1.3 线性代数(下)范数、特征值与SVD的直觉
1.上回书说到
上一篇我们把向量、矩阵、导数、梯度这些最基础的工具过了一遍,你大概也感觉到了,深度学习这套东西说穿了就是把一堆数按某种方式组合起来,再拿梯度去调。这一篇里,我会把线性代数剩下的几个重要工具补齐,包括范数、特征值、特征向量、奇异值分解还有矩阵的秩。这几个名字听着吓人,其实背后都是特别具体的几何画面。
这篇我会一边带直觉、一边把关键推导走完——尤其是 SVD 那一节,光知道结论不知道怎么来的,到后面用起来心里总没底。这几个工具后面全是要派上用场的,它们在正则化、初始化、主成分分析这些地方会反复出来露脸,你现在把它们认全了,后面看到就不会觉得陌生。
2.范数:给向量量个长短
你还记得吧,向量就是有顺序的一排数。那么问题就来了,一个向量到底有多长?说起来也不复杂,把每个数平方加起来再开根号就好了。这就是最常见的一种量法,我们管它叫L2范数,记作 。式子长这样:
这里的 是向量 各个位置上的数, 就是开根号。L2范数算出来的就是初中学的勾股定理那种直线距离,几何上特别直白,二维情况下就是从原点到这个点的那根直线的长度。
我们举个数字例子。假设 ,那么 。这就是经典的勾股例子,两条直角边分别是3和4,斜边正好是5。
但L2只是最常见的一种量法,并不是唯一的尺子。还有一种叫L1范数,记作 ,它的算法是把每个数的绝对值直接加起来:
这里的 表示 的绝对值。还是拿 这个点举例,。你看,同一个向量,换一把尺子量出来的长度就不一样了。
那么L1在几何上是什么样子呢?它叫曼哈顿距离。你不妨想象一下,站在纽约曼哈顿那种横平竖直的格子街区里,要从原点走到 这个点,中间挡着一栋栋楼,没法直接斜穿过去,只能先横着走3格、再竖着走4格,总共走了7格,这就是L1。换句话说,L2是鸟飞过去的直线距离,L1是人沿着街道一步步走的距离。说起来,小明在市中心送外卖也是一样的道理,电动车只能沿着横竖的马路拐来拐去,从一家店到另一家店走的也是这种横竖拐弯的曼哈顿距离,没法笔直地穿过去。
那么在深度学习里这两样到底有什么用呢?最直接的一个用处就是权重衰减,英文叫weight decay,它在训练的时候会给损失函数额外加上一项惩罚,专门管束参数别长太大。写成式子大概是这样:
这里的 是原来的损失, 是模型参数, 是一个手动调的小正数(也就是超参数),叫权重衰减强度, 就是参数向量的L2范数的平方,平方之后那个开根号就省掉了。整项加进去之后,参数要是想变大,就得先付出额外的损失代价,于是训练的时候就倾向于把参数压在一个比较小的范围里,避免它学得太野。
你可能会问,为什么非得压着参数呢?因为参数一旦飘得特别大,模型就特别容易过拟合,把训练集里那些噪声一股脑死记硬背下来,换个测试集表现就掉得很难看。加上L2之后,模型就像被套了个紧箍咒,不能太放飞自我,泛化能力通常就能稳住。这个东西在很多框架里都很常用,你以后写PyTorch代码会经常手动开启它(设置weight_decay大于0),它是防过拟合的一把好手。
至于L1,思路类似,加进去之后它有个特别实在的好处,会把很多参数直接压成0,相当于自动帮你挑特征,没用的特征权重直接清零。这个我们以后讲正则化那篇会专门聊。
3.单位矩阵、转置和矩阵的逆
这三个概念很简单但绕不开,我们快速过一遍。
单位矩阵通常记作 ,它长得就像数字1的矩阵版本,对角线上全是1、其它地方全是0。一个 的单位矩阵长这样:
它的性质也跟数字1一样,任何矩阵乘上它都等于自己,写成式子就是 和 。深度学习里它经常用来占位或者做初始化。
转置这个操作就是把矩阵的行和列互换一下,原来第 行第 列的那个数,转置之后跑到第 行第 列去。矩阵 的转置记作 ,右上角那个小T是transpose的缩写。举个 的例子:
转置这个操作后面会经常用到,比如算梯度的时候、算注意力分数的时候,到处都是它的身影。
再说矩阵的逆,记作 。它满足 和 ,也就是说矩阵乘上自己的逆就变回单位矩阵,这跟数字里 是一个意思。但逆这个东西并不是每个矩阵都有的,得满足一个硬性条件,就是这个矩阵满秩(秩这个概念下面专门讲)。满秩的方阵才有逆,行不满或者列不满的矩阵没逆。
为什么深度学习里要管逆呢?其实大多数情况下你不会真的去算一个矩阵的逆,算起来又慢又容易出数值问题。但是理解逆的存在性对后面理解很多东西都关键,比如说一个线性层的输入维度比输出维度大,那这一层就有可能把不同的输入压成同一个输出,这种操作是不可逆的,信息就这么被丢掉了,跟把一篇长文压缩成一句话一样回不去了。
4.特征值和特征向量:只被拉伸的方向
这一节我们来聊一个特别有画面感的东西。
前面说过,矩阵乘向量这个操作本质上是把一个向量扭成另一个向量。一般来说,向量被矩阵作用完之后方向会变、长度也会变。但是有那么一些特别的方向,矩阵作用上去之后只是被拉长或者压短了,方向(连同它的反向)保持不变。这种特别的方向就叫特征向量,对应的那一个拉伸倍数叫特征值,通常记作 。
写成式子就是:
这里的 是一个方阵, 是它的特征向量, 是特征值。意思就是矩阵 作用在 上,效果跟直接把 乘上一个数 完全一样。
我们拿一个简单的 例子来说。考虑这样一个对角矩阵:
向量 被它作用之后变成 ,方向没变,长度从1变成了2,所以 是特征向量,对应特征值 。同理向量 变成 ,方向也没变,对应特征值 。这个例子因为是对角矩阵,所以特别直观,普通矩阵的特征向量方向可能斜着,但思路是一模一样的,矩阵只在那几个特别的方向上做纯粹的拉伸。
那么这个概念为什么重要呢?我给你两个特别实在的理由。
第一个理由是PCA,也就是主成分分析。你手头有一大堆高维数据,比如每张人脸图片拍扁了是几千个数,你想找几个最重要的方向,把数据投影到这几个方向上,做到降维。我记得看过一本讲金融数据分析的书,里面说分析一篮子股票的涨跌时,真正驱动市场的方向往往就那么几个(比如宏观经济、利率、行业景气),PCA帮你把这些主方向找出来,剩下的细枝末节就可以丢掉。回到人脸图片的例子,这些最重要的方向恰恰就是数据协方差矩阵的特征向量,对应的特征值越大,说明这个方向上数据散得越开、信息越丰富。所以挑特征值最大的几个方向留下,就能用很少的维度抓住数据的大头,剩下的维度尽管扔掉。这招在数据可视化、特征工程里都用了很多年,口碑很好。
第二个理由是理解一个线性层到底在怎么扭数据。一个矩阵的特征值如果都比较大,说明它在这个空间里把向量整体拉得很猛。反过来,如果有些特征值接近0,说明它把某些方向几乎压没了,那些方向上的信息就丢了。深度学习里训练深层网络的时候,如果每一层都把向量往大里拉,最后激活值就会膨胀失控。反过来,如果每一层都往小里压,最后信号就消失没了,网络也就学不进去。理解特征值,你就能从方向和幅度两个角度去想象一个线性层干了什么事。
5.奇异值分解:把任意矩阵拆成三步
特征值有个让人为难的限制,它只对方阵好使。可深度学习里的矩阵大多不是方阵,比如一层全连接层,输入维度是784(一张28乘28的图片拍扁),输出维度是10(10个类别的分数),这就是个 的矩阵,行和列并不相等。这种一般形状的矩阵想要类似的分解,就得靠奇异值分解,简称SVD。
5.1 是什么:三个矩阵的连乘
SVD说的是这么一回事:任意一个矩阵 (行数 、列数 不限),都能被拆成三个矩阵连乘的形式:
挨个交代清楚每一项的形状,免得新手对不上号。 是 的; 是 的方阵; 跟 一样是 的,但它只在左上角的对角线上有非负的数,其余位置全是 ; 是 的方阵, 是它的转置。
两个关键性质。第一, 和 都是正交矩阵(orthogonal matrix),意思是它们的列向量彼此两两垂直、长度都是1,满足 和 ( 是单位阵)。几何上,正交矩阵对向量只做旋转(或翻转),不改长度。第二, 对角线上那些从大到小排好的非负数 ,叫奇异值(singular value),它们就是这次分解的主角。
5.2 为什么:先把几何直觉说清
这个分解的几何画面特别漂亮。矩阵 作用在向量上,本来是一团说不清楚的扭曲操作,SVD告诉你这团操作可以拆成三步:先让 把向量旋转一下(正交矩阵只旋转、不改长度),然后让 把向量沿坐标轴方向拉伸或者压扁(这里奇异值就是各个方向上的拉伸倍数),最后让 再旋转一下。所以任意矩阵对向量的作用,本质上就是旋转、缩放、再旋转这三步,就这么简单。
这个"三步走"的直觉先记牢,但光有直觉不够——新手最容易被卡住的是"SVD 这三个矩阵到底怎么算出来、凭什么一定存在"。下面我把推导从头走一遍,你看完会发现它不是黑魔法,而是特征值分解的直接推广。
5.3 怎么推:从 入手
SVD 的推导,核心思路是借力"方阵的特征值分解",把它用在 这种方阵上。设 是 的矩阵,那么 是 的方阵。我们来观察它有什么好性质。
先看它是不是对称的。,对称。再看它是不是半正定的:对任意向量 ,。所以 是一个对称半正定矩阵。
对称半正定矩阵有个现成的结论(这条结论本身是线性代数的基本定理,这里拿来用):它能被特征值分解成 ,其中 的列是彼此正交的单位特征向量, 是对角阵,对角线上的特征值全都是非负实数。我们把这些特征值记作 ,把对应的特征向量记作 ,于是:
现在定义奇异值 (取正根),把 (因为 对角线就是 ,而 的对角线就是 )。于是关键的一步来了:
这一步把" 就是 SVD 里的 "钉死了——SVD 中的右奇异矩阵 ,就是 的特征向量排成的矩阵;奇异值 就是 特征值的平方根。
5.4 构造 ,凑出
和 有了,剩下的 怎么定?思路是"造"一组向量,让它们正好充当 的列。对每一个 的方向,定义:
为什么这么定义?因为这样 ,正好把" 在 方向上的作用"翻译成" 倍的 "。我们来验证这些 是单位正交的,从而能当 的列。先算长度:
(最后一步用了 。)所以每个 都是单位向量。再验证两个不同的 ()彼此正交:
(最后一步用了特征向量彼此正交 。)所以 这组向量单位正交,可以充当正交矩阵 的列。
最后把分解拼出来。我们已知两件事:(对 的方向),以及 是 的列。把所有方向摞在一起写成矩阵形式:
两边右乘 ,注意 (正交矩阵),就得到:
这就是 SVD。至此我们不光说清了"是什么",还把" 各自从哪来"都推出来了—— 来自 的特征向量, 来自对应特征值的平方根, 用 造出来。(严格说当 的秩不满时, 的方向上 没法定义,这时需要用 的特征向量补齐 剩余的列,思路完全对称。)
5.5 一个 2×3 的手算例子
光看推导还是虚,我们拿一个最小例子手算一遍,你就彻底踏实了。设:
第一步算 :
第二步求它的特征值和特征向量。解特征方程 ,算出来 。于是奇异值 ,,。
对应的单位特征向量(解 再归一化)取:
所以 。
第三步造 。对 的方向:,……仔细算 ,所以 。于是 。
把三块拼起来,你可以自己验证 确实还原回 ( 是 的,对角线 ,其余 )。这个例子里秩是2(第三个奇异值为0),第三列 对应的方向被 完全压没了,正好呼应下一节要讲的"秩"。
5.6 Eckart–Young 定理:为什么截断小奇异值是最优的
前面说"扔掉小奇异值就能压缩",这话其实有个严格的数学保证,叫 Eckart–Young 定理。它说的是:在所有秩不超过 的矩阵 里,把 SVD 截断到前 个奇异值得到的 ,是离 最近的那个,用的是 Frobenius 范数(矩阵所有元素平方和开根号)来量距离:
也就是说,扔掉 之后那些小奇异值,带来的误差恰好就是这些奇异值的平方和再开根号。因为奇异值是从大到小排的,所以扔掉的都是最小的那几个,误差被压到理论最小。这就给"用 SVD 做低秩近似"提供了一个数学上无可挑剔的理由——它不是经验上好用,而是理论上最优。
5.7 几个应用
数据压缩是SVD最经典的应用。你把 里最大的几个奇异值留下来,其余的小奇异值统统扔掉,矩阵 就能被一个低秩的近似给替代,存储量小很多,但还原回来的内容看上去跟原来差不多。这就是为什么图片能被压缩得那么厉害还能看清——背后就是 Eckart–Young 定理保证的"扔掉小奇异值误差最小"。说起来,推荐系统里也常用这一招,把用户和物品之间那张巨大的评分矩阵做SVD,只用几十个主要维度就能还原出大部分偏好,工程上又快又省。
PCA也能用SVD来做,事实上工程上算PCA基本就是上SVD,因为SVD更稳、更快,还顺便把主成分给你算好了——这一点我们到 2.6 节讲 PCA 时会展开说,到时你会发现 PCA 的主成分就是数据矩阵 SVD 里的 。
至于深度学习里的正交初始化,思路就是让权重矩阵一开始接近一个正交矩阵,这样前向传播的时候信号既不会爆炸也不会消失(毕竟正交矩阵只旋转、不改长度),梯度反向传播的时候也稳。这种初始化在训练很深的网络时特别有用,效果很稳健。
6.矩阵的秩:到底有多少有效方向
最后我们聊聊秩,英文叫rank。
秩衡量的是一个矩阵里头到底有多少独立的、互不重复的信息方向。说白了,就是矩阵的列向量(或者行向量)张成的空间有多少维。
举个直观例子。矩阵
它的第二列是第一列的2倍,第二行也是第一行的2倍,两列里其实只有一列是独立的信息,另一列是重复的,所以这个矩阵的秩就是1。再看单位矩阵
它的两列互相独立,秩是2,满秩。
那么秩这个东西在深度学习里有什么用呢?我把它联系到一层的表达力。一个全连接层的权重矩阵,秩越高,它能表达的方向就越丰富、能识别的模式就越多。秩一旦很低,意味着这个矩阵把很多方向都压扁了,能表达的模式就很有限,就像一个只会做一种题型的学生,换套卷子就答不上来了。所以工程上人们有时候会特意给低秩矩阵做补救,比如用残差连接让信号能绕过低秩的那一层,免得表达力被卡死。
低秩矩阵也有它的好处,参数少、算得快。所以现在很多大模型会用低秩微调(也就是LoRA那一套),把一个大的权重更新拆成两个小矩阵的乘积,参数量和计算量都降一大截,省下来的资源相当可观。
回到前面讲的逆,方阵满秩才有逆,这回你应该能从直觉上理解了。满秩意味着这个矩阵没有把任何方向压没,所以操作可逆。秩不满说明有方向被压没了,自然就不可逆,信息丢了就找不回来。
7.收个尾
这一篇我们把范数、单位矩阵、转置、逆、特征值、特征向量、SVD和秩都过完了。你可以这么记:范数管大小,特征值找方向,SVD把任意矩阵拆成三步,秩衡量信息含量。这几个工具在后面的优化、正则化、初始化、降维里会反复出现,到时候你回头再看这篇就不会觉得陌生。
下一篇我们换个口味,去聊概率论和信息论,那里头会有随机变量、期望、方差、高斯分布、KL散度这些概念,它们是理解分类损失和生成模型的关键。
练习
Q1. L1 范数和 L2 范数在深度学习里分别用来干啥?谁能在训练时顺手做特征选择?
L2 范数常用于权重衰减(weight decay),把损失加上一项 ,压着参数别长太大、防过拟合,但它只会把权重整体按比例一起压小,压不到精确的零。L1 范数加进损失后会把很多权重直接压成零,没用的特征权重被清零,相当于自动挑特征,所以做特征选择靠 L1。
Q2. 向量 ,分别算它的 L2 范数和 L1 范数。几何上它俩分别对应哪种"距离"?
L2 范数 ,就是勾股定理那种直线距离(鸟飞过去的距离)。L1 范数 ,对应曼哈顿距离,也就是沿横竖街道一步步走的距离。同一个向量,换把尺子量出来的长短就不一样。
Q3. 特征值分解 只对什么矩阵好使?SVD 凭啥在深度学习里更吃香?
特征值分解只对方阵好使。可深度学习里大多数矩阵不是方阵(比如一层全连接层是 ),想给这种一般形状的矩阵做类似分解就得靠 SVD:任意矩阵 都能拆成 ,几何上对应"旋转、缩放、再旋转"三步,缩放倍数就是奇异值。
Q4.(面试题) 完整说明 SVD 里的右奇异矩阵 为什么就是 的特征向量矩阵,奇异值 和 的特征值 是什么关系。
先看 :它是 的方阵,且 对称,对任意向量 有 ,所以它是对称半正定矩阵,能特征值分解成 ,特征值 。定义奇异值 ,于是 ,这就把 钉死了:SVD 的右奇异矩阵 就是 的特征向量排成的矩阵,奇异值 就是 特征值的平方根()。再用 把 造出来,两边右乘 (注意 )就拼出 。