目录
上一课打开 Transformer Block,看到每个子层都有一条残差路径,前面还有一次 RMSNorm。它们看起来不像 Attention 那样“聪明”,却决定了几十层甚至上百层的模型能不能稳定训练。
Residual 解决的是信息和梯度如何穿过深层网络,Norm 解决的是每一层接收到的数值尺度是否稳定。两者分工不同,又必须配合使用。
Residual 给信息留一条直路,Norm 把送进子层的数值调到合适尺度。
1、为什么深层网络难训练
如果把很多非线性子层首尾相接,每一层都完全改写上一层的输出,会遇到两个直观问题:
- 原始信息经过很多次变换后更容易丢失。
- 反向传播要连续穿过每个子层,梯度可能变得过大、过小或不稳定。
同时,不同层输出的数值范围可能逐渐漂移。后一层今天接到很大的数,下一步又接到很小的数,学习会变得困难。
Residual 和 Norm 就是在改善这两个问题。
2、Residual:给信息留一条直路
普通子层直接输出 $F(x)$,残差结构则输出:
\[y=x+F(x)\]这里的 $x$ 沿旁路直接到达输出,$F(x)$ 只需要学习“在原表示上补充什么”。如果当前子层暂时学不到有用内容,只要 $F(x)$ 接近 0,信息仍可以近似原样通过。
反向传播时也多了一条直接路径:
\[\frac{\partial y}{\partial x}=I+\frac{\partial F(x)}{\partial x}\]式子里的 $I$ 来自那条不经过子层的旁路。它不能保证训练永远不会出问题,但能显著改善深层网络中的梯度传播。
残差是逐元素相加,不是拼接。因此 $x$ 与 $F(x)$ 的形状必须相同。
3、Norm 到底在归一化什么
在 Transformer 中,LayerNorm 和 RMSNorm 通常对每个 Token 自己的隐藏维度做计算。
假设张量形状是 [B, T, d_model],那么每个 Token 都有一条长度为 d_model 的向量。Norm 会分别处理这 B×T 条向量,而不是把整个 Batch 混在一起。
Token A:[0.2, -1.1, 0.7, ...] → 单独归一化
Token B:[3.4, 0.5, 1.2, ...] → 单独归一化
因此,LayerNorm 与 BatchNorm 的对象不同。LLM 的序列长度和 Batch Size 经常变化,按 Token 隐藏维归一化更自然。
4、LayerNorm 怎样计算
对一个 Token 的向量 $x=(x_1,\ldots,x_d)$,LayerNorm 先求均值与方差:
\[\mu=\frac{1}{d}\sum_{i=1}^{d}x_i\] \[\sigma^2=\frac{1}{d}\sum_{i=1}^{d}(x_i-\mu)^2\]然后执行:
\[LayerNorm(x)=\gamma\odot\frac{x-\mu}{\sqrt{\sigma^2+\epsilon}}+\beta\]减去均值让结果重新居中,除以标准差让尺度更稳定。γ 和 β 是可学习参数,让模型可以重新缩放和平移;ε 是防止除以零的小常数。
5、RMSNorm 省略了什么
RMSNorm 不减均值,只根据均方根调整尺度:
\[RMS(x)=\sqrt{\frac{1}{d}\sum_{i=1}^{d}x_i^2+\epsilon}\] \[RMSNorm(x)=\gamma\odot\frac{x}{RMS(x)}\]它保留了 LayerNorm 中最关键的尺度控制,但省去了重新居中的计算,形式更简单。Llama 等现代大模型广泛使用 RMSNorm。
| 对比 | LayerNorm | RMSNorm |
|---|---|---|
| 是否减均值 | 是 | 否 |
| 缩放依据 | 标准差 | 均方根 |
| 可学习参数 | 通常有 γ、β | 通常有 γ |
| 主要目标 | 调整中心与尺度 | 主要调整尺度 |
| 常见位置 | Transformer、视觉与通用网络 | Llama 等现代 LLM |
RMSNorm 更简单,不代表它在任何模型中都必然更好。架构选择仍要结合训练稳定性和实验结果。
6、Pre-Norm 与 Post-Norm
Norm 放在子层之前还是之后,会形成两种结构。
Pre-Norm: x + Sublayer(Norm(x))
Post-Norm:Norm(x + Sublayer(x))
原始 Transformer 使用 Post-Norm。许多现代大模型采用 Pre-Norm,因为残差主路径更直接,深层训练通常更稳定。
代价是 Pre-Norm 的不同层可能更接近“在同一条主干上做增量修正”。实际模型通常还会在全部 Block 之后放一次最终 Norm,再送入 LM Head。
7、放回 Transformer Block
上一课的两行结构现在可以看得更具体:
# Attention 子层
h = x + attention(rms_norm_1(x))
# FFN 子层
y = h + ffn(rms_norm_2(h))
注意这两条路径的分工:
| 路径 | 经过什么 | 负责什么 |
|---|---|---|
| 残差主路径 | 直接从输入到加法节点 | 保留信息和梯度通路 |
| 子层路径 | Norm → Attention / FFN | 计算需要增加的变化量 |
Norm 不会替代 Residual,Residual 也不会替代 Norm。一个稳定输入尺度,一个提供直接通路,共同让 Block 可以连续堆叠。
一个小例子
假设某个 Token 的隐藏向量是:
x = [2, 4, 6, 8]
LayerNorm 会先减去均值 5,再按标准差缩放,所以结果围绕 0 分布。RMSNorm 不减 5,只按向量整体大小缩放,所以仍保留各维度原来的正负与相对方向。
这里不必手算每个小数,真正要记住的是:LayerNorm 同时调整中心和尺度,RMSNorm 主要调整尺度。
容易混淆的 4 件事
- Norm 不会在不同 Token 之间传递信息。 它分别处理每个 Token 的隐藏向量。
- Residual 不是把两份向量拼起来。 它执行逐元素相加。
- RMSNorm 不是没有可学习参数。 它通常保留缩放参数 γ。
- Pre-Norm 和 Post-Norm 的差异不只是代码顺序。 它会影响残差路径和训练行为。
记住这 5 件事
- Residual 让子层只学习需要补充的变化量。
- 残差旁路为信息和梯度提供更直接的通道。
- LayerNorm 会减均值并按标准差缩放。
- RMSNorm 不减均值,主要按均方根调整尺度。
- 现代 LLM 常用
x + Sublayer(RMSNorm(x))的 Pre-Norm 结构。
第十课复习总图
下一课继续看另一个基础问题:模型没有钟表和坐标,怎样知道 Token 的先后顺序?