エンコーダー・トランスフォーマー

PyTorchで学ぶTransformerモデル

James Chapman

Curriculum Manager, DataCamp

オリジナルのトランスフォーマー

学術論文「Attention Is All You Need」に示されたトランスフォーマーのアーキテクチャ

PyTorchで学ぶTransformerモデル

オリジナルのトランスフォーマー

オリジナルのトランスフォーマーアーキテクチャ

PyTorchで学ぶTransformerモデル

エンコーダー専用トランスフォーマー

エンコーダーのみのトランスフォーマーアーキテクチャ

トランスフォーマー本体: N個のエンコーダーレイヤーからなるエンコーダースタック

エンコーダーレイヤー

  • マルチヘッド自己注意
  • フィードフォワード(サブ)レイヤー
  • レイヤー正規化、ドロップアウト

トランスフォーマーヘッド

PyTorchで学ぶTransformerモデル

エンコーダー専用トランスフォーマー

エンコーダーのみのトランスフォーマーアーキテクチャ

トランスフォーマー本体: N個のエンコーダーレイヤーからなるエンコーダースタック

エンコーダーレイヤー

  • マルチヘッド自己注意
  • フィードフォワード(サブ)レイヤー
  • レイヤー正規化、ドロップアウト

トランスフォーマーヘッド: 符号化済み入力を処理して予測を出力

教師ありタスク: 分類、回帰

PyTorchで学ぶTransformerモデル

エンコーダーレイヤー内のフィードフォワード層

アテンション後のフィードフォワードサブレイヤー

class FeedForwardSubLayer(nn.Module):
    def __init__(self, d_model, d_ff):
        super().__init__()
        self.fc1 = nn.Linear(d_model, d_ff)
        self.fc2 = nn.Linear(d_ff, d_model)
        self.relu = nn.ReLU()


def forward(self, x): return self.fc2(self.relu(self.fc1(x)))

全結合×2 + ReLU 活性化

  • d_ff: 線形層間の次元

  • forward(): アテンション出力を非線形に変換し複雑なパターンを捉える

PyTorchで学ぶTransformerモデル

エンコーダーレイヤー

class EncoderLayer(nn.Module):
    def __init__(self, d_model, num_heads, d_ff, dropout):
        super().__init__()
        self.self_attn = MultiHeadAttention(d_model, num_heads)
        self.ff_sublayer = FeedForwardSubLayer(d_model, d_ff)

self.norm1 = nn.LayerNorm(d_model) self.norm2 = nn.LayerNorm(d_model) self.dropout = nn.Dropout(dropout)
def forward(self, x, src_mask): attn_output = self.self_attn(x, x, x, src_mask) x = self.norm1(x + self.dropout(attn_output)) ff_output = self.ff_sublayer(x) x = self.norm2(x + self.dropout(ff_output)) return x

エンコーダーレイヤー

  • マルチヘッド自己注意
  • フィードフォワードサブレイヤー
  • レイヤー正規化とドロップアウト

forward():

  • mask はパディングトークンの処理を防ぐ
PyTorchで学ぶTransformerモデル

注意機構のマスキング

系列のパディング

自己注意でのパディングマスク

PyTorchで学ぶTransformerモデル

エンコーダートランスフォーマー本体

class TransformerEncoder(nn.Module):
    def __init__(self, vocab_size, d_model, num_layers, num_heads, d_ff, dropout, max_seq_length):
        super().__init__()

self.embedding = InputEmbeddings(vocab_size, d_model)
self.positional_encoding = PositionalEncoding(d_model, max_seq_length)
self.layers = nn.ModuleList( [EncoderLayer(d_model, num_heads, d_ff, dropout) for _ in range(num_layers)] )
def forward(self, x, src_mask): x = self.embedding(x) x = self.positional_encoding(x) for layer in self.layers: x = layer(x, src_mask) return x
PyTorchで学ぶTransformerモデル

エンコーダートランスフォーマーのヘッド

class ClassifierHead(nn.Module):
    def __init__(self, d_model, num_classes):
        super().__init__()
        self.fc = nn.Linear(d_model, num_classes)

    def forward(self, x):
        logits = self.fc(x)
        return F.log_softmax(logits, dim=-1)
class RegressionHead(nn.Module):
    def __init__(self, d_model, output_dim):
        super().__init__()
        self.fc = nn.Linear(d_model, output_dim)

    def forward(self, x):
        return self.fc(x)

分類ヘッド

  • タスク: テキスト分類、感情分析、NER、抽出型QA など
  • fc: 全結合線形層
    • エンコーダーの隠れ状態を num_classes のクラス確率に変換

回帰ヘッド

  • タスク: 可読性推定、言語の複雑さ など
    • 単一の数値を予測する場合、output_dim は 1
PyTorchで学ぶTransformerモデル

練習しましょう!

PyTorchで学ぶTransformerモデル

Preparing Video For Download...