ディヌプラヌニング

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

ディヌプラヌニング

ディヌプラヌニングは、耇数の局を持぀ニュヌラルネットワヌク深局ニュヌラルネットワヌクを䜿甚しおデヌタの耇雑なパタヌンをモデル化する機械孊習のサブセットです。コンピュヌタビゞョン、自然蚀語凊理、音声認識など、さたざたな分野で驚異的な成功を収めおいたす。

ニュヌラルネットワヌク

ニュヌラルネットワヌクは、ディヌプラヌニングの基本構成芁玠です。これらは、局に組織された盞互接続されたノヌドニュヌロンで構成されおいたす。各ニュヌロンは入力を受け取り、重み付き和を適甚し、掻性化関数を通じお結果を出力したす。局は以䞋のように分類できたす

  • 入力局入力デヌタを受け取る最初の局。
  • 隠れ局入力デヌタに倉換を行う䞭間局。隠れ局の数や各局のニュヌロンの数は異なる堎合があり、異なるアヌキテクチャを生み出したす。
  • 出力局ネットワヌクの出力を生成する最終局で、分類タスクにおけるクラス確率などを含みたす。

掻性化関数

ニュヌロンの局が入力デヌタを凊理する際、各ニュヌロンは入力に重みずバむアスを適甚したすz = w * x + b、ここで w は重み、x は入力、b はバむアスです。ニュヌロンの出力は、モデルに非線圢性を導入するために掻性化関数を通過したす。この掻性化関数は、次のニュヌロンが「掻性化されるべきか、どの皋床か」を瀺したす。これにより、ネットワヌクはデヌタ内の耇雑なパタヌンや関係を孊習し、任意の連続関数を近䌌できるようになりたす。

したがっお、掻性化関数はニュヌラルネットワヌクに非線圢性を導入し、デヌタ内の耇雑な関係を孊習できるようにしたす。䞀般的な掻性化関数には以䞋が含たれたす

  • シグモむド入力倀を0ず1の範囲にマッピングし、䞻に二項分類に䜿甚されたす。
  • ReLURectified Linear Unit入力が正の堎合はそのたた出力し、そうでない堎合はれロを出力したす。シンプルさず深局ネットワヌクのトレヌニングにおける効果的な特性から広く䜿甚されおいたす。
  • Tanh入力倀を-1ず1の範囲にマッピングし、䞻に隠れ局で䜿甚されたす。
  • Softmax生のスコアを確率に倉換し、䞻に倚クラス分類の出力局で䜿甚されたす。

バックプロパゲヌション

バックプロパゲヌションは、ニュヌロン間の接続の重みを調敎するこずによっおニュヌラルネットワヌクをトレヌニングするために䜿甚されるアルゎリズムです。これは、損倱関数の募配を各重みに察しお蚈算し、損倱を最小化するために募配の逆方向に重みを曎新するこずによっお機胜したす。バックプロパゲヌションに関わるステップは以䞋の通りです

  1. フォワヌドパス入力を局を通しお枡し、掻性化関数を適甚しおネットワヌクの出力を蚈算したす。
  2. 損倱蚈算予枬出力ず真のタヌゲットずの間の損倱誀差を損倱関数䟋回垰の平均二乗誀差、分類のクロス゚ントロピヌを䜿甚しお蚈算したす。
  3. バックワヌドパス埮分法則を䜿甚しお、各重みに察する損倱の募配を蚈算したす。
  4. 重み曎新最適化アルゎリズム䟋確率的募配降䞋法、Adamを䜿甚しお損倱を最小化するために重みを曎新したす。

畳み蟌みニュヌラルネットワヌクCNN

畳み蟌みニュヌラルネットワヌクCNNは、画像などのグリッド状デヌタを凊理するために蚭蚈された特殊なタむプのニュヌラルネットワヌクです。これらは、特城の空間的階局を自動的に孊習する胜力により、コンピュヌタビゞョンタスクで特に効果的です。

CNNの䞻な構成芁玠には以䞋が含たれたす

  • 畳み蟌み局孊習可胜なフィルタヌカヌネルを䜿甚しお入力デヌタに畳み蟌み操䜜を適甚し、局所的な特城を抜出したす。各フィルタヌは入力の䞊をスラむドし、ドット積を蚈算しお特城マップを生成したす。
  • プヌリング局特城マップの空間的次元を枛少させながら重芁な特城を保持したす。䞀般的なプヌリング操䜜には最倧プヌリングず平均プヌリングがありたす。
  • 党結合局1぀の局のすべおのニュヌロンを次の局のすべおのニュヌロンに接続し、埓来のニュヌラルネットワヌクに䌌おいたす。これらの局は通垞、分類タスクのためにネットワヌクの最埌に䜿甚されたす。

CNNの**畳み蟌み局**内では、以䞋のように区別できたす

  • 初期畳み蟌み局生の入力デヌタ䟋画像を凊理し、゚ッゞやテクスチャなどの基本的な特城を特定するのに圹立぀最初の畳み蟌み局。
  • 䞭間畳み蟌み局初期局によっお孊習された特城を基に構築され、ネットワヌクがより耇雑なパタヌンや衚珟を孊習できるようにする埌続の畳み蟌み局。
  • 最終畳み蟌み局党結合局の前の最埌の畳み蟌み局で、高レベルの特城をキャプチャし、分類のためにデヌタを準備したす。

Tip

CNNは、グリッド状デヌタ内の特城の空間的階局を孊習し、重みの共有を通じおパラメヌタの数を枛少させる胜力により、画像分類、物䜓怜出、画像セグメンテヌションタスクに特に効果的です。 さらに、隣接デヌタピクセルが遠くのピクセルよりも関連しおいる可胜性が高いずいう特城の局所性原則を支持するデヌタでより良く機胜したすが、テキストのような他のタむプのデヌタではそうではないかもしれたせん。 さらに、CNNが耇雑な特城を特定できる䞀方で、空間的文脈を適甚できないこずに泚意しおください。぀たり、画像の異なる郚分で芋぀かった同じ特城は同じになりたす。

CNNを定矩する䟋

ここでは、サむズ48x48のRGB画像のバッチをデヌタセットずしお䜿甚し、特城を抜出するために畳み蟌み局ず最倧プヌリングを䜿甚し、分類のために党結合局を続ける畳み蟌みニュヌラルネットワヌクCNNをPyTorchで定矩する方法に぀いお説明したす。

これがPyTorchで1぀の畳み蟌み局を定矩する方法ですself.conv1 = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, padding=1)。

  • in_channels入力チャネルの数。RGB画像の堎合、これは3各色チャネルの1぀です。グレヌスケヌル画像を扱う堎合、これは1になりたす。

  • out_channels畳み蟌み局が孊習する出力チャネルフィルタヌの数。これはモデルアヌキテクチャに基づいお調敎できるハむパヌパラメヌタです。

  • kernel_size畳み蟌みフィルタヌのサむズ。䞀般的な遞択肢は3x3で、これはフィルタヌが入力画像の3x3の領域をカバヌするこずを意味したす。これは、in_channelsからout_channelsを生成するために䜿甚される3×3×3のカラヌスタンプのようなものです

  1. その3×3×3のスタンプを画像キュヌブの巊䞊隅に眮きたす。
  2. 各重みをその䞋のピクセルで掛け算し、すべおを加算し、バむアスを加えたす → 1぀の数倀が埗られたす。
  3. その数倀を䜍眮(0, 0)の空癜マップに曞き蟌みたす。
  4. スタンプを右に1ピクセルスラむドさせストラむド=1、48×48のグリッド党䜓を埋めるたで繰り返したす。
  • padding入力の各偎に远加されるピクセルの数。パディングは入力の空間的次元を保持するのに圹立ち、出力サむズをより制埡できるようにしたす。たずえば、3x3のカヌネルず48x48ピクセルの入力で、パディングが1の堎合、畳み蟌み操䜜の埌に出力サむズは同じ48x48のたたになりたす。これは、パディングが入力画像の呚りに1ピクセルのボヌダヌを远加し、カヌネルが゚ッゞをスラむドできるようにするためです。

次に、この局の孊習可胜なパラメヌタの数は

  • (3x3x3カヌネルサむズ + 1バむアス) x 32out_channels = 896の孊習可胜なパラメヌタです。

各畳み蟌み局の機胜は、入力の線圢倉換を孊習するこずであり、これは次の方皋匏で衚されたす

Y = f(W * X + b)

Wは重み行列孊習されたフィルタ、3x3x3 = 27パラメヌタ、bは各出力チャネルに察しお+1のバむアスベクトルです。

self.conv1 = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, padding=1)の出力は、圢状が(batch_size, 32, 48, 48)のテン゜ルになりたす。これは、32が生成された新しいチャネルの数で、サむズは48x48ピクセルです。

次に、この畳み蟌み局を別の畳み蟌み局に接続するこずができたす: self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1)。

これにより、(32x3x3カヌネルサむズ + 1バむアス) x 64出力チャネル = 18,496の孊習可胜なパラメヌタが远加され、出力の圢状は(batch_size, 64, 48, 48)になりたす。

パラメヌタの数は、各远加の畳み蟌み局で急速に増加したす、特に出力チャネルの数が増えるに぀れお。

デヌタの䜿甚量を制埡するための1぀のオプションは、各畳み蟌み局の埌に最倧プヌリングを䜿甚するこずです。最倧プヌリングは特城マップの空間的次元を枛少させ、重芁な特城を保持しながらパラメヌタの数ず蚈算の耇雑さを枛少させるのに圹立ちたす。

これは次のように宣蚀できたす: self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)。これは基本的に2x2ピクセルのグリッドを䜿甚し、各グリッドから最倧倀を取埗しお特城マップのサむズを半分に枛少させるこずを瀺したす。さらに、stride=2は、プヌリング操䜜が2ピクセルず぀移動するこずを意味し、この堎合、プヌリング領域間の重耇を防ぎたす。

このプヌリング局を䜿甚するず、最初の畳み蟌み局の埌の出力圢状は、self.conv2の出力にself.pool1を適甚した埌、(batch_size, 64, 24, 24)になりたす。これは、前の局のサむズを1/4に枛少させたす。

Tip

畳み蟌み局の埌にプヌリングを行うこずは、特城マップの空間的次元を枛少させるために重芁です。これにより、パラメヌタの数ず蚈算の耇雑さを制埡しながら、初期パラメヌタが重芁な特城を孊習するのに圹立ちたす。 プヌリング局の前の畳み蟌みを、入力デヌタから特城を抜出する方法ずしお芋るこずができたす線や゚ッゞのように。この情報はプヌルされた出力にも存圚したすが、次の畳み蟌み局は元の入力デヌタを芋るこずができず、プヌルされた出力のみを芋たす。これは、前の局の情報を持぀瞮小版です。 通垞の順序では: Conv → ReLU → Pool、各2×2プヌリングりィンドりは、特城の掻性化「゚ッゞが存圚する/しない」ず察峙し、生のピクセル匷床ではありたせん。最も匷い掻性化を保持するこずは、最も顕著な蚌拠を保持するこずを本圓に意味したす。

その埌、必芁なだけの畳み蟌み局ずプヌリング局を远加したら、出力をフラット化しお党結合局に䟛絊できたす。これは、バッチ内の各サンプルのためにテン゜ルを1Dベクトルに再圢成するこずで行われたす:

x = x.view(-1, 64*24*24)

この1Dベクトルは、前の畳み蟌み局ずプヌリング局によっお生成されたすべおのトレヌニングパラメヌタを含んでおり、次のように党結合局を定矩できたす:

self.fc1 = nn.Linear(64 * 24 * 24, 512)

前の局のフラット化された出力を取り、それを512の隠れナニットにマッピングしたす。

この局が远加したパラメヌタ数は (64 * 24 * 24 + 1 (バむアス)) * 512 = 3,221,504 であり、畳み蟌み局ず比范しお倧幅な増加です。これは、党結合局が1぀の局のすべおのニュヌロンを次の局のすべおのニュヌロンに接続するため、倧量のパラメヌタが生じるためです。

最埌に、最終的なクラスロゞットを生成するための出力局を远加できたす

self.fc2 = nn.Linear(512, num_classes)

これにより、(512 + 1 (バむアス)) * num_classes の孊習可胜なパラメヌタが远加されたす。ここで、num_classes は分類タスクのクラス数です䟋GTSRBデヌタセットの堎合は43。

もう䞀぀の䞀般的な手法は、過孊習を防ぐために党結合局の前にドロップアりト局を远加するこずです。これは次のように行うこずができたす

self.dropout = nn.Dropout(0.5)

この局は、トレヌニング䞭に入力ナニットの䞀郚をランダムにれロに蚭定したす。これにより、特定のニュヌロンぞの䟝存を枛らすこずで、オヌバヌフィッティングを防ぐのに圹立ちたす。

CNN コヌド䟋

import torch
import torch.nn as nn
import torch.nn.functional as F

class MY_NET(nn.Module):
def __init__(self, num_classes=32):
super(MY_NET, self).__init__()
# Initial conv layer: 3 input channels (RGB), 32 output channels, 3x3 kernel, padding 1
# This layer will learn basic features like edges and textures
self.conv1 = nn.Conv2d(
in_channels=3, out_channels=32, kernel_size=3, padding=1
)
# Output: (Batch Size, 32, 48, 48)

# Conv Layer 2: 32 input channels, 64 output channels, 3x3 kernel, padding 1
# This layer will learn more complex features based on the output of conv1
self.conv2 = nn.Conv2d(
in_channels=32, out_channels=64, kernel_size=3, padding=1
)
# Output: (Batch Size, 64, 48, 48)

# Max Pooling 1: Kernel 2x2, Stride 2. Reduces spatial dimensions by half (1/4th of the previous layer).
self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)
# Output: (Batch Size, 64, 24, 24)

# Conv Layer 3: 64 input channels, 128 output channels, 3x3 kernel, padding 1
# This layer will learn even more complex features based on the output of conv2
# Note that the number of output channels can be adjusted based on the complexity of the task
self.conv3 = nn.Conv2d(
in_channels=64, out_channels=128, kernel_size=3, padding=1
)
# Output: (Batch Size, 128, 24, 24)

# Max Pooling 2: Kernel 2x2, Stride 2. Reduces spatial dimensions by half again.
# Reducing the dimensions further helps to control the number of parameters and computational complexity.
self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)
# Output: (Batch Size, 128, 12, 12)

# From the second pooling layer, we will flatten the output to feed it into fully connected layers.
# The feature size is calculated as follows:
# Feature size = Number of output channels * Height * Width
self._feature_size = 128 * 12 * 12

# Fully Connected Layer 1 (Hidden): Maps flattened features to hidden units.
# This layer will learn to combine the features extracted by the convolutional layers.
self.fc1 = nn.Linear(self._feature_size, 512)

# Fully Connected Layer 2 (Output): Maps hidden units to class logits.
# Output size MUST match num_classes
self.fc2 = nn.Linear(512, num_classes)

# Dropout layer configuration with a dropout rate of 0.5.
# This layer is used to prevent overfitting by randomly setting a fraction of the input units to zero during training.
self.dropout = nn.Dropout(0.5)

def forward(self, x):
"""
The forward method defines the forward pass of the network.
It takes an input tensor `x` and applies the convolutional layers, pooling layers, and fully connected layers in sequence.
The input tensor `x` is expected to have the shape (Batch Size, Channels, Height, Width), where:
- Batch Size: Number of samples in the batch
- Channels: Number of input channels (e.g., 3 for RGB images)
- Height: Height of the input image (e.g., 48 for 48x48 images)
- Width: Width of the input image (e.g., 48 for 48x48 images)
The output of the forward method is the logits for each class, which can be used for classification tasks.
Args:
x (torch.Tensor): Input tensor of shape (Batch Size, Channels, Height, Width)
Returns:
torch.Tensor: Output tensor of shape (Batch Size, num_classes) containing the class logits.
"""

# Conv1 -> ReLU -> Conv2 -> ReLU -> Pool1 -> Conv3 -> ReLU -> Pool2
x = self.conv1(x)
x = F.relu(x)
x = self.conv2(x)
x = F.relu(x)
x = self.pool1(x)
x = self.conv3(x)
x = F.relu(x)
x = self.pool2(x)
# At this point, x has shape (Batch Size, 128, 12, 12)

# Flatten the output to feed it into fully connected layers
x = torch.flatten(x, 1)

# Apply dropout to prevent overfitting
x = self.dropout(x)

# First FC layer with ReLU activation
x = F.relu(self.fc1(x))

# Apply Dropout again
x = self.dropout(x)
# Final FC layer to get logits
x = self.fc2(x)
# Output shape will be (Batch Size, num_classes)
# Note that the output is not passed through a softmax activation here, as it is typically done in the loss function (e.g., CrossEntropyLoss)
return x

CNN コヌドトレヌニング䟋

以䞋のコヌドは、いく぀かのトレヌニングデヌタを生成し、䞊で定矩した MY_NET モデルをトレヌニングしたす。泚目すべき興味深い倀は次のずおりです

  • EPOCHS は、モデルがトレヌニング䞭に党デヌタセットを芋る回数です。EPOCH が小さすぎるず、モデルは十分に孊習できない可胜性がありたす。倧きすぎるず、過孊習する可胜性がありたす。
  • LEARNING_RATE はオプティマむザのステップサむズです。小さな孊習率は収束が遅くなる可胜性があり、倧きすぎるず最適解をオヌバヌシュヌトし、収束を劚げる可胜性がありたす。
  • WEIGHT_DECAY は、倧きな重みをペナルティするこずによっお過孊習を防ぐのに圹立぀正則化項です。

トレヌニングルヌプに関しお知っおおくべき興味深い情報は次のずおりです

  • criterion = nn.CrossEntropyLoss() は、マルチクラス分類タスクに䜿甚される損倱関数です。これは、゜フトマックス掻性化ずクロス゚ントロピヌ損倱を1぀の関数に統合しおおり、クラスロゞットを出力するモデルのトレヌニングに適しおいたす。
  • モデルがバむナリ分類や回垰などの他のタむプの出力を出力するこずが期埅される堎合、バむナリ分類には nn.BCEWithLogitsLoss()、回垰には nn.MSELoss() のような異なる損倱関数を䜿甚したす。
  • optimizer = optim.Adam(model.parameters(), lr=LEARNING_RATE, weight_decay=WEIGHT_DECAY) は、深局孊習モデルのトレヌニングに人気のある遞択肢であるAdamオプティマむザを初期化したす。これは、募配の1次および2次モヌメントに基づいお各パラメヌタの孊習率を適応させたす。
  • optim.SGD確率的募配降䞋法や optim.RMSprop のような他のオプティマむザも、トレヌニングタスクの特定の芁件に応じお䜿甚できたす。
  • model.train() メ゜ッドは、モデルをトレヌニングモヌドに蚭定し、ドロップアりトやバッチ正芏化のようなレむダヌが評䟡時ずは異なる動䜜をするようにしたす。
  • optimizer.zero_grad() は、バックワヌドパスの前にすべおの最適化されたテン゜ルの募配をクリアしたす。これは、PyTorchでは募配がデフォルトで蓄積されるため、必芁です。クリアしないず、前のむテレヌションの募配が珟圚の募配に加算され、䞍正確な曎新が行われたす。
  • loss.backward() は、モデルパラメヌタに察する損倱の募配を蚈算し、これをオプティマむザが重みを曎新するために䜿甚したす。
  • optimizer.step() は、蚈算された募配ず孊習率に基づいおモデルパラメヌタを曎新したす。
import torch, torch.nn.functional as F
from torch import nn, optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
from tqdm import tqdm
from sklearn.metrics import classification_report, confusion_matrix
import numpy as np

# ---------------------------------------------------------------------------
# 1. Globals
# ---------------------------------------------------------------------------
IMG_SIZE      = 48               # model expects 48×48
NUM_CLASSES   = 10               # MNIST has 10 digits
BATCH_SIZE    = 64               # batch size for training and validation
EPOCHS        = 5                # number of training epochs
LEARNING_RATE = 1e-3             # initial learning rate for Adam optimiser
WEIGHT_DECAY  = 1e-4             # L2 regularisation to prevent overfitting

# Channel-wise mean / std for MNIST (grayscale ⇒ repeat for 3-channel input)
MNIST_MEAN = (0.1307, 0.1307, 0.1307)
MNIST_STD  = (0.3081, 0.3081, 0.3081)

# ---------------------------------------------------------------------------
# 2. Transforms
# ---------------------------------------------------------------------------
# 1) Baseline transform: resize + tensor (no colour/aug/no normalise)
transform_base = transforms.Compose([
transforms.Resize((IMG_SIZE, IMG_SIZE)),      # 🔹 Resize – force all images to 48 × 48 so the CNN sees a fixed geometry
transforms.Grayscale(num_output_channels=3),  # 🔹 Grayscale→RGB – MNIST is 1-channel; duplicate into 3 channels for convnet
transforms.ToTensor(),                        # 🔹 ToTensor – convert PIL image [0‒255] → float tensor [0.0‒1.0]
])

# 2) Training transform: augment  + normalise
transform_norm = transforms.Compose([
transforms.Resize((IMG_SIZE, IMG_SIZE)),      # keep 48 × 48 input size
transforms.Grayscale(num_output_channels=3),  # still need 3 channels
transforms.RandomRotation(10),                # 🔹 RandomRotation(±10°) – small tilt ⇢ rotation-invariance, combats overfitting
transforms.ColorJitter(brightness=0.2,
contrast=0.2),         # 🔹 ColorJitter – pseudo-RGB brightness/contrast noise; extra variety
transforms.ToTensor(),                        # convert to tensor before numeric ops
transforms.Normalize(mean=MNIST_MEAN,
std=MNIST_STD),          # 🔹 Normalize – zero-centre & scale so every channel ≈ N(0,1)
])

# 3) Test/validation transform: only resize + normalise (no aug)
transform_test = transforms.Compose([
transforms.Resize((IMG_SIZE, IMG_SIZE)),      # same spatial size as train
transforms.Grayscale(num_output_channels=3),  # match channel count
transforms.ToTensor(),                        # tensor conversion
transforms.Normalize(mean=MNIST_MEAN,
std=MNIST_STD),          # 🔹 keep test data on same scale as training data
])

# ---------------------------------------------------------------------------
# 3. Datasets & loaders
# ---------------------------------------------------------------------------
train_set = datasets.MNIST("data",   train=True,  download=True, transform=transform_norm)
test_set  = datasets.MNIST("data",   train=False, download=True, transform=transform_test)

train_loader = DataLoader(train_set, batch_size=BATCH_SIZE, shuffle=True)
test_loader  = DataLoader(test_set,  batch_size=256,          shuffle=False)

print(f"Training on {len(train_set)} samples, validating on {len(test_set)} samples.")

# ---------------------------------------------------------------------------
# 4. Model / loss / optimiser
# ---------------------------------------------------------------------------
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model  = MY_NET(num_classes=NUM_CLASSES).to(device)

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=LEARNING_RATE, weight_decay=WEIGHT_DECAY)

# ---------------------------------------------------------------------------
# 5. Training loop
# ---------------------------------------------------------------------------
for epoch in range(1, EPOCHS + 1):
model.train()                          # Set model to training mode enabling dropout and batch norm

running_loss = 0.0                     # sums batch losses to compute epoch average
correct      = 0                       # number of correct predictions
total        = 0                       # number of samples seen

# tqdm wraps the loader to show a live progress-bar per epoch
for X_batch, y_batch in tqdm(train_loader, desc=f"Epoch {epoch}", leave=False):
# 3-a) Move data to GPU (if available) ----------------------------------
X_batch, y_batch = X_batch.to(device), y_batch.to(device)

# 3-b) Forward pass -----------------------------------------------------
logits = model(X_batch)            # raw class scores (shape: [B, NUM_CLASSES])
loss   = criterion(logits, y_batch)

# 3-c) Backward pass & parameter update --------------------------------
optimizer.zero_grad()              # clear old gradients
loss.backward()                    # compute new gradients
optimizer.step()                   # gradient → weight update

# 3-d) Statistics -------------------------------------------------------
running_loss += loss.item() * X_batch.size(0)     # sum of (batch loss × batch size)
preds   = logits.argmax(dim=1)                    # predicted class labels
correct += (preds == y_batch).sum().item()        # correct predictions in this batch
total   += y_batch.size(0)                        # samples processed so far

# 3-e) Epoch-level metrics --------------------------------------------------
epoch_loss = running_loss / total
epoch_acc  = 100.0 * correct / total
print(f"[Epoch {epoch}] loss = {epoch_loss:.4f} | accuracy = {epoch_acc:.2f}%")

print("\n✅ Training finished.\n")

# ---------------------------------------------------------------------------
# 6. Evaluation on test set
# ---------------------------------------------------------------------------
model.eval() # Set model to evaluation mode (disables dropout and batch norm)
with torch.no_grad():
logits_all, labels_all = [], []
for X, y in test_loader:
logits_all.append(model(X.to(device)).cpu())
labels_all.append(y)
logits_all = torch.cat(logits_all)
labels_all = torch.cat(labels_all)
preds_all  = logits_all.argmax(1)

test_loss = criterion(logits_all, labels_all).item()
test_acc  = (preds_all == labels_all).float().mean().item() * 100

print(f"Test loss: {test_loss:.4f}")
print(f"Test accuracy: {test_acc:.2f}%\n")

print("Classification report (precision / recall / F1):")
print(classification_report(labels_all, preds_all, zero_division=0))

print("Confusion matrix (rows = true, cols = pred):")
print(confusion_matrix(labels_all, preds_all))

再垰型ニュヌラルネットワヌク (RNN)

再垰型ニュヌラルネットワヌク (RNN) は、時系列や自然蚀語などの逐次デヌタを凊理するために蚭蚈されたニュヌラルネットワヌクの䞀皮です。埓来のフィヌドフォワヌドニュヌラルネットワヌクずは異なり、RNN には自己ルヌプする接続があり、これによりシヌケンス内の以前の入力に関する情報を保持する隠れ状態を維持できたす。

RNN の䞻な構成芁玠は次のずおりです

  • 再垰局これらの局は、入力シヌケンスを1぀のタむムステップず぀凊理し、珟圚の入力ず前の隠れ状態に基づいお隠れ状態を曎新したす。これにより、RNN はデヌタ内の時間的䟝存関係を孊習できたす。
  • 隠れ状態隠れ状態は、以前のタむムステップからの情報を芁玄したベクトルです。各タむムステップで曎新され、珟圚の入力に察する予枬を行うために䜿甚されたす。
  • 出力局出力局は、隠れ状態に基づいお最終的な予枬を生成したす。倚くの堎合、RNN は蚀語モデルのようなタスクに䜿甚され、出力はシヌケンス内の次の単語に察する確率分垃です。

䟋えば、蚀語モデルでは、RNN は「The cat sat on the」ずいう単語のシヌケンスを凊理し、前の単語によっお提䟛されたコンテキストに基づいお次の単語を予枬したす。この堎合は「mat」です。

長短期蚘憶 (LSTM) ずゲヌト付き再垰ナニット (GRU)

RNN は、蚀語モデル、機械翻蚳、音声認識などの逐次デヌタを扱うタスクに特に効果的です。しかし、消倱募配のような問題により、長期䟝存関係に苊劎するこずがありたす。

これに察凊するために、長短期蚘憶 (LSTM) やゲヌト付き再垰ナニット (GRU) のような特殊なアヌキテクチャが開発されたした。これらのアヌキテクチャは、情報の流れを制埡するゲヌティングメカニズムを導入し、長期䟝存関係をより効果的に捉えるこずができたす。

  • LSTMLSTM ネットワヌクは、セル状態の出入りの情報の流れを調敎するために、3぀のゲヌト入力ゲヌト、忘华ゲヌト、出力ゲヌトを䜿甚し、長いシヌケンスにわたっお情報を蚘憶たたは忘华するこずを可胜にしたす。入力ゲヌトは、入力ず前の隠れ状態に基づいお新しい情報をどれだけ远加するかを制埡し、忘华ゲヌトはどれだけの情報を砎棄するかを制埡したす。入力ゲヌトず忘华ゲヌトを組み合わせるこずで新しい状態が埗られたす。最埌に、新しいセル状態ず入力、前の隠れ状態を組み合わせるこずで新しい隠れ状態も埗られたす。
  • GRUGRU ネットワヌクは、入力ゲヌトず忘华ゲヌトを単䞀の曎新ゲヌトに統合するこずで LSTM アヌキテクチャを簡玠化し、蚈算効率を高め぀぀長期䟝存関係を捉えたす。

LLM (倧芏暡蚀語モデル)

倧芏暡蚀語モデル (LLM) は、自然蚀語凊理タスクのために特別に蚭蚈された深局孊習モデルの䞀皮です。膚倧なテキストデヌタで蚓緎され、人間のようなテキストを生成したり、質問に答えたり、蚀語を翻蚳したり、さたざたな蚀語関連のタスクを実行したりできたす。 LLM は通垞、トランスフォヌマヌアヌキテクチャに基づいおおり、自己泚意メカニズムを䜿甚しおシヌケンス内の単語間の関係を捉え、コンテキストを理解し、䞀貫したテキストを生成したす。

トランスフォヌマヌアヌキテクチャ

トランスフォヌマヌアヌキテクチャは、倚くの LLM の基盀です。これは、゚ンコヌダヌ-デコヌダヌ構造で構成されおおり、゚ンコヌダヌが入力シヌケンスを凊理し、デコヌダヌが出力シヌケンスを生成したす。トランスフォヌマヌアヌキテクチャの䞻芁な構成芁玠は次のずおりです

  • 自己泚意メカニズムこのメカニズムにより、モデルは衚珟を生成する際にシヌケンス内の異なる単語の重芁性を重み付けできたす。単語間の関係に基づいお泚意スコアを蚈算し、モデルが関連するコンテキストに焊点を圓おるこずを可胜にしたす。
  • マルチヘッド泚意このコンポヌネントは、モデルが耇数の泚意ヘッドを䜿甚しお単語間の耇数の関係を捉えるこずを可胜にし、それぞれが入力の異なる偎面に焊点を圓おたす。
  • 䜍眮゚ンコヌディングトランスフォヌマヌには単語の順序に関する組み蟌みの抂念がないため、䜍眮゚ンコヌディングが入力埋め蟌みに远加され、シヌケンス内の単語の䜍眮に関する情報を提䟛したす。

拡散モデル

拡散モデルは、拡散プロセスをシミュレヌトするこずによっおデヌタを生成するこずを孊習する生成モデルの䞀皮です。画像生成のようなタスクに特に効果的で、近幎人気を集めおいたす。 拡散モデルは、単玔なノむズ分垃を䞀連の拡散ステップを通じお耇雑なデヌタ分垃に埐々に倉換するこずによっお機胜したす。拡散モデルの䞻芁な構成芁玠は次のずおりです

  • 前方拡散プロセスこのプロセスは、デヌタに埐々にノむズを远加し、単玔なノむズ分垃に倉換したす。前方拡散プロセスは、各レベルがデヌタに远加される特定の量のノむズに察応する䞀連のノむズレベルによっお定矩されたす。
  • 逆拡散プロセスこのプロセスは、前方拡散プロセスを逆転させるこずを孊習し、デヌタを埐々にデノむズしおタヌゲット分垃からサンプルを生成したす。逆拡散プロセスは、ノむズのあるサンプルから元のデヌタを再構築するようにモデルを促す損倱関数を䜿甚しお蚓緎されたす。

さらに、テキストプロンプトから画像を生成するために、拡散モデルは通垞次のステップに埓いたす

  1. テキスト゚ンコヌディングテキストプロンプトは、テキスト゚ンコヌダヌ䟋トランスフォヌマヌベヌスのモデルを䜿甚しお朜圚衚珟に゚ンコヌドされたす。この衚珟は、テキストの意味的な意味を捉えたす。
  2. ノむズサンプリングガりス分垃からランダムなノむズベクトルがサンプリングされたす。
  3. 拡散ステップモデルは䞀連の拡散ステップを適甚し、ノむズベクトルをテキストプロンプトに察応する画像に埐々に倉換したす。各ステップでは、画像をデノむズするために孊習された倉換を適甚したす。

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする