┌──────────────────────┐
│ 下一个 token 的概率 │
└──────────▲───────────┘
│
┌──────────┴───────────┐
│ Linear + Softmax │
└──────────▲───────────┘
│
┌──────────┴───────────┐
│ Layer Norm (final) │
└──────────▲───────────┘
│
┌────────────────┴────────────────┐
│ GPT Block × N │
│ ┌──────────────────────────┐ │
│ │ Sublayer 2: FFN │ │
│ │ + Residual + LayerNorm │ │
│ └────────────▲─────────────┘ │
│ │ │
│ ┌────────────┴─────────────┐ │
│ │ Sublayer 1: │ │
│ │ Masked Self-Attention │ │
│ │ Q, K, V 都来自这层输入 │ │
│ │ + Residual + LayerNorm │ │
│ └────────────▲─────────────┘ │
└───────────────┼─────────────────┘
│
┌─────────┴───────────┐
│ Embedding + PE │
└─────────▲───────────┘
│
┌─────────┴───────────┐
│ Token IDs │
│ (输入序列) │
└─────────────────────┘
架构上 GPT-2 和 GPT-1 几乎一样——都是 decoder-only Transformer。
主要差异——
| 维度 | GPT-1 | GPT-2 |
|---|---|---|
| 层数 | 12 | 12 / 24 / 36 / 48 |
| 隐藏维度 | 768 | 768 / 1024 / 1280 / 1600 |
| 头数 | 12 | 12 / 16 / 20 / 25 |
| 参数量 | 0.117B | 0.117B / 0.345B / 0.762B / 1.5B |
| 上下文长度 | 512 | 1024 |
| 词表大小 | 40K | 50K(BPE 改进) |
| LayerNorm 位置 | post-norm | pre-norm(关键改动) |
| 训练数据 | BookCorpus(约 7000 本书) | WebText(800 万网页, 40GB) |
注意——
- GPT-2 有 4 个不同尺寸——124M / 355M / 774M / 1558M
- 通常说 "GPT-2" 指最大的 1.5B 版本
- 架构层面几乎只有 pre-norm vs post-norm 这一个真正的改动
GPT-2 是第一个广泛被知道的、采用 pre-norm 的大模型。
Post-norm(原始 Transformer):
x → sublayer(x) → +x → LayerNorm → 输出
y = LayerNorm(x + sublayer(x))
Pre-norm:
x → LayerNorm → sublayer → +x → 输出
y = x + sublayer(LayerNorm(x))
注意一个微妙但关键的不同:
Post-norm:残差连接的"主干"是 被 LayerNorm 处理过的。
x → [+ sublayer] → norm → 下一层
↑
这一步会"压缩"主干信号
Pre-norm:残差连接的"主干"是 原始的 x:
x ──────────── + ─→ 下一层
↘ ↗
norm → sublayer
主干信号 x 从输入直接传到输出,没被任何 norm 修改,只是加上一个"经 norm 处理后的修正"。
Post-norm 的问题:
每一层都会"压缩"主干信号,堆 N 层后,信号被反复压缩,梯度反向传播时容易爆炸或消失。
原始 Transformer 论文里训练 6-12 层还能 work,但要堆到 100 层(GPT-3 那种规模),post-norm 几乎训不动。
Pre-norm 的优势: 主干 x 是"干净的高速公路",梯度可以直接从输出反传到输入,不被任何 norm 干扰。
结果:
- Pre-norm 可以训练几十、几百层
- 不需要复杂的 warmup
- 学习率可以更激进
- 训练更稳定
代价:post-norm 在小规模时效果略好——但在大规模时输给 pre-norm。