主题
字号
PART I · 架构演化
CHAPTER 03 ≈ 40 MIN READ

稳定性之战——归一化与激活函数

上一章结尾我们已经看到了归一化的"站位之争":Post-LN 把归一化架在传送带上,Pre-LN 把它挪到工人的读取口。这一章把这场战役完整讲清楚——归一化到底在防什么,LayerNorm 为什么会被 RMSNorm 取代,激活函数为什么从 ReLU 一路换到 SwiGLU,以及 2025 年之后归一化的站位为什么又有了新变化。

先交代这场仗为什么值得打。你自己训练一个小网络时,训崩了(loss 突然飙成 NaN)大不了重跑一次,损失几分钟。但一次旗舰模型的预训练是几千到几万张 GPU 连续跑几个月的工程,成本以千万美元计。训练中途 loss 突然发散,轻则回滚到几小时前的 checkpoint、跳过一段数据再来,重则整个超参配方推倒重来。在这个尺度上,"稳定性"不是锦上添花的品质,而是第一位的设计约束——一个能把 loss 降得稍低但偶尔会崩的架构,输给一个稍逊但从不崩的架构。本章讲的每一项改动,动机几乎都源于此。

3.1 数值为什么会失控:归一化在防什么

要理解归一化,先理解没有它会发生什么。

神经网络的每一层都在做"乘权重、加起来"。想象传送带上的向量流过几十层,如果每层的输出平均比输入大 10%,那么 96 层之后就是 $1.1^{96} \approx 9000$ 倍——数值指数级膨胀;反过来每层缩小 10%,96 层后就衰减到万分之一。深度网络就像一根首尾相接的扩音器链条,增益稍微偏离 1,信号要么爆炸要么湮灭。而"增益恰好是 1"没有任何先天保证——权重是随机初始化的,还在训练中不断变化。

更麻烦的是这件事和梯度纠缠在一起。前向的数值范围决定了反向的梯度范围,激活爆炸通常伴随梯度爆炸;一次过大的梯度更新把权重推到病态区域,下一步前向就更极端,正反馈几步之内 loss 变成 NaN。现代训练还普遍用 16 位浮点数存激活值(BF16,第五卷会细讲),可表示的数值范围比 32 位窄得多,数值一旦跑飞,直接溢出。

归一化就是插在链条中间的稳压器:不管上游把数值搞成什么范围,过我这一站,统一拉回标准范围。LayerNorm 的做法是对每个位置的 $d$ 维向量减去自身均值、除以自身标准差,再配一组可学习的缩放和平移参数:

$$ \text{LN}(x) = \frac{x - \mu}{\sigma} \odot \gamma + \beta $$

有了每层一次的稳压,增益漂移不再逐层累积,训练的"可崩性"大幅下降。这就是归一化的全部使命:它不直接让模型更聪明,它让模型能被训出来。

顺带说清一个课本常见的困惑:为什么用 LayerNorm 而不是你在 CNN 里学过的 BatchNorm?BatchNorm 沿"批"这个维度统计均值方差,这对语言模型是灾难——序列有长有短、batch 里的统计量在训练和推理时不一致、分布式训练时还要跨卡同步统计量。LayerNorm 只在每个位置自己的 $d$ 维向量内做统计,跟 batch 无关、跟序列长度无关、跟别的卡无关,天然适合序列模型。

3.2 站位之争的完整版:Post-LN、Pre-LN 与代价

上一章用传送带图景讲了结论,这里补上工程史和一个重要的反转。

原版 Transformer(2017)用 Post-LN。当年模型只有 6 层,问题不明显,但也已经需要"学习率 warmup"这个咒语——训练开始时用极小的学习率热身几千步,否则直接崩。随着层数加深,Post-LN 的病症越来越重:梯度要穿过一层又一层的归一化才能到达底层,底层梯度被压得极小,深层模型要么训不动、要么对超参极度敏感。GPT-2(2019)把归一化挪到子层之前,Pre-LN 从此成为标准:传送带畅通,梯度直达,warmup 可以短得多,几百层也训得动。2020 年的一篇论文("On Layer Normalization in the Transformer Architecture")从理论上补齐了解释:Post-LN 里梯度范数随深度衰减,Pre-LN 里则大体平稳。

但 Pre-LN 不是免费的午餐,它有一个安静生长的副作用:传送带上没有任何稳压器了。每层都往传送带上加增量、无人重整,于是残差流的数值范数随深度单调增长,深层的增量相对于已经很"粗"的主干越来越微不足道——深层的边际贡献被稀释。同时,主干数值越滚越大,在 16 位精度下依然可能撞到数值上限。Pre-LN 用"传送带失压"换来了"梯度畅通"。

2024 年之后,一些团队开始给这个副作用打补丁,出现了归一化站位的第三代方案。思路是折中:既要保住传送带的恒等通路,又要在恰当的地方补稳压。典型做法有两类:一是**"三明治"式**——在子层的入口和出口各放一个归一化(写回传送带的增量先被稳压再相加),Google 的 Gemma 系列就是这么做的;二是把归一化放在子层输出、但留在残差相加之外(OLMo 2 等采用的改良 Post-LN,注意它和原版 Post-LN 的区别:归一化不架在相加结果上,传送带仍是纯加法)。你不需要记住每家的具体选择,需要记住的是这条脉络:站位的每一次调整,都是在"梯度畅通"和"数值稳压"这两个目标之间重新找平衡——而这两个目标的张力,正是传送带图景一眼就能看穿的。

3.3 从 LayerNorm 到 RMSNorm:减法的胜利

站位定了,归一化算子本身也被动了一刀。2019 年提出的 RMSNorm 把 LayerNorm 的"减均值"和"加偏置"两个动作全部删掉,只保留"除以均方根、乘可学习缩放":

$$ \text{RMSNorm}(x) = \frac{x}{\sqrt{\frac{1}{d}\sum_{i=1}^{d} x_i^2}} \odot \gamma $$

动机很直白:数值失控的本质是尺度失控,那么稳压器只需要管住尺度(范数)就够了,把向量平移到零均值这个动作未必承担实际功能。实验证实了这个猜想——去掉减均值和偏置项,模型质量不掉,而计算更少、实现更简单(少一次对 $d$ 维向量的求和统计,少一组参数)。从 Llama(2023)把 RMSNorm 带成开源标配开始,2026 年你几乎找不到还在用完整 LayerNorm 的新模型。

单看一次归一化,省的计算微不足道;但它在每层出现两次、乘上百层、乘几万亿 token 的训练量,就值得省。更重要的是它体现了这个领域反复出现的品味:在超大规模下,每个组件都要为自己的每个动作辩护——说不出存在理由的部分,删。原版 Transformer 里大量线性层的偏置项(bias)也在同一轮"减法"中被拿掉了,理由相同:作用存疑,还占显存、添不稳定因素。

3.4 新的火苗:注意力内部的爆炸与 QK-Norm

传送带稳住了,火苗又从一个更隐蔽的地方冒出来:注意力内部。

回想注意力分数的计算:$\text{softmax}(QK^\top/\sqrt{d_k})$。这里有个没有稳压器看守的乘法——query 和 key 都是线性投影的输出,如果训练中 $W_Q$、$W_K$ 的范数悄悄长大,点积(称为注意力 logits)就会二次方地长大。而 softmax 对超大输入极其病态:logits 一大,输出无限逼近 one-hot,梯度趋于零或剧烈震荡。大规模训练中一类臭名昭著的 loss 尖刺(loss spike)就是这么来的——训练好好地跑着,某几个注意力头的 logits 慢慢积累到临界点,突然发散。那个 $\sqrt{d_k}$ 的除法只矫正了初始化时刻的尺度,管不了训练中的漂移。

解法延续本章的逻辑:哪里失控,就在哪里装稳压器。QK-Norm 在计算点积之前,分别对 query 和 key 向量做一次 RMSNorm——logits 的尺度从此被钉死在可控范围,softmax 永远工作在健康区间。这项技术从视觉 Transformer 的训练实践中来,2024 年后进入主流语言模型(Gemma、Qwen3、OLMo 2 等都采用)。它是"稳定性之战"最新的战果,也再次印证了本章的主题:架构演化的很大一部分,不是追求更强的表达力,而是逐个扑灭规模化路上冒出的火苗。

易错点

不要把归一化理解成"让模型更准"的部件。它的价值全部体现在训练动力学上:没有它(或放错位置),模型不是差一点,而是根本训不出来、或时不时崩一次。评价归一化方案的指标从来不是最终 loss 差零点几,而是:warmup 能多短、学习率能开多大、几万步里 spike 有几次、坏了之后能不能自己恢复。

3.5 激活函数:从 ReLU 到 SwiGLU

FFN 中间那个非线性激活,同样走过一条演化链:ReLU → GELU → SwiGLU。前两步你可能熟悉:ReLU($\max(0,x)$)简单粗暴,但在零点处硬拐弯、负半轴梯度恒为零;GELU 把它平滑化(可以理解为"按输入是正数的概率来放行"),梯度处处存在,训练更顺滑,BERT 和 GPT-2/3 都用它。真正的换代发生在第三步,而它改的不只是激活函数,是 FFN 的结构

标准 FFN 是"升维—激活—降维":

$$ \text{FFN}(x) = W_2 \,\phi(W_1 x) $$

SwiGLU 属于门控线性单元(GLU)家族,它把升维这一步做成两路:一路走正常的线性变换,另一路经过 Swish 激活后作为,两路逐元素相乘再降维:

$$ \text{FFN}_{\text{SwiGLU}}(x) = W_2\,\big(\underbrace{\text{Swish}(W_1 x)}_{\text{门}} \odot \underbrace{W_3 x}_{\text{内容}}\big) $$

直觉上,普通激活函数对每个神经元"看自己的值决定过不过",而门控结构让一路信号动态地调制另一路——门可以根据输入内容平滑地放大或掐灭每一个通道,表达力比"固定形状的非线性"强。2020 年 Shazeer 的论文("GLU Variants Improve Transformer")系统比较了各种组合,SwiGLU 胜出;论文结论部分只写了一句著名的解释:"我们没有解释,这大概只能归功于神的眷顾。" 玩笑归玩笑,实证优势是扎实且可复现的——同等参数量下 loss 更低——于是从 PaLM、Llama 起,SwiGLU 成了几乎唯一的选择。

一个账本细节:SwiGLU 的 FFN 有三个矩阵($W_1, W_3$ 升维,$W_2$ 降维)而不是两个。为了和标准 FFN 参数量对齐,惯例把中间维度从 $4d$ 缩到约 $\frac{8}{3}d$,使 $3 \times \frac{8}{3}d \cdot d = 8d^2$ ——总参数不变。所以你查看现代模型的配置文件时,会看到 FFN 中间维度是 $d$ 的 2.7 倍左右而不是课本上的 4 倍,原因就在这里。上一章"FFN 占 $8d^2$"的账本在 SwiGLU 下依然成立。

3.6 汇总:一张 2026 年的"稳定性配方"

把本章的战果拼起来,2026 年一个典型模型的每一层长这样:传送带保持纯加法;每个子层入口一个 RMSNorm(部分模型出口再加一个);注意力内部 query、key 各过一次 QK-Norm;FFN 用 SwiGLU,中间维度约 $\frac{8}{3}d$;全模型几乎所有线性层不带 bias。和 2017 年原版相比,没有任何一处改动是"让模型更聪明"的——它们共同的使命是让一次几个月、几万卡、几十万亿 token 的训练从头到尾不崩,并且让超参数的选择变得宽容。

值得停下来体会这件事的分量:这些改动全部加起来,在小规模实验里几乎看不出差别,它们的价值只在极端规模下显现。这是大模型架构研究的一个根本困境——真正要紧的问题,只有花几千万美元跑一次才暴露——也因此,每家实验室的技术报告里关于"我们这次训练没有崩"的段落,都是全行业最认真研读的部分。

下一章我们离开"稳定性"战场,去看一个截然不同的问题:注意力天生不知道 token 的先后顺序,而"位置"这件事的解法——从正弦波到 RoPE——顺手解锁了这个时代最重要的产品能力之一:长上下文。


本章要点