五:Normalization 与 Pre-Norm/Post-Norm¶
来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247483793&idx=1&sn=fd202058bf58de385bc5902d43f05ab7&chksm=f01eb2e8c7693bfe778fbcb689ed907fabca9b474ddc71462791388514633db9920b3aa410b8#rd
1. 学习定位¶
Normalization 是深度网络稳定训练的重要技术。它通过对激活进行重新中心化、缩放或范数归一化,使不同层、不同 batch、不同 token 的数值范围更稳定,从而改善优化难度和梯度传播。 第五天重点是围绕 Transformer 面试最常考的四个问题建立闭环:
BatchNorm 为什么常用于 CNN,却不适合直接作为 Transformer/LLM 的默认归一化?
LayerNorm 为什么更适合 NLP 和 Transformer?
RMSNorm 相比 LayerNorm 省掉了什么,为什么现代 LLM 常用?
Pre-Norm 和 Post-Norm 的结构差异如何影响深层 Transformer 的梯度稳定性?
激活分布不稳定
-> normalization 稳定数值尺度
-> BN 沿 batch 统计,依赖 batch 分布和 running stats
-> LN 沿 hidden dimension 统计,逐样本逐 token 稳定
-> RMSNorm 只按 RMS 缩放,不减均值
-> Transformer block 中 norm 的位置形成 Post-Norm 和 Pre-Norm
-> Pre-Norm 更利于深层梯度传播,Post-Norm 输出规范但训练更依赖 warmup/初始化
2. Normalization 的作用¶
深层网络训练中,激活和梯度的尺度可能随层数变化而放大或缩小。如果每一层输入分布剧烈变化,优化器需要不断适应新的数值范围,训练会变慢或不稳定。 Normalization 的核心目标是让中间表示具有更可控的统计性质。常见操作包括: - 减去均值,使表示中心化。
-
除以标准差或均方根,使尺度稳定。
-
再乘以可学习缩放参数 gamma。
-
再加上可学习平移参数 beta。
一个通用形式可以写成:
其中 normalized 的统计维度决定了不同 normalization 方法的差异。3. 归一化维度是核心差异¶
理解 BN、LN、RMSNorm 的关键是看“对哪些维度求统计量”。 假设 Transformer hidden states 的 shape 是:
其中: -B 是 batch size。
-
T是 sequence length。 -
H是 hidden size。
LayerNorm 通常对最后一维 H 求均值和方差。也就是对每个样本、每个 token 独立归一化:
4. Batch Normalization¶
Batch Normalization 的基本形式是:
mu_B = mean_B(x)
sigma_B^2 = var_B(x)
x_hat = (x - mu_B) / sqrt(sigma_B^2 + eps)
y = gamma * x_hat + beta
B 不一定只表示 batch 维,而是指 BN 选定的统计维度。对 CNN 来说,BatchNorm2d 通常对 batch 和空间维求统计量,对每个 channel 独立归一化。
BN 的重要特点:
- 训练时使用当前 mini-batch 的均值和方差。
-
推理时使用训练过程中累积的 running mean 和 running variance。
-
统计量依赖 batch 分布。
-
batch size 太小或样本分布变化大时,统计量不稳定。
BN 在 CNN 中很有效,因为图像 batch 中不同样本空间结构较一致,channel 统计较稳定。它在 Transformer/LLM 中不是默认选择,原因与序列长度、padding、batch size、生成推理和样本依赖有关。
5. BatchNorm 的训练与推理差异¶
BN 的训练和推理行为不同。 训练时:
推理时: 这种差异在图像分类中通常可接受,但在 NLP/LLM 中会带来麻烦: - 推理时 batch size 可能为 1。-
生成是逐 token 的,自回归过程不适合依赖 batch 统计。
-
不同句子长度差异大,padding 会影响统计。
-
分布随 prompt、语言、任务变化明显。
-
分布式训练中同步 BN 成本更高。
因此面试中回答“为什么 Transformer 更常用 LayerNorm 而不是 BatchNorm”时,核心是:LN 不依赖 batch 统计,适合变长序列和自回归推理。
6. Layer Normalization¶
LayerNorm 对单个样本的隐藏维度求均值和方差。
对于 x: [B, T, H],LayerNorm 通常对每个 (b, t) 的 H 维向量归一化:
mu = mean(x_{b,t,:})
sigma^2 = var(x_{b,t,:})
x_hat = (x_{b,t,:} - mu) / sqrt(sigma^2 + eps)
y = gamma * x_hat + beta
gamma 和 beta 的 shape 通常是:
LN 的重要特点:
- 不依赖 batch size。
-
训练和推理行为一致。
-
适合变长序列。
-
每个 token 独立归一化 hidden dimension。
-
Transformer 中应用广泛。
这也是 NLP 和 LLM 中常用 LN 或 LN 变体的根本原因。
7. LayerNorm 的 Shape 直觉¶
在 Transformer 中:
对每个 token 的 hidden vector 做归一化: 不会跨 batch 统计,也不会把不同 token 混在一起统计。 这种性质对序列建模很重要。每个 token 的表示独立进行数值稳定化,不受同 batch 其他样本长度、内容、padding 影响。8. LayerNorm 的参数¶
标准 LayerNorm 通常包含两个可学习参数:
归一化后再做仿射变换: gamma 允许模型恢复或调整每个 hidden dimension 的尺度,beta 允许模型调整偏移。没有这两个参数,归一化会限制模型表示能力。 有些现代 LLM 会使用不带 bias 的 normalization,或者使用 RMSNorm 只保留 scale 参数,这与模型设计和训练稳定性有关。9. RMSNorm¶
RMSNorm 是 Root Mean Square Layer Normalization。它和 LayerNorm 类似,通常也沿 hidden dimension 做逐 token 归一化,但它不减均值,只按均方根缩放。
对于 hidden vector x:
LayerNorm: (x - mean(x)) / sqrt(var(x) + eps) * gamma + beta
RMSNorm: x / sqrt(mean(x^2) + eps) * gamma
10. RMSNorm 的直觉¶
RMSNorm 只控制向量的整体尺度,不强制把均值变成 0。它关注的是 hidden vector 的均方根大小。 可以理解为:
RMSNorm 的经验动机是:在深层 Transformer 中,重缩放对稳定训练非常关键,而重新中心化不一定总是必要。省掉 mean 计算后,计算更轻,结构更简单。 RMSNorm 并不总是比 LayerNorm 更好,但在现代 LLM 中非常常见,是面试高频点。11. BN、LN、RMSNorm 对比¶
核心对比:
BatchNorm:
统计量依赖 batch。
训练和推理行为不同。
CNN 中常用,LLM 中不常作为默认。
LayerNorm:
对单个样本/单个 token 的 hidden dimension 统计。
不依赖 batch。
训练和推理一致。
Transformer 中经典选择。
RMSNorm:
类似 LN,但不减均值,只按 RMS 缩放。
通常只有 scale 参数。
计算更轻,现代 LLM 常用。
12. Transformer Block 中 Norm 的位置¶
Normalization 在 Transformer block 中的位置决定了 pre-norm 和 post-norm。 一个 Transformer 子层可以抽象成:
Post-Norm: Pre-Norm: 两者都使用 residual connection,但 norm 的位置不同。这个位置差异会显著影响深层 Transformer 的训练稳定性。13. Post-Norm Transformer¶
原始 Transformer 使用 post-norm:
post-norm 的特点是每个子层输出都会经过归一化,因此传给下一层的表示尺度规范。 但 post-norm 的残差路径不是完全“干净”的恒等路径,因为残差相加后还要经过 Norm。深层网络中,梯度需要穿过许多 normalization 操作,可能导致训练不稳定,尤其在层数很深、学习率较大、warmup 不足时更明显。 原始 Transformer 层数相对较浅,post-norm 可以工作。现代深层 LLM 通常更倾向 pre-norm 或其变体。14. Pre-Norm Transformer¶
pre-norm 把 normalization 放在子层之前:
pre-norm 的关键优势是 residual path 更接近恒等映射。输出中有一条直接的x -> x + ... 路径,梯度可以更容易从高层传到低层。
这使 pre-norm 更适合训练很深的 Transformer,通常对学习率 warmup 和初始化更不敏感。
代价是每层输出没有被立即强制归一化,深层堆叠后表示尺度可能逐渐增长。因此一些模型会在最后加 final norm,或者使用 residual scaling、特殊初始化等稳定手段。
15. Pre-Norm 与 Post-Norm 的梯度直觉¶
pre-norm:
梯度中存在一条接近恒等的残差通路: 这让梯度更容易反向传播。 post-norm: 梯度必须穿过 Norm: 其中J_Norm 是 normalization 的 Jacobian。深层堆叠时,这会让梯度尺度更难控制。
这就是很多论文和工程实践中认为 pre-norm 更容易训练深层 Transformer 的核心直觉。
16. Warmup 与 Post-Norm¶
Transformer 训练常使用 learning rate warmup,即训练初期从较小学习率逐渐升高。 post-norm 结构中,训练初期某些层的梯度可能较大,如果直接使用较大学习率,参数更新会不稳定。warmup 可以在训练早期降低更新幅度,避免发散。 pre-norm 的梯度传播更稳定,因此通常对 warmup 的依赖较弱。但这不表示 pre-norm 完全不需要 warmup,实际训练仍常使用 warmup、梯度裁剪、合适初始化和学习率调度。
17. Pre-Norm 的局限¶
pre-norm 更稳定,但也有局限。 由于每层输出没有立刻被 Norm 约束,残差不断累加后,hidden states 的尺度可能随层数增长。深层 pre-norm 模型通常会使用: - final norm
-
residual scaling
-
合适初始化
-
RMSNorm
-
小心的学习率和 warmup
此外,有研究和经验指出 post-norm 在某些设置下可能有更好的最终表达或输出规范性,但训练深层模型更难。实际选择取决于深度、规模、优化策略和模型设计。
18. Sandwich Norm 与其他变体¶
除了标准 pre-norm/post-norm,还有一些变体:
Sandwich Norm:
在子层前后都放 norm。
DeepNorm:
通过残差缩放和初始化训练更深 Transformer。
RMSNorm + Pre-Norm:
现代 decoder-only LLM 常见组合。
ScaleNorm:
用向量范数缩放表示。
19. 为什么 LLM 常用 RMSNorm + Pre-Norm¶
现代 decoder-only LLM 常使用:
原因可以概括为: - pre-norm 提供稳定的残差梯度路径。-
RMSNorm 计算更简单,只控制尺度。
-
不依赖 batch 统计,适合变长文本和自回归推理。
-
final norm 约束最终 hidden state 的尺度。
-
工程上高效、稳定、易扩展到大规模模型。
这套组合不是唯一选择,但已经成为很多 LLM 架构的常见设计。
20. 常见实现参考¶
LayerNorm 的 PyTorch 风格:
import torch
def layer_norm(x, gamma, beta, eps=1e-5):
# x: [B, T, H]
mean = x.mean(dim=-1, keepdim=True)
var = ((x - mean) ** 2).mean(dim=-1, keepdim=True)
x_hat = (x - mean) / torch.sqrt(var + eps)
return x_hat * gamma + beta
def rms_norm(x, weight, eps=1e-6):
# x: [B, T, H]
rms = torch.sqrt(torch.mean(x * x, dim=-1, keepdim=True) + eps)
return x / rms * weight
def prenorm_block(x):
x = x + attention(norm1(x))
x = x + mlp(norm2(x))
return x
def postnorm_block(x):
x = norm1(x + attention(x))
x = norm2(x + mlp(x))
return x
21. 常见工程错误¶
Normalization 相关常见错误: - 把 BN 用在变长序列上却没有处理 padding 影响。
-
训练和推理时 BN mode 没切换,导致 running stats 异常。
-
LayerNorm 的 normalized_shape 写错,例如把
[T, H]写成[H]或反过来。 -
RMSNorm 的 eps 太小,在混合精度下出现数值问题。
-
忘记 final norm,导致 logits 前 hidden scale 不稳定。
-
pre-norm/post-norm 迁移权重时结构不匹配。
-
把 gamma/beta 或 RMSNorm weight 的 dtype/device 弄错。
-
在 fp16 下方差或 RMS 计算不稳定,没有合适 eps 或上转 fp32。
这些问题可能表现为 loss NaN、训练不收敛、输出重复、梯度爆炸、推理和训练行为不一致。
22. 面试中的核心表达¶
第五天内容可以压缩为:
Normalization 的本质是稳定激活尺度和梯度传播。
BN 按 batch 统计,训练推理行为不同,适合 CNN,但不适合作为 LLM 默认归一化。
LN 对每个样本/每个 token 的 hidden dimension 统计,不依赖 batch,适合 Transformer。
RMSNorm 是 LN 的轻量变体,只按均方根缩放,不减均值,现代 LLM 常用。
Post-Norm 是 Norm(x + Sublayer(x)),原始 Transformer 使用,但深层训练更难。
Pre-Norm 是 x + Sublayer(Norm(x)),残差路径更接近恒等,梯度更稳定。
现代 LLM 常用 RMSNorm + Pre-Norm + Final Norm。
23. 参考资料¶
-
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift: https://arxiv.org/abs/1502.03167
-
Layer Normalization: https://arxiv.org/abs/1607.06450
-
Root Mean Square Layer Normalization: https://arxiv.org/abs/1910.07467
-
On Layer Normalization in the Transformer Architecture: https://arxiv.org/abs/2002.04745
-
Learning Deep Transformer Models for Machine Translation: https://arxiv.org/abs/1906.01787
-
PyTorch BatchNorm1d: https://docs.pytorch.org/docs/stable/generated/torch.nn.BatchNorm1d.html
-
PyTorch LayerNorm: https://docs.pytorch.org/docs/stable/generated/torch.nn.LayerNorm.html
-
PyTorch RMSNorm: https://docs.pytorch.org/docs/stable/generated/torch.nn.RMSNorm.html
-
苏剑林解释 PreNorm 和 PostNorm:https://kexue.fm/archives/9009
-
苏剑林 Transformer 的初始化、参数化与标准化:https://kexue.fm/archives/8620
-
详细梳理多种 Normalization 方法:https://zhuanlan.zhihu.com/p/33173246
-
RMSNorm 代码实现:https://blog.csdn.net/Bug_makerACE/article/details/145621694
预览时标签不可点<div class="