PostNorm 和 PreNorm 详解及区别

1. 核心区别

在 Transformer Block 中,核心结构一般是:

输入 x
  ↓
Self-Attention / FFN
  ↓
Residual Add
  ↓
LayerNorm

或者:

输入 x
  ↓
LayerNorm
  ↓
Self-Attention / FFN
  ↓
Residual Add

二者的区别就是:

类型 LayerNorm 位置 简称
PostNorm 残差相加之后做归一化 Post-LN
PreNorm 进入子层之前先做归一化 Pre-LN

原始 Transformer 使用的是 PostNorm,即每个子层外面做 residual connection,然后再接 LayerNorm。Vaswani 等人在 Transformer 论文中明确描述为:每个子层外部使用残差连接,并在之后进行 LayerNorm。([NeurIPS Papers][1])


2. PostNorm 结构

2.1 结构形式

PostNorm 的单个子层可以写成:

y = LayerNorm(x + Sublayer(x))

对于一个标准 Transformer Block,通常是:

x1 = LayerNorm(x  + SelfAttention(x))
x2 = LayerNorm(x1 + FFN(x1))

也就是说:

Attention / FFN → Residual Add → LayerNorm

2.2 PostNorm 的特点

PostNorm 的特点是:

每经过一个子层,输出都会被 LayerNorm 重新归一化。

这意味着每一层输出的分布相对稳定,层与层之间传递的表示会被规范化。


2.3 PostNorm 的优点

优点 1:原始 Transformer 采用,结构经典

原始 Transformer 就是 PostNorm 结构,因此在早期机器翻译、BERT 类模型、浅层 Transformer 中使用较多。([NeurIPS Papers][1])


优点 2:每层输出分布更规整

因为 LayerNorm 放在残差相加之后:

x + Sublayer(x)

会立即被归一化,所以每一层输出的均值和方差更可控。

这对中浅层 Transformer 来说,通常有利于保持表示稳定。


优点 3:理论上有效深度更强

PostNorm 中,每一层的输出都会经过:

Residual Add + LayerNorm

因此每层变换对最终表示的影响更直接。

相比 PreNorm,PostNorm 不容易出现“模型更像浅层网络”的问题。在训练稳定的情况下,PostNorm 有时可以获得更好的最终效果。

DeepNet 论文也提到,DeepNorm 试图结合 Post-LN 的较好性能Pre-LN 的稳定训练优势,用于训练非常深的 Transformer。([arXiv][2])


2.4 PostNorm 的缺点

缺点 1:深层训练不稳定

PostNorm 最大的问题是:

梯度传播路径上会反复经过 LayerNorm。

对于很深的 Transformer,梯度从高层向低层传播时会受到 LayerNorm 和残差结构的共同影响,容易出现梯度不稳定。

Xiong 等人的研究指出,Post-LN Transformer 在初始化时,靠近输出层的参数期望梯度较大,因此如果直接使用较大学习率,训练容易不稳定;这也是为什么 PostNorm 通常需要 carefully designed learning rate warm-up。([arXiv][3])


缺点 2:依赖 warm-up 和超参数

PostNorm 通常更依赖:

learning rate warm-up
gradient clipping
合理初始化
较小学习率
稳定的优化器参数

如果 warm-up 不合适,训练前期容易 loss 爆炸或收敛不稳定。


缺点 3:不适合非常深的大模型默认配置

当 Transformer 层数增加到几十层、上百层甚至更深时,PostNorm 的训练难度会显著上升。

因此,在很多现代大模型训练中,默认更倾向使用 PreNorm 或 PreNorm 变体。


3. PreNorm 结构

3.1 结构形式

PreNorm 的单个子层可以写成:

y = x + Sublayer(LayerNorm(x))

对于一个标准 Transformer Block,通常是:

x1 = x  + SelfAttention(LayerNorm(x))
x2 = x1 + FFN(LayerNorm(x1))

也就是说:

LayerNorm → Attention / FFN → Residual Add

3.2 PreNorm 的特点

PreNorm 的关键特点是:

残差主路径几乎是直接的 identity path。

也就是:

y = x + 变换项

其中 x 可以比较顺畅地从底层传到高层,梯度也可以比较顺畅地从高层传回底层。


3.3 PreNorm 的优点

优点 1:训练更稳定

PreNorm 的最大优势是稳定。

因为 residual path 保持为近似恒等映射:

x → x + Sublayer(...)

梯度可以更直接地通过残差路径传播。

Xiong 等人的研究认为,把 LayerNorm 放到 residual block 内部,也就是 Pre-LN,可以让初始化时的梯度表现更稳定,并减少对 warm-up 的依赖。([arXiv][3])


优点 2:更适合深层 Transformer

对于深层模型,PreNorm 更容易训练。

例如:

24 层
48 层
80 层
100+ 层

这类模型如果使用 PostNorm,往往需要非常小心地调学习率、warm-up 和初始化;而 PreNorm 通常更稳。


优点 3:对大模型预训练更友好

大模型预训练通常具有:

训练步数长
batch 大
模型深
学习率调度复杂
训练成本高

如果训练不稳定,代价非常大。

因此,PreNorm 的稳定性非常重要。


优点 4:工程实现简单可靠

PreNorm 在工程中更容易复现:

不容易 loss 爆炸
对学习率更宽容
对 warm-up 更不敏感
更适合大规模分布式训练

所以如果是从零训练较深 Transformer,PreNorm 通常是更安全的默认选择。


3.4 PreNorm 的缺点

缺点 1:最终性能有时不如 PostNorm

PreNorm 虽然稳定,但也可能带来一个问题:

模型的残差主路径太强,子层变换相对像“增量修正”。

也就是说,网络可能更倾向于保留原始输入:

y = x + 小幅修正

这会让深层模型在某些情况下出现“有效深度不足”的问题。

通俗理解:

层数虽然很深,但后面很多层只是做很小的修正。

因此,在训练足够稳定的前提下,PostNorm 或改进型 PostNorm 有时可能获得更强的表示能力。


缺点 2:层间表示可能不断累积偏移

PreNorm 中,LayerNorm 只作用在子层输入上,而 residual add 之后的输出不会立即归一化。

因此输出会不断累积:

x_{l+1} = x_l + Sublayer(LN(x_l))

随着层数加深,残差流上的表示尺度可能逐渐变化。

所以实际工程中,PreNorm 模型通常会在 Transformer stack 最后再加一个 Final LayerNorm,例如:

Embedding
  ↓
Transformer Blocks with PreNorm
  ↓
Final LayerNorm
  ↓
LM Head / Classifier

缺点 3:可能存在梯度不均衡问题

虽然 PreNorm 比 PostNorm 更稳定,但也不是完全没有问题。

NormFormer 论文指出,Pre-LayerNorm Transformer 在预训练中可能存在梯度幅度不匹配问题:早期层的梯度可能比后期层更大。NormFormer 因此在 PreNorm 基础上增加额外 normalization 和 scaling 操作,以改善训练和下游效果。([arXiv][4])


4. PostNorm vs PreNorm 对比表

对比维度 PostNorm PreNorm
结构 LN(x + Sublayer(x)) x + Sublayer(LN(x))
LayerNorm 位置 残差相加之后 子层输入之前
原始 Transformer 使用 PostNorm 不是原始默认结构
训练稳定性 较差,尤其深层模型 更好
梯度传播 梯度路径经过 LN,深层不稳定 残差路径更直接,梯度更顺畅
是否依赖 warm-up 更依赖 依赖较弱
深层扩展能力 较弱,需要特殊技巧 更适合深层模型
最终性能潜力 稳定训练时可能更强 稳定但有时最终性能略受限
工程难度 较高 较低
适合场景 中浅层、调参充分、追求性能 深层模型、大模型、稳定预训练

5. 从梯度传播角度理解

5.1 PostNorm 的梯度路径

PostNorm:

y = LayerNorm(x + Sublayer(x))

梯度反传时需要经过:

LayerNorm → Residual Add → Sublayer

对于深层网络,梯度会反复经过 LayerNorm。

这可能导致:

梯度放大
梯度衰减
训练早期不稳定
对 warm-up 敏感

5.2 PreNorm 的梯度路径

PreNorm:

y = x + Sublayer(LayerNorm(x))

这里有一条非常直接的路径:

y ≈ x + ...

因此梯度可以沿着 residual identity path 直接传播。

这也是 PreNorm 更适合深层 Transformer 的主要原因。


6. 从表示能力角度理解

6.1 PostNorm:每层都会强制整理表示

PostNorm 每层输出都会被归一化:

x + Sublayer(x) → LayerNorm

所以每层都会对表示空间进行一次重新整理。

优点是表示更规整,层变换更“实”。

缺点是梯度传播更难。


6.2 PreNorm:残差主路径更强

PreNorm 更像:

当前表示 = 上一层表示 + 一个小修正

优点是训练稳定。

缺点是如果残差修正太弱,模型可能变成:

很多层叠加,但每层贡献不够明显

这就是为什么有些研究会在 PreNorm 基础上加入:

residual scaling
extra normalization
DeepNorm
NormFormer
SandwichNorm

来改善表达能力和训练动态。


7. 适用场景

7.1 适合 PostNorm 的场景

PostNorm 更适合:

中浅层 Transformer
模型层数不太深
训练资源充足
可以仔细调 warm-up 和学习率
追求更强最终性能
复现原始 Transformer 或 BERT 类结构

例如:

6 层 encoder
12 层 encoder
机器翻译 baseline
中小型分类模型
训练流程已经验证稳定的模型

如果模型不深,PostNorm 的训练风险可控,且每层输出都被规范化,效果可能不错。


7.2 适合 PreNorm 的场景

PreNorm 更适合:

大模型预训练
深层 Transformer
Decoder-only LLM
长训练周期
大 batch 分布式训练
希望训练稳定优先
不想过度依赖 warm-up 调参

例如:

GPT 类语言模型
LLaMA 类 decoder-only 模型
深层 ViT
多模态大模型中的 LLM backbone
长上下文 Transformer

如果你要从零训练一个较深模型,PreNorm 通常是更安全的默认选择。


7.3 适合改进型 Norm 的场景

如果模型非常深,或者希望兼顾 PostNorm 的性能和 PreNorm 的稳定性,可以考虑:

方法 思路
DeepNorm 改造残差缩放和初始化,稳定非常深的 Transformer
NormFormer 在 PreNorm 基础上增加额外 normalization 和 scaling
SandwichNorm 在子层前后都加入 norm
RMSNorm 用 RMS 统计替代 LayerNorm 中的均值方差归一化,常用于大模型
ScaleNorm 用向量范数进行缩放归一化
ReZero / residual scaling 控制残差分支初始贡献

DeepNorm 的目标就是结合 Post-LN 的性能优势和 Pre-LN 的训练稳定性,并展示了极深 Transformer 的可训练性。([arXiv][2])


8. 在 LLM 中怎么选?

8.1 默认建议

如果是训练大语言模型,默认建议:

PreNorm / RMSNorm + residual connection + final norm

原因是:

训练稳定
容易扩展到深层
对学习率更宽容
分布式训练风险更低

8.2 如果模型较小

如果是小模型或中浅层模型:

PostNorm 和 PreNorm 都可以尝试

建议实验:

PostNorm:可能最终效果更好,但训练更敏感
PreNorm:更稳,调参成本更低

8.3 如果模型很深

如果是非常深的 Transformer:

优先 PreNorm
或者使用 DeepNorm / residual scaling / NormFormer 等改进结构

不建议直接使用普通 PostNorm,否则训练不稳定风险较高。


9. 在 ViT 中怎么选?

Vision Transformer 中也有 PreNorm 和 PostNorm 的选择。

通常建议:

深层 ViT:优先 PreNorm
中浅层 ViT:PreNorm / PostNorm 都可以尝试
需要稳定训练:PreNorm 更安全

ViT 中如果使用 PostNorm,可能需要更仔细地控制:

学习率
warm-up
weight decay
drop path
初始化

10. 在多模态模型中怎么选?

对于多模态大模型,例如:

CLIP-like encoder
ViT + LLM
Q-Former
视觉 token projector
VLM decoder

建议:

模块 推荐
视觉 Transformer backbone PreNorm 更稳
LLM decoder PreNorm / RMSNorm 更常见
Cross-Attention 融合层 PreNorm 更稳
小型 projector / adapter PostNorm / PreNorm 都可
多层融合模块 优先 PreNorm

原因是多模态训练中不同模态的分布差异较大,PreNorm 更有利于稳定训练。


11. 简单记忆

PostNorm

先计算子层,再残差相加,最后归一化。

公式:

y = LN(x + F(x))

特点:

性能潜力较好
但深层训练不稳定
依赖 warm-up 和调参

PreNorm

先归一化,再计算子层,最后残差相加。

公式:

y = x + F(LN(x))

特点:

训练稳定
适合深层模型
但有时最终性能略受限

12. 最终选择建议

你的目标 推荐
复现原始 Transformer PostNorm
训练 6~12 层中小模型 PostNorm / PreNorm 都可
训练深层 Transformer PreNorm
训练 LLM PreNorm / RMSNorm
训练多模态大模型 PreNorm
训练极深模型 PreNorm + residual scaling / DeepNorm
追求稳定优先 PreNorm
追求极致性能且有调参资源 PostNorm 或改进型 PostNorm
训练经常 loss 爆炸 从 PostNorm 改为 PreNorm
模型层数加深后不收敛 优先 PreNorm 或 DeepNorm

13. 总结

一句话总结:

PostNorm:性能潜力较强,但训练更难。
PreNorm:训练更稳定,更适合深层和大模型。

更具体地说:

PostNorm = LN(x + F(x))
PreNorm  = x + F(LN(x))

如果你做的是:

LLM / VLM / 深层 Transformer / 大规模预训练

优先选:

PreNorm 或 RMSNorm-style PreNorm

如果你做的是:

中浅层 Transformer / 经典机器翻译 / 复现原始架构

可以考虑:

PostNorm

实际工程中最稳妥的默认选择是:

PreNorm + FinalNorm

参考链接:
[1]: https://papers.neurips.cc/paper/7181-attention-is-all-you-need.pdf?utm_source=chatgpt.com “Attention is All you Need”
[2]: https://arxiv.org/abs/2203.00555?utm_source=chatgpt.com “DeepNet: Scaling Transformers to 1,000 Layers”
[3]: https://arxiv.org/abs/2002.04745?utm_source=chatgpt.com “On Layer Normalization in the Transformer Architecture”
[4]: https://arxiv.org/abs/2110.09456?utm_source=chatgpt.com “NormFormer: Improved Transformer Pretraining with Extra Normalization”

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐