SVD:任何矩阵的三幕剧
数一数这本书欠下的债:第 05 章的谱范数、第 08 章椭圆的两根半轴、第 09 与 11 章的条件数、第 12 章「行秩=列秩」与奇异值曲线、第 13 章的正交对齐、第 14 章的伪逆——每一张欠条上都写着同一个债主。今天全部清账。奇异值分解(SVD)是线性代数的総决算:任何矩阵——不用方、不用对称、不用满秩、允许亏损——都能拆成「旋转 · 缩放 · 旋转」三幕剧。数学家说它是矩阵理论的皇冠;工程师用它压图片、配伪逆、做对齐、拆模型。这一章的 Demo,你将亲手拉一根滑杆,看一张图片被压到二十分之一。
三幕剧:旋转、缩放、旋转
定理先摆出来,再拆着看。任何 m×n 矩阵 A,都存在分解:
从右往左读剧本(洋葱定律最后一次登场):第一幕 Vᵀ,在输入空间里转一下(正交矩阵,纯刚体旋转/镜像,不拉不扯);第二幕 Σ,沿着转正后的坐标轴做纯缩放,缩放倍数 σ₁ ≥ σ₂ ≥ … ≥ 0 从大到小排好,叫奇异值(singular values),不方的矩阵在这一幕顺便把维度补零或砍掉;第三幕 U,在输出空间里再转一下。就这三幕。宇宙里不存在第四种动作:你在第 06 章 Demo 里拖出的一切花活——剪切、斜拉、压扁——拆开都是「转、缩、转」。这句话的心理冲击值得停留一秒:线性变换的「任意性」是幻觉,真正的自由度只有「选两组正交轴 + 报一列缩放倍数」,连剪切这种看起来歪门邪道的动作,也不过是两组轴没对齐时的视错觉。
第 06 章存档的那幅全景图正式兑现:单位圆被任何矩阵映成椭圆(可能退化成线段或点)。三幕剧的分工一目了然:Vᵀ 决定圆上哪两根「预备方向」将成为主角,Σ 把它们拉成椭圆的长短半轴——半轴长度就是 σ₁ 和 σ₂,U 决定椭圆最终的摆放角度。第 08 章「|det| = 半轴乘积 ab」的悬案同步告破:|det| = σ₁σ₂(方阵时);第 05 章的谱范数也领到了定义:σ₁ = 矩阵能把单位向量拉到的最长长度,「放大能力」的精确读数。
为什么这样的分解必然存在?给一个能在脑内放映的论证草图。在输入空间的单位圆上巡逻,找那支被 A 拉得最长的方向,叫它 v₁,拉伸后的长度就是 σ₁、方向(归一化后)就是 u₁——「最能放大的方向」总存在(圆是紧的,长度连续,必有最大值)。然后退到 v₁ 的垂直补空间里(降了一维的单位球),重复找「剩余里最能放大的」得 v₂、σ₂、u₂……一路做到维度耗尽。可以证明这样选出的 u 们自动互相垂直——于是两组正交基 + 一列递减的倍数,SVD 装配完成。这个「逐个榨取最大方向」的变分视角,不只证明存在性,还剧透了下一章:PCA 找主成分的过程,就是这段论证在数据云上的逐字执行。
它从哪来:两只对称矩阵作媒
SVD 不是天降,它是谱定理(第 15 章)的嫡孙。看两只由 A 生出的对称矩阵:AᵀA(n×n)与 AAᵀ(m×m)——第 10 章说过,这类「点积出身」的矩阵天生对称、半正定。给 AᵀA 做谱分解:特征向量组成正交基,拼成 V;特征值非负,开根号就是奇异值 σᵢ。再令 uᵢ = Avᵢ / σᵢ,可以验证这批 u 也互相正交,拼成 U。整套 SVD 就装配完成——对任何矩阵成立,因为 AᵀA 永远对称,谱定理永远肯赏脸。这正是本书 Demo 引擎里真实跑的算法(Jacobi 特征分解 + 装配),也顺手证明了两件旧案:奇异值的平方 = AᵀA 的特征值;行秩 = 列秩——两者都等于非零奇异值的个数,第 12 章那个「安静的奇迹」原来是 SVD 在幕后按住的。
对称矩阵自己做 SVD 会怎样?U 和 V 变成同一个(至多差几个符号),三幕剧退化成谱分解的「转过去、缩放、转回来」——SVD 是特征分解的推广,不是竞争者:特征分解要求「输入输出用同一组轴」(所以挑剔),SVD 允许输入输出各用各的轴(所以普度众生)。连上一章的「亏损」剪切矩阵——特征分解的败局——SVD 也照拆不误:[1,1;0,1] 的奇异值是 1.618 和 0.618(又是黄金分割,纯属彩蛋),两组轴各就各位,没有任何矩阵能豁免这场三幕剧。
皇冠上的宝石:最优低秩近似
为什么工程界对 SVD 的爱远超对特征分解?除了「人人可拆」,还有一条数值上的硬理由:U 和 V 都是正交矩阵——第 10 章的贵族,误差不放大;而特征分解的 P 在非对称情形可以病态到没法用。SVD 是「用两件正交外套包住全部脏活(Σ)」的设计,数值分析师叫它「稳定的分解」,这三个字在生产环境里价值连城。
把 SVD 改写成第 07 章的外积形式,三幕剧变成薄片叠加:
每一片是一个秩一矩阵(m+n 个数的薄片),片的「重量」就是奇异值。于是压缩策略不言自明:只留前 k 片,后面全扔。而 Eckart–Young 定理保证这不只是「一种」压缩,是最优压缩:在所有秩 ≤ k 的矩阵里,截断 SVD 与原矩阵的误差(谱范数或 Frobenius 范数)最小,没有任何算法能做得更好。第 12 章「有效秩曲线」「留几个方向」的全部许诺,在这条定理上落槌。现在,亲手拉:
这个 Demo 的幕后没有任何黑魔法,全是本书写过的代码路数:把 48×48 灰度图当矩阵,构造 AᵀA,用循环 Jacobi 做谱分解(第 15 章的对称矩阵特权),装配出 U、σ、V,滑杆选 k 后按「前 k 片薄片叠加」重建——你正在看的是一台在你手机浏览器里现场运转的 SVD 引擎,不联网、不到 200 行。玩法引导:① 从 k=1 开始一格格加:第一片给出「大色块的骨架」(最重的结构),往后每片补一层细节——你在按重要性逐片重建世界;② 盯右侧的奇异值谱:前几根柱子鹤立鸡群,长尾贴地——自然图像的天性(第 12 章的衰减曲线,实物版);③ 找到你的「无损临界点」:大约 k=8~12 时人眼已难辨差异,而存储只有原图的几分之一;④ 读一遍存储账本,把「(m+n+1)×k vs m×n」的算术在真图上过一遍;⑤ 特别注意 k=2、3 附近的中间态:图里的「鬼影」是低秩近似的典型伪影——薄片是全局的(每片覆盖整张图),局部细节要靠多片干涉才能显影,这也是为什么工业压缩改用局部基(分块 DCT)。
一段值得知道的家史:LSA 与「语义」的第一次现身
SVD 在 AI 史上有一场标志性首秀,值得讲给每个学 embedding 的人。上世纪 90 年代的「潜在语义分析」(LSA):把语料做成「词 × 文档」的巨型计数矩阵(词出现在文档里几次),对它做截断 SVD,只留前几百片。奇妙的事情发生了——「汽车」和「轿车」这两个词,原始计数行几乎正交(它们很少出现在同一篇文档里),但在截断后的低维空间里,它们的向量高度相似,因为它们总出现在同类文档里,被同几张薄片捕获。「语义相似度」第一次从纯粹的词频统计里被数学挤了出来,靠的就是一次 SVD。词向量(word2vec)后来被证明近似等价于对某个共现统计矩阵做隐式分解——今天 embedding 的整条血脉,追到源头是这一章的三幕剧。搜索引擎的「你搜『买车』给你『轿车报价』」,家谱上写着 SVD。
读谱如读心:奇异值谱的几种长相
拿到一个矩阵先看它的奇异值谱,像医生先看心电图。几种典型波形,配诊断:
- 断崖式(前几根巨柱 + 贴地长尾):强低秩结构——数据由少数因素主导。图像、推荐矩阵、微调更新 ΔW 的常态。处方:放心截断,压缩红利丰厚。
- 平坦式(奇异值们差不多高):各向同性,没有偏好方向——白噪声、或被彻底打散的信息。处方:没有可压的油水;若你期望有结构却看到平谱,先怀疑数据管道把信号洗没了。
- 尖峰加地毯(几根尖峰浮在一片缓坡「噪声地毯」上):信号 + 噪声的混合,尖峰是真结构,地毯是随机背景。随机矩阵理论甚至算得出纯噪声地毯该有的形状(Marchenko–Pastur 分布),高出地毯的才算数——「信号检测」由此从玄学变几何。
- 缓坡无崖(幂律缓降):自然语言这类「长尾世界」的signature——没有干脆的截断点,留多少都丢一点。处方:按预算选 k,并诚实汇报能量占比。
这份「谱读心术」是第 12 章有效秩曲线的完全体,也是你以后面对任何数据矩阵的第一件顺手工具:np.linalg.svd(X, compute_uv=False),一行,一张心电图。
条件数正式立案,四空间地图交付
零零散散预告过的两件事,在此正式办证。条件数 κ = σ₁/σₙ(最大比最小奇异值):它量的是变换「最不公平」的程度——把某方向拉最长、把另一方向压最扁的比值,也是那只椭圆的「胖瘦比」。解方程时输入误差最多被放大 κ 倍(第 09 章剪刀口的定量版);κ = 1 是正交矩阵(人人平等,数值天堂),κ → ∞ 是奇异边缘(第 11 章「几乎相关」的读数)。经验刻度:κ 每上一个数量级,解就要交出约一位有效数字——float32 只有七位,κ = 10⁵ 的系统解出来只剩两位可信,这笔账在混合精度训练时代尤其要会算。四个基本子空间(第 12 章的半张地图)也全图交付:V 的前 r 列张成行空间、后 n−r 列张成零空间;U 的前 r 列张成列空间、后 m−r 列张成左零空间——四组现成的标准正交基,一次 SVD 全家桶配齐。还有第 14 章的伪逆:A⁺ = VΣ⁺Uᵀ,其中 Σ⁺ 是「非零奇异值取倒数、零保持零」——「能撤销的方向撤销,压死的方向认命」,伪逆的哲学被 SVD 写成了三个字母;np.linalg.pinv 的 rcond 参数,就是「多小的 σ 算压死」的阈值旋钮——第 12 章数值秩的老配方。
写成代码:economy 版与十行 Procrustes
import numpy as np A = np.random.randn(2000, 300) U, s, Vt = np.linalg.svd(A, full_matrices=False) # economy:U 是 2000×300 # 秩 k 截断重建:三幕剧只留前 k 片 k = 20 A_k = U[:, :k] @ np.diag(s[:k]) @ Vt[:k, :] np.linalg.norm(A - A_k) / np.linalg.norm(A) # 相对误差 # 条件数与谱范数,一行一个 s[0], s[0] / s[-1] # Procrustes:求最优正交 R,把点云 X 对齐到 Y X, Y = np.random.randn(500, 3), None R_true, _ = np.linalg.qr(np.random.randn(3, 3)) Y = X @ R_true.T U2, _, Vt2 = np.linalg.svd(Y.T @ X) # 互协方差的 SVD R_hat = U2 @ Vt2 # 最优正交解,一步闭式 np.allclose(R_hat, R_true) # True
最后四行就是 ARCore 扶正虚拟猫、跨语言词向量对齐的骨架代码——第 13 章的 lstsq 版本允许任意矩阵(会偷偷拉伸),这里的 UVᵀ 版本强制刚体,语义不同,场景各有其主。
SVD 在 AI 工程里的岗位表:① LoRA 的亲爹:「微调更新是低秩的」这个假设,验证方式就是对全量微调的 ΔW 做 SVD、看奇异值衰减;一些变体(PiSSA 等)直接用原权重的前 k 片 SVD 初始化 LoRA,收敛更快;② 模型压缩:把 4096×4096 的权重矩阵 SVD 截断成两个瘦矩阵,推理提速,老牌手机端模型的标配招式;③ Procrustes 对齐(第 13 章的收线):求「最优正交」对齐两团点云,解法是对互协方差矩阵做 SVD、令 R = UVᵀ,一步闭式;④ 白化与嵌入后处理:词向量矩阵去掉前几个「公共方向」薄片能提升相似度质量(著名的 all-but-the-top 技巧);⑤ 诊断:第 12 章的一切「量秩」操作,底层全是它。一句话:凡是「重要方向排序」的需求,SVD 是标准答案。
ARCore 每一帧都在解一道 SVD 题:摄像头看到的特征点云(这一帧)与地图里的点云(上一帧/世界坐标)之间,求「最优刚体姿态」——旋转部分的标准解法就是刚才的 Procrustes/Kabsch 算法,对 3×3 互协方差矩阵做 SVD。你手机 AR 里那只稳稳贴在桌面上的虚拟猫,每秒 30 次 SVD 在给它扶正。另外图像编辑 App 的「智能压缩预览」滑杆,交互逻辑和本章 Demo 如出一辙——只是工业格式用 DCT/小波代替 SVD(免存基向量,硬件友好),「按重要性截断」的灵魂相同。
① 形状三件套:完整 SVD 的 U 是 m×m(可能巨大)。工程里几乎总用「经济版」np.linalg.svd(A, full_matrices=False),U 变 m×min(m,n),省内存几个数量级——忘开这个开关,4 万×4096 的矩阵能把你 128GB 内存吃穿。② 唯一性的毛边:u 与 v 可以同时翻号(σ 不变),相等的奇异值对应的方向可以在子空间里随意旋转——比较两次 SVD 结果先对齐符号,和特征向量同款陷阱。③ 成本:完整 SVD 是 O(mn·min(m,n)),对超大矩阵用随机化 SVD 或截断算法(TruncatedSVD),只算前 k 片,快一个量级。④ 奇异值非负是约定(负号被拨给 U/V 吃掉),别和可正可负的特征值搞混:对称矩阵的 σᵢ = |λᵢ|。
① 旋转矩阵的奇异值是什么?条件数是多少?(不用算);
② 秩 1 矩阵 uvᵀ 的 SVD 长什么样?σ₁ 等于什么?(提示:‖u‖‖v‖);
③ Demo 里 k=8 时能量占比 95%+,但 k 从 8 加到 20 视觉几乎不变——用「奇异值长尾」解释这笔「边际收益递减」;
④ 为什么伪逆对 σ≈0 的方向「保持零」而不是取一个巨大的倒数?如果不这么做,解方程时会发生什么?(第 09 章病态 + 本章条件数);
⑤ 对齐两团点云时,为什么解出的 R 要强制正交(用 SVD 的 UVᵀ),不能直接用最小二乘的任意矩阵?
⑥ 一个权重矩阵的条件数 10⁶,用 float16(约三位有效数字)推理会发生什么?这解释了哪类「量化后模型胡说八道」的事故?
小结
SVD:任何矩阵 = 旋转 · 缩放 · 旋转,U、V 是两组正交基,σ 是按重要性排序的缩放倍数,也是那只椭圆的半轴;它由 AᵀA 的谱定理装配而来,因此无人例外,连亏损矩阵也乖乖就范;「逐个榨取最大方向」的变分论证同时是 PCA 的剧本;截断前 k 片是被 Eckart–Young 定理担保的最优低秩近似,图像压缩 Demo 是它的手感版;谱的长相是数据的心电图,断崖、平坦、尖峰加地毯、幂律缓坡各有诊断;条件数 σ₁/σₙ、四个子空间的正交基、伪逆 VΣ⁺Uᵀ、行秩=列秩、Procrustes 对齐,旧债一次结清;LSA 用一次 SVD 第一次从词频里挤出了「语义」,今天的 embedding 是它的后裔。全书的数学至此登顶——二十四章的伏笔网,最粗的那几股线都汇进了这三个字母;往后不再有新定理,只有收割。下一章就是第一场收割:把 SVD 对准「数据」而不是「变换」,它有个更响亮的名字——PCA,顺便解释你见过的每一张「高维数据二维可视化」图是怎么画出来的。