7.5 SVD 应用:PCA、推荐与 LoRA
本节位置:模块 7 · SVD | 前置:7.3 | 预计:40 分钟
一句话:同一套分解,在三处扮演不同角色——PCA 里是方差主轴,推荐里是潜在因子,LoRA 里是参数预算。
0. 场景引入
你要在一张 24 GB 的显卡上微调一个 7B 模型。全参微调按 fp32 参数、梯度、Adam 两个动量共 16 B/参数算,状态就是 ——是显存的 4.7 倍,连优化器都放不下。这张卡还要放基座权重和激活,实际余量更小。
全参微调不是「贵一点」,而是根本放不下;LoRA 把可训练自由度从 压到 。但压到什么程度才够,取决于任务更新 的谱——这正是 SVD 要回答的。
换 LoRA:每层只学 ,、。 时每层 个参数,32 层共 个,优化器状态约 67 MB;而全参微调同样 32 层的状态要 8.6 GB。参数占比 。
现在要定 :给 8 太小,任务学不进去;给 64,参数涨到 3.1%,显存和带宽跟着涨。选 不是拍脑袋,得先看谱。你得先回答:这个任务的更新真的集中在少数方向吗?省下来的显存,是不是用「表达能力」换的?换错了要重跑几小时的训练。
读完你能回答三个问题:
- 为什么 SVD 能把「旋转—拉伸—旋转」和「低秩」讲成同一件事?
- 给定一个 的谱,怎样估 取多少够用?
- LoRA 的 为什么不是 的奇异向量,误读会付出什么代价?
1. 直觉
PCA:一团点云像一根斜着的雪茄。把它转正,让长轴对齐 、短轴对齐 ,然后只留 ——这就是降维。转正用的方向就是主成分,长度就是标准差。
推荐:用户的口味不是 5 万维的独立偏好,而是少数几个潜在因子(动作/文艺/年代/明星)。用户向量与物品向量的内积就是预测评分。
LoRA(Hu 等, 2021):与其在 4096 个方向上都改一点,不如只改 16 个方向——如果任务适配真的只需要 16 个方向。
💡 一句话直觉:三者都在问「这个矩阵/数据云的有效秩是多少」,然后用前 个方向做事。
1.1 它在现实世界里对应什么
LoRA 像一台有 4096 个旋钮的调音台,只允许你动 16 个——但不预先指定是哪 16 个,而是让你用两个小矩阵现场组合出来:
| 数学对象 | 调音台里的对应物 |
|---|---|
| 出厂预设 | |
| 你这次拧动的总效果 | |
| 允许动的「独立旋钮」数 | |
| 把 4096 维输入压到 个旋钮 | |
| 把 个旋钮的效果铺回 4096 维 | |
| 无论怎么拧,最多只有 个独立方向在变 |
1.2 这个类比在哪里失效
- 旋钮方向是学出来的,不是 的 top- 奇异方向;训练完不做 SVD,你不知道那 个方向长什么样。
- 秩约束在 上,不在 上: 仍是满秩 4096,模型的总容量没有变成 。
- 太小会欠拟合, 太大会过拟合、吃显存;低秩是预算,不是效果保证。
- 调音台是线性、可交换的;真实任务的适配可能依赖非线性交互,低秩只是对权重更新的约束。
1.3 量级直觉
时,参数占比是
所以 占 、 占 、 占 。若 的谱按 衰减,前 16 个方向占
这个式子说的是:按 衰减时, 能抓住约 96% 的能量;真实 的谱可能衰减更快或更慢,必须训练后实测,不能拿这个数当承诺。
2. 定义
2.1 PCA:中心化后做 SVD
PCA(principal component analysis,主成分分析)的流程是「减均值、做 SVD、取前 列」。它最早由 Pearson 以「最接近点云的直线与平面」提出。给定数据矩阵 ( 个样本、 个特征),先做中心化(centering):,其中 是列均值。
协方差矩阵 。PCA 取 的前 个特征向量 作为主成分(principal components)。用 SVD 写:
则 的列就是主成分,得分(scores)为 ,第 个方向的方差为 。降维后的表示是 。
2.2 推荐:评分矩阵的潜在因子
评分矩阵 ( 用户、 物品),观测集 。秩 的分解:
的第 行是用户 的潜在因子(latent factors), 的第 行是物品 的因子,预测评分为 。实际训练最小化只对观测项的损失 。只对观测项拟合、用交替最小二乘或 SGD 求解的系统做法见 Koren 等。
2.3 LoRA:把更新约束成低秩
对预训练权重 ,LoRA 学习
前向为 。参数量 ,。初始化常取 ,于是训练起点 ,不破坏预训练行为。
3. 为什么这样定义
PCA 为什么必须中心化? 不中心化时,SVD 的第一个方向会指向数据的均值方向——它「解释」的是位置,不是变化。中心化把问题变成「围绕均值的形状」,方差才有意义。
PCA 为什么用 SVD 而不是对 做特征分解? 两者数学等价( 的特征向量就是 ),但 的条件数是 的平方(7.2),高维稀疏数据上会丢精度。sklearn 的 PCA 默认走 SVD。
推荐为什么不用精确 SVD? 因为 有缺失项。直接把缺失填 0 再 SVD,等于假设「没评分 = 评 0 分」,会把预测拉向 0。所以实际做法是加权分解或交替最小二乘(ALS):固定 时,每个用户的 是一个小型最小二乘问题。
LoRA 为什么可能有效? 它赌「任务适配所需的更新集中在少数方向」。这不是定理: 是超参数,效果要实测。Eckart–Young 只在「给定 、求最佳秩 近似」时给最优性保证,不保证「梯度下降能找到那个 」。
3.1 反事实:不中心化就做 SVD 会坏在哪
PCA 的定义里,「减均值」不是可选步骤。取四个点
不中心化,直接算 :
第一主成分方向是 ,解释方差比 。看起来「数据几乎是一维的」。
但把均值 减掉,四个点变成 ,,两个方向的方差完全相等,根本没有「主」方向。不中心化的 SVD 找到的 方向,解释的是「数据中心在哪」,不是「数据怎么变」。按它降到一维,你会保留偏移、丢掉真正的变化。
3.2 反事实:把 当奇异向量会坏在哪
取 、,则 。 的两列是 和 ,不正交。如果把这两列当成 、把 的两行当成 ,你会读出 。
但 的真实奇异值是黄金比例 和 (第 7.2 节给出过同一个矩阵的奇异值)。再取 、,乘积 不变,因子却整体变了——同一个 有无穷多种分解。SVD 的 要求单位正交,所以只在符号和重奇异子空间内不唯一;LoRA 的 没有这个约束,既不唯一,也不正交。
结论:想读 的谱,必须对训练后的 再做一次 SVD; 只是「秩 的参数化」,不是奇异向量,也不能直接把它们的元素当奇异值。
4. 性质与推导
4.1 PCA 的方差就是奇异值平方
设单位向量 是投影方向,投影后样本的方差为
在 下最大化它,拉格朗日条件给出 :方差最大的方向是 的特征向量,最大值是 。而 的特征值正是 。
4.2 解释方差比(explained variance ratio)与重构误差
前 个主成分解释的方差比例
用 重构:,重构误差 (Eckart–Young)。所以「解释 90% 方差」与「重构误差是总能量的 10%」是同一句话。
4.3 推荐与 LoRA 的秩账本
推荐里 有 个可能评分,分解只需 个数:、、 时为 ,是完整矩阵 的 。LoRA 里 、 时 ,是全参数 的 。两个数字都是参数量的账;能不能用,取决于真实数据的谱是否真的集中在 个方向。
4.4 LoRA 的合并与秩上界
。推理时可以把 合并成一个矩阵,不增加延迟;但合并后就失去了「只存低秩增量」的存储优势。反过来,多个 LoRA 适配器可以分别保存、按需加载或相加(相加后秩至多累加)。
5. 例子
5.1 手算:4 个点的 PCA
四个点 ,均值恰为 (方便手算)。
特征值:迹为 、行列式为 ,故 ,即 、。故
主成分 、。
方差(除以 ): 与 ,总计 ,解释方差比 。
得分:四个点在 上的投影是 (两个点一对,落在同一点上),在 上是 。
降到一维的重构:。以 为例,,误差 ,平方 。四个点总误差平方 ✓,Frobenius 误差 。
中心化的作用:把四个点整体平移 ,均值变 ,主成分不变;但不做中心化直接 SVD,第一方向会偏向 ——它解释的是「数据在哪」,不是「数据怎么变」。
5.2 场景:三个场景的规模账
| 场景 | 矩阵 | 规模 | 低秩参数 | 占比 |
|---|---|---|---|---|
| PCA(隐藏层) | : 得分 + 方向 | 得分仍是大头 | ||
| 推荐 | : | |||
| LoRA | : |
PCA 那一行值得注意:降维的收益不在存储,而在后续计算——把 4096 维的注意力/分类头换成 32 维,省的是下游的乘加,以及可视化时能画图。
5.3 场景闭环:24 GB 显卡上的 LoRA
输入:32 层、每层 的 7B 模型。全参 fp32 训练状态按 16 B/参数估 112 GB;LoRA 每层 131,072 个参数,32 层共 个,Adam 状态约 67 MB。基座权重按 bf16 存约 B=14 GB,24 GB 卡装得下。
计算:每层每个 token 的增量是 ()再 (),约 FLOP;32 层共 FLOP/token。batch 个 token 时,前向约 FLOP;按 100 TFLOP/s 估约 5.5 ms(不含 attention 与 FFN 本身)。
输出: 的选择;训练后对 做 SVD,按 决定能否把 降到更小;推理时合并 。
成本:优化器状态 67 MB 对 8.6 GB,差 128 倍;不合并时每层多读 共 B=262 kB(fp16),占 的 B=33.6 MB 的 0.78%;合并后不增加推理延迟,但失去「只存低秩增量」的存储优势。
失败条件:
- 谱不衰减: 的真实谱若接近平坦, 远低于 96%, 会欠拟合,表现为新任务学不会、输出仍是预训练套话。兜底:训练后看谱,按 选 ,或对更多层加 LoRA。
- 合并精度: 在 bf16 下舍入,若 很大,误差会污染无关方向。兜底:合并前检查 ,保留未合并适配器,合并前后跑同一套回归评测。
- 缩放系数:LoRA 常把增量乘 , 配错会让有效步长随 漂移,换 就得重调。兜底:固定 、做小规模 sweep。
6. 常见误区
- 误区:PCA 可以直接对原始 做 SVD。 纠正:必须先减均值,否则第一主成分指向均值方向;另外特征尺度差异大时通常还要标准化,否则方差大的特征会独占主成分。
- 误区:主成分就是「最重要的原始特征」。 纠正:主成分是原始特征的线性组合,系数可正可负;单个主成分往往不对应任何可命名的物理量。
- 误区:推荐系统就是用 SVD 分解评分矩阵。 纠正:精确 SVD 要求矩阵完整。带缺失时要么填补(有偏),要么用加权分解/ALS/SGD;「SVD 分解」只是最理想化的版本。
- 误区:LoRA 的 就是 的 SVD 因子。 纠正: 只是一种秩 的参数化, 既不正交也不按奇异值排序。训练后对 再做一次 SVD,才能读出它的谱与有效秩。
- 误区:解释方差 99% 就说明 维够了。 纠正:这只说明重构误差小;若下游任务依赖被丢掉的方向(如罕见类别),99% 也可能不够。
7. 概念网络
- 前置:7.3 低秩近似 —— 截断、误差公式、Eckart–Young。
- 前置:7.2 计算与性质 —— 为什么用 SVD 而不是协方差特征分解。
- 前置:7.4 伪逆与数值秩 —— 最小二乘视角下的推荐与编辑。
- 关联:2.6 秩 —— 「有效秩」的原始定义。
- 关联:4.5 伪逆 —— 固定一侧求另一侧的最小二乘。
- 关联:9.3 PCA —— 从概率与协方差角度重讲同一件事。
8. 通往大模型:三种「低秩」不要混
1. 激活分析(PCA):取 ( 个 token、),中心化后对 做 SVD,前几个主成分解释了多少方差,就说明表示落在多低维的子空间里。注意 的协方差是 ,对协方差做特征分解要 且把条件数平方;对 直接做 SVD()更稳。
2. LoRA(2Dr 的预算): 时参数是 ,占 的 。这里的关键不是「低秩一定够」,而是「低秩把可训练自由度压到 」;训练后对 做 SVD,若谱只集中在 个方向,就说明 还可以再小。
3. 推荐(潜在因子):LLM 做推荐时,用户/物品 embedding 的内积打分等价于秩至多 的双线性模型; 是隐层维度,远小于用户数。这和第 2 点形似而神不同:LoRA 的秩是优化约束,推荐的秩是模型结构。
可检验结论:三种场景都能用同一句话检验——「把矩阵做 SVD,看前 个奇异值占多少能量」。若 在很小的 就接近 1,低秩假设成立;若谱衰减很慢(),强行低秩就是在丢信息。另外, 的条件数 过大时,合并回 会放大数值误差,尤其在 bf16 推理时;上线前值得检查。
import numpy as np
H = np.random.default_rng(0).normal(size=(10_000, 4096)) # [T, D]
H = H - H.mean(axis=0, keepdims=True) # 中心化
s = np.linalg.svd(H, compute_uv=False) # 只算奇异值
print((s[:32] ** 2).sum() / (s ** 2).sum()) # 前 32 维解释的方差比
算错时下游看到什么:若把 的范数当奇异值来选 ,可能把 选小,模型学不进新任务,输出仍是预训练时的套话。若合并 时用 bf16 且 很大,舍入误差会污染本来无关的方向,用户看到的是「只微调了客服话术,代码能力却掉了」。兜底是合并前检查 、保留未合并的适配器、并在合并前后跑同一套回归评测。
9. 练习
- 概念:为什么 PCA 必须先中心化?若数据均值是 ,不中心化会怎样?
- 计算:数据 的两列正交、范数分别为 和 ()。求两个主成分方向、各自方差、解释方差比。
- 计算:,求它的秩、非零奇异值,并说明为什么缺失项(用户 1 对物品 3)不能靠这个分解预测。
- 场景:、 的 LoRA 有多少参数?占全参数多少?若训练后 的前 8 个奇异值只占 60% 能量,说明什么?
- 开放:PCA 降维后再训练分类器,与直接在原空间训练,各自的优劣是什么?
参考答案
- 不中心化时,SVD 的第一方向捕获均值(数据「在哪」),方差被位置主导;中心化后才描述围绕均值的形状。均值 时第一主成分会明显偏向 方向,前几个成分解释的「方差」大量来自偏移。
- 两列已正交,主成分就是坐标轴方向;按方差降序,第一主成分是 (方差 ),第二是 (方差 )。总计 ,、。
- 前两行成比例,秩 2;(第一因子:用户 1、2 的动作偏好),(第二因子:用户 3 的文艺偏好)。缺失项 落在两个独立块的交叉处,矩阵里没有任何信息连接它们,任何分解都只能给先验(如全局均值),不能「预测」出 5。
- ,占 的 。前 8 个奇异值只占 60% 能量,说明 不够,应增大 或换用其它适配方式。
- 降维后:参数少、抗过拟合、可可视化,但会丢掉判别方向;原空间:保留全部信息但样本需求大、易过拟合。实践中用交叉验证选 ,并注意 只能在训练集上选。
10. 一页速记
- PCA = 中心化 + SVD;主成分是 的列,方差是 ,重构误差是 。
- 物理意义 / 现实对应:PCA 是「把点云转正、只留最长轴」;推荐是「用户和商品各自在一张潜在因子表上取坐标」;LoRA 是「只允许拧 个学出来的旋钮」。
- 推荐 = 评分矩阵的秩 分解 ,只对观测项拟合;精确 SVD 只在矩阵完整时可用。
- LoRA = ,参数量 、秩 ; 不是 SVD 因子。
- 三者共享「有效秩」假设,但秩的来源不同:方差、偏好、优化约束;上线前都要看谱衰减与 ,不能只看参数量。
11. 参考文献与致谢
这一页的知识不是凭空来的。下面列出本页直接借用的原始工作与权威整理;正文中的人名、定理名已链接到对应条目。链接优先指向 DOI、arXiv 或可长期访问的原文存档。
- 皮尔逊(Karl Pearson, 1901):On Lines and Planes of Closest Fit to Systems of Points in Space。用「最接近点云的直线与平面」提出主成分,本页第 2.1 节「减均值后取方差最大的方向」就是它的现代写法。Philosophical Magazine 2(11)
- Koren 等(Yehuda Koren et al., 2009):Matrix Factorization Techniques for Recommender Systems。把评分矩阵写成 、只对观测项做正则化最小二乘并用 ALS/SGD 求解,本页第 2.2 节的推荐模型与第 3 节的「为什么不用精确 SVD」都以它为标准做法。IEEE Computer 42(8)
- Hu 等(Edward J. Hu et al., 2021):LoRA: Low-Rank Adaptation of Large Language Models。提出 的低秩适配,本页第 2.3 节的参数量 、 初始化与「更新秩远小于 」的假设都出自这里。arXiv:2106.09685
上一篇 → 7.4 伪逆、数值秩与条件数 | 回到 模块导览
随堂测 · 5 题
源文件:07-SVD/05-SVD应用.md