跳转至

Transformer

1. 核心结构

Transformer 由编码器(Encoder)与解码器(Decoder)堆叠而成(GPT 通常仅保留 Decoder)。 每层的关键模块:

  1. Multi-Head Self-Attention
  2. Feed-Forward Network (FFN)
  3. Residual Connection
  4. LayerNorm

2. 注意力机制

缩放点积注意力:

\[ \mathrm{Attention}(Q,K,V)=\mathrm{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \]

多头注意力将表示分到不同子空间并并行建模关系。

3. 手写最小注意力实现(PyTorch)

import torch
import torch.nn as nn

class SelfAttention(nn.Module):
    def __init__(self, d_model=256, n_heads=8):
        super().__init__()
        assert d_model % n_heads == 0
        self.n_heads = n_heads
        self.d_head = d_model // n_heads
        self.qkv = nn.Linear(d_model, d_model * 3)
        self.out = nn.Linear(d_model, d_model)

    def forward(self, x, mask=None):
        # x: [B, T, C]
        B, T, C = x.shape
        qkv = self.qkv(x)  # [B, T, 3C]
        q, k, v = qkv.chunk(3, dim=-1)

        def split_heads(t):
            return t.view(B, T, self.n_heads, self.d_head).transpose(1, 2)

        q, k, v = map(split_heads, (q, k, v))  # [B, H, T, Dh]
        att = (q @ k.transpose(-1, -2)) / (self.d_head ** 0.5)  # [B,H,T,T]

        if mask is not None:
            att = att.masked_fill(mask == 0, float('-inf'))

        att = torch.softmax(att, dim=-1)
        y = att @ v  # [B,H,T,Dh]
        y = y.transpose(1, 2).contiguous().view(B, T, C)
        return self.out(y)

4. 训练大模型时的关键点

  • Pre-LN 架构通常更稳定。
  • Warmup + Cosine 学习率策略几乎是标配。
  • 梯度裁剪与混合精度降低训练不稳定概率。
  • 有效 batch size(梯度累积)对收敛影响极大。

5. 常见错误

  • mask 维度错误导致信息泄漏;
  • position encoding 与序列长度不匹配;
  • 使用 FP16 但未启用 loss scaling 导致 NaN。