考察点
这道题表面问维度,实际考三件事:是否真正理解归一化在统计哪个维度的均值方差;能否解释 NLP 用 LayerNorm 而 CV 用 BatchNorm 的原因;是否知道 Pre-Norm 和 Post-Norm 对深层 Transformer 训练稳定性的影响——后者是大模型训练实践里的真问题。追问常往 RMSNorm、梯度流和 DeepNorm 这类深层稳定化方案上走。
参考答案
LayerNorm 归一化哪个维度
对输入张量 (batch, seq_len, d_model),LayerNorm 对最后一个维度 d_model 做归一化:每个 token 独立地在自己那一行特征上算均值和方差,然后减均值除标准差,再乘可学习的 γ 加 β。
$$LN(x) = \gamma \cdot \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta$$
关键点是:归一化只在单个样本(单个 token)内部做,不跨 batch,也不跨序列位置。每个 token 有一套自己的统计量,γ 和 β 是所有 token 共享的、d_model 维的可学习参数。
和 BatchNorm 的区别
BatchNorm 反过来,对 (batch, seq_len) 这个维度做统计:对每个特征通道,用整个 batch(甚至整个序列)的样本算均值方差。差别带来一串连锁后果:
| 维度 | LayerNorm | BatchNorm |
|---|---|---|
| 统计范围 | 单 token 内部 | 跨 batch 的同一通道 |
| 依赖 batch size | 不依赖 | 强依赖,小 batch 统计不准 |
| 训练/推理行为 | 一致 | 推理用滑动平均,两阶段不一致 |
| 变长序列 | 天然支持 | padding 会污染统计量 |
| 典型场景 | NLP/Transformer | CV/CNN |
NLP 弃用 BN 的根本原因有两个。一是序列变长:一个 batch 里有的句子 10 个 token、有的 500 个,padding 位置参与统计会把均值方差带偏。二是统计意义:同一个词在不同上下文里应该有自己的表示强度,把一批不相关句子的同一个通道拉到一起统计,语义上说不通。另外 BN 训练和推理不一致(推理用滑动平均统计)在自回归生成这种逐 token 场景里也很别扭。
Pre-Norm 和 Post-Norm
两种结构说的是 LayerNorm 放在子层(注意力/FFN)的里面还是外面:
- Post-Norm(原始 Transformer):
x + Sublayer(x)之后再做 Norm,即LN(x + Sublayer(x))。 - Pre-Norm(GPT-2 之后的主流):先 Norm 再进子层,即
x + Sublayer(LN(x))。
Post-Norm 的问题在深层时暴露:LayerNorm 加在残差之后,输出层级的数值被反复重整,梯度要穿过一连串 LN 才能回传,层数一深(几十上百层)梯度容易爆炸或消失,训练非常依赖 warmup 和小学习率,大模型规模下常常直接训崩。
Pre-Norm 让残差通路变成一条干净的恒等通道:梯度可以沿 x + ... 的加法直通到底层,深层网络容易训练得多,warmup 可以缩短甚至去掉。代价是理论上 Post-Norm 收敛后的最终效果略好(Pre-Norm 深层容易近似「加宽而非加深」),但在大模型时代训练稳定性压倒一切,LLaMA、Qwen、GPT 系全是 Pre-Norm。
延伸:RMSNorm 与 DeepNorm
现代大模型普遍用 RMSNorm 替代 LayerNorm:不做均值平移,只按均方根缩放,x / RMS(x) * γ。省掉均值计算,训练推理都更快,实测效果相当。
对超深网络(上百层),微软提出 DeepNorm,把 Post-Norm 的残差分支放大 α 倍并配合特定初始化,试图兼得 Post-Norm 的表达力和训练稳定性,GLM-130B 用过。但主流路线仍是 Pre-Norm + RMSNorm,简单够用。
可能的追问
- Pre-Norm 有什么副作用? 深层 block 的残差分支贡献相对变小,模型容易「看似很深实则等效变浅」,有研究认为最终效果略逊于训得起来的 Post-Norm。
- 为什么 RMSNorm 可以省掉均值平移? 经验上缩放(控制向量模长)对稳定性起主要作用,中心化贡献小;省掉后计算更简,kernel 也更好融合。
- LayerNorm 的 γ、β 是干嘛的? 归一化把分布强制拉到标准形态可能损害表达能力,γ、β 给网络一个可学习的恢复空间,学不到需要时也能近似恒等。