9.6 残差连接与层归一化
9.6.1 生活比喻:残差连接是”复印件 + 修改批注”
想象你在修改一份合同。每次修改时,你拿到上一轮的版本(输入 x),在上面用红笔批注修改(SubLayer(x)),然后把原件和批注版本并排存档。下一轮修改时,审阅的人可以同时看到原件和最新批注——原件是一条”直达通道”,不管中间加了多复杂的批注,原始信息始终可追溯。
这就是残差连接(Residual Connection)的核心直觉:
Output = SubLayer(x) + x
SubLayer(x) 是”修改”(可能很大、很复杂),x 是”原件”(始终保留)。如果 SubLayer 把信息改坏了(梯度接近零),原件 x 仍然能够畅通无阻地传递到下一层和反向传播的梯度路径。
9.6.2 深层网络的退化问题
在没有残差连接的情况下,堆叠更多层反而会导致训练误差上升——这不是过拟合(过拟合是训练误差下降但验证误差上升),而是优化困难。
梯度在反向传播中每经过一层就被乘以该层的雅可比矩阵。可以把这个过程想象成”传话游戏”:第一层说一个数,每经过一层乘以一个随机因子。如果因子普遍小于 1,传 100 层后数值趋近于 0(梯度消失);如果普遍大于 1,传 100 层后数值爆炸(梯度爆炸)。无论哪种情况,浅层的参数都收不到有效的学习信号。
残差连接的梯度公式揭示了解决方案:
∂L/∂x = ∂L/∂y · (∂SubLayer(x)/∂x + I)
其中 I 是单位矩阵。无论 ∂SubLayer(x)/∂x 多小,梯度至少有一条”高速公路”(identity path,即乘以 I 的部分)可以直通浅层。即使 SubLayer 的梯度完全消失,信号也能按原值回传。这就是为什么 100 层甚至 1000 层的现代 Transformer 可以稳定训练——残差连接确保了梯度不会在层数增加时指数衰减 1。
9.6.3 Post-LN vs Pre-LN:归一化放在哪里
LayerNorm 的位置看似是一个细枝末节的实现细节,实际上深刻影响训练的稳定性和收敛速度。两种放置方案:
Post-LN(原始 Transformer 方案):
x → SubLayer(x) → Add(x) → LayerNorm → 输出
即 LayerNorm(x + SubLayer(x))。在这种方案中,梯度路径必须经过 LayerNorm。LayerNorm 会缩放梯度——它的归一化操作除以标准差,这改变了梯度的尺度。在深层网络中,每一层的 LayerNorm 都对梯度施加一次缩放变换,这些缩放因子的乘积在深层会出现方差累积,导致训练不稳定。
原始 Transformer 论文需要精心设计的学习率预热(warmup)来缓解这个问题:训练初期用极小的学习率(逐渐增大到目标学习率),让模型在梯度还算稳定的阶段先找到好的初始状态。如果不加 warmup,Post-LN 的 Transformer 在训练初期极易发散 2。
Pre-LN(2026 年 LLM 标准方案):
x → LayerNorm → SubLayer(x) → Add(x) → 输出
即 x + SubLayer(LayerNorm(x))。关键区别:残差路径不再经过 LayerNorm。梯度可以通过 identity path 畅通无阻地回流,不需要经过 LayerNorm 的缩放。这带来了两个显著优势:
- 训练更稳定:不需要复杂的学习率 warmup,从头到尾使用恒定学习率或简单的余弦衰减即可
- 梯度范数更均匀:各层的梯度范数分布更一致,不会出现某些层梯度极小、某些层梯度爆炸的情况
GPT-2 首次大规模验证了 Pre-LN 的稳定性,此后所有 GPT 系列、Llama 系列、Qwen 系列、Mistral 系列均采用 Pre-LN 3。
9.6.4 LayerNorm 公式与直观理解
μ = (1/d) · Σ_i x_i -- 均值
σ² = (1/d) · Σ_i (x_i - μ)² -- 方差
y_i = (x_i - μ) / √(σ² + ε) · γ_i + β_i -- 归一化 + 缩放 + 平移
LayerNorm 对每个 token 的 d_model 维向量进行归一化——跨特征维度,而非跨 batch。这与 BatchNorm(跨 batch 维度归一化)有本质区别:
- BatchNorm 对 batch 中的每个特征维度,计算该维度上所有样本的均值和方差。对 batch size 敏感,在变长序列和小 batch 场景下不稳定。
- LayerNorm 对每个样本独立计算 d_model 个特征的均值和方差。对 batch size 完全不敏感,天然适合 NLP 中变长序列和变 batch size 的场景。
直观理解:经过注意力层和 FFN 层后,不同 token 的表示可能在数值范围上差异很大——有的 token 的某些维度激活值很大(比如 100),有的很小(比如 0.01)。LayerNorm 将每个 token 的表示重新校准到均值为 0、方差为 1 的标准分布。这就好比每次会议讨论后,主持人用统一的方式总结每个人的发言——不管谁说了多少、说得多激烈,都整理成统一格式的纪要。
两个可学习参数 γ 和 β 是 LayerNorm 的”调节旋钮”:归一化把所有特征拉到了标准分布,但模型可能确实需要”某个维度的值比其他维度更大”来表达某些信息。γ(缩放)和 β(平移)允许模型逐维度地恢复被归一化抹掉的差异化表达能力。极端情况下,模型可以把 γ 设得很小、β 设为 0,相当于关闭 LayerNorm;也可以把 γ 设得很大,放大某些维度的信号。
9.6.5 RMSNorm:砍掉均值,只留缩放
RMSNorm 是 LayerNorm 的简化版,去掉了均值减除:
RMS(x) = √((1/d) · Σ_i x_i²)
y_i = x_i / RMS(x) · γ_i
关键发现来自 Zhang & Sennrich (2019):LayerNorm 的核心收益来自缩放(除以标准差),而非中心化(减去均值)。减去均值在某些情况下甚至会略微损害性能——原因是均值为 0 的约束限制了模型表达的灵活性。
RMSNorm 的实现比 LayerNorm 快约 15-20%(省去了均值计算和减法操作),效果相当或略优。Llama 系列(1/2/3/4)、T5、Mistral 均使用 RMSNorm。2026 年,RMSNorm 已成为 LLM 的标配归一化方案 5。
9.6.6 DeepNorm:超深网络的归一化进阶
当 Transformer 层数超过 100 层时,即使 Pre-LN 也可能出现训练不稳定。DeepNorm(微软,2022)在残差连接中引入了一个额外的缩放因子 α:
Output = x + α · SubLayer(LayerNorm(x))
其中 α 是一个小于 1 的常数(根据层数计算)。它本质上限制了子层输出对残差路径的”扰动幅度”,防止深层网络中的累积扰动破坏训练的稳定性。DeepNorm 让 1000 层的 Transformer 稳定训练成为可能 6。
对于大多数 20-80 层的 LLM(Llama 3 是 80 层,Qwen 2.5 72B 是 80 层),Pre-LN + RMSNorm 已经足够稳定。DeepNorm 主要用于实验性超深网络。
9.6.7 实践要点
- 残差连接虽然简单,但实现错误是导致训练不稳定的最常见原因之一。正确实现是
x = x + layer(norm(x)),而不是x = norm(x + layer(x))(后者是 Post-LN),也不是x = layer(x) + norm(x)(完全错误)。 - 2026 年写新模型:直接用 Pre-LN + RMSNorm。这是所有主流 LLM 的选择,经过大规模验证。
- 相关概念补充:关于归一化在整个训练流程中的位置,见 归一化 (Normalization);残差连接的更广泛讨论见 第6章 · 神经网络基础。
← 上一节:9.5 前馈网络(FFN)— Transformer 的"知识存储" | 下一节:9.7 完整编码器-解码器架构 →
注释
-
He et al., “Deep Residual Learning for Image Recognition”, 2016, https://arxiv.org/abs/1512.03385 ↩
-
Vaswani et al., 2017, Section 5.3 ↩
-
Radford et al., “Language Models are Unsupervised Multitask Learners”, 2019, https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdf ↩
-
Ba et al., “Layer Normalization”, 2016, https://arxiv.org/abs/1607.06450 ↩
-
Zhang & Sennrich, “Root Mean Square Layer Normalization”, 2019, https://arxiv.org/abs/1910.07467 ↩
-
Wang et al., “DeepNet: Scaling Transformers to 1,000 Layers”, 2022, https://arxiv.org/abs/2203.00555 ↩
-
Ba et al., “Layer Normalization”, 2016, https://arxiv.org/abs/1607.06450 ↩
-
Zhang & Sennrich, 2019 ↩
-
He et al., 2016 ↩