Pre-LN 与 RMSNorm eps
LayerNorm 在 channel/ token 维归一化,不依赖 batch 统计——Transformer 和小 batch 场景比 BatchNorm 稳,但和 BN 的 inductive bias 不同。

1. 小 batch 时 BatchNorm 不稳
检测/分割 batch size 常只有 2–4,BatchNorm 的 running mean/var 噪声大,val 曲线抖、多卡数不一致。LayerNorm 在 channel 或 token 维归一化,不依赖 batch 统计,Transformer 和小 batch 场景标配。LN 与 BN 的 inductive bias 不同——BN 利用 batch 内 spatial 统计,大 batch CNN 里常略好;小 batch 或序列模型里 LN 更稳。不能指望「全局换 LN 就更好」,要看 batch 约束与架构。
ViT 把图像 patch 当 token,天然用 LN;CNN stem + Transformer trunk 混合架构要在 stem 与 trunk 分别选型,stem 常用 BN/GN,trunk 用 LN。BN 在 batch 维聚合,等价于假设 同一 channel 在不同 spatial 位置共享统计;LN 在 feature 维聚合,对每条 token 独立,序列长度变也不影响统计质量。检测头 batch 有效大(多 anchor)时 BN 仍常用;纯 ViT 分类 batch=8 时 LN 几乎必选。换 norm 类型不是 drop-in:后续层 weight scale、LR warmup 可能都要重调。
2. LayerNorm 公式与 Pre-LN 块
PyTorch nn.LayerNorm(normalized_shape) 在最后一维 normalize;Transformer 里 normalized_shape=hidden_dim,对每条 token 独立算 。Pre-LN(norm 在 sublayer 前)训练更稳,GPT/BERT/LLaMA 常用:
class Block(nn.Module):
def forward(self, x):
x = x + self.attn(self.ln1(x)) # Pre-LN
x = x + self.ffn(self.ln2(x))
return xPost-LN(原始 Transformer,norm 在 sublayer 后)深网络 12+ layer 常需 careful init + warmup;Pre-LN 梯度路径更短,有时可无 warmup 训深模型。RMSNorm(LLaMA):去掉 mean centering,,少算 ,大模型省 compute,效果与 LN parity 居多。
Pre-LN 块里 sublayer 输入已归一化,residual 主路径上 norm 次数更少,深层 梯度爆炸概率下降。Post-LN 在 residual 累加后再 norm,输出尺度更可控,但与 init、warmup 强耦合——BERT 原论文的 warmup 即为此服务。RMSNorm 假设均值接近 0,对 centered embedding 成立;若前层有大 bias shift,LN 与 RMSNorm 差异会放大。normalized_shape 必须与 hidden dim 一致,误设会对错误轴归一化,silent 毁性能。
3. fp16 与 eps 边界
nn.LayerNorm(eps=1e-5) 在 fp16 下可能不稳定—— 很小时 除法放大误差,深层累积 NaN。可试 eps=1e-6、LN 层 fp32 compute(局部 autocast(enabled=False)),或 residual init scale 1/sqrt(2*num_layers) 帮 Post-LN。DeepNorm、Admin 等 LLM init recipe 与 Post-LN 配套,换 Pre-LN 时不要只抄块结构不抄 init。
fp16 下 LN 输出若溢出,后续 softmax 与 matmul 全 NaN——训练 log 应盯 每 N step 的 max activation。常见修复:LN 在 fp32 算再 cast 回 fp16;或全局 loss scaling 与 GradScaler 配合。eps 从 1e-5 调到 1e-6 在 fp32 足够,fp16 有时需更大 eps(如 1e-4)反而稳,须 empirically 测。Post-LN 深模型还可对 residual 分支乘 初始化缩放,与 Pre-LN 无 warmup 训动形成对照实验。
4. 与 BatchNorm、GroupNorm 选型
纯 Transformer/ViT:LN 默认。CNN 小 batch:GroupNorm 或 SyncBN 而非 LN——LN 不利用 spatial 结构。检测 head 常仍用 BN(anchor 多、effective batch 大)。混合模型接口处 norm 类型切换要测数值范围,必要时加 adapter conv。
从 BN 迁移到 LN 时,stem 仍用 BN 而 trunk 用 LN 的分工最常见:stem 提取 local 纹理,trunk 做 global mixing。全网替 LN 的 CNN 实验常显示 小 batch 略稳、大 batch 略差——结论依赖 batch 与数据规模,不宜教条推广。
GroupNorm 把 channel 分组在 group 内算统计,不依赖 batch size,分割小 batch 常用 GN(group=32)。SyncBN 跨 GPU 同步 batch 统计,effective batch 变大但通信开销增。选型口诀:序列/Transformer → LN;CNN 大 batch → BN;CNN 小 batch → GN/SyncBN。ViT-Det 等混合体在 backbone 与 neck 交界处易出现 norm 不匹配,可在 junction 加 LayerNorm + linear proj 对齐尺度。
5. 案例:Post-LN 十二层无 warmup 发散
某 12-layer Transformer encoder,Post-LN + 默认 init,lr 3e-4 无 warmup,第 500 step loss NaN。改 Pre-LN 同 lr 可训;若坚持 Post-LN,需 lr warmup 2k step + residual scale 1/sqrt(24)。说明 norm 位置与 init、schedule 是组合契约,不能单改一项。
同配置下 Pre-LN 的 grad_norm 曲线更平,Post-LN 在前 1k step 常出现尖峰——这是选择 warmup 的直接依据。若业务必须 Post-LN(例如复现 BERT 系 checkpoint 结构),应整包复制 init recipe:weight std、bias zero、warmup ratio、max grad clip。只改 Pre/Post 之一而不动其余,A/B 结论不可信。
6. 验收
- 深 12+ layer:Pre-LN 能否无 warmup 训动;Post-LN 对比 init + warmup。
- 训练 log 各层 activation 方差与 grad_norm,无爆炸/消失。
- fp16:LN output 无 NaN;必要时 LN fp32 compute。
- 小 batch(2–4)vs 大 batch(32+)曲线稳定性对比。
- RMSNorm 换 LN:下游 metric 与 wall-clock 对比。
深模型验收可加 层-wise grad norm 直方图:Post-LN 若末层 grad 比首层大两个数量级,init/warmup 未配对。ViT 还须测 patch embedding 后 LN 输出是否随 patch 数变化而 drift——position embedding 与 LN 交互不当会导致长序列 extrapolation 差。
LayerNorm 是 Transformer 与小 batch 的归一化选择;Pre-LN 与 eps/fp16 是落地关键。改 norm 时固定 init 与 LR schedule,单变量 ablation 才分得清 norm 问题还是 warmup 问题。生产环境若从 Post-LN checkpoint 蒸馏到 Pre-LN 学生,须重新训或长 warmup,不可假设权重直接 load 即收敛。推理侧 model.eval() 下 LN 用当前 batch 统计仅当 batch>1 且非 streaming 场景——单样本在线 infer 仍用训练时固定的 per-token 行为,与 BN 的 running stats 问题不同但需知晓。
相关
也可以看看
- ·3 分钟阅读
PyTorch SDPA 的两个静默坑:布尔 mask 与 eval dropout
拆清 scaled_dot_product_attention 的 keep-mask 语义、广播维度和 dropout_p 行为,用最小张量测试阻止注意力泄漏。
- ·5 分钟阅读
SDPA backend 与 FlashAttention
Self-attention 的 O(n²) 内存和算力随序列长度平方涨——长序列要算 FLOPs/activation 预算,FlashAttention 和线性近似是工程选项不是免费 lunch。
- ·16 分钟阅读
KV cache 分页与前缀复用:吞吐上去后正确性怎么验
沿 block table、前缀哈希与抢占回收拆开缓存一致性风险,说明错页复用为何表现为「偶发胡话」;用确定性前缀集、强制抢占和逐 token 对照验收。
johan's blog