FP8 训练在前 100B token 上看不出问题,训到 200B token 附近,损失会突然发散,论文把这个现象放到 2 万亿 token 的规模上解释。麻烦不在格式本身,而在网络内部:海量数据把模型推到欠参数化状态,激活值跑进 sigmoid 的饱和区;ℓ₂ 正则又把 SwiGLU 的两组权重推成同向或反向,输出按平方增长,于是冒出离群值。落到优化器上,Adam 两个矩对数值格式的要求恰好相反。

下面按三个问题分开讲:欠参数化为什么让输入 $z$ 远离 0,SwiGLU 的权重为什么会对齐,以及 Adam 为什么给第一矩和第二矩选了不同的 E4M3/E5M2。

欠参数化是什么

要说清欠参数化,得先和它的反义词过参数化放在一起看。

欠参数化指的是,模型自身的容量(参数数量)或算力不足以把庞大复杂的数据集拟合下来。用学生备考打比方:给一个记忆力普通的学生(小模型)一万本参考书(大数据集),他背不下来,只能强行总结出最普遍的规律,抓大放小。落到网络里,参数不够用,就没法为每一种罕见情况单独留一套参数。数据里出现极少见的特征,网络没有余力专门分出几个神经元去记它,只能逼着现有神经元变得极端而高效,尽量覆盖常见情况。

过参数化反过来,参数比数据还多。同一个学生换成过目不忘,连标点排版都能记住。网络有闲散算力去记每一个噪点,可以专门分几个神经元处理罕见特征,其余神经元保持中庸,输入接近 0,避免饱和。

为什么欠参数化会让输入远离 0

在 200B token 这种规模上,有两件事同时发生。

一是没有闲散算力做微调。面对海量数据,网络不能给每个 token 配一群专属神经元。要把整体 loss 压到最低,每个神经元都得干最重的活。

二是走向极端才是最优解。对负责高频核心特征的通道,只要让权重 $\mathbf{w}_2$ 变大,把 $z$ 推到远大于 0 或远小于 0,sigmoid 就变成一个干脆的开关,这样处理效率最高。遇到特征 A 给个巨大正数($z=10$),输出 1;没遇到就给个巨大负数($z=-10$),输出 0。$z=0$ 附近那些模棱两可的中间状态,网络既没有精力也没有参数去管。

一个常见的认知错位

有人会问:GPT-4、LLaMA 动辄几百上千亿参数,明明该算过参数化,为什么这里说是欠参数化($N \gg k$)?

这里的 $N \gg k$ 说的是数据规模远超模型的有效记忆容量。700 亿参数($k$)面对万亿级 token($N$),数据的多样性和长尾分布仍然压倒性地大。模型记不住每个样本,必须抽象和归纳。从这个角度看,面对无穷无尽的数据,模型永远处在数据相对模型而言过于庞大的欠参数化状态,只能压榨每一个神经元,把它们推进饱和区($|z| > 1$)。

小结

归拢一下:数据太多,模型没法靠死记硬背搞定所有情况,只能把有限参数用到极致,把某些神经元变成非黑即白的极端开关,让输入 $z$ 变大。传统 Sigmoid 在这里梯度饱和,这正是 SwiGLU 能大显身手的地方。

SwiGLU 的两组权重为什么会对齐

核心结论可以先说完:在 ℓ₂ 正则化下,训练收敛到稳定点,且神经元的输入普遍足够大(sigmoid 导数趋近 0)时,SwiGLU 的两组权重 w₁ 和 w₂ 必然同向或反向,也就是 w₁ ≈ w₂ 或 w₁ ≈ −w₂。这个对齐正是 FP8 训练里出现离群值的根源。下面按逻辑链拆开。

结构上 SwiGLU 是二次的

SwiGLU 神经元定义为:

其中 σ 是 sigmoid。关键有两点。普通激活(ReLU、GeLU、Swish)在大输入下最多线性增长,输出与输入的比值的绝对值不超过 1。SwiGLU 是两个线性分支相乘,输出是二次的。w₁ 和 w₂ 方向一致、输入 x 又很大时,输出按 $c^2$ 增长。论文举的例子是,若 w₁ = w₂ 且 w₁ᵀx = 1,把输入放大 c 倍,输出会放大 c² 倍,两者比值趋于 1。

也就是说,只要两组权重对齐,SwiGLU 就能给出平方级的巨大输出,这就是 outlier 的放大器。问题于是变成:训练中 w₁ 和 w₂ 会不会自发对齐?定理 1 的回答是会。

定理 1 的设定

训练目标(式 1)是带 ℓ₂ 正则的损失:

θ 是网络其余参数,μ > 0 是正则强度,可以取得很弱。关键假设是:对所有样本 n,都有 $\sigma’(\mathbf{x}_n^\top\mathbf{w}_2)\to 0$。

sigmoid 导数 σ′(z) 随 |z| 增大指数衰减,所以 σ′→0 等价于这个神经元的输入 $\mathbf{w}_2^\top\mathbf{x}_n$ 普遍不小(|z| 较大)。论文附录 Fig. 9 给了证据:训练 200B token 后,某个 outlier 通道里约 99% 的 token 满足 $|\mathbf{w}_2^\top\mathbf{x}_n|>1$。原因还是前面说的欠参数化,在 $N \gg k$ 的规模下,网络没有余力把某个神经元的输入特意压到 0,输入自然就远离 0。

定理的结论是:收敛到稳定点、且上述假设成立时,$\mathbf{w}_1\to\mathbf{w}_2$ 或 $\mathbf{w}_1\to-\mathbf{w}_2$。

证明分四步

第 1 步:写出稳定点条件

稳定点处,对 w₁ 和 w₂ 的梯度为零:

第 2 步:用链式法则展开成两个方程

记 $\delta_n \triangleq \partial\ell_n/\partial u_n$,即损失对 SwiGLU 输出的导数。对 SwiGLU 求导:

  • 对 w₁:$\partial u/\partial\mathbf{w}_1 = \mathbf{x}_n\cdot(\mathbf{x}_n^\top\mathbf{w}_2)\sigma(\mathbf{x}_n^\top\mathbf{w}_2)$
  • 对 w₂:$\partial u/\partial\mathbf{w}_2 = \mathbf{x}_n\cdot(\mathbf{x}_n^\top\mathbf{w}_1)\left[\sigma(\mathbf{x}_n^\top\mathbf{w}_2)+(\mathbf{x}_n^\top\mathbf{w}_2)\sigma’(\mathbf{x}_n^\top\mathbf{w}_2)\right]$,这里用了乘积法则,所以是两项

于是得到:

第 3 步:代入 σ′→0,方程被简化

这一步最关键。σ′→0 之后,第一个方程本来就只含 σ,不变;第二个方程括号里的 σ′ 项消失,只剩 σ。两式于是变成对称的形式:

两式结构完全一样,只是 w₁ 和 w₂ 互换了位置。对称性就是从这一步来的。

第 4 步:定义矩阵 A,得到 w₁ = Aw₂、w₂ = Aw₁

令 $\lambda_n = -\mu^{-1}\delta_n\sigma(\mathbf{w}_2^\top\mathbf{x}_n)$,并定义

A 是对称矩阵,因为每个 $\mathbf{x}_n\mathbf{x}_n^\top$ 都对称。两式移项后就是:

把第二式代入第一式(反过来也一样):

这说明 w₁ 和 w₂ 都是 A² 的特征向量,特征值为 1。A 对称,A² 的特征值为 1 就意味着 A 在该方向上的特征值是 ±1。设 w₁ 对应特征值 λ ∈ {+1, −1}:

  • λ = +1 时,$\mathbf{w}_1 = A\mathbf{w}_1$,而 $\mathbf{w}_2 = A\mathbf{w}_1 = \mathbf{w}_1$,也就是 w₁ = w₂;
  • λ = −1 时,$\mathbf{w}_1 = -\mathbf{w}_2$,也就是 w₁ = −w₂。

证毕。

直觉上可以这样理解:稳定点条件加上 σ′→0,使得两个权重的梯度方程变成同一个线性算子 A 的互逆作用(w₁ = Aw₂ 且 w₂ = Aw₁)。这种关系只有两种解,要么两者相等,要么互为相反数。

这个结论为什么重要

对齐是 ℓ₂ 正则逼出来的。正则项惩罚权重范数,训练会倾向用最经济的方式表达同一功能。w₁ 和 w₂ 同向时,同样的输出只需要更小的范数,因为乘积效应,所以正则化会推动它们对齐。论文特别指出,即使正则很弱也会发生;正则越弱,权重范数越大,效应反而越强。

对齐加上大输入,输出平方级爆炸。一旦 w₁ ≈ w₂ 且输入较大,SwiGLU 输出约等于 $(w^\top x)^2$,产生极端激活值,也就是 outlier。Fig. 2(b) 显示,在 125B 到 210B token 之间,w₁、w₂ 的相关系数从接近 0 骤增到接近 1,同时范数暴涨,正好对上 Fig. 2(a) 里 FP8 损失在约 200B token 处发散。

短训练看不到这个现象。对齐需要长时间训练才会发生,范数先增长到超过某个阈值,才满足 σ′→0 的前提。之前的工作只训到 100B token,所以没观察到。论文强调要 2 万亿 token 规模才暴露问题,说的就是这件事。

正相关和负相关都会出现。定理允许 w₁ = w₂,也允许 w₁ = −w₂。正文 Fig. 2(c) 是正相关的例子,附录 Fig. 7 是负相关的例子,两者都会造成 outlier。

结论不依赖 Swish 的具体形式。证明里只用到 σ′→0 和两个线性分支相乘的结构,换成其他 GLU 变体(Shazeer 2020a)同样成立。

Adam 为什么给第一矩选 E4M3、第二矩选 E5M2

一句话答案:第一矩需要准,第二矩需要宽。根源在 Adam 更新公式里,第二矩要先开平方再取倒数,这一步会把 v 里最小的值放大成最关键的更新量,所以 v 必须能表示很小和较大的值,要宽范围,用 E5M2;而 m 只参与乘加,范围温和,要高精度,用 E4M3。

两种 FP8 格式差在指数位和尾数位

格式 指数位 尾数位 特点
E4M3 4 3 范围窄、精度高
E5M2 5 2 范围宽、精度低

多一个指数位,动态范围大约翻倍,能表示更小和更大的数;少一个尾数位,相对精度变差。E4M3 和 E5M2 因此落在精度和范围的两端。

Adam 的更新公式决定了两边需求不对称

第一矩 m 只出现在分子,做的是乘加。m 是梯度的滑动平均,数值范围和梯度同量级,比较温和。它只会被乘以学习率、除以 √v,没有非线性放大。所以 m 的误差是线性传播的,相对精度够就行,E4M3 的 3 位尾数足够。

第二矩 v 出现在分母的根号里,会被非线性放大。v 是梯度平方的滑动平均,本身跨度就大,不同参数的梯度大小差异悬殊。关键在 $\sqrt{v}$ 再取倒数这一步,v 越小,$1/\sqrt{v}$ 越大。也就是说,v 里最小的那些值对参数更新的影响最大。如果 v 用 E4M3,范围不够,很小的 v 会被下溢或截断成 0 或者最小值,那么 $1/\sqrt{v}$ 就会变成极大值甚至无穷,更新直接爆炸。

一句话对比:m 的误差是线性的,v 的误差被 $1/\sqrt{v}$ 非线性放大,而且放大的是小值那一端,这就是两者格式需求相反的根本原因。

一个数值例子

假设某参数的真实 v 是:参数 A 的 $v_A = 10^{-4}$(梯度很小),参数 B 的 $v_B = 10^{0} = 1$(梯度正常)。

用 E5M2 这种宽范围格式,$10^{-4}$ 能正常表示,$\sqrt{v_A}=10^{-2}$,$1/\sqrt{v_A}=100$,更新合理。

换成 E4M3,最小正规数约 $2^{-6}\approx0.0156$,指数位少,下溢边界高。$v_A=10^{-4}$ 远小于它,会被截断成 0 或最小可表示值:

  • 截断成 0:$\sqrt{0}=0$,$1/(0+\epsilon)$ 巨大,该参数的更新爆炸;
  • 截断成最小值 $0.0156$:$\sqrt{0.0156}\approx0.125$,$1/0.125=8$,而真实值应该是 100,误差 12 倍。

E4M3 装不下第二矩的小值,原因就在这:小值被截断后,经过 $1/\sqrt{v}$ 被放大成严重误差。m 没有这个机制,E4M3 的高精度反而更有利。

实验证据(Fig. 5,Llama2-100M 穷举)

m 格式 v 格式 结果
E5M2 E5M2 不收敛(m 精度不够,loss 偏高 ~3.3)
E5M2 E4M3 发散(loss 5+)
E4M3 E5M2 ✅ 收敛到基线
E4M3 E4M3 不收敛(loss ~4+,v 小值被截断)

四个组合里只有 E4M3 加 E5M2 成功,和理论对得上:m 换成 E5M2 的两个组合(E5M2/E5M2、E5M2/E4M3)精度不够,失败;v 换成 E4M3 的两个组合(E5M2/E4M3、E4M3/E4M3)范围不够,也失败。

和直觉相反的地方

有人会想,第二矩是平方,值应该更大,怎么反而需要更宽的范围?关键在于 v 是梯度平方的滑动平均,不同参数的梯度差异极大,v 的分布跨越多个数量级,有的参数梯度接近 0,有的很大。平方让大值更大、小值更小,跨度被拉得更开,所以 v 比 m 更需要宽的动态范围。而 $1/\sqrt{v}$ 又专门放大小值那一端,进一步抬高了范围要求。

小结

m 用 E4M3,因为它只做乘加、误差线性传播、范围温和,要的是精度,3 位尾数够用。v 用 E5M2,因为它要开平方再取倒数,小值被非线性放大成关键更新量,必须能表示跨多个数量级的小值,要的是动态范围,5 位指数才装得下;用 E4M3 会让小 v 下溢,再经 $1/\sqrt{v}$ 放大成更新爆炸。Fig. 5 的四个组合里只有 E4M3 加 E5M2 收敛,和理论一致。