无归一化 Transformer:去掉 LayerNorm 能不能训?有什么替代方案?

你有没有遇到过这种情况:训练一个 Transformer,loss 掉到 0.7 左右,突然跳一下变成 NaN,整个实验白给。我最早遇到这种问题时,第一反应是调低学习率,第二反应是检查数据。排除了半天,最后才发现问题出在 LayerNorm 上——准确地说,是 LayerNorm 的位置。

AI technology illustration

于是我问了自己一个问题:如果干脆把 LayerNorm 拿掉,会怎样?这个想法并不奇怪。很多网络不要归一化也能训,比如 ResNet 可以用 BatchNorm,也可以用 Fixup 这类初始化技巧。那 Transformer 呢?

答案是:能训,但得在“替代方案”上下功夫。这篇回答我就把 LayerNorm 在 Transformer 里的真正作用、去掉之后的坑,以及 ReZero、Fixup、DeepNorm、RMSNorm 这几个替代方案掰开讲清楚。

LayerNorm 不是装饰,是脚手架的“拉索”

先回忆一下标准 Transformer 的残差结构:每个子层输入是 x,残差分支输出 f(x),然后 x + f(x)。LayerNorm 要么加在残差相加之前(Pre-LN),要么加在相加之后(Post-LN)。

LayerNorm 做的事情很简单:对每个 token 的隐藏向量减去均值、除以标准差,再乘一个可学习的缩放因子 γ 和偏移 β。 比如 d 维向量 z=(z1,…,zd),归一化后变成:

μ = mean(z), σ = sqrt(mean((z-μ)^2))
LN(z) = γ * (z - μ) / (σ + ε) + β

这一操作有两个效果。第一,它把向量的尺度压回一个可控范围——这直接关系到残差流的稳定性。第二,它让梯度更新有了“一视同仁”的基准——不管上一层怎么剧烈波动,这一层的输入尺度都是均一的。

关于这一点,有一篇关键词是“Understanding the Difficulty of Training Transformers”的论文,专门分析了 Post-LN 不稳定的原因:随着深度增加,残差连接的梯度范数会指数级增长,LayerNorm 恰好能缓解这个增长。参考文献:Understanding the Difficulty of Training Transformers

还有一个经验事实:Pre-LN 比 Post-LN 稳定,但收敛的时候比 Post-LN 略差。原因在于 Pre-LN 把归一化放在残差相加之前,等于给恒等路径“加了层保护”。这层保护让训练初期非常稳,但也让模型有了一点“偷懒”的空间——直接复制上一层输入,而不去表达需要跨层变换的信息。这也解释了为什么很多大规模Transformer 后续研究又回到 Post-LN 的变体上。On Layer Normalization in the Transformer Architecture 这篇论文有详细对比。

把 LayerNorm 直接删掉,会发生什么?

我最早以为,LayerNorm 只是一种“特征标准化”,删掉之后最多是收敛慢一些。后来我在一个 12 层的 Transformer 上试过一次,结果 loss 直接飞到天上。

为什么?想象残差流是一个水桶。每一层的残差分支都在往水桶里倒水。没有 LayerNorm,桶里的水会随深度线性增长。更麻烦的是,每一层输出的方差会积压,等传到输出层时,数值范围已经不是 Softmax 能处理的了。

梯度也一样:反向传播时,所有残差分支的梯度直接相加。没有归一化,这个加法很容易让梯度范数爆炸或消失。你会看到 loss 曲线像过山车,或者直接 NaN。

所以,真正要解决的不是“特征中心化”,而是残差流的尺度控制

用初始化骗过优化器:ReZero 和 Fixup

既然 LayerNorm 负责控制尺度,那能不能在初始化阶段就把尺度定好?ReZero 和 Fixup 就是沿着这个思路走的。

Fixup Initialization:把每个残差分支的最后一层权重初始化为 0,同时按深度缩放其他层的权重。这样在初始化时,每个残差块输出都是 0,整个网络就是一个恒等映射。训练初期梯度能够顺畅地传播到每一层,之后再慢慢“学”残差。实验证明,Fixup 可以在无归一化的情况下训练超过百层的 ResNet 和 Transformer。论文:Fixup Initialization

ReZero:更简单,直接给残差分支加一个可学习的缩放参数 α,初始化为 0。训练时 α 随梯度自动变大。作者用 ReZero 训练了上千层的网络,而且收敛速度比 Pre-LN 还快。论文:ReZero is All You Need

这两个方案看起来都很漂亮,但有一个共同的限制:它们依赖精心设计的初始化,到了大规模自回归训练中,仍然不比 RMSNorm + 默认初始化更稳。换句话说,它们是做实验的好起点,但在生产环境中还没完全替代。

如果只是嫌贵:RMSNorm 能省下多少?

LayerNorm 本身的计算量不大,但在长序列场景下,均值 + 方差两次 reduction 会在 GPU 上卡出额外的同步开销。如果只是想省钱,其实有一个非常简单的替代品:RMSNorm。

RMSNorm 把 LayerNorm 除以标准差的部分换成除以均方根(RMS),删掉了均值中心化。作者发现,均值中心化之后引入的是一个线性依赖,对性能影响很小。结果显示,RMSNorm 在 Transformer 上的效果几乎和 LayerNorm 持平,但减少了约 10% 的归一化计算开销。

最有说服力的是,Llama 系列用的就是 RMSNorm。换句话说,大多数“无归一化”的冲动,最后都收敛到了 RMSNorm——留下最重要的缩放部分,丢掉花哨的均值中心化。论文:Root Mean Square Layer Normalization

一张表快速选型

方案 是否保留归一化 核心思想 适用场景 主要代价
Pre-LN 保留 把归一化放到残差相加前 需要稳定训练的场景 表达能力略降
Post-LN 保留 经典位置 小模型、对精度敏感 需要学习率预热
RMSNorm 只保留缩放 去掉均值中心化 大模型训练,性价比优先 对数值范围还是敏感
Fixup 精细初始化,残差分支清零 研究或受限环境 对深度敏感,调参复杂
ReZero 可学习缩放参数初始化为0 深网络、需要快速收敛 训练后期可能不稳定
DeepNorm 保留 残差缩放 + Post-LN 超深 Transformer(千层级) 仍有 LN,计算未削减

DeepNorm 单独说一下:它是为训练 1000 层 Transformer 设计的,本质上是通过对残差分支和隐藏状态做尺度缩放,让 Post-LN 的梯度从“指数级”衰减变成“线性级”。它的成功说明,LayerNorm 可以被其他尺度机制替代一部分功能,但要同时兼顾训练稳定性和表达力,残差缩放设计依然很讲究。论文:DeepNet: Scaling Transformers to 1,000 Layers

我绕了很久才想通的一点

我最早以为 LayerNorm 只是为了让特征“标准化”,后来我明白了,它更像一个自动平衡器。Transformer 的残差流是许多分量相加的结构,LayerNorm 保证了相加后尺寸不会失控。

也因此,单纯删掉 LayerNorm 而不做任何替代方案,失败几乎是必然的。真正的替代方案不是“删掉”,而是“把它的职责交给别人”——交给初始化的尺度、可学习的缩放、或者更简单的 RMS 缩放。每一种替换都在某种程度上承认:LayerNorm 控制尺度的本领,是别人难以完全替代的。

我的判断

目前,没有一种方案能在完全不牺牲稳定性的前提下彻底踢开 LayerNorm。最接近“无归一化”且已经经受住大规模检验的,是 RMSNorm——它去掉了均值中心化,保留了缩放能力。

如果你只是想加快训练或减少同步开销,首选 RMSNorm;如果你在写论文,想探索“无归一化 Transformer”,ReZero 或者 Fixup 是个不错的起点,但请准备足够的耐心去调初始化。至于那些绚丽的 normalization-free 架构,我建议先看它们是否真正在千亿参数级别验证过,再决定要不要踩坑。

进阶阅读:原论文链接

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/511.html

(0)
上一篇 2天前
下一篇 2天前

相关推荐