PostNorm和PreNorm优缺点及适用场景
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”
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)