【机器学习300问】139、Post-LN 和 Pre-LN 的区别?
他们最直观的区别就是把LN挪了一下位置。假设一个 Transformer 子层是 Attention 或 FFN,记作 Sublayer(x),输入是 x。
Post-LN 的顺序是:先算子层 → 再加残差 → 最后做 LayerNorm。
output = LayerNorm(x + Sublayer(x))

Pre-LN 的顺序是:先做 LayerNorm → 再算子层 → 最后加残差
output = x + Sublayer(LayerNorm(x))

看起来只是把LayerNorm从括号外挪到了括号内,但它对梯度怎么回传影响非常大。
(1)从正向传播的角度
Post-LN 里,x 直接和 Sublayer(x) 相加,然后再被 LayerNorm 统一压缩。问题是,如果 Sublayer(x) 输出波动很大,x + Sublayer(x) 就可能变得很不稳定,LayerNorm 每次都要做很重的“收拾工作”。
Pre-LN 则先把 x 变成均值接近 0、方差接近 1 的稳定输入,再送进子层。这样 Attention 和 FFN 拿到的输入尺度比较一致,不容易出现激活值忽大忽小的情况。
(2)从反向传播的角度
这是最关键的一点。Post-LN 反向传播时,梯度要经过:LayerNorm 的导数 → 残差相加 → 子层导数。
也就是说,残差路径上的梯度并不是“直接传回去”的,它每经过一层都要被 LayerNorm 的雅可比矩阵再变换一次。层数一多,这些变换会不断累积,梯度可能变小,也可能震荡,训练就不稳定。
Pre-LN 反向传播时,输出是:x + Sublayer(LayerNorm(x))
对 x 求导时,会有一个 1 直接留下来,因为 x 没有经过 LayerNorm,而是直接加到输出上。于是梯度可以沿着这条“纯残差路径”几乎无损地传回很浅的层。
可以这样理解:
- Post-LN:残差信号传回去时,每层都要过一道“关卡”,关卡会改变梯度。
- Pre-LN:残差信号有一条直达通道,关卡只拦在子层那边,不拦主路。
(3)训练表现
| 对比维度 | Post-LN | Pre-LN |
|---|---|---|
| 典型模型 | 原始 Transformer、部分浅层 Encoder | GPT-2、LLaMA、Qwen、现代 LLM |
| 残差路径 | 残差后还要过 LayerNorm | 残差路径几乎不经过 LayerNorm |
| 梯度稳定性 | 深层容易不稳定,梯度易衰减或震荡 | 梯度更平滑,深层更稳 |
| 对 warm up 的依赖 | 较强,通常需要学习率预热 | 较弱,很多情况下可省略或缩短 |
| 可堆层数 | 浅层尚可,几十层以上难训 | 可轻松扩展到几十甚至上百层 |
| 性能上限 | 浅层或充分调参后可能略优 | 深层大规模训练更可靠 |
| 主要问题 | 深层训练易发散 | 深层表征可能变弱,存在“深度诅咒”现象 |
Post-LN 在浅层模型里并不差,甚至在某些任务上可能略好;但一旦模型变深、参数变大,它就容易训练崩溃。Pre-LN 的代价是因为残差路径太“顺”,深层的梯度有时会变得偏小,导致很深的层贡献不足。这就是最近研究里提到的 Pre-LN 深度诅咒,即模型虽然堆了很多层,但越深的层可能越像恒等映射,实际表达能力没有完全发挥出来。
更多推荐


所有评论(0)