编码器 Transformer

使用 PyTorch 的 Transformer 模型

James Chapman

Curriculum Manager, DataCamp

原始 Transformer

论文《Attention Is All You Need》中的Transformer架构图。

使用 PyTorch 的 Transformer 模型

原始 Transformer

原始 Transformer 架构

使用 PyTorch 的 Transformer 模型

仅编码器的 Transformer

仅编码器的 Transformer 架构

Transformer 主体:由 N 个编码器层组成的编码器栈

编码器层

  • 多头自注意力
  • 前馈(子)层
  • 层归一化与dropout

Transformer 头

使用 PyTorch 的 Transformer 模型

仅编码器的 Transformer

仅编码器的 Transformer 架构

Transformer 主体:由 N 个编码器层组成的编码器栈

编码器层

  • 多头自注意力
  • 前馈(子)层
  • 层归一化与dropout

Transformer 头:处理编码后的输入,生成预测输出

监督任务:分类、回归

使用 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

编码器层

  • 多头自注意力
  • 前馈子层
  • 层归一化与dropout

forward()

  • mask 用于屏蔽填充标记
使用 PyTorch 的 Transformer 模型

注意力过程中的掩码

序列填充

自注意力中的填充掩码

使用 PyTorch 的 Transformer 模型

编码器 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 模型

编码器 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 模型

Passons à la pratique !

使用 PyTorch 的 Transformer 模型

Preparing Video For Download...