LayerNorm 和 RMSNorm 有什么区别?Pre-LN 和 Post-LN 呢?
简化版
LayerNorm 和 RMSNorm 都是对单个 token 的特征向量做归一化,稳定训练:
- LayerNorm 先减均值、再除标准差,带缩放 γ 和偏移 β。
- RMSNorm 不做中心化,通常也不设偏移 β,只按**均方根(RMS)**缩放;公式与实现更简,一些现代模型采用它,但质量与速度收益需实测。
Pre-LN 和 Post-LN 指归一化放在残差块的哪个位置:
- Post-LN(原始 Transformer):归一化放在残差相加之后,深层训练通常更敏感。
- Pre-LN:归一化放在子层之前,保留更直接的恒等残差路径,通常更易优化深层网络;并非任何配方下都更好。
详细版
为什么要归一化
归一化控制每个 token 表示的尺度并改变优化几何,有助于数值稳定和梯度传播。“内部协变量偏移”只是历史直觉,不能当作公认的唯一机制。
LayerNorm(Layer Normalization)
LN(x) = γ ⊙ (x − μ) / √(σ² + ε) + β
μ = mean(x), σ² = var(x) # 在特征维度上统计
- 对每个 token 的特征向量独立归一化(与 batch 无关,适合变长序列)。
- 有两组可学习参数:缩放 γ、偏移 β。
RMSNorm(Root Mean Square Norm)
RMSNorm(x) = γ ⊙ x / RMS(x), RMS(x) = √(mean(x²) + ε)
- 不减均值、不加偏移,只用 RMS 缩放,只保留 γ。
- 算术步骤更少,但端到端收益取决于融合 kernel 和访存;一些架构取得了与 LayerNorm 有竞争力的效果,不能概括为普遍相当或更好。
Pre-LN vs Post-LN
| Post-LN(原始) | Pre-LN(现代) | |
|---|---|---|
| 结构 | x + Sublayer(x) 后再 LN | x + Sublayer(LN(x)) |
| 深层训练 | 往往更敏感 | 通常更易优化 |
| 学习率预热 | 常需要谨慎调节 | 通常敏感度较低,仍可能使用 |
| 最终性能 | 调好时可能略高 | 稳定、主流 |
完整版教学
一、归一化到底在解决什么问题
训练深层网络时,激活尺度、残差累积和各层 Jacobian 会共同影响数值与梯度。LayerNorm/RMSNorm 让每个 token 的通道尺度受控,并重参数化后续子层的输入,从而改善优化稳定性。
LayerNorm 会中心化并按方差缩放,RMSNorm 只控制均方根,因此“都拉到零均值单位方差”并不准确。它们通常改善稳定性,但可用学习率和最大深度仍取决于初始化、残差缩放、优化器与精度。
二、为什么 Transformer 用 LayerNorm 而不是 BatchNorm
CNN 里常用 BatchNorm(按 batch 统计每个通道的均值方差),但 Transformer 用 LayerNorm,原因关键:
- 序列变长、batch 内不齐:NLP 的序列长度不一,BatchNorm 跨样本、跨位置统计不稳定;LayerNorm 只在单个 token 自己的特征维上统计,与 batch 大小、序列长度无关。
- 推理与训练一致:BatchNorm 训练/推理行为不同(要维护running统计),LayerNorm 没这个问题,逐样本即时计算。
- 自回归友好:解码时逐 token 生成,LayerNorm 对单个 token 就能算,天然契合。
记住:LayerNorm 归一化的方向是”每个 token 的特征向量内部”,和 batch 无关,这是它适配 Transformer 的根本原因。
三、RMSNorm:去掉中心化的尺度归一化
RMSNorm 的设计问题是:能否只保留重缩放而去掉重新中心化。原始实验表明这种简化在其测试任务上有效,但不能据此断言中心化在所有架构里贡献都不大。
于是 RMSNorm 直接砍掉减均值和偏移 β:
LayerNorm: y = γ ⊙ (x − μ)/σ + β # 4 步:求均值、求方差、中心化+缩放、偏移
RMSNorm: y = γ ⊙ x / RMS(x) # 2 步:求均方根、缩放
好处:
- 实现更简:少做中心化,通常没有 β;实际 kernel 可能仍主要受内存访问限制。
- 经验上可用:多个架构采用后取得良好效果,但与 LayerNorm 的公平优劣必须在同配方下消融。
因此 RMSNorm 成为常见选择之一;仍有模型使用 LayerNorm 或其他归一化,不能说“几乎清一色”或保证同样稳定性。
四、Pre-LN vs Post-LN:归一化摆在哪,决定能训多深
这是比「LN 还是 RMSNorm」更影响训练稳定性的选择。
Post-LN(原始 Transformer):
x = LN( x + Sublayer(x) ) # 先残差相加,再归一化
Post-LN 的跨层梯度连续经过归一化与子层 Jacobian,深层优化通常对初始化、学习率和 warmup 更敏感。但“必须 warmup 才能训练”不是数学必然,也有专门初始化和残差缩放方案改善它。
Pre-LN(当代主流):
x = x + Sublayer( LN(x) ) # 先归一化,再进子层,残差主干直连
好处:残差主干提供显式恒等项,梯度可沿这条路径传播,因此深层网络通常更易优化。它仍可能使用 warmup,残差流的幅度也可能随层累积,需要最终 Norm、缩放或初始化配合。
Pre-LN 与 Post-LN 的最终质量没有普适排序;差异会随深度、初始化和训练预算变化。DeepNorm、Sandwich-Norm 等方案进一步调整残差与归一化位置,说明选型不是简单二选一。
记忆图景:Post-LN 是「加完再洗」,残差路被反复洗、深层易乱;Pre-LN 是「洗完再加」,残差路一通到底、深层也稳。大模型要堆很深,所以选 Pre-LN。
五、把两组选择拼起来看现代大模型
当代主流大模型(如 Llama)的典型配方是:Pre-LN 的位置 + RMSNorm 的形式,即:
h = x + Attention( RMSNorm(x) )
y = h + FFN( RMSNorm(h) )
这个组合在多种模型中被验证为可扩展配方,但不是“现代 LLM 唯一标配”。面试应解释恒等残差路径与是否中心化的差异,并强调同训练预算消融。
六、用残差路径判断训练稳定性
设一个子层为 F。Pre-LN 写成 x_{l+1}=x_l+F(Norm(x_l)),梯度沿残差支路可直接跨过 F 和归一化;Post-LN 写成 x_{l+1}=Norm(x_l+F(x_l)),跨层梯度必须连续经过归一化。网络很深时,前一种恒等路径通常更容易优化,但这不代表它在任何规模上都一定质量更高。
LayerNorm 对 4096 维向量同时计算均值和方差;RMSNorm 只根据均方根缩放,不做中心化。少一次均值相关运算只是局部收益,端到端加速还取决于融合算子和内存访问,因此不能把“公式更短”直接等同于模型整体快一倍。
| 选择 | 主要收益 | 需要验证的边界 |
|---|---|---|
| Pre-LN | 深层梯度路径更直接 | 最终质量与残差尺度 |
| Post-LN | 经典结构、层输出已归一 | 深层训练稳定性与 warmup |
| RMSNorm | 计算更简、现代 LLM 常用 | kernel 支持与精度回归 |
七、常见误区与追问
- 误区:RMSNorm 与 LayerNorm 完全等价。 RMSNorm 不减均值,只按均方根缩放;二者归一化统计与表达并不相同。
- 追问:Transformer 为什么不用 BatchNorm? 序列长度、padding 和小批次会让跨样本统计不稳定,LayerNorm/RMSNorm 对每个 token 独立归一化。
- 追问:Pre-LN 为什么更易训练深层网络? 残差支路提供不经过子层与归一化的直接梯度路径,减轻连续变换造成的梯度困难。
- 误区:Pre-LN 在质量上总优于 Post-LN。 Pre-LN 更稳但可能带来有效深度等问题,具体质量依赖初始化、残差缩放、深度和训练配方。
- 追问:RMSNorm 公式更简单就一定显著提速吗? 端到端收益取决于融合 kernel 和访存占比,必须用目标硬件实测而不能只数算术操作。
八、加强记忆
两组选择要分开:LayerNorm 做中心化和方差缩放,通常有 γ/β;RMSNorm 只按均方根缩放,通常只有 γ。Post-LN 在残差相加后归一化;Pre-LN 在子层前归一化,保留更直接的恒等梯度路径。 Pre-LN + RMSNorm 是常见组合而非唯一答案;RMSNorm 不保证质量相当,Post-LN 也非必然训不动。最终比较稳定性、质量和目标硬件 kernel,同时记住两种 Norm 都按单个 token 的特征维统计、与 batch 统计无关。