先说结论
残差连接通过让梯度直接跳过子层的"捷径"实现深层网络的可训练性,归一化通过稳定每一层的激活值分布保证训练过程的数值稳定性——两者共同构成了使深层 Transformer 可训练的基础设施。
为什么我会单独记这一篇
深层神经网络训练有两个根本性困难:
-
梯度消失/爆炸:在反向传播中,梯度需要经过所有层传递。当层数增加时,梯度在逐层传递中可能指数级衰减(消失)或增长(爆炸),导致浅层参数几乎不更新或训练不稳定。
-
内部协变量偏移(Internal Covariate Shift):每一层的输入分布会随着前面层参数的更新而不断变化,导致每一层需要不断适应新的输入分布,训练效率降低。
残差连接解决第一个问题:为梯度提供直接回传的"高速公路",不受子层变换的影响。
归一化解决第二个问题:将每一层的输出(或输入)归一化到稳定的分布范围,减少层间依赖。
这两个机制共同使得训练 100 层甚至更深的 Transformer 成为可能。没有它们,即使是原始 Transformer 的 6 层堆叠都会面临严重的训练困难。
先把核心脉络捋清楚
残差连接(Residual Connection / Skip Connection)
公式:
output = x + Sublayer(x)
残差连接将子层的输入 x 直接加到子层的输出上。子层只需要学习"增量修改"(即 f(x) = H(x) - x,残差),而非从零开始学习完整的映射 H(x)。
关键性质:
- 梯度直通:在反向传播中,梯度可以沿着 x + Sublayer(x) 中的 x 直接回传,不经过 Sublayer 的参数。公式为 dL/dx = dL/doutput * (1 + dSublayer/dx),其中 1 保证了梯度的最小值。
- 恒等映射初始化:如果将子层参数初始化为零(或接近零),则初始状态下 output ≈ x,整个层近似恒等映射。这意味着增加层数至少不会使模型变差。
- 信息保留:浅层学到的特征可以通过残差路径直接传递到深层,不会被中间层"覆盖"。
Layer Normalization(层归一化)
公式:
mu = mean(x)
sigma = std(x)
LayerNorm(x) = gamma * (x - mu) / sqrt(sigma^2 + epsilon) + beta
其中 gamma 和 beta 是可学习的参数(scale 和 shift),epsilon 是防止除零的小常数(通常 1e-5)。
LayerNorm 对每个 token 的特征向量独立归一化(沿特征维度计算均值和方差),不依赖 batch 中的其他样本。
关键性质:
- 独立于 batch size:与 BatchNorm 不同,LayerNorm 不需要计算 batch 统计量,因此适用于任意 batch size(包括 batch_size=1 的推理场景)。
- 适用于变长序列:每个 token 独立归一化,不受序列长度影响。
- 可学习的缩放和平移:gamma 和 beta 允许模型在需要时"恢复"归一化前的分布。
RMSNorm(Root Mean Square Normalization)
公式:
RMS(x) = sqrt(mean(x^2))
RMSNorm(x) = gamma * x / RMS(x)
RMSNorm 简化了 LayerNorm:
- 不减均值:LayerNorm 先减去均值再除以标准差,RMSNorm 直接除以 RMS 值。
- 没有 beta 参数:不进行平移,只有可学习的缩放参数 gamma。
- 计算更快:省略了均值计算和减法操作。
Zhang & Sennrich(2019)的实验表明,RMSNorm 在语言模型上的性能与 LayerNorm 几乎没有差别,但计算效率更高。
Post-Norm vs Pre-Norm
这是 Transformer 归一化策略中最重要的设计选择。
Post-Norm(原始 Transformer,Vaswani 2017)
output = LayerNorm(x + Sublayer(x))
归一化在残差连接之后应用。
Pre-Norm(GPT-2、LLaMA 等现代模型)
output = x + Sublayer(LayerNorm(x))
归一化在子层之前应用,残差路径上没有任何变换。
原理拆开看
Post-Norm 的梯度问题
在 Post-Norm 中,残差路径经过 LayerNorm:
output = LayerNorm(x + Sublayer(x))
反向传播时,梯度必须通过 LayerNorm 回传。LayerNorm 的梯度涉及方差和均值的导数,这会导致梯度被重新缩放。在深层网络中,这种重复缩放可能导致梯度不稳定——有些层梯度被放大,有些被缩小。
这就是为什么原始 Transformer 需要仔细的学习率 warmup(先用小学习率训练几千步,再逐渐增加到目标学习率)。没有 warmup,Post-Norm Transformer 的训练可能在最初几步就崩溃。
Pre-Norm 的梯度优势
在 Pre-Norm 中,残差路径完全不经过归一化:
output = x + Sublayer(LayerNorm(x))
反向传播时,沿着 x 路径的梯度为 dL/dx = dL/doutput * 1,直接传递,不被任何变换缩放。这意味着无论网络多深,至少有一条路径的梯度保持不变。
Xiong 等人(2020)在 "On Layer Normalization in the Transformer Architecture" 中从理论上分析了这一现象,证明 Pre-Norm 的梯度范数更稳定,不需要 warmup 即可训练。
Pre-Norm 的潜在劣势
一些研究表明,Post-Norm 在充分调优的情况下可能达到略高的性能上限。这是因为 Post-Norm 中归一化作用于残差之后的完整向量,提供了更强的"重塑"能力。但这种优势需要大量调优才能体现,且不稳定。
实践中,Pre-Norm 的稳定性和易用性远比 Post-Norm 的理论上限更重要,这也是几乎所有现代 LLM 选择 Pre-Norm 的原因。
为什么 RMSNorm 足够
LayerNorm 的两步操作是:(1) 中心化(减均值)(2) 缩放(除标准差)。
中心化的作用是确保特征均值为零。但在 Transformer 中,残差连接本身就倾向于保持零均值(因为子层的输出与输入相加,初始化时子层输出接近零)。因此,显式减去均值的收益不大,反而增加了计算开销。
RMSNorm 只保留缩放操作,省略了中心化。实验表明这在 Transformer 中几乎不影响性能,因为 Transformer 的激活分布本身就接近零均值。
放到工程里怎么落
现代 LLM 的典型归一化配置
以 LLaMA 为例:
# Pre-Norm + RMSNorm
x = x + attention(rms_norm(x)) # 自注意力子层
x = x + ffn(rms_norm(x)) # FFN 子层
- 使用 RMSNorm 而非 LayerNorm。
- 使用 Pre-Norm 而非 Post-Norm。
- 不使用偏置项(gamma 是 RMSNorm 唯一的可学习参数)。
- epsilon 通常设为 1e-5 或 1e-6。
归一化位置的选择
除了 Pre-Norm 和 Post-Norm,还有其他设计选择:
- Sandwich-Norm:在子层前后都加归一化。即 output = LayerNorm(x + Sublayer(LayerNorm(x)))。理论上提供更强的稳定性,但增加了计算量。
- 仅归一化残差分支:一些变体只在残差连接的"跳跃"路径上加归一化。
训练稳定性技巧
- 梯度裁剪:即使使用 Pre-Norm,也建议在训练早期使用梯度裁剪(clip_grad_norm = 1.0),防止偶尔的梯度尖峰。
- 学习率 warmup:Pre-Norm 对 warmup 的需求大大降低,但短 warmup(100-1000 步)仍然有助于稳定初期训练。
- 初始化:残差分支的最后一层通常使用更小的初始化(如将权重除以 sqrt(2*N_layers)),确保深层中残差分支的贡献不会过大。
推理时的注意事项
归一化在推理时也需要计算,因此影响推理延迟。RMSNorm 比 LayerNorm 少一次均值计算,在高吞吐推理场景中是有意义的优化。部分推理框架(如 vLLM、TensorRT-LLM)会将 RMSNorm 融合到 CUDA kernel 中以减少显存访问。
与相邻概念的区别
- LayerNorm vs BatchNorm:BatchNorm 沿 batch 维度计算统计量,依赖大 batch 且不适用于变长序列;LayerNorm 沿特征维度计算,独立于 batch size。
- LayerNorm vs RMSNorm:RMSNorm 省略了中心化步骤,只有缩放参数,计算更快,性能相当。
- Pre-Norm vs Post-Norm:归一化的位置不同。Pre-Norm 训练更稳定,Post-Norm 可能上限略高但需要更多调优。
- 残差连接 vs DenseNet 的密集连接:DenseNet 将所有前层输出拼接,残差连接只是加法跳跃,更简洁高效。
设计时真正要权衡什么
| 选择 | 优势 | 代价 |
|---|---|---|
| Pre-Norm | 训练稳定、不需要 warmup | 可能上限略低于 Post-Norm |
| Post-Norm | 理论上可能更高上限 | 训练不稳定、需要仔细调优 |
| LayerNorm | 完整的归一化 | 计算稍多 |
| RMSNorm | 计算高效、性能相当 | 省略了中心化 |
| 偏置项(beta) | 额外的灵活性 | 增加参数、现代模型通常去掉 |
容易踩的坑
- Pre-Norm 和 Post-Norm 混用:在不同层使用不同的归一化策略,或预训练和微调之间不一致,会导致性能下降。
- epsilon 值不当:epsilon 过大会过度平滑特征,过小可能导致数值不稳定(尤其在混合精度训练中)。
- 梯度裁剪遗漏:在训练深层模型(>12 层)时,即使是 Pre-Norm 也可能偶尔出现梯度尖峰。
- gamma 初始化不当:如果 gamma 初始化过大,残差分支的信号可能被淹没;过小则归一化效果减弱。通常初始化为 1.0。
- 忽略归一化的计算开销:虽然单次归一化计算量不大,但在大模型中每层都有两次归一化(注意力前 + FFN 前),累积开销不可忽视。
工程落地时我会怎么做
- 默认使用 Pre-Norm + RMSNorm:这是 LLaMA、Mistral、Gemma 等主流模型的配置,已经过充分验证。
- 不使用偏置项:现代 LLM 普遍去掉所有偏置,包括归一化中的 beta 参数。
- 在推理时融合 RMSNorm kernel:将 RMSNorm 计算与相邻操作融合,减少显存访问。
- gamma 初始化为 1.0:确保初始状态下归一化层的输出与输入一致。
- 训练时监控梯度范数:如果梯度范数突然增大,考虑减小学习率或增强梯度裁剪。
如果要对外讲,可以怎么概括
建议结构:
- 先讲为什么需要这两个机制:深层网络的梯度问题和训练不稳定。
- 写出残差连接的公式,解释梯度直通的含义。
- 写出 LayerNorm 的公式,解释每个步骤。
- 重点对比 Pre-Norm vs Post-Norm:公式差异、梯度行为、实际选择。
- 简述 RMSNorm 为何足够(省略中心化,计算更快)。
常见面试追问:
- 为什么 Pre-Norm 不需要 warmup?(残差路径上梯度直接传递,不被归一化重新缩放)
- RMSNorm 和 LayerNorm 的区别?(省略中心化步骤和 beta 参数)
- 残差连接为什么有效?(梯度直通 + 恒等映射初始化)
最后记几条
- Pre-Norm 是现代标准:几乎所有 2022 年后的 LLM 都使用 Pre-Norm,不再使用原始 Transformer 的 Post-Norm。
- RMSNorm 取代 LayerNorm:计算更快,性能相当,LLaMA 等模型验证了这一点。
- 残差连接的核心是梯度直通:output = x + Sublayer(x),梯度至少有一条路径不受子层影响。
- Post-Norm 需要学习率 warmup:因为梯度必须经过归一化层,可能被重新缩放导致不稳定。
- 归一化的位置比归一化的方法更重要:Pre-Norm vs Post-Norm 的影响远大于 LayerNorm vs RMSNorm。
面试高频题
QUESTION Pre-Norm 和 Post-Norm 有什么区别?哪个更好? Post-Norm(原始 Transformer):,归一化在残差之后。 Pre-Norm(现代 LLM):,归一化在子层之前。
核心区别在于梯度路径:Pre-Norm 中残差路径 完全不经过归一化,梯度直接传递;Post-Norm 中梯度必须通过 LayerNorm 回传,可能被重新缩放导致不稳定。
结论:Pre-Norm 训练更稳定、不需要 warmup,是现代 LLM 的标准选择(LLaMA、Mistral、Gemma 等)。Post-Norm 理论上上限可能略高,但需要大量调优。
QUESTION RMSNorm 和 LayerNorm 有什么区别?为什么现代模型用 RMSNorm?
特性 LayerNorm RMSNorm 均值中心化 减去均值 不减均值 缩放 除以标准差 除以 RMS 值 可学习参数 (缩放)+ (平移) 仅 (缩放) 计算量 较多(均值+方差) 较少(仅 RMS) RMSNorm 省略了中心化步骤,因为 Transformer 中残差连接本身就倾向于保持零均值。实验表明性能几乎无差别,但计算更快。LLaMA、Mistral 等均使用 RMSNorm。
QUESTION LayerNorm 和 BatchNorm 的区别?
维度 BatchNorm LayerNorm 计算方向 沿 batch 维度 沿特征维度 依赖 batch size 是(小 batch 不稳定) 否 变长序列 不适用 适用 推理行为 需要 running stats 无需额外统计量 适用场景 CNN、图像 Transformer、NLP
QUESTION 残差连接为什么有效?
- 梯度直通:,梯度至少有一条路径不被子层衰减
- 恒等映射初始化:子层参数初始化为零时 ,增加层数至少不会变差
- 信息保留:浅层特征通过残差路径直接传递到深层,不被中间层"覆盖"
QUESTION 为什么 Post-Norm 需要 warmup 而 Pre-Norm 不需要? Post-Norm 中残差路径经过 LayerNorm,梯度被重新缩放。深层网络中,靠近输入层的梯度可能被多次缩放后变得极小或极大,导致训练初期不稳定。Warmup 用小学习率"热身"。Pre-Norm 的残差路径完全不经过归一化,梯度直接传递,不存在这个问题。
现代 LLM 归一化配置
# LLaMA 配置:Pre-Norm + RMSNorm
x = x + attention(rms_norm(x)) # 自注意力子层
x = x + ffn(rms_norm(x)) # FFN 子层
# 不使用偏置项(bias=False)
# epsilon = 1e-5 或 1e-6
# gamma 初始化为 1.0
延伸阅读
-
Transformer — 归一化和残差在整体架构中的位置
-
FFN与激活函数 — FFN 子层与归一化的配合
-
注意力机制 — 注意力子层与归一化的配合
-
注意力优化前沿 — 归一化改进与注意力优化的关系
参考资料
- Vaswani, A. et al. (2017). "Attention Is All You Need." — Post-Norm 的原始设计。
- Xiong, R. et al. (2020). "On Layer Normalization in the Transformer Architecture." — Pre-Norm vs Post-Norm 的理论分析。
- Zhang, B. & Sennrich, R. (2019). "Root Mean Square Layer Normalization." NeurIPS 2019. — RMSNorm 的原始论文。
- He, K. et al. (2016). "Deep Residual Learning for Image Recognition." — 残差连接的原始论文(ResNet)。
- Ba, J.L. et al. (2016). "Layer Normalization." — LayerNorm 的原始论文。
- Touvron, H. et al. (2023). "LLaMA: Open and Efficient Foundation Language Models." — Pre-Norm + RMSNorm 的工程实践。
延伸阅读
- 正则化与泛化 — Dropout/BatchNorm/LabelSmoothing 在深度学习中的完整解读