10.4 迭代法与共轭梯度
本节位置:模块 10 · 数值线性代数 | 前置:4.5 伪逆与最小范数解、10.2 矩阵范数与条件数 | 预计:40 分钟
一句话:不必求逆,也不必消元——只要反复做「矩阵乘向量」,就能一步步逼近解;共轭梯度是这件事在对称正定情形下的最优做法。
0. 场景引入
凌晨 00 UTC,全球模式要起报 10 天预报。网格 ,约 5 000 万个格点;半隐式时间步每 15 分钟一步,10 天共 960 步,每步都要解一个 7 点差分格式的 Helmholtz 方程。业务窗口 60 分钟,即每步只有 3.75 s。
矩阵每行 7 个非零元,,CSR 约 3 GB。一次 SpMV 在 GB/s 的节点上约 10 ms,算术强度只有 FLOP/byte——瓶颈从来不是算力。
用 Jacobi 预条件 CG,Poisson 算子的 ,经验上要约 步,单步 s,超时 2.7 倍。几何多重网格把预条件后的 压到 量级,约 步,单步 s。
小时与 分钟的差距不是「快一点」,而是「能不能按时出产品」:前者意味着 10 天预报只能隔天起报一次,或者砍掉集合预报的成员数;后者才留得出时间做集合与后处理。
决定:投 2 人月实现多重网格,还是扩 3 倍机器?
代价:赶不上起报时次,产品晚 6 小时;或降分辨率到 ,预报技巧直接下降。
问题:迭代法凭什么收敛,为什么 CG 的迭代数随 而不是 增长?
读完本节,你应该能回答三件事:
- Jacobi 与 CG 的收敛速度分别由什么决定,各要多少步?
- CG 凭什么在 步内精确解出 维系统,实际为什么远早于 步就停?
- 预条件改的是矩阵还是「坐标系」,为什么它能把 降两个数量级?
1. 直觉
1.1 拆分矩阵:把「难解的部分」挪到右边
把 拆成对角、下三角、上三角:。Jacobi 说:用对角部分直接解,非对角部分留在右边:
这相当于把「耦合项」当作已知量,反复修正。Gauss-Seidel 更贪心:算第 个分量时,立刻用上刚算出的第 个分量。
💡 一句话直觉:迭代法 = 用当前猜测算残差,再沿某个方向修正;CG = 每次修正都与之前所有方向「共轭」,不重复走回头路。
类比边界:Jacobi 的收敛依赖 的对角占优或谱半径条件;对角元很小或为 0 时它会发散,CG 则要求 对称正定。
图:同一个二次函数、同一个起点:GD 在狭长山谷里之字形前进,CG 用两个共轭方向两步到达解。
1.2 CG 在地形上走「最陡且不回头」的路
解 ( 对称正定)等价于最小化二次函数
它的等高线是椭球,最优点就是解。梯度下降沿负梯度走,容易在狭长山谷里来回震荡;CG 每步选一个与之前所有搜索方向 -正交(共轭)的方向,保证每个方向只走一次。
1.3 它在现实世界里对应什么
在天气预报里, 是「气压 → 散度趋势」的离散算子,迭代法就是反复做局部、便宜的修正,让全局错配一点点被抹平。
条件数在这里有直接的物理读数。Poisson 算子的特征值是 :最小特征值对应波长最长的模态,最大特征值对应网格最细的模态。于是
读作:网格加密一倍,条件数涨 4 倍,CG 的迭代次数涨 2 倍。 时 ,。
| 网格 | 迭代数 | ||
|---|---|---|---|
最后一行是「换更细网格」被迭代法惩罚的地方:物理分辨率提高 4 倍,每步贵 16 倍、步数多 4 倍,合计约 64 倍;多重网格能把「步数」这一项变成常数。
1.4 这个类比在哪里失效
「抹平」的直觉容易让人以为迭代法是局部平滑器。Jacobi 确实是:高频误差抹得快,低频误差几乎不动。CG 不是平滑器,它在 Krylov 子空间里做全局最优逼近,靠的是谱信息。
所以两者的收敛指数不同:Jacobi 的 ,迭代数是 ;CG 由 控制,是 。「加密网格会变慢」对两者都成立,但慢的指数不同——这正是多重网格(真正在多尺度上同时处理高低频)存在的理由。
2. 定义
2.1 定常迭代:Jacobi、Gauss-Seidel、SOR
设 , 是对角部分, 分别是严格下、上三角部分。
Jacobi 迭代:
Gauss-Seidel 迭代:用最新分量,矩阵形式是 。
SOR(successive over-relaxation) 在 Gauss-Seidel 上加速:,。
2.2 收敛判据
把迭代写成 ,则误差满足
其中 是谱半径(spectral radius),即特征值绝对值的最大值。收敛速度由 决定:每步误差大约乘以 。
2.3 Krylov 子空间
从初始猜测 出发,令 。第 个 Krylov 子空间(Krylov subspace) 是
CG 在第 步从 中挑出使 最小的解,其中 。
2.4 CG 算法
给定对称正定 、右端 、初值 :
每次迭代只做一次矩阵乘向量 、两次内积和几次向量更新,代价 ,内存 。
2.5 预条件
预条件(preconditioning) 是找一个容易求逆的 ,改为解 ,使条件数从 降到 。常见选择:Jacobi()、不完全 Cholesky、代数多重网格(AMG)。
3. 为什么这样定义
- 为什么不直接消元? 消元代价 、内存 ,且稀疏矩阵会被填充(fill-in)成稠密;迭代法每步 ,只要能收敛,稀疏性就能保住。
- 为什么 CG 要求对称正定? 只有 SPD 矩阵才定义内积 ,才能谈「-范数最小」与「-共轭方向」。非对称时短递推会崩溃,要换 GMRES/BiCGStab。
- 为什么 Krylov 子空间是自然的选择? 你唯一能方便算的向量就是 ;Krylov 子空间正是「用矩阵乘向量能到达的所有方向」,在上面做最优逼近是自然的。
- 为什么预条件能大幅加速? CG 的收敛率由 控制;好的预条件把 降下来,迭代次数可以从 降到 。
3.1 反事实:换一种矩阵、一个参数,会坏在哪
反事实一:把 CG 用在对称但不定的矩阵上。 取
真解是 。CG 第一步:,于是
——第一步就除以零。 对称、可逆,特征值 也都不为零,唯一的问题是它不定,-内积不是内积。这不是数值精度问题,是定义域问题;对称不定该用 MINRES。
反事实二:把 SOR 的松弛因子推出 。 对 、:
特征值是 ,模长 。每步误差乘 2:20 步放大 ,看起来「在算」,实际在爆炸。 不是保守的工程习惯,是收敛的必要条件。
反事实三:用绝对残差当停止准则。 取 的系统,阈值 意味着相对精度 ,很好;但同一个物理问题换成更小的单位, 缩小 ,同样的绝对阈值只剩相对精度 ——三位的差距来自单位,不来自算法。所以停止准则要用 。
4. 性质与推导
4.1 定常迭代的收敛率
误差递推 展开得 。若 可对角化, 的量级是 ,所以 是充要条件。对 Jacobi,;若 严格对角占优(),则 。对 SPD 的 ,Gauss-Seidel 也收敛,且 (一致次序情形)。
4.2 CG 的收敛界
对 SPD 的 ,CG 的误差满足
读作:条件数越小,括号越小,收敛越快。 时括号为 0,一步到位( 是单位阵的倍数)。这个界是最坏情况,实际常更快;它也说明 CG 的迭代次数大约与 成正比,而不是 。
推导思路:CG 的误差可写成 ,其中 是满足 的 次多项式;在所有这样的多项式中,CG 选的那个使 最小。用 Chebyshev 多项式在 上逼近 0,就得到上面的界。Krylov 子空间 的维数每步至多增加 1,最多到 ; 时 ,CG 在精确算术下必得精确解。实际因舍入误差,通常远早于 步就达到机器精度;病态时则可能退化。
4.3 每步代价
| 运算 | 稠密 | 稀疏 (nnz 个非零) |
|---|---|---|
| FLOPs | FLOPs | |
| 内积 | ||
| 向量更新 | ||
| 内存 |
所以稀疏 CG 一次迭代是 ,总代价是「迭代次数 × nnz」。
5. 例子
5.1 手算:Jacobi 在 系统上慢慢爬
取
精确解是 。从 开始:
三步之后仍在 量级附近晃。Jacobi 迭代矩阵
特征值是 ,所以每步误差约乘 。要减小 倍需要约 步;看起来不多,但换成 的稀疏矩阵,收敛因子会接近 1,步数可能上万。
5.2 手算:CG 两步解出同一个系统
仍取上面的 ,。
第 0 步:,。
第 1 步:,。
恰好等于精确解。 的系统,CG 在 2 步内收敛,与理论一致。
5.3 场景:稀疏系统上的真实收益
一个二维泊松方程离散后有 个未知数、每行 5 个非零元。稠密消元需要 ,不可能;Jacobi 每步 但可能要 步;预条件 CG 每步约 次运算,通常几百步收敛,总计约 次运算——在笔记本上几秒量级。这就是迭代法在科学计算里的地位。
5.4 场景闭环:10 天预报的 960 次求解
输入: 网格,,7 点格式,,CSR 约 3 GB;单步预算 s。
计算(每步一次 Helmholtz 求解):
| 方案 | 预条件后的 | 迭代数(按 §4.2 的界) | 单步时间 |
|---|---|---|---|
| 无预条件 CG | s | ||
| Jacobi-PCG | (量级不变) | 界 ,经验约 | s |
| 几何多重网格预条件 | s |
迭代数用 §4.2 的界反解:。 时括号是 ,; 时括号是 ,。
输出:960 步的总时间——Jacobi 约 h,多重网格约 min,业务窗口 min。
成本:多重网格每步 setup 约 s(几次 SpMV 量级),换来 倍加速。代价有两件事:实现复杂度(粗化、插值、光滑子都要按问题调),以及强扩展性变差(网格太小时粗层通信占比上升)。
失败条件:系数矩阵随天气状态变化(变系数、对流主导)时,「粗网格仍刻画低频」的假设变弱,收敛可能退化到几十步;此时 AMG 更稳但 setup 更贵。兜底是「多重网格 + 几步 CG 抛光」,并监控残差是否在预算步数内达标。
6. 常见误区
- 误区:CG 对任何矩阵都能用。 纠正:CG 要求 对称正定。非对称系统要用 GMRES/BiCGStab;对称但不定的系统要用 MINRES。
- 误区:迭代法一定比直接法快。 纠正:稠密、小规模、良态的系统,LAPACK 的直接法往往更快更稳;迭代法的优势在稀疏、大规模。
- 误区:CG 一定在 步内精确收敛,所以不用预条件。 纠正: 步是精确算术的上界;浮点误差会让实际收敛变慢,病态时可能几百步还不如预条件后几十步。
7. 概念网络
- 前置:4.5 伪逆与最小范数解 —— 最小二乘与正规方程提供了 SPD 系统的来源。
- 前置:10.2 矩阵范数与条件数 —— 决定 CG 的收敛率。
- 后续:10.5 稀疏矩阵 —— 稀疏存储让每步 变便宜。
- 关联:8.7 梯度下降与牛顿法 —— 牛顿步内部可以用 CG 解线性系统。
8. 通往大模型:不形成 Hessian 的二阶优化
出现位置一:Newton-CG。 牛顿法要解 ,其中 。70B 模型的 ,显式存 需要 ,绝无可能。但 Hessian-向量乘积 可以通过一次额外反向传播近似得到(Pearlmutter 技巧:对 再做一次方向导数),代价约等于一次前向+反向。CG 只需要 ,于是可以在不形成 的情况下求近似牛顿步。这就是 Newton-CG / trust-region Newton 的核心。
出现位置二:为什么只跑几十步。 每个 CG 迭代都要一次 HVP,成本约等于一次训练 step。实际实现用截断 CG(truncated CG):最多跑 20–50 步,或用残差范数阈值提前停。因为 Hessian 本身有噪声、且远离极小点时二次模型不准,精确解 反而没有意义。
出现位置三:损失曲面的条件数。 CG 的收敛界含 。若某层 Hessian 的 是 ,CG 需要约 步量级才能显著降低误差;若 是 ,约 步。预条件(如对角预条件、K-FAC 的块对角近似)能把 拉低,这也是二阶优化在大模型上仍被研究的原因。
出现位置四:Adam 与对角预条件。 Adam 的更新是 ,其中 是梯度平方的滑动平均。把它看成 , 就是一个对角预条件器:它按每个参数的梯度尺度缩放步长,粗略地降低了各方向的条件数差异。这不是严格的 CG,但动机相同——让不同曲率方向上的有效步长接近。 可检验结论:在二次损失上,CG 的迭代次数大致随 增长;把预条件从「无」换成「对角」后,若 从 降到 ,达到同样精度所需的步数约从 降到 。你可以用 lab10 之外的小实验验证:构造对角缩放差异很大的 SPD 矩阵,比较 CG 与 Jacobi 预条件 CG 的残差曲线。
如果这一步算错,用户会看到什么。 数值天气预报的失败很少表现为「程序崩溃」,而是预报场出现格点尺度的棋盘花纹(椭圆型求解没收敛,高频残差留在场里),或者 6 小时预报的位势高度场大范围漂移。业务上有个笨办法很有效:每步记录 CG 的实际迭代数与最终相对残差,任何一步残差没到 就直接告警——迭代法最危险的失败是「跑完了但没收敛」。
9. 练习
- 概念:为什么 CG 要求 对称正定?如果 只是对称但不定,哪个性质会失效?
- 计算:对 、,写出 Jacobi 迭代矩阵 ,求 ,并估计误差缩小 倍需要多少步。
- 计算:对 、,从 出发跑两步 CG,验证得到精确解。
- 开放:为什么大模型训练主流仍然用 Adam 而不是 Newton-CG?从存储、噪声、非凸性、实现复杂度四个角度说明。
参考答案
- SPD 保证 是内积,从而有 -范数与 -共轭方向;同时保证 ,步长 不会变成负数或零。对称但不定时,-范数不是范数,CG 可能除以负数或崩溃;应改用 MINRES。
- ,,特征值 ,。误差每步乘 ,缩小 倍需要 ,即 6 步。
- ,;,,,。,,,。,,。,正是 。
- 存储上 是 ,不可能;噪声上小批量梯度让 估计不准,精确牛顿步会放大噪声;非凸性上 可能不定,牛顿方向不保证下降;实现上 HVP、线搜索、预条件都复杂。Adam 用一阶信息与对角缩放,便宜、鲁棒,是工程上的最优折中。
10. 一页速记
- 定常迭代 收敛 ;Jacobi 要求对角占优。
- CG 用于对称正定系统,在 Krylov 子空间 上最小化 -范数误差。
- 每步只做一次 :稠密 、稀疏 ,内存 或 。
- 收敛界 ,迭代次数约随 增长。
- 预条件把 降下来;Newton-CG 用 HVP 避免显式构造 Hessian。
- 物理意义 / 现实对应:条件数是算子谱的「扁度」; 意味着网格越细、山谷越扁,迭代次数 。
11. 参考文献与致谢
这一页的知识不是凭空来的。下面列出本页直接借用的原始工作与权威整理;正文中的人名、定理名已链接到对应条目。链接优先指向 DOI、arXiv 或可长期访问的原文存档。
- Hestenes & Stiefel(1952):Methods of Conjugate Gradients for Solving Linear Systems。共轭梯度法(CG)的原始论文,本页 §2–§4 的算法与 -共轭方向都来自这里。NIST Journal of Research
- Lanczos(1950):An Iteration Method for the Solution of the Eigenvalue Problem of Linear Differential and Integral Operators。Krylov 子空间迭代的经典起点,也是 CG 与 Lanczos 算法的共同祖先。NIST Journal of Research
- Saad(2003):Iterative Methods for Sparse Linear Systems(2nd ed.)。Krylov 方法、预条件与收敛分析的权威教材,本页的收敛界可在其中找到完整推导。SIAM
下一篇 → 10.5 稀疏矩阵
随堂测 · 5 题
源文件:10-数值线性代数/04-迭代法与共轭梯度.md