正文
假设一个教学例子,把三个小组在四项任务上的记录写成下面的矩阵。数字只是用于解释线性关系:
M = [
[1, 2, 3, 4],
[2, 4, 6, 8],
[3, 6, 9, 12]
]
它有三行四列,一共十二个数。不过,第二行就是第一行乘 2,第三行就是第一行乘 3。只要保存第一行和每行的倍数,就能恢复整张表,不需要把十二个位置都当作彼此独立的变化。
从列来看也一样。第一列是 [1, 2, 3],后面三列分别是它的 2 倍、3 倍和 4 倍。所有列都沿着同一个向量方向展开。这个矩阵的秩就是 1。
矩阵的秩,可以理解为其中最多有多少条线性独立的列;也等于最多有多少条线性独立的行。 “线性独立”需要解释一下:如果某一列能通过其他列乘常数后相加得到,它就没有提供一个新的独立线性方向。秩数的就是能够保留下来的独立方向数量。MIT 线性代数:列空间与秩
例如 [1, 0] 和 [0, 1] 两列,无法只靠给其中一列乘一个常数,就变成另一列。它们是两个独立方向。如果再增加第三列 [1, 1],第三列可以由前两列相加得到,所以这个两行三列矩阵的秩是 2,不会因为增加一列就自动变成 3。
这里的“独立”是线性代数的定义,不能直接理解成统计学里的两个变量互相独立,也不能理解成两段文字没有语义联系。“信息重复”的直觉有助于入门,正式判断仍要看线性组合关系。
一个 m 行 n 列的矩阵,秩最多是 m 和 n 中较小的那个数。三行四列矩阵的秩最多是 3。如果达到这个最大值,就叫满秩;小于它,则是秩亏。全是零的矩阵秩为 0。所谓低秩,通常还强调秩相对于矩阵规模比较小,而不是说所有没有满秩的矩阵都能得到显著压缩。
这与“张量有几条轴”不同。刚才的 M 是二维数组,有两条轴,矩阵秩却为 1。把它改成满秩的三行四列矩阵,轴数仍然是 2。资料中两个概念有时都使用英文 rank,判断时要看是在讨论形状,还是在讨论线性关系。
回到 M。既然所有列来自同一条基础列向量,我们可以把它写成两个较小矩阵的乘积:
B = [ [1], A = [ [1, 2, 3, 4] ]
[2],
[3] ]
M = B × A
形状:(3, 1) × (1, 4) → (3, 4)
例如乘积第二行、第三列的数,是 2 × 3 = 6;第三行、第四列的数,是 3 × 4 = 12。你可以逐个位置检查,恢复出的就是原矩阵。
原本直接保存 M,需要十二个数;保存 B 和 A,共需要 3 + 4 = 7 个数。实际文件还有形状、类型等开销,这里只比较数值元素数量。更关键的是,原本一张表现在由“怎样组合”和“组合的基础内容”共同表示。这就是一种秩分解。
把这个形式推广,可以写成:
M ≈ B × A
M 的形状:m × n
B 的形状:m × r
A 的形状:r × n
r 是两个小矩阵相接的位置数量。乘积的秩不会超过 r,也不会超过 m、n。因为输出的每一列都由 B 的那 r 列组合而成,最多只能提供这么多个独立方向。如果原矩阵的秩正好为 r,就存在相应的精确分解;为了节省开销,也常选择较小的 r,接受一定近似误差。
只计元素时,原矩阵需要 mn 个数,两个因子需要 r(m+n) 个数。假设 m、n 都是 1000,r 取 8,那么前者是 1,000,000,后者是 16,000,后者占前者的 1.6%。这些是设定下的算术结果,不是某款模型的压缩实测;r 如果很大,两个因子也可能不比原矩阵省。
在计算时,分解还提供了一条中间路径。假设输入是 n 项向量 x,可以先计算 A 与 x 的乘积,得到 r 项中间结果,再由 B 把它变成 m 项输出。根据矩阵乘法的结合律,这与先形成 BA 再乘 x 得到同样的数学结果。中间只有 r 项,并不表示任务只剩 r 个词或 r 条知识;它限制的是这一线性变换经过的独立方向数量。
而且,能写成乘积不代表分解唯一。上面 B 中所有数都乘 2、A 中所有数都除以 2,乘积仍然不变。所以不能简单地说其中某个因子就是原矩阵唯一正确的“真实原因”。
真实数据通常没有例子那么整齐。若把 M 的最后一个 12 改成 12.01,原来的秩 1 关系就被打破,精确的秩会增加。但是,原先两个小矩阵仍能近似表示这张表,只在那个位置产生 0.01 的差异。由此要分清:精确低秩是在等式成立时讨论结构,低秩近似则允许丢失部分数值细节。
怎样寻找这种近似?一种重要工具叫奇异值分解,简称 SVD。对实数矩阵,它把矩阵写成 UΣVᵀ 的形式。这里 U、V 描述一组相互正交的方向,Σ 中的非负奇异值描述各部分的大小,ᵀ 表示转置。入门时不必先手算整个分解,但要知道它能按奇异值大小排列组成部分。SVD 的定义与计算结果
保留较大的前 r 个奇异值及其方向,舍去其余部分,就得到截断 SVD。它在特定的矩阵误差度量下,例如所有元素误差平方和开平方的 Frobenius 范数,能给出最佳的秩不超过 r 的近似。这里的“最佳”有明确的数学目标,并不保证后续业务任务效果最好。Cornell 课程:截断 SVD 的近似误差
例如,一张图里占据大量像素的背景可能主导数值误差,小而关键的编号却只占很小部分。近似后的整体误差低,不代表编号仍然能识别。因此,压缩比例和矩阵重建误差之外,还要检查真正关心的任务结果。
精确秩与程序计算出的数值秩也有差别。浮点运算存在精度限制,实测数据还有噪声。软件通常根据奇异值与某个容差比较,把足够小的部分当作零;选择的容差不同,数值秩可能不同。报告秩的时候,需要说明数据尺度、误差和计算规则。数值秩与容差的官方说明
现在就能接到用户关心的 LoRA。设模型原本有一个较大的权重矩阵 W₀,适配新任务时,完整更新可以写成 W₀ + ΔW。常见 LoRA 做法冻结 W₀,并用两个较小的可训练矩阵表示更新部分:ΔW = BA,实际计算还可以包含缩放系数。LoRA 原始论文
低秩约束施加在这部分更新上。因此,LoRA 不要求原始权重 W₀ 本身就是低秩矩阵,也不意味着先把整个模型做一次 SVD 再训练。两个小矩阵通常是在任务训练中学习的。选择 r 为 8,表示更新矩阵的秩上限受到这个中间宽度限制,并不能保证最终实际秩必定等于 8。
冻结基础权重减少了需要训练的参数,基础模型本身仍然需要用于计算。可训练参数减少多少、运行占用降低多少,取决于目标层、训练精度、优化器和其他设置,不能直接拿刚才 1.6% 的矩阵例子代替整套训练的资源测量。
学到这里,看到“低秩”就可以追问得更具体:哪一个矩阵受到约束,中间宽度是多少,是精确表示还是近似表示,省下了哪些参数,又牺牲了什么表达空间。后面的 LoRA 专题会逐项展开这些问题。接下来的数学基础,则转向另一种常见情况:结果并不确定时,怎样用概率来描述它。
当前学习编号:03.03 矩阵秩与低秩分解。
下一学习编号:03.04 概率与条件概率。后续还有其他学习编号。
关联分支:矩阵结构和计算对应 03.01 向量、矩阵与张量、03.02 点积、范数与距离;模型参数与训练对应 07.01 神经网络与可训练参数;低秩更新的具体使用,对应 10.05 LoRA 的整体机制、10.06 冻结基础权重、10.07 低秩更新矩阵 A 与 B、10.08 LoRA Rank:r、10.09 LoRA Alpha 与缩放、10.14 LoRA 训练超参数选择。