他们最直观的区别就是把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-LNPre-LN
典型模型原始 Transformer、部分浅层 EncoderGPT-2、LLaMA、Qwen、现代 LLM
残差路径残差后还要过 LayerNorm残差路径几乎不经过 LayerNorm
梯度稳定性深层容易不稳定,梯度易衰减或震荡梯度更平滑,深层更稳
对 warm up 的依赖较强,通常需要学习率预热较弱,很多情况下可省略或缩短
可堆层数浅层尚可,几十层以上难训可轻松扩展到几十甚至上百层
性能上限浅层或充分调参后可能略优深层大规模训练更可靠
主要问题深层训练易发散深层表征可能变弱,存在“深度诅咒”现象

        Post-LN 在浅层模型里并不差,甚至在某些任务上可能略好;但一旦模型变深、参数变大,它就容易训练崩溃。Pre-LN 的代价是因为残差路径太“顺”,深层的梯度有时会变得偏小,导致很深的层贡献不足。这就是最近研究里提到的 Pre-LN 深度诅咒,即模型虽然堆了很多层,但越深的层可能越像恒等映射,实际表达能力没有完全发挥出来。

Logo

更多推荐