Layer Normalization:为什么 Transformer 用 LN,不用 BN

如果说残差连接负责给深层网络留一条直路,Layer Normalization(LN)负责的就是另一件同样基础的事:别让每一层输出的数值尺度乱跑。

这件事听起来像数值细节,但在 Transformer 里它几乎是结构性组件。没有 LN,attention 分数容易变尖,FFN 激活容易飘,深层训练会变得非常敏感;而换成 BatchNorm(BN)这种在视觉里很成功的归一化,又会立刻碰到序列长度、自回归和 batch 依赖的问题。于是 Transformer 家族几乎从一开始就把 LN 当成默认答案。

这一篇就把这套逻辑拆开:LN 到底在算什么,它为什么比 BN 更适合序列模型,pre-LN 为什么改变了深层训练的手感,以及 RMSNorm 这类现代变体到底省掉了什么、保留了什么。

原文链接

一、LayerNorm 到底归一化了什么

LayerNorm 是 Ba、Kiros、Hinton 在 2016 年提出的。给定某个 token 的隐藏向量:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> x = [ x 1 , x 2 , ... , x d ] x = [x_1, x_2, \dots, x_d] </math>x=[x1,x2,...,xd]

LN 会先在这个向量内部计算均值和方差:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> μ = 1 d ∑ i = 1 d x i , σ 2 = 1 d ∑ i = 1 d ( x i − μ ) 2 \mu = \frac{1}{d} \sum_{i=1}^{d} x_i, \qquad \sigma^2 = \frac{1}{d} \sum_{i=1}^{d} (x_i - \mu)^2 </math>μ=d1i=1∑dxi,σ2=d1i=1∑d(xi−μ)2

然后做标准化,再加可学习的缩放和平移:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> LN ⁡ ( x ) i = γ i x i − μ σ 2 + ϵ + β i \operatorname{LN}(x)_i = \gamma_i \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta_i </math>LN(x)i=γiσ2+ϵ xi−μ+βi

其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> γ , β ∈ R d \gamma, \beta \in \mathbb{R}^d </math>γ,β∈Rd,是每个维度自己的可学习参数。

1.1 它的归一化范围是"单个 token 的所有通道"

这句话值得反复强调,因为它和 BatchNorm 的差别就在这里。

对于一个形状是 [B, T, d] 的 Transformer 激活:

  • LayerNorm:对每个 (b, t) 独立地,沿最后一维 d 做归一化;
  • 也就是说,每个 token 都自己算一套均值和方差;
  • 跟 batch 里别的样本、同一序列里别的位置都没关系。

因此 LN 的行为不依赖:

  • 当前 batch size 有多大;
  • 序列长度是 128 还是 8192;
  • 这是训练还是推理。

这正是它特别适合 Transformer 的第一层原因。

1.2 LN 不是把信息"洗掉",而是把尺度拉回稳定区间

有些初学者会担心:既然 LN 每次都把均值拉成 0、方差拉成 1,那原始表示里的信息是不是被抹掉了?

不会。原因有两点:

  1. <math xmlns="http://www.w3.org/1998/Math/MathML"> γ \gamma </math>γ 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> β \beta </math>β 是可学习的,网络可以学会恢复或重排它需要的尺度;
  2. LN 主要约束的是公共偏移和整体尺度。经过中心化和缩放后,表示在绝对坐标系里的位置会变,但这不等于语义信息被直接抹掉。

换句话说,LN 不是把向量内容洗白,而是把它拉回一个更适合后续线性层和 softmax 继续工作的数值区域。


二、为什么不用 BatchNorm

从 2015 年开始,BatchNorm 几乎是深度网络训练的标配。那 Transformer 为什么一上来就没选它?

答案很简单:BN 的统计维度和序列模型的需求对不上。

2.1 BatchNorm 依赖 batch 统计

BN 对某一层某一通道,会在整个 batch 上统计均值和方差。对 [B, T, d] 的张量来说,它更像是在某些维度上跨 batch 聚合。

这在 CNN 里很好用,因为:

  • 图像尺寸固定;
  • batch 往往够大;
  • 推理时可以用训练期累积的 running mean / variance。

但对 Transformer 来说,麻烦很快出现。

2.2 变长序列会让 BN 的统计口径很别扭

自然语言里,不同样本的长度经常不同,padding 又很多。你要是跨 batch 去统计均值方差,会立刻碰到:

  • 不同位置的语义分布本来就不同;
  • padding 会污染统计;
  • batch 大小时,统计稳定性差别很大。

尤其是小 batch 或微调场景,BN 的统计会很抖。

2.3 自回归推理更不适合 BN

decoder-only LLM 推理时,经常是一条请求一个 batch、一步一个 token 地生成。此时:

  • batch size 可能等于 1;
  • 每一步前缀长度不同;
  • 你很难定义稳定又合理的 batch 统计。

LN 不依赖跨样本统计,因此会避开这一类问题,因为它只看当前 token 自己的隐藏向量。

2.4 BN 会引入训练/推理不一致

BN 训练时用当前 batch 统计,推理时用 running statistics;而 LN 训练推理一模一样。这对长序列生成非常重要,因为生成时任何训练/推理分布不一致都会被 autoregressive 方式逐步放大。

所以对 Transformer 来说,LN 不是"一个可替代 BN 的选项",而更像最自然、也最常见的默认解。


三、LN 在 Transformer 里具体放在哪里

这一点前一篇已经碰到过,但值得单独拿出来。

Transformer 里 LN 的核心分歧,不是要不要用,而是放在残差相加之前还是之后

3.1 原论文:Post-LN

原论文的写法是:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> h ′ = LN ⁡ ( x + MHA ⁡ ( x ) ) y = LN ⁡ ( h ′ + FFN ⁡ ( h ′ ) ) \begin{aligned} h' &= \operatorname{LN}(x + \operatorname{MHA}(x)) \\ y &= \operatorname{LN}(h' + \operatorname{FFN}(h')) \end{aligned} </math>h′y=LN(x+MHA(x))=LN(h′+FFN(h′))

也就是 attention / FFN 先做完,和残差相加,再统一归一化。

这套写法在 6 层翻译模型里完全能用,但当层数变深时,训练会越来越依赖 warmup、初始化和学习率配方。

3.2 现代主流:Pre-LN

现代更常见的是:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> h ′ = x + MHA ⁡ ( LN ⁡ ( x ) ) y = h ′ + FFN ⁡ ( LN ⁡ ( h ′ ) ) \begin{aligned} h' &= x + \operatorname{MHA}(\operatorname{LN}(x)) \\ y &= h' + \operatorname{FFN}(\operatorname{LN}(h')) \end{aligned} </math>h′y=x+MHA(LN(x))=h′+FFN(LN(h′))

它把 LN 提前到每个子层输入,直觉上做了两件事:

  1. 给 attention / FFN 一个分布更稳定的输入;
  2. 让 residual 主路径尽可能保持直通。

3.3 梯度上的差别比前向更关键

Post-LN 和 Pre-LN 前向看起来只差一个括号位置,但反向差别很大。

在 post-LN 里,主路径梯度也必须穿过 LN 的 Jacobian;在 pre-LN 里,主路径更接近恒等映射。Xiong 等人在 2020 年对 pre-LN / post-LN 的分析,也指向了这个方向:pre-LN 通常更容易训练更深的模型。

3.4 原论文为什么还能训起来

因为它的深度不算大,只有 6 层;同时还配上了:

  • 4000 步 warmup;
  • 比默认更激进的 Adam 参数;
  • 比较仔细的初始化与正则化。

一旦模型往更深处走,仅靠这些配方技巧就不够了,所以社区后来才逐渐转向 pre-LN。


四、LN 为什么能稳定 attention 和 FFN

把 LN 放到 Transformer 里,最直接的好处体现在两处:attention 分数和 FFN 激活。

4.1 对 attention:控制 Q/K 的尺度

attention 分数来自:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> Q K ⊤ d k \frac{QK^\top}{\sqrt{d_k}} </math>dk QK⊤

如果输入激活尺度在不同层里乱飘,那么:

  • Q/K 的范数会一起飘;
  • 点积会突然变大或变小;
  • softmax 会过尖或过平;
  • 梯度要么集中在极少数位置,要么全是噪声。

LN 的作用就是把子层输入的数值范围拉回稳定区间,让 attention score 的统计特性更可控。

4.2 对 FFN:控制激活不要一路放大

FFN 是两层大矩阵乘再加激活函数。没有 LN,某几层的激活一旦偏大,就很容易通过矩阵乘继续放大,最后出现厚尾甚至数值爆炸。

LN 不是彻底消灭这种风险,但通常会显著降低它。你可以把它看成"每次进入大算子前先做一次定标"。

4.3 LN 和 warmup 是互补关系

这也是为什么原论文虽然用了 post-LN,仍然需要 warmup。LN 提供的是局部数值稳定;warmup 解决的是训练最初几千步优化器统计不稳、参数还很随机的问题。两者不是替代关系,而是叠加关系。

下图表达的是常见现象:post-LN 往往更依赖 warmup,而不是给出一条可以直接拿去复现的统一损失曲线。


五、RMSNorm 为什么后来会流行

标准 LayerNorm 有两个步骤:

  1. 减均值;
  2. 除以标准差。

RMSNorm(Root Mean Square Layer Normalization)把第一步去掉了,只保留按均方根缩放:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> RMSNorm ⁡ ( x ) i = γ i x i 1 d ∑ j = 1 d x j 2 + ϵ \operatorname{RMSNorm}(x)i = \gamma_i \frac{x_i}{\sqrt{\frac{1}{d}\sum{j=1}^{d} x_j^2 + \epsilon}} </math>RMSNorm(x)i=γid1∑j=1dxj2+ϵ xi

5.1 它少掉了什么

RMSNorm 不再显式把均值拉成 0,所以没有 <math xmlns="http://www.w3.org/1998/Math/MathML"> β \beta </math>β 这一项,也不需要计算中心化后的方差。它保留的是"控制整体幅值",去掉的是"强制中心化"。

5.2 为什么这在实践里经常够用

不少工作和工程实践都表明,对 Transformer 来说,真正关键的往往是把激活的尺度控制住,而不是一定要把均值也严格移到 0。既然如此,RMSNorm 就提供了一个更轻、更简单、数值上也常常够好的替代。

5.3 它为什么特别受 decoder-only LLM 欢迎

原因主要有三个:

  1. 计算更省一点;
  2. 实现更简单;
  3. 在不少 decoder-only LLM 里,效果损失通常很小。

以 LLaMA 系列为代表,不少现代 decoder-only LLM 采用了 RMSNorm 或其近亲变体;Mistral、Qwen 等开源模型也延续了这一路线。

5.4 这不意味着 LN 过时

标准 LN 在 encoder、视觉 Transformer、很多多模态模型里仍然非常常见。RMSNorm 的流行更像是"在某类大模型和工程约束下,一个更省的近似已经足够好",而不是 LN 被完全淘汰。


六、几个工程上很容易踩的坑

6.1 低精度训练时常用更高精度算 norm

即使模型主体用 FP16 或 BF16,很多实现也会在算均值、方差时临时转成 FP32,再把结果 cast 回去。原因很简单:归一化的统计量对精度比较敏感,尤其是长链路训练时,微小误差会逐层积累。

6.2 LN 不是"哪里不稳就加哪里"

Transformer 里的 LN 放置位置是整体设计的一部分,不是可以随手乱插的补丁。随便多加几层 LN,可能会让主路径被过度打断,反而损失表达力。


七、几个常见误解

7.1 "LN 就是把每一层输出压成均值 0、方差 1,所以会损失表达力"

不对。LN 后面还有可学习的 <math xmlns="http://www.w3.org/1998/Math/MathML"> γ \gamma </math>γ、 <math xmlns="http://www.w3.org/1998/Math/MathML"> β \beta </math>β,而且它不会因为一次中心化和缩放就自动把语义信息抹平。它限制的是无约束漂移,不是把表示洗白。

7.2 "BN 比 LN 更强,只是 Transformer 没跟上"

不是"谁更强"的问题,而是谁和序列建模的统计结构更匹配。BN 很适合大 batch 图像模型;LN 更适合变长序列和自回归推理。

7.3 "Pre-LN 只是实现习惯差异"

也不对。它直接改变了残差主路径的梯度性质,所以会显著影响深层训练稳定性。

7.4 "RMSNorm 就是更便宜的 LN,因此总是更好"

不是。它只是很多场景下足够好,而且更省。是否更合适,还取决于架构、任务和训练配方。

7.5 "有了 LN 就不需要 warmup"

错。LN 和 warmup 解决的是不同层面的问题:一个管激活分布,一个管训练初期优化动态。


八、结语

LayerNorm 在 Transformer 里的地位,和卷积网络里的 BatchNorm 有点像:平时画图时一笔带过,但没有它,整个训练配方都要重新写。它真正提供的,不是抽象的"稳定性"三个字,而是更具体的东西:对子层输入做局部定标、让 attention 和 FFN 的数值分布保持可控、配合残差把深层优化问题压到一个可训的范围里。

从原论文的 post-LN,到今天大模型广泛采用的 pre-LN 和 RMSNorm,这条演化线说明的不是"归一化这件事有没有用",而是"在深层 Transformer 里,归一化该以什么姿态出现"。下一篇我们回到原论文主线,看看这些结构和训练配方最终在实验结果上换来了什么。


九、参考文献

  1. Ba, J. L., Kiros, J. R., Hinton, G. E. "Layer Normalization." arXiv:1607.06450, 2016. LN 的原始提出。
  2. Ioffe, S., Szegedy, C. "Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift." ICML 2015. BN 的原始提出,用来和 LN 对照。
  3. Vaswani, A. et al. "Attention Is All You Need." NeurIPS 2017. Transformer 中 LN 的标准用法。
  4. Xiong, R. et al. "On Layer Normalization in the Transformer Architecture." ICML 2020. 分析 pre-LN / post-LN 的优化差异。
  5. Zhang, B., Sennrich, R. "Root Mean Square Layer Normalization." NeurIPS 2019 Workshop. RMSNorm 的代表性工作。
  6. Wang, S. et al. "DeepNet: Scaling Transformers to 1,000 Layers." IEEE TPAMI 2024. 深层 Transformer 中 norm 与 residual 的协同设计。

← 上一篇:24|残差连接 | 下一篇:26|前馈网络

相关推荐
ltl5 小时前
title: 【Transformer 与注意力机制】24|
后端
范什么特西5 小时前
Spring 动态代理 静态代理
java·后端·spring
醇氧5 小时前
Spring 动态注册 Bean 深度解析:从源码到实践
java·后端·spring
zb200641205 小时前
Laravel7.x十大核心特性解析
spring boot·后端·laravel
明月_清风6 小时前
FastAPI 从入门到实战:3 分钟构建高性能异步 API
后端·python·fastapi
小村儿6 小时前
连载10-Sub-agents 深度解析:从源码理解 Claude Code 的分身术
前端·后端·ai编程
他们叫我阿冠6 小时前
Day5学习--SpringBoot详解
spring boot·后端·学习
枕星而眠6 小时前
Linux 四大进程/线程同步锁详解:互斥锁、读写锁、条件变量、文件锁
linux·c语言·后端·ubuntu·学习方法
IT_陈寒6 小时前
Vite动态导入把我坑惨了,原来要这样用才对
前端·人工智能·后端