当前位置: 首页 > news >正文

30-机器学习与大模型开发数学教程-3-4 矩阵的逆与伪逆

一句话版:逆矩阵是在“方阵且可逆”时,把线性变换完全“撤销”的按钮;**伪逆(Moore–Penrose 伪逆)**是在“不可逆/非方阵”时,给最合理的“近似撤销”的按钮。工程上:别无脑 inv,优先用 solve / lstsq / pinvSVD/QR


1. 先把“逆”的直觉捋顺

  • 向量类比:你把衣服翻进去(矩阵 AAA),逆矩阵 A−1A^{-1}A1 就是把它翻出来。
  • 生活类比:地铁从 A 站坐到 B 站(AAA),逆就是从 B 站按原路线回 A 站(A−1A^{-1}A1)。

定义(方阵)
A∈Rn×nA\in\mathbb{R}^{n\times n}ARn×n,若存在 A−1A^{-1}A1 使 A−1A=AA−1=IA^{-1}A=AA^{-1}=IA1A=AA1=I,则 AAA 可逆(非奇异)。

等价刻画(记住这串“同义词”)
以下条件互相等价:

  • det⁡A≠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],A1=adbc1[dcba].

但请注意:数值计算不要用这个手写式,用分解法更稳。


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\|_2x2 最小 的那个。

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\! nmn 且满列秩):A+=(A⊤A)−1A⊤A^+=(A^\top A)^{-1}A^\topA+=(AA)1A
  • 矮且胖(m ⁣≤ ⁣nm\!\le\! nmn 且满行秩):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}XRm×d,目标 y∈Rmy\in\mathbb{R}^{m}yRm

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λ=(XX+λI)1Xy.

  • 在 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=A1A1U(C1+VA1U)1VA1.

  • 典型用法:特征维高、增量低秩的在线更新;
  • 岭回归的“核化”版本与卡尔曼滤波也频繁用到它。

6. 如何选择“解线性系统”的姿势

需要更稳
问题: 解 Ax=b 或 拟合最小二乘
A 是方阵且 SPD?
Cholesky: A=LL^T, 解两三角
A 是方阵且可逆?
LU/QR 解: solve(A,b)
最小二乘/秩亏/非方阵?
SVD/QR 最小二乘: lstsq/pinv
加正则: 岭/Tikhonov

说明:优先分解,谨慎求逆;病态就去 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 IXX+λI(岭)提升稳定性。
  • 别拿行列式判断可逆det 在数值上不稳定,用分解/条件数更靠谱。
  • 检查残差:解出来后看 ∥Ax−b∥\|Ax-b\|Axb∥x∥\|x\|x,防止被病态坑。

9. 常见坑(踩过都懂)

  1. 把逆当“求解器”inv 只是数学对象,工程不用它
  2. 明明 SPD 却没用 Cholesky:速度和稳定性都亏。
  3. 无脑 normal equation:直接解 (X⊤X)w=X⊤y(X^\top X)w=X^\top y(XX)w=Xy 会把条件数平方,不如 QR/SVD
  4. 忘了正则:高相关/高维/少样本的回归不加 λ\lambdaλ 极易炸。
  5. 伪逆阈值pinv 的容差太小/太大都会出问题;根据数据尺度设定或用默认。
  6. 内存炸裂:显式构造巨型逆/投影器(如 AA+AA^+AA+)不必要;用线性算子乘法接口

10. 练习(含提示/部分答案)

  1. 可逆等价性:证明“可逆 ⇔ σmin⁡(A)>0\sigma_{\min}(A)>0σmin(A)>0
    提示:SVD 写 A=UΣV⊤A=U\Sigma V^\topA=UΣV
  2. 最小二乘与伪逆:证明 arg⁡min⁡x∥Ax−b∥22=A+b\arg\min_x \|Ax-b\|_2^2 = A^+ bargminxAxb22=A+b
    提示:用 SVD 把问题化为 min⁡z∥Σz−U⊤b∥\min_z \|\Sigma z - U^\top b\|minz∥ΣzUb
  3. 最小范数解:当 AAA 欠定(m<nm< nm<n)且可行解不唯一,证明 A+bA^+ bA+b∥x∥2\|x\|_2x2 最小的可行解。
    提示:仍在 SVD 坐标下讨论自由变量。
  4. 岭回归的 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)Uy
    答案要点:把 (X⊤X+λI)−1X⊤(X^\top X+\lambda I)^{-1}X^\top(XX+λI)1X 放到 SVD 里化简。
  5. Woodbury 推导:在矩阵逆引理的假设下,推导公式(可参考分块矩阵逆公式)。
    提示:从 [AUV−C−1]\begin{bmatrix}A & U\\ V & -C^{-1}\end{bmatrix}[AVUC1] 的 Schur 补入手。
  6. 数值实验(自做):构造条件数 κ\kappaκ 很大的 AAA,比较 inv(A)@bsolve(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;病态就正则。”
http://www.dtcms.com/a/528364.html

相关文章:

  • 【大语言模型 104】LLM推理服务架构:从单机到分布式的演进之路
  • Rust所有权机制解析:内存安全的基石与实战指南
  • 个人做商业网站需要什么如何判断网站数据库类型
  • Spring容器进化论:从BeanFactory到ApplicationContext
  • 20.7 零样本多模态实战:CLIP模型如何让ChatPPT图像识别吞吐量飙升406%
  • 可以做平面设计兼职的网站佛山市网站建设分站哪家好
  • win11系统下配置c++机器学习库mlpack
  • [人工智能-大模型-72]:模型层技术 - 模型训练六大步:①数据预处理 - 基本功能与对应的基本组成函数
  • java基础-13 : 双列集合(Map)
  • 【十年后台管理系统】Redis的使用
  • SSM框架-MyBatis2
  • 深入理解JVM垃圾回收机制:从原理到实践
  • Spring的后处理器
  • 本地佛山顺德网站设计深圳市宝安区西乡街道
  • 监控 Linux 系统上的内存使用情况
  • 湖北省住房与建设厅网站高品质的网站开发
  • 智慧校园建设方案-6PPT(32页)
  • Spring的@Cacheable取缓存默认实现
  • MySQL-TrinityCore异步连接池的学习(七)
  • 2020应该建设什么网站建网站的论坛
  • 华为OD机考双机位A卷 - Excel单元格数值统计 (C++ Python JAVA JS GO)
  • SpringBoot集成Elasticsearch | Elasticsearch 7.x专属HLRC(High Level Rest Client)
  • 广东省住房城乡建设厅门户网站免费下载手机app
  • 信创入门指南:一文掌握信息技术应用创新的核心要点
  • 基于鸿蒙UniProton的物联网边缘计算:架构设计与实现方案
  • 基于Swin Transformer的脑血管疾病中风影像诊断系统研究
  • 宝安第一网站东莞关键词优化软件
  • 篮球论坛|基于SprinBoot+vue的篮球论坛系统(源码+数据库+文档)
  • SQL 进阶:触发器、存储过程
  • ansible快速准备redis集群环境