技术博客

海森矩阵为什么在大模型里几乎不用:二阶信息的成本账

第 15 / 147 篇 · 2025-12-29 · ai · Hessian二阶优化Gauss-Newton

学优化的时候牛顿法总是压轴出场:二阶收敛,好问题上几步到位。但翻遍大模型训练的技术报告,优化器一栏永远是 AdamW 家族,海森矩阵连影子都没有。是牛顿法不好吗?不是,是它的成本结构在 $n$ 亿参数尺度下彻底崩坏。这篇把这笔账算清楚,再看哪些二阶信息的"穷人版"真的活了下来。

牛顿法的美好与 $n^2$ 的墙

对 $f(\theta)$ 做二阶泰勒展开并极小化二次模型,得到牛顿步:

$$ \delta=-H^{-1}g,\qquad H=\nabla^2 f(\theta)\in\mathbb{R}^{n\times n}. $$

在极小点附近,若 $H$ 足够光滑且正定,牛顿法的迭代误差满足 $\|e_{k+1}\|\le C\|e_k\|^2$——二次收敛,精度位数每步翻倍,梯度下降的一次收敛在它面前像爬行。

直观上,牛顿步做的是"用局部抛物线完全替代损失,一步跳到抛物线顶点"。损失越接近二次,这一步越准;梯度下降则只用切平面,步长还得靠猜。数学上两者的差距是真实且巨大的——问题从来不出在效果上。

代价写在矩阵的尺寸里。$n$ 个参数,$H$ 有 $n^2$ 个元素。GPT-2 small 的 $n=1.24\times10^8$,$H$ 是 $1.5\times10^{16}$ 个元素,fp16 存储 $3\times10^{16}$ 字节——30 EB,是全球数据中心内存总和的量级。7B 模型:$4.9\times10^{19}$ 个元素。这还没算求逆的 $O(n^3)$,更没算海森每一步都变、每步都要重算。一阶梯度 $O(n)$ 存储、一次反向传播就能拿到,海森的显式形式连"算出来看一眼"都做不到。

这堵墙是结构性的:二阶信息本质上是"任意两个参数之间的交叉导数",交叉对数天然是 $n^2$。想用上二阶信息,只能放弃显式矩阵,在近似和间接访问上做文章。

再算一笔通信账堵死最后的侥幸:就算存储免费,分布式训练里 $H$ 每步要随梯度同步。一阶梯度的 all-reduce 已是万卡集群的主要通信负担(每步数百 GB 级),海森是它的 $n$ 倍。任何"每步新鲜二阶信息"的方案在通信上就先出局了,活下来的近似方案全都接受了"用陈旧的、局部估的曲率"这个妥协。

折中一:Gauss-Newton,扔掉残差二阶项

最小二乘结构的损失 $f=\frac12\|r(\theta)\|^2$($r$ 是残差向量),海森精确展开为

$$ H=J^\top J+\sum_i r_i\nabla^2 r_i,\qquad J=\frac{\partial r}{\partial\theta}. $$

Gauss-Newton 近似把第二项整个扔掉:

$$ H\approx G:=J^\top J. $$

扔得有道理:在极小点附近拟合良好时 $r_i\approx0$,第二项本来就小。附赠一个关键性质——$J^\top J$ 半正定,而真海森在鞍点区域不定,牛顿步可能朝山上走。GN 方向天然是下降方向。但 $J^\top J$ 依然是 $n\times n$,存储问题一个都没解决,所以这个近似只负责"数学上好处理",不负责"算得起"。

GN 还有一层与深度学习的亲缘:对交叉熵损失,广义 GN 矩阵与 Fisher 信息矩阵在模型分布与数据分布一致时相等——$F=\mathbb{E}[\nabla\log p_\theta\,\nabla\log p_\theta^\top]$ 与 $\mathbb{E}[-\nabla^2\log p_\theta]$ 的等式是同一内容的两种写法。后面说的 K-FAC、自然梯度名义上近似 Fisher,实际上都在借 GN 的半正定性兜底。

折中二:Hessian-向量积,$O(n)$ 访问二阶信息

真正的突破口是换个问法:大多数用途要的不是 $H$ 本身,而是它对某个向量的作用 $Hv$。Pearlmutter (1994) 的 trick:

$$ Hv=\left.\frac{d}{dt}\nabla f(\theta+tv)\right|_{t=0}. $$

$\nabla f(\theta+tv)$ 是 $\theta$ 的光滑函数,对 $t$ 求导在 $t=0$ 处取值恰是方向导数 $Hv$。计算上就是"前向模式自动微分套在梯度上"(或两次反向的复合),存储 $O(n)$,时间约为两次梯度的代价。Hessian-free 优化(Martens 2010)就靠它:用共轭梯度解 $H\delta=-g$,CG 每轮只需要一次 $Hv$,几十轮拿到近似牛顿方向,全程不碰显式海森。

推导本身只有一行链式法则:$\frac{d}{dt}\nabla f(\theta+tv)=\nabla^2 f(\theta+tv)\cdot v$,$t=0$ 时即 $Hv$。但这个等式的工程含义巨大——它把"矩阵-向量乘"从"先存矩阵再乘"改写成"沿方向微分梯度",存储需求从平方级塌缩到线性级。

同一招还能估谱信息:随机向量 $v$ 做幂迭代 $v\leftarrow Hv/\|Hv\|$ 收敛到最大特征值 $\lambda_{\max}$。学习率上限 $2/\lambda_{\max}$ 的估计(可信域那篇会谈)就是这么来的。GPTQ 量化校准里用到的逐层二阶信息(OBS 系列),本质也是对小块逐层海森逆的间接访问。

HVP 还有一个经常被忽视的优点:它只依赖梯度的可微性,任何能反向传播的图都能再反一次拿到 $Hv$,PyTorch 里就是 torch.autograd.grad(grad_out, params, grad_outputs=v) 的双 backward 写法。代价约两次反向,在现代框架里开箱可用。它对 $H$ 的结构零假设——不像对角近似那样先验扔掉交叉项——所以谱估计、锐度分析(sharpness)、influence function(数据归因,估 $H^{-1}\nabla\ell$)这些研究工具全部建立在它上面。

一个可跑的 HVP 实验

Pearlmutter 的等式 20 行就能在 PyTorch 里验证,顺带量一下 $H$ 的谱:

import torch
torch.manual_seed(0)
d = 100
Q, _ = torch.linalg.qr(torch.randn(d, d, dtype=torch.float64))
H_true = Q @ torch.diag(torch.linspace(1, 50, d, dtype=torch.float64)) @ Q.T

def f(x):
    return 0.5 * x @ H_true @ x   # 二次型,海森恒定

x = torch.randn(d, dtype=torch.float64, requires_grad=True)
v = torch.randn(d, dtype=torch.float64)
g = torch.autograd.grad(f(x), x, create_graph=True)[0]
hv = torch.autograd.grad(g, x, grad_outputs=v)[0]   # 双反向 = HVP
assert torch.allclose(hv, H_true @ v, atol=1e-10)

create_graph=True 让第一次反向本身也可微,第二次 grad 用 grad_outputs=v 做向量-雅可比积,合起来正是 $\nabla(\nabla f\cdot v)=Hv$。真实网络上这段代码原样可用——把 f 换成一个 batch 的训练损失即可,这也是各家曲率分析工具的最小内核。

折中三:结构近似——对角、块对角、Kronecker

更激进的路是给 $H$(或 Fisher 矩阵)强行加结构。先说一个容易混淆的点:下面所有近似的对象严格说是广义 Gauss-Newton / Fisher 而非真海森——真海森含残差二阶项、可能不定,近似它反而会把不稳定性带进优化器。结构近似的哲学是"宁要一个好行为的粗糙曲率,不要一个精确但不定的"。

  • 对角近似:只留 $H_{ii}$,存储 $O(n)$。AdaGrad/Adam 的二阶矩 $v_t$ 常被解读成对角海森的在线估计——所以 Adam 某种意义上就是"对角牛顿法",虽然这个对应关系严格来说并不成立(梯度平方的滑动平均不等于对角曲率),但它解释了对角近似的性价比为什么高。
  • K-FAC(Martens & Grosse 2015):对每层 Fisher 块做 Kronecker 分解 $F_l\approx A_l\otimes B_l$,$A_l$ 是输入激活的二阶矩、$B_l$ 是输出梯度的二阶矩。$(m^2+n^2)$ 存储代替 $(mn)^2$,求逆变成两个小矩阵分别求逆(Kronecker 积的性质 $(A\otimes B)^{-1}=A^{-1}\otimes B^{-1}$)。Shampoo、SOAP 是这条线在实践中的后代。

值得问一句:这么多近似各自保真多少?有一个统一评判角度——它们都在近似 Fisher/海森的逆的作用 $H^{-1}g$。对角近似假设参数间曲率互不耦合,在小神经元 fan-in 下偏差大;K-FAC 假设层间解耦、层内 Kronecker 可分解,对前馈层拟合好,对注意力层要额外处理;HVP+CG 不做结构假设但只解到 CG 的迭代精度。选哪个取决于你愿用多少计算换多少保真,而"完整海森"不在这个权衡曲线上——它在曲线外面,根本不可达。

二阶信息的访问方式谱系:从完整海森到对角近似,存储从 n² 逐级降到 O(n) 完整 Hessian 存储 n²,不可行 Gauss-Newton JᵀJ 仍 n²,半正定 K-FAC 块分解 A⊗B,m²+n² 存储 对角近似 O(n),Adam 的远亲 正交路线:Hessian-向量积 Hv = d/dt ∇f(θ+tv)|₀,O(n) 存储 喂给 CG / 幂迭代,间接用二阶 选择逻辑 要矩阵本身?只能结构近似 只要矩阵的作用?HVP + 迭代法

折中四:拟牛顿,用历史梯度拼曲率

L-BFGS 代表另一条思路:不显式算二阶导,而是从最近的 $m$ 组 $(s_t,y_t)=(\theta_{t+1}-\theta_t,\ g_{t+1}-g_t)$ 中反推海森逆的近似——割线条件 $H^{-1}y=s$ 给出 $m$ 个约束,配上"离上一步近似最近"的正则,构成低秩更新的逆海森估计。存储 $O(mn)$,$m$ 通常取 10~20。它在小批量确定性问题上确实快,但在 SGD 的噪声环境里 $y_t$ 被梯度噪声污染,曲率估计跟着失真,这是拟牛顿法没能在随机训练主流里活下来的原因——二阶信息的信噪比门槛比一阶高得多,噪声把它的优势吃掉了。

二次收敛的神话再算一遍

"牛顿法几步到位"的直觉需要打折。二次收敛说的是$\|e_{k+1}\|\le C\|e_k\|^2$,其中常数 $C$ 依赖三阶导数与极小点条件数。深度损失的三阶项并不温和——景观里到处是平坦方向与尖锐方向并存(谱呈重尾分布,少数大特征值加海量近零特征值),二次收敛区域实际上很小,大部分训练轨迹在区域之外。也就是说即使海森免费,纯牛顿步在深度网络上也不见得比调好的一阶方法少走多少步——这解释了为什么所有活下来的二阶方案都配着阻尼、裁剪、可信域这些"不信任纯牛顿方向"的保险丝。

谱的重尾结构还顺手解释了对角近似的有效性来源:损失曲面的曲率方差主要来自少数方向(前几十个大特征值),而 SGD 的噪声与学习率瓶颈恰恰也由这些方向决定。对角近似捕捉不到方向间的旋转,但对"逐坐标尺度差异"这个主成分足够敏感——在重尾谱上,逐坐标缩放已经拿走了预条件收益的大头。

活下来的用法

盘之前先给"活"下个可操作的定义:能在千卡集群上跑三个月不成为瓶颈、代码维护成本不超过一个全职工程师。这个标准比"理论上最优"苛刻得多,也解释了为什么有些数学上优美的方案(全 GN、精确线搜索)不在榜上——它们卡在工程复杂度,不是卡在数学。

盘一下二阶信息在大模型时代的实际栖身地:预训练主优化器用对角级近似(AdamW);量化校准用逐层二阶逆(GPTQ/AWQ 的 OBS 血统);曲率分析、学习率估计、数据归因(influence function)用 HVP;K-FAC 系在中等规模训练里有稳定拥趸但没成为主流——通信和工程复杂度吃掉了一部分数学收益。完整海森则彻底退场,只在玩具规模的理论分析里出现。

这个新秩序里有一个值得单独点名的赢家:influence function。估算"删掉某个训练样本,模型参数会怎么变",经典答案是 $\Delta\theta\approx H^{-1}\nabla\ell(z)$——只需要海森逆对向量的作用,HVP+CG 恰好能算。这让一个教科书级别的二阶量在 LLM 时代重新就业,用于数据归因与投毒样本排查。二阶信息没死,只是换了访问方式。

这个格局背后的统一逻辑:二阶信息的收益是"步数减少",成本是"每步变贵加存储爆炸"。当模型大到单步成本已经是瓶颈时,任何让单步更贵的东西都要拿出超额收益才能活下来,而 $n^2$ 与 $O(n)$ 之间的鸿沟,靠二次收敛填不平。

还有一个历史角度的注脚。二阶方法并非从没赢过:在参数量百万级、batch 可全量的年代,L-BFGS 一度是深度学习竞赛的常客(2012 年之前的不少 benchmark 记录出自它)。它被挤出主流不是数学上输了,而是两个趋势夹击的结果——模型规模爆炸让 $O(n)$ 以上的存储全部出局,数据规模爆炸让全批量方法的前提(梯度的确定性)消失。看清楚这段历史就能明白:优化器的选型从来不是纯数学问题,是数学与硬件、数据规模的联合约束优化。

小结

牛顿法的数学优雅撞在 $n^2$ 存储与 $O(n^3)$ 求逆的墙上:7B 模型的海森是 $10^{20}$ 字节量级,显式形式连存都存不下。活下来的方案分成结构近似(对角、K-FAC 的 Kronecker 分解)与间接访问(Pearlmutter 的 Hessian-向量积配迭代法)两支,前者服务于优化器,后者服务于量化、谱估计与分析工具。理解这笔账之后,"深度学习为什么只用一阶方法"就从经验事实变成了成本必然。

这笔账还有一个面向未来的注脚:硬件的每代演进都在改变 $O(n)$ 与 $O(n^2)$ 之间的相对汇率——显存带宽、互联速度涨得比参数量慢,二阶信息的相对成本只会更高。押注"更聪明的一阶方法"仍是主线,二阶方案的机会窗口在"离线、一次性的分析"(量化、归因),不在"在线、每步的优化"。下一篇回到一阶世界的根基:微分与梯度之间隔着一座内积的桥。