30-机器学习与大模型开发数学教程-3-4 矩阵的逆与伪逆
一句话版:逆矩阵是在“方阵且可逆”时,把线性变换完全“撤销”的按钮;**伪逆(Moore–Penrose 伪逆)**是在“不可逆/非方阵”时,给最合理的“近似撤销”的按钮。工程上:别无脑 inv,优先用 solve / lstsq / pinv 与 SVD/QR。
1. 先把“逆”的直觉捋顺
- 向量类比:你把衣服翻进去(矩阵 AAA),逆矩阵 A−1A^{-1}A−1 就是把它翻出来。
- 生活类比:地铁从 A 站坐到 B 站(AAA),逆就是从 B 站按原路线回 A 站(A−1A^{-1}A−1)。
定义(方阵)
对 A∈Rn×nA\in\mathbb{R}^{n\times n}A∈Rn×n,若存在 A−1A^{-1}A−1 使 A−1A=AA−1=IA^{-1}A=AA^{-1}=IA−1A=AA−1=I,则 AAA 可逆(非奇异)。
等价刻画(记住这串“同义词”)
以下条件互相等价:
- detA≠0\det A\ne 0detA=0;
- rank(A)=n\mathrm{rank}(A)=nrank(A)=n;
- 线性方程 Ax=bA x=bAx=b 对任何 bbb 都有唯一解;
- 0 不是 AAA 的特征值;
- 最小奇异值 σmin(A)>0\sigma_{\min}(A)>0σmin(A)>0。
2×2 逆的公式(只作直觉,不作工程)
A=[abcd],A−1=1ad−bc[d−b−ca].A=\begin{bmatrix}a&b\\c&d\end{bmatrix},\quad A^{-1}=\frac{1}{ad-bc}\begin{bmatrix}d&-b\\-c&a\end{bmatrix}.A=[acbd],A−1=ad−bc1[d−c−ba].
但请注意:数值计算不要用这个手写式,用分解法更稳。
2. 为啥工程上少用 inv?
解线性方程 Ax=bAx=bAx=b
- 错法:
x = inv(A) @ b(慢 + 不稳 + 浪费内存) - 正法:
x = solve(A, b)(LU/Cholesky/QR 背后做分解,省时省误差)
条件数(病态性)
κ2(A)=σmax(A)σmin(A) (≥1).\kappa_2(A)=\frac{\sigma_{\max}(A)}{\sigma_{\min}(A)}\ (\ge 1).κ2(A)=σmin(A)σmax(A) (≥1).
κ\kappaκ 大 → 小误差被放大。直接求逆会把误差放得更大,尤其当 σmin\sigma_{\min}σmin 很小。
建议
- SPD(对称正定)矩阵:用 Cholesky。
- 一般非奇异方阵:用 LU/QR。
- 病态/秩亏:用 SVD/最小二乘,必要时加 正则化。
3. 伪逆:不可逆时的“最合理反演”
当 AAA 不是方阵或不可逆时,用 Moore–Penrose 伪逆 A+A^+A+ 替代。它满足四个公理(对称投影等,这里不赘述),带来两条金律:
- 最小二乘解:KaTeX parse error: Undefined control sequence: \* at position 17: …displaystyle x^\̲*̲=\arg\min_x \|A…
- 最小范数:若解不唯一(欠定),A+bA^+ bA+b 给出所有解中 ∥x∥2\|x\|_2∥x∥2 最小 的那个。
SVD 公式(最实用)
若 A=UΣV⊤A=U\Sigma V^\topA=UΣV⊤,Σ=diag(σ1≥⋯≥σr>0)\Sigma=\mathrm{diag}(\sigma_1\ge\cdots\ge\sigma_r>0)Σ=diag(σ1≥⋯≥σr>0),
则
A+=V Σ+ U⊤,Σ+=diag(1σ1,…,1σr).A^+=V\,\Sigma^+\,U^\top,\quad \Sigma^+=\mathrm{diag}\big(\tfrac{1}{\sigma_1},\dots,\tfrac{1}{\sigma_r}\big).A+=VΣ+U⊤,Σ+=diag(σ11,…,σr1).
- 秩亏时对 σi=0\sigma_i=0σi=0 的位置保持 0。
- 数值里常对小奇异值用阈值截断,形成截断伪逆(更稳)。
特殊情形(满秩)
- 高且瘦(m ≥ nm\!\ge\! nm≥n 且满列秩):A+=(A⊤A)−1A⊤A^+=(A^\top A)^{-1}A^\topA+=(A⊤A)−1A⊤。
- 矮且胖(m ≤ nm\!\le\! nm≤n 且满行秩):A+=A⊤(AA⊤)−1A^+=A^\top(AA^\top)^{-1}A+=A⊤(AA⊤)−1。
投影器
- PR(A)=AA+P_{\mathcal{R}(A)} = A A^+PR(A)=AA+ 是到列空间的正交投影;
- PR(A⊤)=A+AP_{\mathcal{R}(A^\top)} = A^+ APR(A⊤)=A+A 是到行空间的正交投影。
4. 与机器学习的高频连接
4.1 线性回归闭式解(最小二乘)
样本矩阵 X∈Rm×dX\in\mathbb{R}^{m\times d}X∈Rm×d,目标 y∈Rmy\in\mathbb{R}^{m}y∈Rm。
KaTeX parse error: Undefined control sequence: \* at position 3: w^\̲*̲=\arg\min_w \|X…
4.2 岭回归(Tikhonov 正则)
wλ=(X⊤X+λI)−1X⊤y.w_\lambda=(X^\top X+\lambda I)^{-1}X^\top y.wλ=(X⊤X+λI)−1X⊤y.
- 在 SVD 基底中,这是把每个 1/σi1/\sigma_i1/σi 换成 σi/(σi2+λ)\sigma_i/(\sigma_i^2+\lambda)σi/(σi2+λ),抑制小奇异值带来的放大(更稳,也更好泛化)。
4.3 LoRA / 低秩近似
大模型微调中,把权重更新近似为低秩 UV⊤U V^\topUV⊤。求解/拟合常落到最小二乘 + 低秩结构,背后仍然是 SVD/伪逆/投影 的数学。
4.4 核方法与 Schur 乘积
核矩阵 KKK 要 PSD,训练中求解 (K+λI)α=y(K+\lambda I)\alpha=y(K+λI)α=y。这类系统适合 Cholesky;若要“近似逆”,用 Nyström / 低秩 SVD 更高效。
5. Woodbury 身法(增量更新神器)
当你要反转 A+UCVA+U C VA+UCV(低秩更新)时,不必重算大逆:
(A+UCV)−1=A−1−A−1U(C−1+VA−1U)−1VA−1.(A+U C V)^{-1} = A^{-1} - A^{-1} U(C^{-1}+V A^{-1} U)^{-1}V A^{-1}.(A+UCV)−1=A−1−A−1U(C−1+VA−1U)−1VA−1.
- 典型用法:特征维高、增量低秩的在线更新;
- 岭回归的“核化”版本与卡尔曼滤波也频繁用到它。
6. 如何选择“解线性系统”的姿势
说明:优先分解,谨慎求逆;病态就去 SVD/正则化。
7. 代码小抄(NumPy / PyTorch)
# 需要: numpy, torch
import numpy as np, torch# (1) 线性方程:solve >> inv@b
A = np.random.randn(300, 300)
A = A @ A.T + 1e-1*np.eye(300) # SPD
b = np.random.randn(300)x1 = np.linalg.solve(A, b) # 推荐
x2 = np.linalg.inv(A) @ b # 不推荐# (2) 最小二乘:lstsq / pinv
m, d = 200, 300 # 欠定 or 过定都可
X = np.random.randn(m, d)
y = np.random.randn(m)w_lstsq, *_ = np.linalg.lstsq(X, y, rcond=None) # 最稳的通用方法
w_pinv = np.linalg.pinv(X) @ y # 基于SVD的伪逆# (3) 岭回归闭式
lam = 1e-1
w_ridge = np.linalg.solve(X.T @ X + lam*np.eye(d), X.T @ y)# (4) PyTorch 版本
Xt = torch.tensor(X, dtype=torch.float64)
yt = torch.tensor(y, dtype=torch.float64)
wt = torch.linalg.lstsq(Xt, yt).solution # 最小二乘
wp = torch.linalg.pinv(Xt) @ yt # 伪逆
wr = torch.linalg.solve(Xt.T@Xt + lam*torch.eye(d), Xt.T@yt)
经验:
lstsq是“万金油”(内部用 QR/SVD);pinv用于需要显式伪逆或投影器;- SPD 用 Cholesky;
- 大问题优先用迭代法(CG)+ 矩阵–向量乘接口。
8. 数值稳定与容错
- 阈值与截断:在
pinv中对小于tol的奇异值置零,避免放大噪声。 - 中心化与缩放:回归前标准化特征能显著降低条件数。
- 加对角线:X⊤X+λIX^\top X+\lambda IX⊤X+λI(岭)提升稳定性。
- 别拿行列式判断可逆:
det在数值上不稳定,用分解/条件数更靠谱。 - 检查残差:解出来后看 ∥Ax−b∥\|Ax-b\|∥Ax−b∥ 与 ∥x∥\|x\|∥x∥,防止被病态坑。
9. 常见坑(踩过都懂)
- 把逆当“求解器”:
inv只是数学对象,工程不用它。 - 明明 SPD 却没用 Cholesky:速度和稳定性都亏。
- 无脑 normal equation:直接解 (X⊤X)w=X⊤y(X^\top X)w=X^\top y(X⊤X)w=X⊤y 会把条件数平方,不如 QR/SVD。
- 忘了正则:高相关/高维/少样本的回归不加 λ\lambdaλ 极易炸。
- 伪逆阈值:
pinv的容差太小/太大都会出问题;根据数据尺度设定或用默认。 - 内存炸裂:显式构造巨型逆/投影器(如 AA+AA^+AA+)不必要;用线性算子与乘法接口。
10. 练习(含提示/部分答案)
- 可逆等价性:证明“可逆 ⇔ σmin(A)>0\sigma_{\min}(A)>0σmin(A)>0”
提示:SVD 写 A=UΣV⊤A=U\Sigma V^\topA=UΣV⊤。 - 最小二乘与伪逆:证明 argminx∥Ax−b∥22=A+b\arg\min_x \|Ax-b\|_2^2 = A^+ bargminx∥Ax−b∥22=A+b。
提示:用 SVD 把问题化为 minz∥Σz−U⊤b∥\min_z \|\Sigma z - U^\top b\|minz∥Σz−U⊤b∥。 - 最小范数解:当 AAA 欠定(m<nm< nm<n)且可行解不唯一,证明 A+bA^+ bA+b 是 ∥x∥2\|x\|_2∥x∥2 最小的可行解。
提示:仍在 SVD 坐标下讨论自由变量。 - 岭回归的 SVD 视角:若 X=UΣV⊤X=U\Sigma V^\topX=UΣV⊤,证明
wλ=V diag(σiσi2+λ) U⊤yw_\lambda = V\,\mathrm{diag}(\tfrac{\sigma_i}{\sigma_i^2+\lambda})\,U^\top ywλ=Vdiag(σi2+λσi)U⊤y。
答案要点:把 (X⊤X+λI)−1X⊤(X^\top X+\lambda I)^{-1}X^\top(X⊤X+λI)−1X⊤ 放到 SVD 里化简。 - Woodbury 推导:在矩阵逆引理的假设下,推导公式(可参考分块矩阵逆公式)。
提示:从 [AUV−C−1]\begin{bmatrix}A & U\\ V & -C^{-1}\end{bmatrix}[AVU−C−1] 的 Schur 补入手。 - 数值实验(自做):构造条件数 κ\kappaκ 很大的 AAA,比较
inv(A)@b与solve(A,b)的误差与时间。
提示:用 SVD 控制 σmin\sigma_{\min}σmin 生成病态矩阵。
11. 小结
- 逆只在“方阵且可逆”时存在;工程上用分解求解而非显式求逆。
- 伪逆用 SVD 处理非方阵/秩亏问题,给出最小二乘与最小范数解;
AA+A A^+AA+ / A+AA^+ AA+A 是正交投影器。 - 稳定性胜过一切:优先 Cholesky/QR/SVD,必要时正则化;大问题用迭代法 + HVP。
- 记住口诀:“能 solve 不 inv;能 QR/SVD 不 normal;病态就正则。”
