第4章 Transformer Block
本章目标:
理解一个完整的 Transformer Block 的结构,以及 Tensor 的 Shape 是如何在其中变化的。
本章目录
- 4.1 一个 Block 的全貌
- 4.2 Block 的四个组件
- 4.3 为什么这样排列?
- 4.4 Pre-Norm vs Post-Norm
- 4.5 Tensor Shape 的完整流程(Pre-Norm)
- 4.6 TensorFlow 实现
- 4.7 多个 Block 堆叠
- 4.8 一层 Block 有多少参数?
- 4.9 Hidden State——Block 中真正流动的数据
- 本章总结
- 本章思考题
- 下一章预告
4.1 一个 Block 的全貌
Transformer 是由多个相同的 Block 堆叠而成的。
原始论文(2017)使用的是Post-Norm结构,每个 Block 的结构如下:
⚠️注意:上图是原始论文的 Post-Norm 结构。现代 LLM(GPT-2、Llama、Qwen)使用 Pre-Norm 结构,区别见 4.4 节。
注意:输入和输出的 Shape 完全相同。
这是 Transformer 能堆叠多层的关键。
4.2 Block 的四个组件
| 组件 | 作用 | 章节 |
|---|---|---|
| Multi-Head Self-Attention | 让每个 Token 和所有 Token 交互 | 第6、7章 |
| Residual(残差连接) | 防止梯度消失,保留原始信息 | 第10章 |
| LayerNorm | 稳定训练,加速收敛 | 第9章 |
| Feed Forward Network | 对每个 Token 做非线性变换 | 第8章 |
4.3 为什么这样排列?
Block 的排列顺序是:
Attention → Add & Norm → FFN → Add & Norm这个顺序不是随意的:
- Attention 先:让 Token 先收集全局信息
- Add & Norm:稳定 Attention 的输出,防止梯度爆炸
- FFN 后:对每个 Token 的表示做进一步变换(引入非线性)
- Add & Norm:再次稳定
4.3.1 为什么要两次 Residual + 两次 LayerNorm?
很多人看到 Block 结构会疑惑:为什么不是只在最后做一次 Residual + LayerNorm?
答案在于:一个 Block 做了两件本质不同的事情,每件事完成后都需要独立"提交"结果。
| 阶段 | 做什么 | 类比 | 为什么需要独立的 Add & Norm |
|---|---|---|---|
| Attention | 收集其他Token的信息 | 开会听取意见 | 意见可能有错,不能直接覆盖旧认知 |
| FFN | 对已有信息独立加工 | 回家自己思考 | 推理可能跑偏,不能直接覆盖会议结论 |
每个阶段的 Residual 含义:
- 第一次 Residual(Attention后):
旧认知 + 从别人那里收集的新信息 - 第二次 Residual(FFN后):
收集后的认知 + 自己深入思考的结果
如果只在 Block 最后做一次 Residual:
❌ H_new = H_old + Attention(H_old) + FFN(...)那就意味着 FFN 的输入是 Attention 的"裸输出"(未经稳定化),数值可能不稳定,且 Attention 的错误会直接传给 FFN。
两次独立的 Add & Norm 确保:
- FFN 收到的是已经稳定化的中间结果
- 每个阶段的错误都被 Residual “缓冲”——即使那个阶段失败了,原始信息也不会丢失
4.4 Pre-Norm vs Post-Norm
原始论文使用Post-Norm(LayerNorm 在残差相加之后):
Post-Norm: x → Attention(x) → x + Attention(x) → LayerNorm → ...现代 LLM(GPT-2、Qwen、Llama)使用Pre-Norm(LayerNorm 在子层之前):
Pre-Norm: x → LayerNorm(x) → Attention(LayerNorm(x)) → x + Attention(LayerNorm(x)) → ...