Transformer¶
1. 核心结构¶
Transformer 由编码器(Encoder)与解码器(Decoder)堆叠而成(GPT 通常仅保留 Decoder)。 每层的关键模块:
- Multi-Head Self-Attention
- Feed-Forward Network (FFN)
- Residual Connection
- 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。