4.6 条件数与病态问题:误差被放大多少倍
本节位置:模块 4 · 线性方程组 | 前置:4.4 | 预计:35 分钟
一句话:条件数衡量「输入的小扰动会让解变化多少倍」;它是问题本身的属性,不是某个算法的 bug。
0. 场景引入
一条协作机械臂要装腕部相机做抓取:相机看到零件,机械臂得知道零件在自己坐标系里的位置。标定方法是走 30 个姿态,每个姿态同时记录末端位姿与标定板位姿,解手眼方程 。未知数只有 6 个:相机相对末端的旋转 3 个、平移 3 个。
问题出在姿态上:这 30 个姿态里有 20 个只是让第 6 轴原地转,另外 10 个的旋转轴也几乎平行。对方程来说,这等于用 20 个几乎相同的约束去定 6 个未知数——最小奇异值只有最大奇异值的 ,条件数 。
后果可以算:特征点定位的等效噪声按 0.02 mm 估, mm。抓取公差是 ±2 mm,8 mm 意味着每次都要撞一下夹具;停线 4 小时,按 2 万元/小时估,8 万元。而省下的,只是把 30 个姿态减成 30 个「差不多的姿态」。
问题:为什么「多拍 20 组」没有让结果更准? 能不能提前算出来?读完本节,你应该能回答三件事:
- 条件数为什么是「问题」的属性,而不是算法的 bug?
- 与奇异值、行列式分别是什么关系?
- 标定姿态怎么选,才能把 压下来?
1. 直觉
1.1 圆被压成扁椭圆
把单位圆映射成一个椭圆,半轴长就是奇异值 与 。若 很小,椭圆被压得很扁:某个方向几乎被压成零。求逆时要把这个方向重新拉长,拉长倍数就是 ,误差也随之放大。
图:左为输入单位圆,右为像椭圆。σ_min 方向被压得越扁,求逆时误差被放大的倍数 1/σ_min 就越大。
1.2 病态是「问题」的属性
同一个 、同一个 ,无论用高斯消元、LU 还是 np.linalg.solve,都逃不过这个放大。算法只能决定「额外再引入多少误差」,不能改变问题本身把误差放大多少倍。
💡 一句话直觉:条件数 = 最坏情况下,输入的相对误差被放大成输出相对误差的倍数。
1.3 它在现实世界里对应什么
条件数在标定里有一个很物理的读法:这套动作能把空间分辨得多细。
| 数学对象 | 手眼标定里的对应物 |
|---|---|
| 标定动作最强的那一个方向 | |
| 所有 30 个姿态都没能好好区分的那个方向 | |
| 该方向上噪声被放大的倍数 | |
| 最坏方向相对最好方向的放大比 | |
| 右奇异向量 | 哪个参数组合最不敏感 |
量级直觉:30 个姿态若旋转轴只覆盖 5°,相当于只测了一个方向; 时 0.02 mm 的噪声变成 8 mm。把姿态补到绕三个正交轴都有 30° 以上的转动, 通常能压到 10 以下(按一类标定流程估算)——同样的算法,换一组动作,精度差一个数量级。
1.4 这个类比在哪里失效
第一, 是最坏情况上界。具体噪声若落在不敏感方向上,实际放大远小于 ;反过来,系统偏差(标定板不平、畸变没校正)根本不在这个上界里。
第二, 依赖参数化。旋转用欧拉角,在万向锁附近会人为放大条件数;换成四元数或带约束的旋转矩阵,数值会不同。比较两个 之前,先确认它们用的是同一套参数。
第三,非线性最小二乘的协方差近似是 ,与 同源;但鲁棒核、固定部分参数都会改变有效条件数。
2. 定义
2.1 条件数
对可逆矩阵 与选定的范数,条件数(condition number)定义为 。2-范数下
其中 是最大、最小奇异值。,等号当且仅当 是正交矩阵的常数倍。
这个量出自 1940 年代对矩阵求逆的舍入误差分析:von Neumann 与 Goldstine(1947)与 Turing(1948)各自引入了它。
2.2 相对误差上界
若 、,则
若 本身有扰动 ,一阶近似下 。 接近 1 是良态(well-conditioned),误差不被显著放大; 是病态(ill-conditioned)。双精度约 16 位十进制有效数字, 时解可能一位有效数字都不剩。
3. 为什么这样定义
为什么不直接用 判断?因为行列式随整体缩放变化: 的 ,但它条件数为 1,非常良态。行列式小可能只是「整体尺度小」或「维数大」,与「某个方向被压扁」不是一回事。
为什么用相对误差?绝对误差没有可比性:把 的单位从米换成毫米,绝对误差变 1000 倍,但解的质量没变。
为什么是奇异值的比值?最坏情况下误差落在 对应的方向(被压得最扁),而解本身主要由 方向贡献;比值正是这两个方向的放大倍数之比。
3.1 反事实:用行列式判断病态
「行列式接近 0 就病态」是最常见的替代判据。它错得很直接:两个矩阵可以有完全相同的行列式,条件数差 400 倍。
,,一模一样。但 的条件数是 1——它只是把整个平面缩小 10 倍,任何方向都没被压扁; 的条件数是 402(5.1 手算),最小奇异值方向被压得只剩约 。
更极端: 的行列式是 ,条件数仍然是 1。
行列式量的是「体积缩放」,条件数量的是「形状畸变」。 求逆的误差放大只跟后者有关,所以判据必须是奇异值的比值,不是行列式。
4. 性质与推导
4.1 上界的推导
由 得 ,所以 。又由 得 。两式相除即得 。
这个上界可以取到:让 沿 对应的左奇异方向(此时 最小), 沿 对应的左奇异方向(此时 最大)即可。
4.2 最小二乘的条件数会平方
。这就是 4.4 说「别显式求逆」的原因: 时 ,正规方程会丢掉一半有效数字;QR 与 SVD 直接在 上工作,避免这一步。
4.3 基本性质
| 性质 | 说明 |
|---|---|
| 由 | |
| 求逆不改变条件数 | |
| 整体缩放不影响() | |
| ( 正交) | 正交变换不放大误差 |
| 乘法可能让条件数变差 |
4.4 一个可手算的近似
对 :,。特征值之和为迹 、之积为 ,所以小特征值 ,对应 ;大特征值 ,。于是
时估计 ,实测 ——量级与系数都对上了。
5. 例子
5.1 手算: 的 2×2 系统
:;,迹 、行列式 ;,。于是 、,。
扰动实验:、,则 。理论上界 ;实际 。几乎正好撞上上界——这个扰动恰好落在最敏感的方向附近。
5.2 Hilbert 矩阵:越算越不准
是经典的病态矩阵:
| 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|
时已经丢掉 7 位有效数字。Hilbert 矩阵病态但不奇异:行列式很小、逆的元素很大,这正是「病态」的典型样子;它是 Higham 里反复使用的标准例子。
5.3 场景:为什么用 QR 而不是正规方程
拟合 20 个点、10 个特征,若特征近共线, 可能到 。正规方程的矩阵条件数是 ,双精度只剩约 8 位;QR 直接在 上做,只损失约 4 位。两个算法会给出不同答案,而精度上限由 决定。
5.4 场景闭环:30 个姿态、6 个未知数
输入:30 个姿态,每个姿态给 6 个线性化方程,拼成 ;fp64 共 kB。采集本身要 30 次移动,每次约 5 s,合计 2.5 分钟。
计算: 是 , FLOP;特征分解 次乘法。整套计算在微秒级——标定的时间全花在动机械臂上,不在解方程上。
输出:6 个参数的估计 ,以及 和 6 个奇异值。决策规则: 就拒绝这次标定,提示操作员补绕 、 轴的姿态; 才允许上线。
成本:重标一次 3 分钟;带着 8 mm 误差上线,撞一次夹具停线 4 小时、8 万元。所以阈值应该定得比「能用」更严——标定的成本是分钟,撞机的成本是小时。
失败条件:
- 姿态共轴: 接近 0, 爆掉。兜底:直接看奇异值谱,缺哪个方向补哪个方向。
- 标定板在视野边缘:镜头畸变没被模型吸收,等效噪声远大于 0.02 mm。兜底:标定板只走视野中央 60% 区域,或先做畸变校正。
- 机器人重复定位误差:0.05 mm 的重复精度与特征噪声同量级,再多的姿态也压不下去。兜底:先测重复精度,把它作为噪声下限代入误差预算。
6. 常见误区
- 误区:解不准是算法实现有 bug。纠正:先算 。若 ,任何双精度算法都只剩 4 位;换算法不能突破问题的上限。
- 误区: 小就病态。纠正: 的 ,但 ; 看的是奇异值的比值。
- 误区:残差小说明解准确。纠正:病态系统里可以构造「残差很小但误差很大」的解;残差衡量 ,误差衡量 ,两者差一个 。
- 误区:条件数大就完全不能用。纠正: 是最坏情况;若已知扰动方向,或用正则化(岭回归)把最小奇异值抬起来,实际精度可以接受。
- 误区:条件数与单位无关,不用预处理。纠正: 依赖矩阵缩放;把不同量纲的列归一化常能显著降低 。
7. 概念网络
- 前置:4.4 最小二乘与正规方程 —— 。
- 前置:3.4 逆矩阵与可逆性 —— 条件数刻画「求逆有多难」。
- 前置:4.5 伪逆与最小范数解 —— 奇异值阈值决定数值秩。
- 后续:第 7.4 节(伪逆、数值秩与条件数)—— SVD 视角下的完整处理。
- 后续:第 10 章(数值线性代数)—— 浮点、稳定性与迭代法。
- 关联:第 6.5 节(二次型)—— Hessian 的条件数决定优化难度。
8. 通往大模型:训练不稳与量化误差
出现位置:优化器的曲率、权重低精度存储、推理时的激活量化。
形状:一层 作用在 上,。若权重有扰动 ,则 ,相对误差满足
bfloat16 有 8 位有效位,相对精度约 ;fp16 约 。若某层 ,bf16 的舍入误差在输出端可以被放大到 倍量级——这是低精度训练需要混合精度与归一化(fp16 还需要 loss scaling)的原因之一。
为什么需要:训练时的 Hessian 若条件数很大,梯度下降在不同方向上步长差异巨大:大曲率方向震荡、小曲率方向几乎不动。学习率必须小于 ,收敛速度受 限制。LayerNorm/RMSNorm 把激活尺度拉回可控范围,本质上是在改善后续矩阵的条件数。
可检验结论:构造一个 的权重,把 的相对扰动放在最敏感的组合上,输出相对误差会放大约 倍;随机扰动则远小于此。对真实权重做 4-bit 量化时,可用同一上界 估计风险。
import numpy as np
rng = np.random.default_rng(0)
D = 256
U, _ = np.linalg.qr(rng.normal(size=(D, D)))
V, _ = np.linalg.qr(rng.normal(size=(D, D)))
W = U @ np.diag(np.logspace(0, 3, D)) @ V.T # 构造 κ = 1000
Uw, sw, Vt = np.linalg.svd(W)
x = Vt[-1] # 沿最小奇异值方向
dW = 0.004 * np.outer(Uw[:, -1], Vt[-1]) # 扰动放在最敏感的组合上
rel_in, rel_out = 0.004 / sw[0], np.linalg.norm(dW @ x) / np.linalg.norm(W @ x)
print(f"κ={sw[0]/sw[-1]:.0f}, 输入={rel_in:.2e}, 输出={rel_out:.2e}, 放大={rel_out/rel_in:.0f}")
如果这一步算错,工程上看到什么现象:训练侧,Hessian 病态会让 loss 在小批量上突然尖峰、梯度裁剪频繁触发;量化侧, 时 bf16 的 舍入误差在最敏感方向上放大到 倍量级,用户看到的是「同一个 prompt 两次输出风格不同」,而不是报错。这些现象都不是某个算子写错了,而是误差被问题的条件数放大。
9. 练习
- 概念:为什么说条件数是「问题」的性质而不是「算法」的性质?举一个算法无法突破 的例子。
- 计算:求 的 。
- 计算:,求 ;若右端扰动相对误差 ,解的相对误差上界是多少?
- 推导:用 4.4 的近似说明: 减半, 大约变几倍?
- 开放:训练中 loss 突然震荡,如何判断是「学习率太大」还是「Hessian 病态」?你会看哪些量?
参考答案
- 由 的奇异值决定,与求解方法无关,上界对任何算法都成立。例: 时双精度只有约 16 位有效数字,任何算法都无法保证解的第一位有效数字。
- ,迹 30、行列式 4,特征值 ;、,。
- ;解相对误差上界 。
- , 减半则 约翻倍(渐近意义下);实测 ,,正好约 100 倍。
- 看梯度范数分布与 Hessian 的最大/最小特征值(幂迭代估 、逆迭代估 )。若 很大,是病态;若各方向曲率正常但步长超过 ,是学习率问题。也可比较不同参数组的梯度尺度。
10. 一页速记
- ;2-范数下 。
- 物理意义 / 现实对应:条件数 = 误差放大倍数;标定里是「姿态多样性不足」,训练里是 Hessian 的谱跨度,量化里是权重扰动被放大的倍数。
- 相对误差上界:。
- ,正交矩阵取等;整体缩放、正交变换不改变 。
- ,所以最小二乘用 QR/SVD。
- 病态是问题的属性; 小不等于病态。
11. 参考文献与致谢
这一页的知识不是凭空来的。下面列出本页直接借用的原始工作与权威整理;正文中的人名、定理名已链接到对应条目。链接优先指向 DOI、arXiv 或可长期访问的原文存档。
- 冯·诺伊曼与戈德斯坦(John von Neumann & Herman H. Goldstine, 1947):Numerical inverting of matrices of high order。第一份系统的矩阵求逆舍入误差分析:把误差放大与矩阵本身的「条件」挂钩,后来被写成 这个比值。Bull. Amer. Math. Soc. 53(11), 1021–1099
- 图灵(Alan M. Turing, 1948):Rounding-off Errors in Matrix Processes。独立引入 作为「求逆会损失多少有效位」的度量,并分析消元过程中的误差累积,对应第 2.2 节的相对误差上界。Quart. J. Mech. Appl. Math. 1(1), 287–308
- 海厄姆(Nicholas J. Higham, 2002):Accuracy and Stability of Numerical Algorithms(2nd ed.)。条件数与扰动界的严格处理,也是 Hilbert 矩阵这类「病态但不奇异」例子的标准来源,第 4.1 节的上界推导与之一致。SIAM
下一篇 → 回到 模块导览
随堂测 · 7 题
源文件:04-线性方程组/06-条件数与病态.md