CV 时代 BatchNorm 几乎默认开启,Transformer 从 2017 年第一版就用 LayerNorm,之后 BN 在这条线里彻底消失。这个更替常被当成"习惯",其实背后是几条硬约束,这篇逐条推。
两种统计量,一个方向之差
对激活 $x \in \mathbb{R}^{B \times d}$($B$ 个样本、$d$ 维特征):
$$ \underbrace{\mathrm{BN}: \;\hat x_i = \frac{x_i - \mu_B}{\sigma_B},\;\; \mu_B = \tfrac{1}{B}\sum_{i=1}^B x_i}_{\text{统计量沿 batch 轴取,跨样本}},\qquad \underbrace{\mathrm{LN}: \;\hat x_{it} = \frac{x_{it} - \mu_{it}}{\sigma_{it}},\;\; \mu_{it} = \tfrac{1}{d}\sum_{j=1}^d x_{it,j}}_{\text{统计量沿特征轴取,逐样本独立}}. $$
差别只有统计轴一个方向,后果是系统性的。
约束一:变长序列与 padding
NLP 输入长度不一,batch 内要 padding 到最长。BN 的 $\mu_B, \sigma_B$ 会被 pad token 的填充值污染:同一个句子,因为 batch 邻居长短不同,自己的归一化结果就不同。要修正就得做 masked 统计——公式不难,但前向、反向、running stats、推理去 padding 每个环节都要配套改,坑的数量随实现细节指数增长。LN 天然免疫:统计在特征维内,每个位置独立计算,pad 不 pad 不影响有效 token 的均值方差。
约束二:LLM 的 batch 形状让统计量失去意义
CNN 时代的 batch 是几百张独立同分布的图片,统计量是稳定的随机估计。LLM 训练的 micro-batch 长什么样?每卡 1~2 条长序列,batch 维上没几个样本,而每个样本内部几万个性质相近的位置。沿 batch 轴取统计,等于用两三个样本来估均值方差——噪声大到 $\sigma_B$ 本身需要额外正则。更要命的是数据并行:每张卡只见本地 batch,BN 要么接受各卡统计不一致(卡间行为分叉),要么每次前向做跨卡同步(延迟敏感,还和梯度通信抢流水线)。有人认真试过救 BN:PowerNorm(ICML 2020)把统计量改成平滑变体,能训——但相比 LN 没有任何胜出点,遂无人问津。
约束三:跨样本耦合破坏训练动力学
这条最本质。BN 前向里,样本 $i$ 的输出依赖样本 $j$ 的输入(经由 $\mu_B, \sigma_B$),反向时一个样本的梯度要穿过同 batch 其他样本。带来三个问题:
- 训练-推理不一致:训练用 batch 统计,推理用 running average,同一输入两种输出。这个 gap 在 CV 里可忍,在自回归生成里不可忍——逐 token 解码的统计环境和训练完全不同。
- 梯度耦合:loss 对每个样本的梯度混入他人贡献,小 batch 下是系统性偏差;BN 的 Jacobian 不是块对角的,谱范数、收敛率的全部分析随之变复杂。
- 超参纠缠:学习率、batch size、动量通过统计量互相影响,调参空间变大。
LN 把三个问题整体删除:统计量只依赖当前样本当前位置,前向是确定性函数,训练和推理是同一个算子,梯度按样本块对角,batch size 退化为纯粹的吞吐量旋钮。
BN 输掉之后,它的正则化红利去哪了
公平地说,BN 有一个 LN 没有的好处:batch 统计的随机噪声是实证有效的正则化器(CV 里小 batch 有时泛化更好,部分源于此)。LN 时代这笔红利由别的机制补位:dropout、权重衰减(在 AdamW 里焕发第二春)、以及数据规模本身——当预训练 token 数以万亿计时,正则化的需求结构变了。
小结
BN 的退场不是 LN 更"高级",而是任务形态变了:变长输入弄脏统计量、小 batch 摧毁统计量、自回归解码暴露训练-推理裂缝、数据并行放大同步成本。四条全是工程硬约束,LN 的"逐样本独立"恰好同时豁免全部四条。看归一化方案的兴衰,最好的视角是问一句:统计量取自哪条轴,那条轴在你的任务里稳定吗?