NormFormer:用额外归一化改进 Transformer 预训练

2026-04-09 · 8 分钟阅读时长
blog Tech

本文是关于 Meta AI 论文《NormFormer: Improved Transformer Pretraining with Extra Normalization》(arXiv:2110.09456)的深度精读笔记。这篇论文通过在 Transformer 架构中添加三处额外的归一化操作,有效缓解了 Pre-LN 架构中各层梯度分布不均的问题,在几乎不增加计算成本的前提下,显著提升了语言模型的预训练效率和下游任务表现。


1. 引言:Transformer 归一化问题的前世今生

1.1 从 Post-LN 到 Pre-LN 的演进

自 Vaswani 等人在 2017 年提出 Transformer 架构以来,层归一化(Layer Normalization) 就是其中不可或缺的核心组件。归一化层的放置位置虽然看似只是一个微小的工程决策,但实际上对模型的训练稳定性、收敛速度和最终性能有着深远的影响。

原始 Transformer 采用 Post-LN 架构,即将 LayerNorm 放在残差连接之后:

$$\text{PostLN}(x) = \text{LayerNorm}(x + \text{Sublayer}(x))$$

这一设计在 Transformer 的早期应用中被广泛使用,但随着模型规模的不断增大,研究者们逐渐发现了它的致命缺陷:后层参数的梯度范数远大于早层,导致梯度爆炸于深层,梯度消失于早层。这意味着在反向传播过程中,靠近输入端的层几乎无法获得有效的梯度信号,导致训练极度不稳定。

为了缓解这个问题,Pre-LN 架构 应运而生,即将 LayerNorm 移到子层的输入端:

$$\text{PreLN}(x) = x + \text{Sublayer}(\text{LayerNorm}(x))$$

Pre-LN 架构被 GPT-2、GPT-3 等里程碑模型所采用,成为大语言模型预训练的事实标准。它显著改善了训练稳定性,使得大规模模型的训练成为可能。问题解决了吗?答案是否定的。

1.2 Pre-LN 的隐患:反向失配与梯度失衡

Xiong 等人在 2020 年的研究中首次系统性地揭示了 Post-LN 的梯度问题。然而,NormFormer 的作者们进一步发现,Pre-LN 虽然解决了 Post-LN 的训练不稳定问题,但实际上引入了方向相反的梯度失配

  • Post-LN:后层梯度 » 早层梯度(梯度消失)
  • Pre-LN:早层梯度 » 后层梯度(反向失配)

为什么梯度不均衡很糟糕?

用一个工厂流水线的类比来理解:

  • 梯度 = 改进信号,梯度大的层在训练中改变快,梯度小的层改变慢
  • 早层是上游,负责提取基础特征。如果上游改进太频繁(梯度过大),下游来不及适应,导致训练不稳定
  • 后层是下游,负责学习任务特定的高级表示。如果下游改进太慢(梯度不足),即使获得好的基础特征,也无法有效地组织成好的上层表示

梯度分布不均 = 各层学习效率不同 = 整体训练收敛慢、最终性能不佳

在 Pre-LN 架构中,这种现象体现为:

  1. 早期层过度更新:由于梯度过大,早期层的参数在训练初期可能剧烈波动,导致学到的特征不够稳定。
  2. 后期层更新不足:深层网络中最靠近输出的层本应承担最重要的任务特定表示学习,但它们接收到的梯度信号却相对不足,导致学习速度缓慢。

关键观察:论文通过可视化展示了这一现象:

Figure 3: Average L1 norm of gradients across layers

Pre-LN 的梯度分布呈现明显的递减趋势,与 Post-LN 的递增趋势恰好相反。但两种趋势都是问题——因为两者都导致梯度分布不均。

1.3 梯度分布可视化:问题的直观表现

为了更直观地理解三种架构的梯度分布差异,我们用下面的图示展示各层的梯度范数变化:

梯度流向图:Post-LN vs Pre-LN vs NormFormer

图的含义

  • x 轴:网络的第几层(从 1 到 12)
  • y 轴:该层参数的梯度 L1 范数(梯度大小)
  • 红线(Post-LN):梯度从浅层的很小逐渐增大到深层,形成"阶梯上升"。这导致深层参数更新剧烈,早层参数更新缓慢
  • 蓝线(Pre-LN):梯度从浅层的很大逐渐减小到深层,形成"阶梯下降"。这导致早层参数更新剧烈,深层参数更新缓慢
  • 绿线(NormFormer):梯度在各层基本保持一致的水平,形成"平坦"的分布。这导致各层参数更新速度均衡

这张图直观地说明了为什么 NormFormer 能提升训练效率:通过在三个精心选择的位置添加归一化操作,它实现了梯度在各层的均衡分布,使得每一层都能以相近的速率学习,从而提高了整个网络的训练效率。

1.4 研究动机:能否让梯度在所有层间均衡分布?

面对这一发现,NormFormer 论文提出了一个自然而直接的研究问题:能否通过在 Transformer 的关键位置添加额外的归一化操作,使得各层的梯度范数趋于均衡?

这个问题的提出源于一个简单但深刻的直觉:归一化操作本质上是对激活值进行重新缩放(rescaling),它天然具备调节梯度流动幅度的能力。如果我们能在正确的位置插入归一化层,就有可能同时解决 Pre-LN 的早层梯度过大和后层梯度过小的问题。

在接下来的章节中,我们将看到 NormFormer 如何通过三处精心设计的改进,实现这一目标。


2. 核心方案:三处改进与架构演进

NormFormer 的核心思想可以用一句话概括:在 Pre-LN Transformer 的基础上,在三个关键位置添加额外的归一化操作,通过精心的梯度控制实现各层学习效率的均衡化

这三个操作分别是:Post-Attention LayerNorm(注意力后归一化)、HeadScale(注意力头缩放)和 FFN Mid-LayerNorm(前馈网络中间归一化)。它们的协同作用可以用下式表示:

$$x_{l+1}^{\text{NormFormer}} = \text{NormFFN}(\text{NormScaledMHA}(x_l))$$

在深入讲解具体的改进点之前,我们先给出 NormFormer、Pre-LN 和 Post-LN 三种架构的全景对比,帮助读者快速理解各架构的特点。

2.0 架构总览

三种架构的特性对比

Figure 1: NormFormer、Pre-LN 与 Post-LN 架构对比

特性Post-LNPre-LNNormFormer
归一化位置残差连接之后子层之前多点分布式
训练稳定性差(需精细 warmup)更好(支持更高学习率)
梯度分布后层 » 早层早层 » 后层各层趋于均衡
头级控制有(HeadScale)
FFN 内部归一化
额外参数量-基准+0.4%
额外训练开销-基准+2~6%

关键观察:NormFormer 的核心创新在于在三个精心选择的位置添加归一化操作,以极小的代价(0.4% 参数 + 2~6% 计算)实现了梯度分布的均衡化。这种"微创手术"式的改进策略在理论上可以解决 Pre-LN 的梯度失衡问题,同时保留其训练稳定性优势。

三处改进的位置总览

NormFormer 的三个改进分别位于 Transformer 块中的不同位置:

  1. Post-Attention LayerNorm:在多头注意力输出后、残差连接前
  2. HeadScale:在多头注意力的拼接(concat)操作前,对每个头乘以可学习标量
  3. FFN Mid-LayerNorm:在前馈网络的激活函数后、第二个线性层前

我们将逐个讲解每个改进的工作原理、消融验证数据和实际贡献度。


2.1 改进点 A:Post-Attention LayerNorm

工作机制

核心设计: 在多头注意力的输出后、残差连接前,添加一个额外的 LayerNorm。

标准 Pre-LN 的注意力子层为:

$$\text{PreLN-MHA}(x) = x + \text{MHA}(\text{LN}(x))$$

NormFormer 将其修改为:

$$\text{NormScaledMHA}(x) = x + \text{LN}(\text{HeadScaleMHA}(\text{LN}(x)))$$

这里外层的 $\text{LN}(\cdot)$ 包裹注意力输出。这个额外的归一化层起到了下缩放(downscaling) 的作用:论文发现训练完成后,所有层的 Post-Attention LN 的缩放参数(gamma)都低于 1,这意味着它在系统性地降低注意力输出的幅度。

为什么这很重要? 在标准 Pre-LN 中,注意力层的输出直接通过残差连接加到主干上。如果注意力输出的幅度过大,会导致残差分支主导信号传播,破坏信息在不同层之间的平衡传递。通过添加这一归一化层,NormFormer 能够自适应地控制每一层注意力输出的贡献幅度。

原理图和实现

Post-Attention LayerNorm 原理

简洁实现示例(PyTorch):

attn_output = self.attention(self.layer_norm(x))
attn_output = self.post_attn_layer_norm(attn_output)  # 新增
x = x + attn_output

消融实验数据

在 125M 模型上的消融结果:

配置PPL相比完整 NormFormer 的变化贡献度
完整 NormFormer15.88基准-
移除 Post-Attn LN15.92+0.04最小

贡献度评估:Post-Attn LN 的单独贡献最小(+0.04 PPL 退化),但作为整体方案的补充,它有助于进一步稳定梯度流。


2.2 改进点 B:HeadScale

工作机制

核心设计: 在多头注意力的拼接(concat)操作前,对每个注意力头的输出乘以一个独立的可学习标量参数。

传统的多头注意力将所有头的输出直接拼接后通过输出投影矩阵:

$$\text{MHA}(Q, K, V) = \text{Concat}(h_1, h_2, ..., h_n) W^O$$

NormFormer 引入了 HeadScale 机制:

$$\text{HeadScaleMHA}(Q, K, V) = \text{Concat}(\gamma_1 \cdot h_1, \gamma_2 \cdot h_2, ..., \gamma_n \cdot h_n) W^O$$

其中 $\gamma_i$ 为可学习的标量参数,初始化为 1,确保训练初期与标准多头注意力完全一致。

原理图和关键发现

HeadScale 原理:逐头缩放

关键发现:

  1. 头级权重差异化:训练后的 $\gamma_i$ 值变化较大,不同头获得了不同的缩放权重,这表明模型学会了动态调整不同注意力头的重要性
  2. 无单调性约束:$\gamma_i$ 与层深度之间没有明显的单调关系,说明 HeadScale 不是简单地对深层或浅层进行统一调节,而是在细粒度上优化每个头的贡献。
  3. 最大贡献度:在消融实验中,HeadScale 是三个操作中贡献最大的

实现示例

head_scales = nn.Parameter(torch.ones(num_heads))  # 初始化为1
scaled_heads = [head_scales[i] * heads[i] for i in range(num_heads)]
attn_output = torch.cat(scaled_heads, dim=-1) @ W_o

消融实验数据

在 125M 模型上的消融结果:

配置PPL相比完整 NormFormer 的变化相对贡献度
完整 NormFormer15.88基准-
移除 HeadScale16.22+0.3469% 的总改进

贡献度评估:HeadScale 是三个改进点中贡献最大的,单独贡献占总改进(0.49 PPL 相比基线)的约 69%。(注:三个改进的占比之和超过 100% 是因为存在协同效应,详见第 2.5 节)这表明对注意力头进行差异化加权是 NormFormer 最核心的创新。

与注意力头剪枝的联系:HeadScale 的思想与注意力头剪枝(Head Pruning)有一定的联系。Chen 等人在 2021 年的工作中使用类似的头级缩放进行模型压缩,而 NormFormer 将这一思想用于改进训练过程,目标不同但技术路线相似。


2.3 改进点 C:FFN Mid-LayerNorm

工作机制

核心设计: 在前馈网络(FFN)的第一个线性变换之后、激活函数之后,添加一个 LayerNorm。

标准 FFN 的计算流程为:

$$\text{FFN}(x) = \sigma(x W_1 + b_1) W_2 + b_2$$

NormFormer 将其修改为:

$$\text{NormFFN}(x) = x + \underbrace{\text{LN}_{\text{mid}}}_{\text{新增}}(\sigma(\underbrace{\text{LN}_{\text{pre}}}_{\text{原有Pre-LN}}(x) \cdot W_1 + b_1)) \cdot W_2 + b_2$$

其中 $\text{LN}_{\text{pre}}$ 是 Pre-LN 架构原有的归一化,而 $\text{LN}_{\text{mid}}$ 是 NormFormer 新增的 FFN 中间归一化——它位于激活函数 $\sigma(\cdot)$ 之后、第二个线性变换 $W_2$ 之前。

关键机制:自适应梯度抑制

FFN Mid-LayerNorm 原理:自适应梯度控制

这是解决梯度失配的核心机制。 论文的 Figure 4 & 5 展示了一个极为重要的发现:

Figure 4 & 5: Scaling parameters and learning rate stability

早期层的 FFN LN gamma 参数系统性地小于后期层的。这意味着 FFN Mid-LayerNorm 自适应地减小了早期层全连接层输入的幅度,从而有效降低了早期层的梯度,缓解了 Pre-LN 固有的"早层梯度过大"问题。这种设计妙处在于:

  • 无需显式约束 gamma 值
  • 模型在训练过程中自动学习最优的梯度分配方案
  • 早层自然获得较小的 gamma(抑制梯度),后层获得较大的 gamma(放大梯度)

数学直觉

归一化操作通过将激活值映射到零均值、单位方差的分布来工作。当早期层的 FFN 中间激活值幅度较大时,归一化层通过较小的 gamma 参数对其进行压缩,相当于在反向传播时减小了通过这些层的梯度流。这种自适应机制使得模型能够自动学习到最优的梯度分配方案。

实现示例

# 原始 FFN
h = activation(x @ W1 + b1)
output = h @ W2 + b2

# NormFormer
h = activation(x @ W1 + b1)
h = self.ffn_layer_norm(h)  # 新增
output = h @ W2 + b2

消融实验数据

在 125M 模型上的消融结果:

配置PPL相比完整 NormFormer 的变化相对贡献度
完整 NormFormer15.88基准-
移除 FFN-LN16.14+0.2653% 的总改进

贡献度评估:FFN-LN 是第二大贡献者,单独贡献占总改进的约 53%。这验证了前馈网络内部归一化对梯度均衡的重要性,是仅次于 HeadScale 的核心创新。


2.4 可选改进:ResScale

除了上述三个核心操作外,NormFormer 还提出了一个可选的 ResScale 操作:

$$\text{ResScale}(x) = \lambda_{\text{resid}} \odot x + \text{Sublayer}(\text{LayerNorm}(x))$$

其中 $\lambda_{\text{resid}}$ 是可学习的逐维度缩放参数,用于调节残差连接中主干信号和子层输出的相对权重。

重要警告: 论文实验表明,ResScale 仅在小模型(125M、355M 参数)上有效,在 1.3B 及以上规模的模型上反而会导致性能下降。因此,对于当前主流的大规模预训练场景,不建议使用 ResScale。这一发现也提醒我们,并非所有的归一化/缩放操作都是"越多越好"的——过度参数化在大模型上可能导致优化困难。


2.5 三大改进的协同效应

前四个小节分别介绍了三个改进点的单独贡献,现在我们看它们是如何协同工作的。

完整消融实验对比

论文在 125M 模型上进行了系统性消融。注意:此规模下的"完整 NormFormer"包含 ResScale(因为 ResScale 仅在小模型上有正收益),而对于 1.3B 及以上的模型,推荐配置不包含 ResScale:

配置PPL相比完整模型的变化单独贡献度
完整 NormFormer(含 ResScale)15.88基准-
移除 Post-Attn LN15.92+0.04最小
移除 FFN-LN16.14+0.26第二大
移除 ResScale16.20+0.32中等
移除 HeadScale16.22+0.34最大
增加 QKV 上的 3 个额外 LN15.88+0.00无收益
基线 Pre-LN16.37+0.49相比 Pre-LN 的总改进

消融实验贡献度分析

关键结论

  1. HeadScale 是绝对核心(+0.34 PPL,占总改进 69%):注意力头的差异化加权是 NormFormer 最具影响力的创新。

  2. FFN-LN 是第二支柱(+0.26 PPL,占总改进 53%):前馈网络内部的自适应梯度抑制对整体改进也至关重要。

  3. Post-Attn LN 是补充设计(+0.04 PPL,占总改进 8%):单独看贡献最小,但与其他改进配合使用时能进一步稳定梯度流。

  4. 三个改进的互补性:总改进 0.49 PPL ≈ HeadScale(0.34) + FFN-LN(0.26) - 重叠。这说明三个改进虽然作用机制不同(头级权重、梯度抑制、层级下缩放),但它们的效果有部分叠加,共同作用于梯度分布均衡化。

反面教训:更多归一化不一定更好

论文还测试了一个反例:在 QKV 投影上额外添加 3 个 LayerNorm——这看似应该进一步改进梯度分布,但实际结果是:

  • 困惑度无任何改进(+0.00 PPL)
  • 训练速度反而降低 5%

启示:NormFormer 选择的三个位置(Post-Attn、HeadScale、FFN Mid)是经过精心设计的,不是简单的"到处加 LN"。随意添加更多归一化操作反而会浪费计算资源,甚至破坏优化过程。

小模型 vs 大模型的推荐配置

基于消融实验的结果,我们给出不同规模模型的推荐配置:

模型规模推荐配置预期改进说明
125M-355MPost-Attn LN + HeadScale + FFN-LN + ResScale最大ResScale 在小模型上有正贡献
1.3B+Post-Attn LN + HeadScale + FFN-LN稳定不使用 ResScale,避免大模型优化困难

3. 实验结果深度分析

NormFormer 论文的实验设计非常全面,涵盖了因果语言模型(CLM)、掩码语言模型(MLM)、零样本评估、消融实验等多个维度。下面我们逐一分析关键实验结果。

3.1 学习率搜索:挑战 GPT-3 的默认设置

在正式实验之前,论文做了一项非常有价值的预实验:系统性的学习率搜索。结果出人意料地发现,在他们的数据集上,最优学习率比 GPT-3 论文建议的值高出 3-5 倍

模型规模GPT-3 建议学习率实际最优学习率倍数
125M6e-43e-35x
355M3e-41e-33.3x
1.3B2e-46e-43x

为什么 NormFormer 能支持更高的学习率?

这个现象与我们在改进点 C(FFN Mid-LayerNorm)讨论的梯度缩放密切相关。通过在 FFN 第一个线性层后添加 LayerNorm,NormFormer 实现了分层的梯度缩放 — 前馈网络内部的特征被重新归一化,避免了极端的激活值。这种分层缩放机制使得早层的梯度幅度自动降低,即使在更高的学习率下,参数更新也不会过于剧烈,从而显著提升了训练稳定性。

工程启示

这一发现本身就具有独立的工程价值——针对自己的数据集进行学习率搜索可能带来显著的性能提升,不要盲目套用论文中的超参数。论文使用这些优化后的基线作为对比对象,确保了实验结果的公平性和说服力。

3.2 因果语言模型:稳定且一致的困惑度改进

在因果语言模型(Causal Language Model)预训练任务上,NormFormer 在所有模型规模上都取得了一致的困惑度(Perplexity)改进:

模型参数量基线 PPLNormFormer PPL改进幅度
125M124.5M21.0920.11-0.98
1.3B1313.5M12.2111.94-0.27
2.7B2649.5M10.9210.55-0.37

核心发现

1. 训练加速效果显著。 NormFormer-1.3B 达到基线相同困惑度的速度快了 24%。也就是说,使用 NormFormer,你只需要原来 76% 的训练时间就能获得相同质量的模型。对于动辄需要数千 GPU 小时的大规模预训练来说,24% 的训练时间节省意味着巨大的计算成本削减。

与改进点的关联:这个加速来自于梯度均衡带来的更高的单步训练效率 — 梯度分布均匀意味着每一层都在以最优速率学习,没有某些层学得太快而其他层跟不上的浪费。这正是改进点 B(HeadScale)和改进点 C(FFN-LN)共同实现的梯度重均衡的直接体现。

2. 大模型训练稳定性提升。 这可能是 NormFormer 最引人注目的工程价值:基线 2.7B 模型在 6e-4 学习率下训练发散(完全失败),而 NormFormer-2.7B 在相同学习率下可以稳定训练并取得最佳性能。这意味着 NormFormer 显著拓宽了大模型可用学习率的范围,降低了超参数调优的难度。

与改进点的关联:这与改进点 B(HeadScale)的头级权重调整密切相关 — 通过对注意力头进行细粒度控制,NormFormer 抑制了某些头过度主导信号的现象。在大模型中,这种头间差异往往更加突出,因此 HeadScale 的稳定化效果在大模型上更加显著。

3. 困惑度改进随模型规模变化。 125M 模型上的绝对改进最大(-0.98),而大模型上的绝对改进较小。但考虑到大模型本身的困惑度已经很低(基数效应),相对改进幅度仍然有意义。更重要的是,训练加速和稳定性提升在大模型上同样甚至更加显著

总结

因果语言模型的实验充分验证了 NormFormer 的核心改进在实践中的效果:梯度均衡带来的训练加速,头级控制带来的稳定性提升,使得 NormFormer 成为一个具有重大工程价值的改进方案。

3.3 零样本任务评估:无需微调即见效果

NormFormer 在零样本(Zero-Shot)任务评估中展现了明显的优势,直接反映了预训练质量的提升:

任务基线-1.3BNormFormer-1.3B基线-2.7BNormFormer-2.7B
HellaSwag58.560.5--
WinoGrande76.877.5--
平均(多任务)63.664.766.368.7

关键发现:

  • NormFormer-125M 达到 GPT-3 Large(1.3B 参数)零样本性能的速度快了 60%
  • 在 2.7B 规模上,平均零样本准确率从 66.3% 提升到 68.7%(+2.4 个百分点)。

3.4 掩码语言模型:GLUE 基准全面提升

论文在掩码语言模型(Masked Language Model)上的实验验证了 NormFormer 对编码器型模型(BERT 类)同样有效。在 GLUE 基准的所有 7 个任务上都取得了改进

GLUE 任务基线NormFormer提升
CoLA74.382.6+8.3
MNLI85.986.3+0.4
MRPC84.686.0+1.4
QNLI91.691.9+0.3
QQP90.791.3+0.6
RTE66.467.9+1.5
SST-292.993.8+0.9
平均83.7785.69+1.92

最令人印象深刻的是 CoLA 任务上的 +8.3 提升(从 74.3 到 82.6),说明 NormFormer 对语法特征学习的显著帮助。GLUE 平均分提升接近 2 个百分点,MLM 困惑度从 3.42 降低到 3.31,展现了强大的通用性。

3.5 消融实验:各组件贡献量化

在第 2 部分,我们已经讨论了 NormFormer 的三个核心改进点(HeadScale、Post-Attn LN、FFN-LN)。这里提供完整的消融实验细节,量化每个组件的具体贡献。论文在 125M 小模型(470 V100 GPU 小时)上进行了系统性消融。注意:此规模下的"完整 NormFormer"包含 ResScale(因为 ResScale 仅在小模型上有正收益),而对于 1.3B 及以上的模型,推荐配置不包含 ResScale:

配置Perplexity相比完整模型的退化
完整 NormFormer + ResScale15.88基准
移除 Post-Attn LN15.92+0.04
移除 FFN LN16.14+0.26
移除 ResScale16.20+0.32
移除 HeadScale16.22+0.34(影响最大)
增加 3 个额外 LN(QKV 上)15.88+0.00(无额外收益)
基线 Pre-LN16.37+0.49

关键结论:

  1. HeadScale 贡献最大(移除后退化 +0.34),说明注意力头的差异化加权是 NormFormer 最核心的创新。
  2. FFN LN 贡献第二(+0.26),验证了前馈网络内部归一化对梯度均衡的重要性。
  3. Post-Attn LN 贡献最小(+0.04),但仍有正面效果。
  4. 更多归一化并不总是更好:在 QKV 投影上额外添加 3 个 LN 没有带来任何性能提升,反而使训练速度降低 5%。这证明了 NormFormer 选择的三个位置是经过精心设计的,不是简单的"到处加 LN"。

3.6 超参数鲁棒性验证

NormFormer 的另一个重要优势是其对超参数设置的鲁棒性。论文在 125M 模型上测试了多种超参数组合:

学习率配置基线 PPLNormFormer PPL差值
0.001默认16.8016.33-0.47
0.003默认16.3715.88-0.49
0.003更长 warmup16.5016.06-0.44
0.003GPT-3 设置16.2915.88-0.41

NormFormer 在所有超参数配置下都一致优于基线,改进幅度在 0.41-0.49 之间波动,方差极小。这意味着使用 NormFormer 不需要额外的超参数调优工作——只要基线能跑,NormFormer 就能带来稳定的改进。

3.7 Wikitext-103 验证

论文还在 Wikitext-103 数据集上进行了验证:

模型最终 Perplexity达到基线 PPL 所需步数
基线18.70100%
NormFormer18.6570%(节省 30% 训练时间)

NormFormer 仅需 70% 的训练步数就达到了基线的最终性能。虽然后 30% 的训练中 NormFormer 的改进趋于饱和,但论文指出这可能通过进一步的训练策略调优来改善。

3.8 计算开销分析

NormFormer 的工程吸引力在于其极低的额外开销:

指标数值
额外参数量+0.4%(不足 0.07% 实际额外参数)
额外内存开销+2~6%
单步训练时间增加+2~6%
推理开销接近零

这些数字意味着,NormFormer 实质上是一个"免费的改进"——用不到 6% 的额外计算成本,换取 24% 的训练加速和可量化的性能提升。从性价比角度看,这非常划算。


4. 工程应用与落地分析

4.1 实现极度简单

NormFormer 的工程实现可以说是所有 Transformer 改进方案中最简单的之一。只需要在现有 Pre-LN Transformer 代码中做三处修改:

修改一:在 MultiHeadAttention 输出后添加 LayerNorm

# 原始 Pre-LN
attn_output = self.attention(self.layer_norm(x))
x = x + attn_output

# NormFormer
attn_output = self.attention(self.layer_norm(x))
attn_output = self.post_attn_layer_norm(attn_output)  # 新增
x = x + attn_output

修改二:在 MHA concat 前对每个 head 乘以可学习标量

# 原始 MHA
attn_output = torch.cat(heads, dim=-1) @ W_o

# NormFormer
head_scales = nn.Parameter(torch.ones(num_heads))  # 初始化为1
scaled_heads = [head_scales[i] * heads[i] for i in range(num_heads)]
attn_output = torch.cat(scaled_heads, dim=-1) @ W_o

修改三:在 FFN 第一个线性层后添加 LayerNorm

# 原始 FFN
h = activation(x @ W1 + b1)
output = h @ W2 + b2

# NormFormer
h = activation(x @ W1 + b1)
h = self.ffn_layer_norm(h)  # 新增
output = h @ W2 + b2

在 fairseq 框架中,这三个修改对应三个简单的命令行参数:

fairseq-train ... --scale-attn --scale-fc --scale-heads

4.2 与主流框架的兼容性

NormFormer 的设计具有极强的框架兼容性:

与 PyTorch 原生 Transformer 兼容: NormFormer 的三处修改都是在现有层之间插入标准的 LayerNorm 或可学习参数,不改变任何现有层的接口或行为。这意味着它可以无缝集成到任何基于 PyTorch 的 Transformer 实现中。

与 HuggingFace Transformers 兼容: 只需继承现有的注意力层和前馈网络层,在对应位置添加归一化操作即可。不需要修改分词器、数据加载器或训练循环。

与分布式训练框架兼容: NormFormer 添加的归一化层和可学习参数都是标准的 PyTorch 模块,完全兼容 DeepSpeed、Megatron-LM、FSDP 等主流分布式训练框架。归一化操作的计算和通信开销极小,不会成为分布式训练的瓶颈。

与不同归一化方式兼容: 虽然论文使用 LayerNorm 进行实验,但其设计思想对 RMSNorm(LLaMA 系列使用的归一化方式)同样适用。可以将 NormFormer 中的 LayerNorm 替换为 RMSNorm,在保持核心优势的同时获得 RMSNorm 的计算效率优势。

4.3 实际部署场景与建议

场景一:从头预训练大语言模型

这是 NormFormer 最适用的场景。如果你的团队正在从头训练一个数十亿参数的语言模型,添加 NormFormer 可以:

  • 节省约 24% 的训练时间(以达到同等困惑度为标准)
  • 支持使用更高的学习率而不发散,降低超参数调优成本
  • 以不到 6% 的额外计算开销换取稳定的性能提升

场景二:中等规模模型的快速迭代

对于 125M-1B 参数规模的模型,NormFormer 的收益更加明显。在这个规模上,可以同时使用 ResScale 获得最大收益。特别适合需要快速迭代模型架构和训练策略的研究场景。

场景三:训练稳定性要求高的场景

如果你的训练任务容易出现发散(例如使用较大的学习率、较长的上下文、较大的 batch size),NormFormer 可以显著提升训练的鲁棒性。2.7B 模型在高学习率下的稳定训练就是一个很好的例证。

4.4 不适用场景

也需要诚实地指出 NormFormer 可能不太适用的场景:

  1. 已有预训练好的模型进行微调: NormFormer 的收益主要体现在预训练阶段。如果你只是微调一个现有模型,添加 NormFormer 需要重新预训练,成本远大于收益。
  2. 极大规模模型(>10B): 论文最大的实验只到 2.7B,对于更大规模模型的效果尚未被验证。虽然理论上应该同样有效,但缺乏实证支持。
  3. 推理优化敏感的场景: 虽然 NormFormer 的额外推理开销极小,但在对推理延迟有极致要求的场景下(例如实时搜索排序),任何额外的计算都需要审慎评估。

4.5 成本收益分析

让我们做一个简单的成本收益计算。假设你正在训练一个 1.3B 参数的语言模型:

成本(额外开销):

  • 训练速度降低约 4%(1.3B 规模的典型值)
  • 如果原始训练需要 10000 GPU 小时,NormFormer 版本需要约 10400 GPU 小时

收益:

  • 达到相同困惑度仅需 7600 GPU 小时(节省 24%)
  • 最终困惑度从 12.21 降低到 11.94
  • 零样本平均准确率从 63.6% 提升到 64.7%
  • 更强的训练稳定性,降低训练失败的风险

净收益: 即使考虑单步训练时间的增加,要达到基线相同性能仍然可以节省约 20% 的总训练时间。如果以固定的计算预算训练到收敛,则获得更好的最终性能。NormFormer 都是一个值得采纳的改进。

4.6 与后续工作的关系

NormFormer 发表于 2021 年底,此后 Transformer 归一化领域继续涌现了许多重要工作:

  • RMSNorm(Root Mean Square Layer Normalization):去掉了 LayerNorm 中的均值中心化步骤,计算效率更高。被 LLaMA 系列广泛采用。NormFormer 的设计理念可以与 RMSNorm 无缝结合。
  • QK-Norm:对注意力中的 Query 和 Key 进行归一化,防止注意力得分过大。与 NormFormer 的 HeadScale 有互补作用。
  • HybridNorm(2025):探索了在同一模型中混合使用 Pre-LN 和 Post-LN 的可能性,进一步细化了归一化位置的选择。
  • nGPT(2024):提出了基于单位超球面上表示学习的归一化方案,代表了归一化研究的新方向。

这些后续工作并没有否定 NormFormer 的价值,反而证明了"在 Transformer 中优化归一化策略"这一研究方向的重要性。NormFormer 作为这一领域的先驱工作之一,为后续研究奠定了重要的理论和实验基础。


5. 总结与展望

5.1 核心贡献回顾

NormFormer 论文的核心贡献可以用三句话概括:

  1. 发现了问题: 系统性地揭示了 Pre-LN Transformer 中各层梯度分布不均的问题——早期层梯度过大、后期层梯度不足。
  2. 提出了方案: 通过在三个精心选择的位置(注意力输出后、注意力头拼接前、FFN 中间层)添加归一化操作,有效缓解了梯度失配。
  3. 验证了效果: 在多种任务(CLM、MLM、零样本)和多种规模(125M-2.7B)上,以不到 6% 的额外计算成本换取了 24% 的训练加速和一致的性能提升。

5.2 对工程实践的启示

NormFormer 给我们的最大启示不仅仅是"加几个 LayerNorm"这么简单,而是:

启示一:小改进,大回报。 在深度学习研究中,并非所有有价值的工作都需要颠覆性的架构创新。有时候,对现有架构的精细分析和微小调整就能带来显著的实际收益。NormFormer 的三处修改总共只增加了 0.4% 的参数量,却换来了 24% 的训练加速——这种高性价比的改进在工业界尤其受欢迎。

启示二:梯度分析是优化训练的利器。 NormFormer 的整个工作建立在对梯度分布的细致观察之上。通过可视化和分析各层的梯度范数,研究者找到了问题所在,并据此设计了针对性的解决方案。这提醒我们,在训练大模型时,不要只盯着损失曲线,还应该关注梯度的层间分布。

启示三:不是所有改进都能无限叠加。 消融实验表明,在三个位置之外继续添加归一化层不仅没有收益,反而降低了训练速度。ResScale 在大模型上甚至有害。这告诉我们,模型改进需要有度,过度设计反而可能适得其反。

5.3 未来展望

尽管 NormFormer 已经展示了令人信服的实验结果,但仍有一些开放的研究方向值得探索:

  1. 超大规模验证: 论文最大的实验只到 2.7B 参数,NormFormer 在 10B、100B 甚至更大规模模型上的表现如何?是否存在新的问题或需要调整的地方?
  2. 与新型归一化的结合: 将 NormFormer 的设计理念与 RMSNorm、QK-Norm 等新技术结合,是否能获得更大的收益?
  3. 多模态扩展: NormFormer 目前主要在语言模型上验证,在视觉 Transformer(ViT)、多模态模型(如 Flamingo、GPT-4V)中是否同样有效?
  4. 自适应归一化: 能否设计一种机制,让模型在训练过程中自动决定在哪些位置需要额外的归一化,而不是人工预设固定位置?

总而言之,NormFormer 是一项兼具理论深度和工程价值的优秀工作。它用最简洁的方式解决了一个被忽视但重要的问题,为大规模 Transformer 预训练提供了一个即插即用的改进方案。对于正在从事大模型预训练的团队来说,NormFormer 值得认真评估和尝试。


参考文献:

  • Shleifer, S., Weston, J., & Ott, M. (2021). NormFormer: Improved Transformer Pretraining with Extra Normalization. arXiv:2110.09456
  • Xiong, R., et al. (2020). On Layer Normalization in the Transformer Architecture. ICML 2020.
  • Vaswani, A., et al. (2017). Attention Is All You Need. NeurIPS 2017.
  • Zhang, B., & Sennrich, R. (2019). Root Mean Square Layer Normalization. NeurIPS 2019.
👋 Hey, I'm Yadong
Authors
电商算法工程师 @ 字节跳动

字节推荐广告算法工程师,专注电商推荐系统。电商广告模型 → 电商推荐模型,兴趣方向:模型结构 Scale Up、序列建模、首点归因、GMV 回归建模。

日常分享搜广推论文 & LLM 笔记,以及自己做的一些小工具和尝试过程。

🔥 欢迎加入 TT 电商推荐团队,期待共建业界领先的推荐系统,完成 LLM 的清晰落地!内推通道 →