2017年,Google在论文《Attention Is All You Need》中提出了Transformer架构。在这篇开创性论文中,设计者在每个子层之后放置了层归一化(Layer Normalization),这种设计被称为Post-LN。然而,当研究者们尝试将Transformer堆叠得更深时,发现这种设计会带来严重的训练不稳定问题。
2020年,两篇关键论文从不同角度揭示了这个问题的本质。Liu等人在ACL发表的《Understanding the Difficulty of Training Transformers》指出,Post-LN的梯度消失问题源于一种"放大效应"。同年,Xiong等人在ICML发表的《On Layer Normalization in the Transformer Architecture》则从理论上证明了,Post-LN需要warm-up阶段的根本原因在于初始化时梯度的不稳定性。
这两种分析指向了同一个解决方案:将层归一化移到子层之前,即Pre-LN。此后,GPT-2、GPT-3、LLaMA等现代大语言模型几乎都采用了Pre-LN设计。但Pre-LN并非完美,它也带来了"表示坍缩"和"巨大激活值"等新问题。2022年,微软提出的DeepNorm成功训练了1000层的Transformer。2023年,微软与中国人民大学联合提出的ResiDual试图融合Pre-LN和Post-LN的优势。2025年,Peri-LN作为一种新策略被提出,在Gemma和OLMo等模型中得到应用。
这篇文章将深入分析这三种归一化策略的技术原理、数学推导和工程权衡。
两种归一化位置的架构差异
首先需要明确Pre-LN和Post-LN在架构上的具体差异。假设第l层的输入隐状态为z_l,子层(注意力或前馈网络)的输出为F(·),则两种设计的计算流程如下:
Post-LN(原始Transformer设计):
z_{l+1} = LN(z_l + F(z_l))
层归一化应用在残差连接之后,即先执行残差加法,再进行归一化。
Pre-LN(现代大模型设计):
z_{l+1} = z_l + F(LN(z_l))
层归一化应用在子层输入之前,残差路径保持不变。
flowchart TB
subgraph PostLN["Post-LN(原始设计)"]
direction TB
A1[输入 z_l] --> B1[子层 F]
A1 --> C1[残差连接 +]
B1 --> C1
C1 --> D1[层归一化 LN]
D1 --> E1[输出 z_{l+1}]
end
subgraph PreLN["Pre-LN(现代设计)"]
direction TB
A2[输入 z_l] --> B2[层归一化 LN]
B2 --> C2[子层 F]
A2 --> D2[残差连接 +]
C2 --> D2
D2 --> E2[输出 z_{l+1}]
end
这两种设计的核心差异在于:Post-LN中,层归一化位于"高速通道"上,梯度必须穿过归一化层才能回传;而Pre-LN中,残差路径是一条干净的恒等映射,梯度可以无损地流向浅层。
Post-LN的梯度消失问题
编码器-解码器注意力的特殊地位
Liu等人的研究发现,Post-LN的梯度消失问题并非均匀分布在整个网络中,而是集中在解码器的编码器-注意力子层。
在Transformer解码器中,每个block包含三个子层:带掩码的自注意力、编码器-注意力、前馈网络。编码器-注意力的特殊性在于,它的查询来自解码器前一层的输出,而键和值来自编码器的最终输出。这种跨模块的连接使得梯度流更加复杂。
flowchart LR
subgraph Decoder["解码器 Block"]
direction TB
Input[输入] --> MaskedAttn[带掩码自注意力]
MaskedAttn --> EncAttn[编码器-注意力]
EncAttn --> FFN[前馈网络]
FFN --> Output[输出]
end
subgraph Encoder["编码器"]
EncOut[编码器输出]
end
EncOut -.->|Key, Value| EncAttn
研究者在实验中发现,编码器-注意力子层的参数梯度和明显小于其他子层。当层数增加时,这种现象更加显著。例如,在一个16层的解码器中,浅层编码器-注意力子层的梯度几乎消失。
数学推导:梯度范数的衰减
设解码器第l层的编码器-注意力子层参数为θ_l,损失函数为L。由于编码器的输出在解码过程中保持不变,编码器-注意力子层对θ_l的梯度只依赖于解码器第l层之后的层。
在Post-LN中,梯度从第L层回传到第l层需要经过(L-l)个层归一化。每个层归一化都会对梯度进行缩放,具体缩放因子取决于输入的方差。当输入方差较大时,归一化后的值较小,对应的梯度也会被缩小。
flowchart TB
subgraph GradientFlow["Post-LN梯度回传路径"]
direction BT
L16["第16层 LN"] -->|"梯度缩小"| L15["第15层 LN"]
L15 -->|"梯度缩小"| L14["第14层 LN"]
L14 -->|"梯度缩小"| L13["..."]
L13 -->|"梯度消失"| L1["第1层 LN"]
end
style L1 fill:#ff6b6b
style L16 fill:#51cf66
更关键的是,Liu等人证明了一个定理:Post-LN编码器的梯度消失问题不严重,但解码器的编码器-注意力子层会遭受严重的梯度消失。
放大效应:参数扰动的传播
放大效应(Amplification Effect)是Post-LN训练不稳定的另一根源。研究者比较了参数扰动对Post-LN和Pre-LN输出的影响:
设模型参数发生微小扰动Δθ,则输出变化ΔY满足:
- Post-LN: ||ΔY|| = O(N)
- Pre-LN: ||ΔY|| = O(log N)
其中N是网络层数。
xychart-beta
title "参数扰动对输出影响随层数变化"
x-axis ["10层", "20层", "50层", "100层", "200层"]
y-axis "输出变化幅度" 0 --> 250
bar [10, 20, 50, 100, 200]
line [3.2, 4.3, 5.6, 6.6, 7.6]
这个结果意味着,在Post-LN中,参数的微小变化会被放大N倍。对于百层网络,一个微小的参数更新可能导致输出的剧烈变化,这正是训练不稳定的根源。
放大效应的数学解释如下:在Post-LN中,残差连接的输出直接进入层归一化。由于层归一化的缩放因子依赖于输入的方差,当输入发生扰动时,归一化因子也会变化,这种变化会进一步放大扰动的效果。而在Pre-LN中,残差路径是一条恒等映射,扰动只能通过子层传播,不会在归一化层被放大。
Warm-up阶段的理论解释
初始时刻的梯度异常
Xiong等人的研究从另一个角度分析了Post-LN的问题。他们使用平均场理论(Mean Field Theory)研究了Transformer在初始化时的梯度行为。
研究发现,在Post-LN初始化时,靠近输出层的参数具有很大的期望梯度。这意味着,如果在训练开始时使用较大的学习率,这些参数会经历剧烈的更新,导致优化过程不稳定。
xychart-beta
title "Post-LN初始化时各层梯度范数分布"
x-axis ["第1层", "第4层", "第8层", "第12层", "第16层"]
y-axis "梯度范数" 0 --> 100
bar [15, 25, 45, 70, 95]
具体而言,设θ^(L)为第L层(最深层)的参数,则在初始化时:
E[||∇{θ^(L)} L||^2] » E[||∇{θ^(l)} L||^2], l « L
这种梯度的不均匀分布使得直接使用大学习率训练Post-LN变得困难。
Warm-up的作用机制
Warm-up阶段通过逐步增加学习率来缓解初始化时梯度不均匀的问题。典型的warm-up策略是:在前T个训练步骤中,学习率从0线性增加到目标值η,之后保持恒定或按某种调度衰减。
xychart-beta
title "学习率Warm-up调度曲线"
x-axis "训练步数" 0 --> 100
y-axis "学习率" 0 --> 1
line [0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.0, 1.0, 1.0, 1.0]
从数学角度看,warm-up的作用是让模型参数在梯度最不稳定的阶段以较小的步长更新,逐步调整到更稳定的状态。当模型走出初始化区域后,梯度分布变得更加均匀,此时可以使用更大的学习率。
然而,warm-up增加了训练时间,也引入了额外的超参数。研究者希望找到一种不需要warm-up的设计。
Pre-LN消除warm-up的原理
Xiong等人证明了一个关键定理:如果将层归一化放在残差块内部(即Pre-LN),则初始化时的梯度行为良好。
直观理解是:在Pre-LN中,残差路径是一条干净的恒等映射,梯度可以直接从深层流向浅层,不需要穿过任何归一化层。因此,即使初始化时不同层的参数扰动不同,梯度也能均匀地回传到所有层。
实验结果验证了这一点:Pre-LN可以直接使用大学习率训练,不需要warm-up阶段。这不仅加速了训练,也减少了超参数调优的工作量。
Pre-LN的代价:表示坍缩与巨大激活值
表示坍缩现象
Pre-LN虽然解决了梯度消失问题,但它也带来了新的挑战。其中之一是"表示坍缩"(Representation Collapse)。
表示坍缩指的是,随着层数增加,不同位置的隐状态表示变得越来越相似。这种现象在深层Pre-LN Transformer中尤为明显。
flowchart LR
subgraph Layers["深层Pre-LN中的表示变化"]
L1["第1层: 表示多样"] --> L8["第8层: 表示趋同"]
L8 --> L16["第16层: 表示坍缩"]
end
style L1 fill:#51cf66
style L8 fill:#ffd43b
style L16 fill:#ff6b6b
研究者分析了Pre-LN的梯度流,发现梯度在深层往往更大,而在浅层较小。这种不均衡的梯度分布可能导致浅层表示无法得到充分训练,最终使得不同位置的表示趋于相似。
巨大激活值问题
另一个更棘手的问题是"巨大激活值"(Massive Activations)。在Pre-LN中,子层的输出未经归一化就直接进入残差连接。如果某个子层产生了大数值的输出,这个值会直接传播到后续所有层,并可能在传播过程中进一步放大。
Sun等人在2024年的研究中详细分析了这一现象。他们发现,在训练好的LLaMA模型中,某些特定位置的激活值可以达到其他位置的数千倍甚至更高。这些"巨大激活值"通常出现在特定的token位置,如序列开头。
xychart-beta
title "Pre-LN各Token位置的激活值分布(示意)"
x-axis "Token位置" --> 10
y-axis "激活值幅度" 0 --> 1000
bar [950, 0.5, 0.8, 0.6, 0.7, 0.5, 0.9, 0.4, 0.6, 0.7]
巨大激活值的存在带来几个问题:
- 数值稳定性:极端的激活值可能导致数值溢出或梯度爆炸
- 训练动态:某些参数可能被极端值主导,影响整体训练
- 量化困难:大范围的激活值使得低精度量化更加困难
与注意力汇的联系
巨大激活值与"注意力汇"(Attention Sink)现象密切相关。注意力汇指的是,序列中的某些token(通常是第一个)吸引了大量的注意力权重。
研究表明,巨大激活值往往出现在第一个token的位置。这些大值在注意力计算中产生了显著的键(Key)偏置,使得其他位置对第一个token产生强烈的注意力。这可能是一种"自适应"机制,但也可能是架构缺陷导致的副作用。
第三条路:Peri-LN的出现
设计理念
2025年,研究者提出了一种新的归一化策略:Peri-LN(Peripheral Layer Normalization)。这种设计在子层的输入和输出两侧都放置归一化层:
z_{l+1} = LN(z_l + F(LN(z_l)))
Peri-LN结合了Pre-LN和Post-LN的优点:输入归一化保证了梯度流的稳定性,输出归一化限制了激活值的增长。
flowchart TB
subgraph PeriLN["Peri-LN(最新设计)"]
direction TB
A[输入 z_l] --> B[输入归一化 LN]
B --> C[子层 F]
C --> D[输出归一化 LN]
A --> E[残差连接 +]
D --> E
E --> F[输出 z_{l+1}]
end
理论分析
研究者从方差增长的角度分析了三种策略:
| 策略 | 方差增长 | 梯度稳定性 |
|---|---|---|
| Post-LN | 大致恒定 | 可能消失 |
| Pre-LN | 随层数指数增长 | 可能爆炸 |
| Peri-LN | 线性或亚指数增长 | 自调节 |
关键洞察是:Peri-LN通过输出归一化引入了一个"阻尼因子"。当子层产生大值输出时,输出归一化会将其缩放到合理范围,防止后续层的累积放大。
从梯度角度看,Peri-LN的梯度范数满足:
||∇θ L||{Peri-LN} ≤ C · ||∇θ L||{Pre-LN}
其中C是一个与激活值大小相关的常数。这意味着,即使出现巨大激活值,Peri-LN的梯度也能保持有界。
实验验证
研究者在400M到7B参数规模的模型上进行了实验。结果显示:
- 训练损失:Peri-LN在各种学习率下都能获得更低的训练损失
- 梯度稳定性:Peri-LN的梯度范数曲线更加平滑,Pre-LN和Post-LN则频繁出现尖峰
- 下游任务:Peri-LN在ARC-Easy、HellaSwag、PIQA等基准测试上表现更好
- 训练一致性:Peri-LN在不同随机种子下的性能差异更小
xychart-beta
title "三种策略的训练损失对比(示意)"
x-axis "训练步数" 0 --> 5
y-axis "训练损失" 0 --> 5
line [4.5, 3.8, 3.2, 2.9, 2.7, 2.6]
line [4.5, 3.6, 2.8, 2.4, 2.2, 2.1]
line [4.5, 3.5, 2.6, 2.1, 1.9, 1.8]
值得注意的是,Gemma和OLMo等开源大模型已经采用了类似Peri-LN的设计,但之前并没有系统的理论分析解释其有效性。
DeepNorm:通往千层Transformer
动机与设计
2022年,微软的研究者提出了DeepNorm,目标是在Pre-LN的基础上实现更深层的Transformer训练。
DeepNorm的核心思想是通过对残差连接进行缩放来控制信号的增长:
z_{l+1} = α · z_l + F(LN(z_l))
其中α是一个大于1的常数,具体取值与网络层数相关。对于N层的Transformer,研究者建议α ≈ (2N)^{1/4}。
flowchart TB
subgraph DeepNorm["DeepNorm架构"]
direction TB
A[输入 z_l] -->|缩放 α| B[残差支路]
A --> C[层归一化 LN]
C --> D[子层 F]
D --> E[残差连接 +]
B --> E
E --> F[输出 z_{l+1}]
end
理论保证
DeepNorm的设计基于以下定理:如果适当选择α,则前向传播中的激活值增长和后向传播中的梯度增长都是有界的。
具体而言,研究者证明了在DeepNorm中:
- 前向激活值:||z_l|| ≤ C_1,与层数无关
- 反向梯度:||∇_{z_l} L|| ≤ C_2,与层数无关
这种理论保证使得训练极深的网络成为可能。
实验成果
DeepNorm成功训练了1000层的Transformer,这是之前无法想象的深度。在机器翻译任务上,DeepNorm在WMT14 En-De和En-Fr数据集上都取得了有竞争力的结果。
更重要的是,DeepNorm结合了Post-LN的良好性能和Pre-LN的训练稳定性。这验证了一个重要观点:Post-LN本身的性能并不差,问题在于训练的困难。
ResiDual:融合两种范式
架构设计
2023年,微软与中国人民大学联合提出了ResiDual架构,试图同时获得Pre-LN和Post-LN的优势。
ResiDual的核心创新是"Pre-Post层归一化"(PPLN),它在每个子层使用了两个归一化层:
z_{l+1} = LN(z_l + F(LN(z_l)))
等等,这不就是Peri-LN吗?实际上,ResiDual和Peri-LN确实有相似之处,但ResiDual的重点在于从信息流的角度理解这种设计。
ResiDual的作者指出,这种设计:
- 保持了Pre-LN的恒等梯度路径
- 通过输出归一化避免了激活值爆炸
- 缓解了Pre-LN的表示坍缩问题
表示多样性的恢复
研究者通过余弦相似度分析了不同层的表示多样性。结果显示,ResiDual能够保持更高的表示多样性,不同层的表示更加区分明显。
这解决了Pre-LN的一个重要缺陷:由于梯度主要集中在深层,浅层的表示往往无法得到充分训练,导致不同位置的表示趋于相似。
LayerNorm vs RMSNorm:归一化函数的选择
公式对比
除了归一化位置的选择,归一化函数本身也有不同实现。最常见的是LayerNorm和RMSNorm。
LayerNorm:
LayerNorm(x) = γ ⊙ (x - μ) / √(σ² + ε) + β
其中μ是均值,σ²是方差,γ和β是可学习的缩放和偏移参数。
RMSNorm:
RMSNorm(x) = γ ⊙ x / √(mean(x²) + ε)
RMSNorm去掉了均值中心化步骤,只保留缩放操作,因此也没有偏移参数β。
flowchart LR
subgraph LayerNormDiagram["LayerNorm"]
A1[输入 x] --> B1[计算均值 μ]
A1 --> C1[计算方差 σ²]
B1 --> D1[中心化: x - μ]
C1 --> E1[标准化: /√σ²]
D1 --> E1
E1 --> F1[缩放移位: γ⊙x + β]
end
subgraph RMSNormDiagram["RMSNorm"]
A2[输入 x] --> B2[计算RMS]
B2 --> C2[缩放: γ⊙x/RMS]
end
计算效率
RMSNorm的设计初衷是提高计算效率。LayerNorm需要两次遍历:一次计算均值,一次计算方差。RMSNorm只需要一次遍历计算均方值。
原论文报告了7%-64%的训练加速,具体取决于模型和硬件。对于大规模模型训练,这种效率提升可以转化为显著的成本节约。
为什么LLaMA选择RMSNorm
LLaMA系列模型选择了Pre-RMSNorm(即Pre-LN + RMSNorm的组合),理由包括:
- 计算效率:RMSNorm更简单,计算开销更低
- 训练稳定性:研究表明RMSNorm在深层网络中表现稳定
- 工程便利:去掉均值计算简化了实现,特别是在分布式训练中
LayerNorm的优势
尽管RMSNorm在大模型中很流行,LayerNorm仍有其优势:
- 零均值保证:LayerNorm确保输出均值为0,这对后续计算可能有帮助
- 量化兼容性:研究表明,LayerNorm的零均值特性使其更适合低精度量化
- 理论完备:LayerNorm的理论分析更加成熟
Costello等人在2025年的研究中发现,通过优化实现,LayerNorm可以达到与RMSNorm相似的速度。因此,RMSNorm的效率优势可能在很大程度上是由于早期的朴素实现。
实践建议
架构选择指南
根据当前研究,以下是不同场景的架构选择建议:
flowchart TB
Start[选择归一化策略] --> Q1{模型规模?}
Q1 -->|"小于1B参数"| Small[中小规模模型]
Q1 -->|"1B-100B参数"| Large[大规模模型]
Q1 -->|"大于100层"| Deep[极深网络]
Small --> S1[可选Post-LN + warm-up]
Small --> S2[推荐Pre-LN]
Large --> L1[推荐Pre-LN]
Large --> L2[推荐Peri-LN]
Deep --> D1[推荐DeepNorm]
Deep --> D2[可选Peri-LN]
中小规模模型(<1B参数):
- 可以尝试Post-LN,配合适当的warm-up
- Pre-LN是更稳妥的选择
大规模模型(1B-100B参数):
- 推荐Pre-LN或Peri-LN
- 如果使用Pre-LN,考虑监控巨大激活值
极深网络(>100层):
- DeepNorm是经过验证的选择
- Peri-LN提供了更简洁的替代方案
量化部署:
- LayerNorm可能更适合低精度量化
- 如果使用RMSNorm,需要额外注意量化校准
超参数设置
对于Pre-LN:
- 可以不使用warm-up,直接使用目标学习率
- 建议使用较小的权重衰减
对于Post-LN:
- warm-up步数通常占总训练步数的1%-10%
- 初始学习率建议设置为目标学习率的1/10或更小
对于Peri-LN:
- 与Pre-LN类似的设置即可
- 输出归一化的缩放参数建议保持可学习
技术演进时间线
timeline
title Transformer归一化技术演进
2017 : Post-LN : 原始Transformer设计
: 问题发现 : 深层训练不稳定
2020 : Liu等人论文 : 发现放大效应
: Xiong等人论文 : Warm-up理论分析
: Pre-LN成为主流 : GPT-2/GPT-3采用
2022 : DeepNorm : 成功训练1000层
2023 : ResiDual : 融合两种范式
: LLaMA发布 : 采用Pre-RMSNorm
2024 : LLaMA 2/3 : 继续Pre-RMSNorm
: Gemma/OLMo : 采用Peri-LN
2025 : Peri-LN论文 : 系统理论分析
未来展望
Transformer架构的归一化设计仍在演进中。几个值得关注的方向:
自适应归一化: 根据训练动态自动调整归一化强度,可能在保持稳定性的同时提供更好的性能。
稀疏归一化: 针对稀疏激活模式的归一化设计,可能更适合稀疏专家混合(MoE)架构。
理论深化: 虽然我们已经理解了Pre-LN和Post-LN的基本原理,但许多细节仍不清楚,例如表示坍缩的精确机制、巨大激活值的形成过程等。
无归一化训练: 有研究表明,训练好的模型可以在推理时移除归一化层。这是否意味着我们可以设计不需要归一化的训练方法?这是一个值得探索的方向。
结语
从Post-LN到Pre-LN,再到Peri-LN和DeepNorm,Transformer的归一化设计经历了十多年的演进。每一步演进都基于对前一代设计问题的深入理解,以及对深度学习基本原理的应用。
Post-LN在理论上具有良好的性质——恒定的激活值方差,但它在深层网络中存在严重的梯度问题和放大效应,需要warm-up来稳定训练。Pre-LN解决了梯度问题,消除了warm-up的需求,但引入了表示坍缩和巨大激活值的新问题。Peri-LN和DeepNorm代表了融合两种设计优势的努力,在实践中取得了成功。
理解这些技术背后的原理,不仅有助于我们在实践中做出正确的架构选择,也展示了深度学习研究的典型范式:发现问题、分析原因、提出方案、验证效果。这个过程仍在继续,未来可能会有更好的设计出现。
参考文献
[1] Vaswani, A., et al. “Attention Is All You Need.” NeurIPS 2017.
[2] Liu, L., et al. “Understanding the Difficulty of Training Transformers.” ACL 2020.
[3] Xiong, R., et al. “On Layer Normalization in the Transformer Architecture.” ICML 2020.
[4] Wang, H., et al. “DeepNet: Scaling Transformers to 1,000 Layers.” ICLR 2023.
[5] Zhang, B., & Sennrich, R. “Root Mean Square Layer Normalization.” NeurIPS 2019.
[6] Ba, J. L., et al. “Layer Normalization.” arXiv 2016.
[7] Sun, M., et al. “Massive Activations in Large Language Models.” ICLR 2024.
[8] Kedia, A., et al. “Understanding Layer Normalization in Transformers.” ICML 2024.
[9] Peri-LN论文作者. “Peri-LN: Revisiting Layer Normalization in the Transformer Architecture.” arXiv 2025.
[10] Radford, A., et al. “Language Models are Unsupervised Multitask Learners.” OpenAI 2019.
[11] Brown, T., et al. “Language Models are Few-Shot Learners.” NeurIPS 2020.
[12] Touvron, H., et al. “LLaMA: Open and Efficient Foundation Language Models.” arXiv 2023.
[13] Rivière, M., et al. “Gemma: Open Models Based on Gemini Research.” arXiv 2024.
[14] OLMo Team. “OLMo: Accelerating the Science of Language Models.” arXiv 2024.
[15] Costello, T., et al. “Revisiting LayerNorm: aka Norms are Important.” Ceramic.ai Blog 2025.