秩:一张大表里,真正独立的方向有几个
成绩表上有语文、数学、英语三列,看着信息挺多。可要是英语分永远等于语文分,那第三列一个字的新消息都没带来——表是三列宽,真本事只有两样。
🧠 一句话结论
秩就是"真正独立的方向有几个"——一堆箭头里,扣掉那些能被别人拼出来的,剩下几根。秩比表面的行数列数小,就叫低秩,意味着这堆数据能用很少几根主方向近似地拼回来,这正是压缩和降维能成立的原因。
场景问题
班主任做了一张全班成绩表,三列:语文、数学、英语。
她想按"学习特点"给同学分类,一开始以为要考虑三个方面。可翻着翻着发现一件怪事:每个人的英语分,都恰好等于他的语文分。一个不差。
那这张表到底该算"三个方面"还是"两个方面"?
从格式上说它有三列。但从信息上说,英语那一列完全是白搭——知道了语文分,英语分闭着眼睛就能写出来。真正在描述同学的,只有语文和数学两样东西。
于是班主任心里冒出个问题:有没有办法一眼看出,一张表里"真正独立的方向"到底有几个? 如果不是"恰好相等"这么明显,而是"大致跟着走"呢?
这一篇讲的就是这件事。
实现方案
有的箭头是多余的
先回到第三篇的语言。那一篇讲过:几根箭头能张成(拼出)一片范围。
现在把成绩表的每一列当成一根箭头。三根箭头,能拼出多大的地方?
如果英语 = 语文,那两根箭头躺在同一条直线上。 这时候第三根箭头对"能拼出多大地方"一点贡献都没有——它能到的地方,第一根箭头自己就能到。它是多余的。
图里青色两根箭头各指一个方向,谁也拼不出谁。橙色那根正好躺在语文那根的延长线上——它带来的一切,语文那根自己就能给。
扣掉所有多余的箭头之后,还剩几根,这个数就叫秩。 三列的表,秩是 2。
秩不满的时候,空间会被压扁
把这件事翻译成第四篇的语言:矩阵是把整张网格搬一次家。
如果一个矩阵的秩不满(比如 2 列的矩阵秩只有 1),搬家之后会发生什么?
整张网格被压成了一条线。所有格子的面积都变成 0——这正是第六篇讲的"行列式为 0",也正是第七篇说的"倒不回去"的原因。
秩不满 ⟺ 面积(体积)归零 ⟺ 变换不可逆。 三篇讲的是同一件事的三个侧面:秩说的是"独立方向剩几个",行列式说的是"面积缩到多少倍",可逆性说的是"能不能倒着走回去"。
少数几根主方向,就能把表拼个八九不离十
现实里很少有"英语分恰好等于语文分"这么干净的事。更常见的是大致跟着走:英语分和语文分不完全相等,但明显同涨同跌。
这时候秩严格算起来是满的(3),可从信息上说,第三列带来的新东西少得可怜。
于是有了一个更有用的问法:能不能只留最重要的几根方向,把整张表近似地拼回来?
看这组对比:只留 1 根主方向,图案只剩个粗略的条纹;留 2 根,轮廓就出来了;留 5 根,已经和原图几乎看不出差别。
这说明一件事:真实数据里,绝大部分内容都挤在少数几根方向上,剩下的方向装的东西少得可以忽略。这种"名义上秩很高,实际上只有少数几根方向真正装东西"的情况,就叫低秩。
低秩不是特例,是常态。班里同学的成绩、一张照片的像素、一段文字的含义——真实世界的数据几乎都是这样。这就是压缩能成立的根本原因:不是我们手段高明,是数据本来就没那么"满"。
挑主方向不是"砍掉几列"
有个地方特别容易搞混:留下"几根主方向",不等于从原表里挑几列留着。
原表的列(语文、数学、英语)不一定是最好的量尺。主方向是第十一篇说的那种换出来的新量尺——它们通常是原来几列的混合,比如"语文和英语的共同部分"算一根、"数学独有的部分"算一根。
所以流程是:先换一组更合身的量尺,再只留前几根。直接砍列是把整整一列的信息全丢掉;换量尺后砍,丢掉的只是各列里最不重要的那部分渣滓。
为什么这么做
为什么要专门给"独立方向有几个"起个名字叫秩?
因为这个数把好几件事一口气说清了:能不能倒着走回去(第七篇)、面积会不会归零(第六篇)、这堆数据能压到多小。一个词说清一串事,值得起名字。
为什么低秩能压缩,不会把东西弄丢?
因为真实数据本来就"不满"。各个方向装的东西极不平均:前几根方向装了绝大部分,后面那些方向装的接近于零。丢掉几乎空着的方向,当然不心疼。压缩省下的是本来就没什么内容的地方,不是把有内容的地方硬砍掉。
为什么要先换量尺再砍,不能直接砍列?
因为原来的列往往互相纠缠——语文和英语各装了一部分"语言能力"。直接砍掉英语列,那部分信息就整块没了。换一组量尺之后,"语言能力"被单独拎成一根量尺,剩下的量尺装的才是真正的边角料,砍它才不心疼。
为什么别的选择不行
错误直觉一:以为秩就是行数或列数
"三列的表,秩不就是 3 吗?"
不是。秩数的是真正独立的方向,不是格式上有几列。三列的表里要是有一列能被另外两列拼出来,秩就是 2;要是三列全躺在同一条直线上,秩就是 1。
行数列数是表的外形,秩是表的实际本事。 外形唬人,本事不一定跟得上。
错误直觉二:以为低秩必然丢掉大量信息
"只留 5 根方向,那不是把其它方向全扔了?"
扔了,但那些方向本来就几乎是空的。看上面那组重建图:留 5 根已经和原图几乎看不出差别——说明第 6 根往后的方向装的东西微乎其微。
关键不是"扔了多少根方向",是"扔掉的那些方向里装了多少东西"。 真实数据几乎都是低秩的,所以扔掉一大堆方向往往只损失一丁点内容。
错误直觉三:以为降维就是砍掉几列
不是。降维是先换一组更合身的量尺,再只留前几根,砍的是新量尺不是原来的列。
直接砍列的后果很具体:砍掉英语列,"语言能力"这件事就整块丢了。而换量尺之后,"语言能力"已经被单独拎成一根主方向留了下来,被砍掉的只是各列里零碎的边角料。同样是"变少",砍对地方和砍错地方,结果天差地别。
沉淀结论
- 秩 = 扣掉多余箭头之后,真正独立的方向还剩几根——不是行数列数
- 秩不满 ⟺ 空间被压扁 ⟺ 面积归零 ⟺ 倒不回去,这是第六、第七篇结论的另一个侧面
- 低秩 = 名义上方向很多,实际上内容全挤在少数几根上——真实数据几乎都是这样
- 只留前几根主方向就能把数据拼个八九不离十,因为丢掉的那些方向本来就几乎是空的
- 降维是"先换量尺、再留前几根",不是直接砍掉几列——砍对地方才不心疼
记忆口诀
秩 = 真正独立的方向有几根,不是有几列。
秩不满就压扁,压扁就倒不回去。
真实数据都低秩:内容全挤在前几根方向上。
留前几根就够像,因为后面那些本来就空着。
降维是先换量尺再留前几根,不是硬砍几列。
延伸阅读
- LoRA 为什么能用极少参数微调大模型:因为微调要改的那部分本来就是低秩的——不用动整张大表,只用两张又窄又薄的表就能把改动拼出来。详见模型微调。
- embedding 压缩与降维:把上千根量尺换成几十根主方向,检索效果掉不了多少、存储和计算却省一大截,靠的正是低秩。详见RAG 架构。
自测:合上资料能说清楚吗?
- 一张三列的成绩表,英语分永远等于语文分。这张表的秩是几?为什么?
参考答案
秩是 2。 秩数的是真正独立的方向,不是有几列。英语那一列能被语文那一列直接拼出来(躺在同一条直线上),它一个字的新消息都没带来,是多余的。扣掉它,剩下语文和数学两个独立方向。
- 秩不满和"倒不回去"是什么关系?
参考答案
是同一件事的两个说法。 秩不满意味着变换把空间压扁了(比如整张网格压成一条线),所有格子面积归零——这正是行列式为 0。压扁之后,原来不同的点被挤到了同一个位置,分不清谁是谁,自然倒不回去。秩说的是"独立方向剩几个",行列式说的是"面积缩到多少倍",可逆性说的是"能不能走回去",三者讲的是一件事。
- 只留 5 根主方向重建的图和原图几乎一样,这说明了什么?
参考答案
说明这堆数据是低秩的:内容极不平均地挤在前几根方向上,第 6 根往后装的东西微乎其微。所以扔掉一大堆方向只损失一丁点内容。真实数据几乎都是这样——这正是压缩能成立的根本原因:不是手段高明,是数据本来就没那么"满"。
- 降维和"砍掉几列"有什么区别?
参考答案
降维是先换一组更合身的量尺,再只留前几根,砍的是新量尺不是原来的列。
原来的列往往互相纠缠(语文和英语各装一部分"语言能力"),直接砍英语列会把那部分信息整块丢掉。换量尺之后"语言能力"被单独拎成一根主方向留下来了,被砍的只剩零碎边角料。同样是变少,砍对地方和砍错地方结果天差地别。
- 一张 1000 列的表,秩算出来是 1000(满的)。它还有可能被大幅压缩吗?
参考答案
很有可能。 秩满只说明"没有哪一列能被别的列恰好拼出来",但各方向装的内容可以极不平均——前 20 根方向装了 99% 的内容,后面 980 根各装一丁点。
现实里"恰好相等"很罕见,"大致跟着走"才是常态。所以真正有用的问题不是"秩满不满",而是"内容集中在前几根方向上",这才是低秩近似的用武之地。