跳转至

五: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。

一个通用形式可以写成:

y = normalized(x) * gamma + beta
其中 normalized 的统计维度决定了不同 normalization 方法的差异。

3. 归一化维度是核心差异

理解 BN、LN、RMSNorm 的关键是看“对哪些维度求统计量”。 假设 Transformer hidden states 的 shape 是:

x: [B, T, H]
其中: - B 是 batch size。

  • T 是 sequence length。

  • H 是 hidden size。

LayerNorm 通常对最后一维 H 求均值和方差。也就是对每个样本、每个 token 独立归一化:

mean/var over H
BatchNorm 更常见于 CNN 或 MLP,它通常对 batch 维和空间维统计每个 channel 的均值方差。对于序列数据,如果直接使用 BN,统计量会依赖 batch 内样本和序列长度,容易受 padding、长度变化、batch size 和分布差异影响。 RMSNorm 也通常沿 hidden dimension 计算,但只计算均方根,不减均值。

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、生成推理和样本依赖有关。

img

5. BatchNorm 的训练与推理差异

BN 的训练和推理行为不同。 训练时:

使用当前 mini-batch 的 mean/var
更新 running_mean / running_var
推理时:

使用 running_mean / running_var
不再依赖当前 batch 统计
这种差异在图像分类中通常可接受,但在 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
其中 gammabeta 的 shape 通常是:

[H]
LN 的重要特点: - 不依赖 batch size。

  • 训练和推理行为一致。

  • 适合变长序列。

  • 每个 token 独立归一化 hidden dimension。

  • Transformer 中应用广泛。

这也是 NLP 和 LLM 中常用 LN 或 LN 变体的根本原因。

img

7. LayerNorm 的 Shape 直觉

在 Transformer 中:

x: [B, T, H]
LayerNorm normalized_shape = H
对每个 token 的 hidden vector 做归一化:

x[b, t, :] -> mean/var over H -> normalized vector
不会跨 batch 统计,也不会把不同 token 混在一起统计。 这种性质对序列建模很重要。每个 token 的表示独立进行数值稳定化,不受同 batch 其他样本长度、内容、padding 影响。

8. LayerNorm 的参数

标准 LayerNorm 通常包含两个可学习参数:

gamma: [H]
beta:  [H]
归一化后再做仿射变换:

y = gamma * x_hat + beta
gamma 允许模型恢复或调整每个 hidden dimension 的尺度,beta 允许模型调整偏移。没有这两个参数,归一化会限制模型表示能力。 有些现代 LLM 会使用不带 bias 的 normalization,或者使用 RMSNorm 只保留 scale 参数,这与模型设计和训练稳定性有关。

9. RMSNorm

RMSNorm 是 Root Mean Square Layer Normalization。它和 LayerNorm 类似,通常也沿 hidden dimension 做逐 token 归一化,但它不减均值,只按均方根缩放。 对于 hidden vector x

RMS(x) = sqrt(mean(x_i^2) + eps)
y = x / RMS(x) * gamma
对比 LayerNorm:

LayerNorm: (x - mean(x)) / sqrt(var(x) + eps) * gamma + beta
RMSNorm:   x / sqrt(mean(x^2) + eps) * gamma
RMSNorm 省掉了均值中心化,也常省掉 beta。它计算更简单,速度和显存略有优势,在很多现代 decoder-only LLM 中被采用,例如 LLaMA 系列和一些 Qwen 系列模型。

10. RMSNorm 的直觉

RMSNorm 只控制向量的整体尺度,不强制把均值变成 0。它关注的是 hidden vector 的均方根大小。 可以理解为:

LayerNorm: 控制中心和尺度
RMSNorm:   只控制尺度
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 常用。
若面试中被问“为什么不用 BatchNorm”,不要只说“因为 NLP 不适合”,要讲清统计维度和训练/推理差异。

12. Transformer Block 中 Norm 的位置

Normalization 在 Transformer block 中的位置决定了 pre-norm 和 post-norm。 一个 Transformer 子层可以抽象成:

Sublayer(x) = Attention(x) 或 MLP(x)
Post-Norm:

y = Norm(x + Sublayer(x))
Pre-Norm:

y = x + Sublayer(Norm(x))
两者都使用 residual connection,但 norm 的位置不同。这个位置差异会显著影响深层 Transformer 的训练稳定性。

13. Post-Norm Transformer

原始 Transformer 使用 post-norm:

x = LayerNorm(x + MultiHeadAttention(x))
x = LayerNorm(x + FFN(x))
post-norm 的特点是每个子层输出都会经过归一化,因此传给下一层的表示尺度规范。 但 post-norm 的残差路径不是完全“干净”的恒等路径,因为残差相加后还要经过 Norm。深层网络中,梯度需要穿过许多 normalization 操作,可能导致训练不稳定,尤其在层数很深、学习率较大、warmup 不足时更明显。 原始 Transformer 层数相对较浅,post-norm 可以工作。现代深层 LLM 通常更倾向 pre-norm 或其变体。

14. Pre-Norm Transformer

pre-norm 把 normalization 放在子层之前:

x = x + MultiHeadAttention(LayerNorm(x))
x = x + FFN(LayerNorm(x))
pre-norm 的关键优势是 residual path 更接近恒等映射。输出中有一条直接的 x -> x + ... 路径,梯度可以更容易从高层传到低层。 这使 pre-norm 更适合训练很深的 Transformer,通常对学习率 warmup 和初始化更不敏感。 代价是每层输出没有被立即强制归一化,深层堆叠后表示尺度可能逐渐增长。因此一些模型会在最后加 final norm,或者使用 residual scaling、特殊初始化等稳定手段。

15. Pre-Norm 与 Post-Norm 的梯度直觉

pre-norm:

x_{l+1} = x_l + F(Norm(x_l))
梯度中存在一条接近恒等的残差通路:

d x_{l+1} / d x_l = I + ...
这让梯度更容易反向传播。 post-norm:

x_{l+1} = Norm(x_l + F(x_l))
梯度必须穿过 Norm:

d x_{l+1} / d x_l = J_Norm * (I + ...)
其中 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:
  用向量范数缩放表示。
这些变体都围绕同一个问题:如何在深层 Transformer 中保持激活和梯度尺度稳定。

19. 为什么 LLM 常用 RMSNorm + Pre-Norm

现代 decoder-only LLM 常使用:

x = x + Attention(RMSNorm(x))
x = x + MLP(RMSNorm(x))
final = RMSNorm(x)
原因可以概括为: - 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
RMSNorm 的 PyTorch 风格:

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
Pre-Norm Transformer block:

def prenorm_block(x):
    x = x + attention(norm1(x))
    x = x + mlp(norm2(x))
    return x
Post-Norm Transformer block:

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="