向量空间与最小二乘
矩阵保留了什么、丢掉了什么,以及做不到时能有多接近
本文译自英文原文 Vector Spaces and Least Squares,如有出入,以英文版为准。
最近重新学习了 Gilbert Strang 的《Introduction to Linear Algebra》第三章和第四章:向量空间与子空间、秩与维数、正交、最小二乘和 QR 分解。我不打算按照教材的顺序逐个介绍这些定义,而是想通过几个简单的例子,弄清楚它们究竟在描述什么。
第三章一开始让我很困惑,我不明白为什么要研究那么多不同的空间。后来在回家的路上,我把那些定义暂时放到一边,只问一个更简单的问题:一个矩阵究竟对空间做了什么?结果发现,这一章的大部分内容并没有看起来那么复杂。
1 一个矩阵对空间做了什么
想象一个三维空间,其中每个向量都有三个坐标,然后对整个空间施加同一个线性变换。如果这个矩阵是满秩的 \(3\times3\) 矩阵,三个独立方向都会被保留下来。向量可能被拉伸、被旋转,但两个不同的输入永远不会变成同一个输出。
现在考虑
\[ A=\begin{bmatrix}1&0&0\\0&1&0\\0&0&0\end{bmatrix}, \qquad A\vec{x}=\begin{bmatrix}x_1\\x_2\\0\end{bmatrix} \]
无论原来的第三个坐标是多少,最终都会变成零。空间中所有的向量都落在了 \(z=0\) 这个平面上:一个独立方向被消除了。所以两个不同的输入,比如
\[ \vec{x}_a=\begin{bmatrix}1\\2\\3\end{bmatrix}, \qquad \vec{x}_b=\begin{bmatrix}1\\2\\100\end{bmatrix}, \]
会得到同一个输出 \(A\vec{x}_a=A\vec{x}_b=(1,2,0)\)。这个变换已经看不出它们在第三个方向上的差异(图 1)。
在上一篇讲矩阵的文章里,我已经用一个不那么整齐的矩阵遇到过这件事。第三章补上的,是这些东西的名字,以及背后的规律。
1.1 零空间
现在反过来想。假设输出是 \(\vec{b}=(1,2,0)\),哪些输入可能产生它?前两个坐标一定是 \(1\) 和 \(2\),第三个坐标却可以是任意值:
\[ \vec{x}=\begin{bmatrix}1\\2\\t\end{bmatrix} =\underbrace{\begin{bmatrix}1\\2\\0\end{bmatrix}}_{\text{一个特解}} +\,t\underbrace{\begin{bmatrix}0\\0\\1\end{bmatrix}}_{\text{被消除的方向}} \]
无论 \(t\) 是多少,\(A\) 都会把第二部分变成零。这就是零空间 \(N(A)\):被变换送到零的那些输入,换句话说,输入中那些变换看不见的变化。要找到产生某个输出的所有输入,只需要找一个特解,再加上零空间里的任意向量:
\[ \vec{x}=\vec{x}_p+\vec{x}_n,\qquad \vec{x}_n\in N(A) \]
这就是 \(A\vec{x}=\vec{b}\) 的完整解。从这个角度看,这件事一点也不意外:变换丢掉了输入的一部分,所以我们无法从输出中知道那一部分原来是什么。
1.2 秩与维数
这里的 \(A\) 恰好消除了一个坐标。一般的矩阵消除的方向可能由几个坐标组合而成,但计数的方式是一样的。秩为 2 的 \(3\times3\) 矩阵,输出只有两个独立方向,同时消除一个输入方向;秩为 1,输出只有一个独立方向,同时消除两个(把 图 1 切换到秩 1)。对于有 \(n\) 列,也就是有 \(n\) 个输入坐标的矩阵,
\[ \operatorname{rank}(A)+\dim N(A)=n \]
在上一篇里,这还是一条我没有学过的旁注。消元说明了它为什么成立:消元之后,\(n\) 列中的每一列要么是主元列,要么是自由列。主元列的个数就是秩,而每个自由列给出零空间里的一个独立方向。
这也让我重新理解了线性无关、基和维数。描述一个空间,我们可能会用很多向量,但向量的个数并不等于独立方向的个数。如果一个向量是其他向量的线性组合,它就没有带来新的方向。一组能够完整描述空间、又没有冗余的向量,就是一组基,其中向量的个数就是维数。
所以在我看来,第三章归结为一个问题:一个线性变换保留了多少独立方向,又消除了多少?从输入端看,我们问哪些不同的输入会得到同一个输出,这就是零空间;从输出端看,我们问这个变换究竟能产生哪些输出,这就是列空间。第三章里的那些子空间,就是用精确的方式描述这两端。
2 当目标无法达到
这就直接来到了第四章。同一个 \(A\) 只能产生第三个坐标为零的输出。假设我们的目标是
\[ \vec{b}=\begin{bmatrix}2\\3\\5\end{bmatrix} \]
没有任何输入能达到它,因为 \(A\) 永远不会输出第三个坐标为 \(5\) 的向量。但如果不要求完全准确,我们可以去找能够达到的、离 \(\vec{b}\) 最近的点。所有输出都在 \(z=0\) 这个平面上,所以只要从 \(\vec{b}\) 向平面作一条垂线,最近的点就是 \(\vec{p}=(2,3,0)\)(图 2)。这就是正交投影。
背后的道理很朴素:并不是每个目标都能被精确达到,但我们仍然可以在可能的范围内找到最好的结果。而当可能的结果构成一个子空间时,最好的那个点有一个特殊的性质:误差 \(\vec{e}=\vec{b}-\vec{p}\) 垂直于整个子空间,而不只是垂直于其中的某一条直线。
还有一个细节。最近点 \(\vec{p}\) 是唯一的,但产生它的输入并不唯一:每一个 \(\vec{x}=(2,3,t)\) 都给出 \(A\vec{x}=\vec{p}\)。这又是零空间,后面会用到它。
3 拟合一条抛物线
这是我在学习第四章时自己想到的一个例子。假设我们想通过一些观测点,找到一个二次函数:
\[ y=ax^2+bx+c \]
点 \((x_i,y_i)\) 是数据,未知数是三个系数 \(a\)、\(b\)、\(c\),我把它们记作 \(\vec{w}=(a,b,c)\)。需要多少个点,才能确定这个函数?
3.1 两个点:无穷多条抛物线
取 \((1,2)\) 和 \((-1,2)\) 两个点:
\[ \begin{cases} a+b+c=2,\\ a-b+c=2. \end{cases} \]
相减得到 \(b=0\),剩下 \(a+c=2\)。所以 \(y=x^2+1\) 经过这两个点,\(y=2x^2\) 也经过,而且每一个 \(a\) 都对应一条这样的抛物线(图 3)。写成矩阵形式:
\[ \begin{bmatrix}1&1&1\\1&-1&1\end{bmatrix} \begin{bmatrix}a\\b\\c\end{bmatrix} =\begin{bmatrix}2\\2\end{bmatrix} \]
这个 \(2\times3\) 矩阵的秩是 2,却有三个未知数,所以还剩一个方向可以自由变化:
\[ \begin{bmatrix}a\\b\\c\end{bmatrix} =\begin{bmatrix}1\\0\\1\end{bmatrix} +t\begin{bmatrix}1\\0\\-1\end{bmatrix} \]
这正是第一节里的 \(\vec{x}_p+\vec{x}_n\)。而零空间的方向 \((1,0,-1)\) 本身也是一个多项式 \(x^2-1\),它在 \(x=1\) 和 \(x=-1\) 处都等于零。加上任意多的它,曲线会变,但在我们观测的两个点上的值不变。当独立条件少于未知参数时,不同的输入会产生相同的观测结果。
3.2 三个点:恰好一条抛物线
现在加上点 \((0,1)\),三个点变成 \((-1,2)\)、\((0,1)\)、\((1,2)\):
\[ \begin{cases} a-b+c=2,\\ c=1,\\ a+b+c=2. \end{cases} \]
于是 \(c=1\),再得到 \(a=1\)、\(b=0\),抛物线是 \(y=x^2+1\)。三个系数现在都确定了。写成矩阵形式:
\[ \underbrace{\begin{bmatrix}1&-1&1\\0&0&1\\1&1&1\end{bmatrix}}_{A} \begin{bmatrix}a\\b\\c\end{bmatrix} =\begin{bmatrix}2\\1\\2\end{bmatrix} \]
可是三个方程、三个未知数,就一定只有一个解吗?不是,这三个方程还必须相互独立。如果有两个点的横坐标相同,矩阵就有两行相同,不可能有三个独立条件。如果三个横坐标互不相同,就没有问题:
\[ A=\begin{bmatrix}x_1^2&x_1&1\\x_2^2&x_2&1\\x_3^2&x_3&1\end{bmatrix}, \qquad \det(A)=(x_1-x_2)(x_1-x_3)(x_2-x_3) \]
三个横坐标互不相同,行列式就不为零,\(A\) 就可逆。所以,三个横坐标互不相同的点,唯一确定一个次数不超过二次的多项式。说「不超过」,是因为求出来的 \(a\) 也可能恰好是零。
和 AI 讨论时,我才知道这个矩阵有一个专门的名字:范德蒙德矩阵(Vandermonde matrix)。以前学线性代数时我见过它,也算过它的行列式,但完全不明白为什么要研究这样一个特殊的矩阵。这次正好反过来:我从一个问题出发,想知道为什么两个点不够而三个点够,把方程写出来,这个矩阵就自己出现了,后来才发现它就是教材里的那个矩阵。它的定义我可能还是会忘,但我想我不会忘记它从哪里来:只要用观测点去确定一个多项式,它就会出现。
3.3 四个点:可能无解
上面三个点已经确定了 \(y=x^2+1\)。如果加上第四个点 \((2,5)\),它恰好也在这条曲线上,所以虽然有四个条件、三个未知数,仍然有精确解。但如果第四个点是 \((2,6)\),它就不符合了,没有任何一组 \(a\)、\(b\)、\(c\) 能同时满足四个方程:
\[ \begin{bmatrix}1&-1&1\\0&0&1\\1&1&1\\4&2&1\end{bmatrix} \begin{bmatrix}a\\b\\c\end{bmatrix} =\begin{bmatrix}2\\1\\2\\6\end{bmatrix} \]
有意思的是,这个 \(4\times3\) 矩阵的秩仍然是 3。第四个点增加了一个条件,却没有增加一个参数。我们现在有四个观测值,但一个二次多项式只有三个可以调整的系数。在四维的观测空间里,二次多项式所能给出的全部预测 \(A\vec{w}\) 构成一个三维子空间,也就是 \(A\) 的列空间。如果观测值 \(\vec{y}\) 在这个子空间里,就有精确解;如果不在,就没有。我们又回到了投影问题。
3.4 五个点,甚至一千个点
如果再加第五个、第六个点,甚至一千个点呢?我们要求的仍然只有三个系数。只要其中至少有三个不同的横坐标,矩阵的秩就仍然是 3。更多的点不会让二次多项式多出第四个参数,只会多出一些我们希望它满足的条件。
现实中的数据有噪声,一般不可能被同一个二次多项式全部满足。与其精确经过三个点而忽略其他点,不如同时考虑所有观测值,让总误差尽可能小。这就是最小二乘:
\[ \min_{a,b,c}\sum_{i=1}^{m}\bigl[y_i-(ax_i^2+bx_i+c)\bigr]^2 \]
这又是上一节的问题:\(A\vec{w}\) 在列空间里变化,我们要找其中离 \(\vec{y}\) 最近的点。所以误差必须垂直于列空间,也就是垂直于 \(A\) 的每一列。用转置写出来就是 \(A^T(\vec{y}-A\hat{\vec{w}})=\vec{0}\)。这说明误差落在 \(A^T\) 的零空间里,也就是左零空间 \(N(A^T)\),第三章里的另一个子空间:它恰好由所有垂直于列空间的向量组成。整理一下,就是
\[ A^TA\hat{\vec{w}}=A^T\vec{y} \]
这就是正规方程,一个方程个数和系数个数相同的方阵方程组。如果 \(A\) 列满秩,\(A^TA\) 就可逆,最小二乘的系数就是唯一的,即使曲线无法经过每一个点。如果不是列满秩,就回到了上面那个细节:最近的点仍然唯一,但系数不唯一。
对于第四个点是 \((2,6)\) 的情况,解是 \(y=1.25x^2+0.05x+0.85\)(图 4)。精确经过前三个点的曲线,在第四个点差了 \(1\);最小二乘在每个点的误差都不超过 \(0.15\),误差平方和是 \(0.05\),而不是 \(1\)。
3.5 更高次的多项式,以及为什么只拟合直线
同样的道理可以推广到更高次。三次多项式 \(y=ax^3+bx^2+cx+d\) 有四个系数,所以四个横坐标互不相同的点唯一确定一个次数不超过三的多项式。一般地,\(y=a_nx^n+\cdots+a_1x+a_0\) 有 \(n+1\) 个系数,\(n+1\) 个横坐标互不相同的点唯一确定一个次数不超过 \(n\) 的多项式。点比这更多、又没有一个多项式能经过全部的点时,就用最小二乘。
这时我意识到一件事。我一直以为最小二乘就是拟合一条直线,但其实完全没有这个要求。一个点被观测之后,\(x\)、\(x^2\)、\(x^3\) 都只是已知的数。未知的是系数,而问题对系数仍然是线性的:
\[ \begin{bmatrix} x_1^3&x_1^2&x_1&1\\ x_2^3&x_2^2&x_2&1\\ \vdots&\vdots&\vdots&\vdots\\ x_m^3&x_m^2&x_m&1 \end{bmatrix} \begin{bmatrix}a\\b\\c\\d\end{bmatrix} \approx \begin{bmatrix}y_1\\y_2\\\vdots\\y_m\end{bmatrix} \]
所用的函数甚至不必是多项式。只要是已知函数乘以未知系数再相加,都可以用同样的方法。
所以,我对最小二乘的理解最后很简单:先选一种描述数据的方式,再找最合适的参数,让它的预测尽可能接近真实的观测。
4 Gram–Schmidt 与 QR:同一个空间,更好的基
第四章最后介绍了 Gram–Schmidt 和 QR 分解。我觉得核心其实很简单。取
\[ \vec{v}_1=\begin{bmatrix}1\\2\end{bmatrix}, \qquad \vec{v}_2=\begin{bmatrix}2\\1\end{bmatrix} \]
它们线性无关,所以张成整个平面,但它们并不互相垂直。它们只是这个平面的一组基,那为什么不换一组,比如 \(\vec{e}_1=(1,0)\) 和 \(\vec{e}_2=(0,1)\)?它们张成同一个平面,而且是标准正交的。我们改变的是描述空间的方式,而不是空间本身。
标准正交基的方便之处在于分量互不混杂:一个向量在某个方向上的分量,不会混入其他方向的成分,而且只要算一个点积。这让投影以及很多矩阵计算都变得更简单。
Gram–Schmidt 是系统地构造标准正交基的方法。从第一个向量开始,对后面的每个向量,减去它在已有方向上的投影,留下新的方向,再归一化。对这两个向量(图 5),
\[ \vec{q}_1=\frac{1}{\sqrt5}\begin{bmatrix}1\\2\end{bmatrix}, \qquad \vec{q}_2=\frac{1}{\sqrt5}\begin{bmatrix}2\\-1\end{bmatrix} \]
我最初的问题是:既然可以直接选 \(\vec{e}_1\) 和 \(\vec{e}_2\),为什么还需要 Gram–Schmidt?答案是,标准基在这里能用,只是因为 \(\vec{v}_1\) 和 \(\vec{v}_2\) 张成了整个平面。在拟合抛物线的例子里,\(4\times3\) 矩阵的三列张成的是四维空间中的一个三维子空间,没有一个标准基向量落在里面。我们只能用手上已有的向量,为这个子空间构造一组标准正交基,这正是 Gram–Schmidt 做的事。它还保持了顺序:前 \(k\) 个新方向张成的空间,和前 \(k\) 个原始向量张成的空间相同。
QR 分解记录了原始向量和新方向之间的关系:
\[ A=QR \]
\(Q\) 的列是新的标准正交方向,\(R\) 记录了如何用它们组合出原始向量。\(R\) 是上三角矩阵,正是因为那个顺序:第 \(k\) 个原始向量只需要前 \(k\) 个方向。对我们的两个向量,
\[ \begin{bmatrix}1&2\\2&1\end{bmatrix} =\underbrace{\frac{1}{\sqrt5}\begin{bmatrix}1&2\\2&-1\end{bmatrix}}_{Q} \underbrace{\begin{bmatrix}\sqrt5&4/\sqrt5\\0&3/\sqrt5\end{bmatrix}}_{R} \]
当 \(A\) 列满秩时,\(R\) 可逆,因为原来的独立方向一个都没有丢。这在最小二乘里很有用。因为 \(Q^TQ=I\),把 \(A=QR\) 代入正规方程,\(A^TA\hat{\vec{w}}=A^T\vec{y}\) 就变成
\[ R\hat{\vec{w}}=Q^T\vec{y} \]
一个三角方程组,用回代就能解,就像上一篇里 LU 给出的三角方程组一样。
所以我对这部分最直接的理解是:如果空间本身没有变,我们完全可以换一种更方便的方式来描述它。问题还是同一个问题,换一种描述,计算量却可能完全不同。
5 维度、信息与大模型
学习第三章时,我还有一些超出教材的想法。这些话题我都还没有学过,下面是我当时的想法,以及和 AI 讨论时它告诉我的东西。
我的出发点是线性无关。如果一个矩阵因为消除了某个独立方向而分不清某些输入,那能不能增加一个新的独立方向,让它们重新变得可以区分?AI 指出这里有两种不同的情况。如果我们得到了真正新的信息,比如一个新的测量,那确实可能区分开;但如果信息已经在某个变换中丢失了,事后再把输出映射到更高的维度,也不能把它找回来。
这又让我想到另一个问题:如果信息没有丢失,只是表示方式不合适,那升到更高的维度,能不能让难的问题变简单?AI 举的例子是,平面上两组无法用直线分开的点,经过适当的非线性映射到三维之后,可能就能用一个平面分开。这并没有增加信息,却让问题变容易了(图 6)。上面拟合抛物线的例子就是同一件事的一个小版本:\(x\) 只是一个数,但把它映射成 \((x^2,x,1)\),拟合曲线就变成了一个线性问题。
5.1 参数越多,模型就越聪明吗?
大模型的能力和参数规模有一定关系。我的想法是,能力的提升也许来自能在更高的维度中表示信息;也许还存在某个维度或容量上的临界点,超过它之后,继续扩大规模就不如更好地利用已有的参数重要。AI 指出,参数量、表示维度和模型容量是不同的概念:一个有一万亿参数的模型,并不是在一万亿维的空间中表示每个输入,而且更多的参数也不必然意味着更强的智能。
由此我想到一个思想实验。两个模型架构相同、参数量相同,如果 A 的参数全是零,B 是正常训练过的,它们的能力显然天差地别。即使两个都训练过,也会因为训练数据、训练方法和参数取值不同而差别很大。那么,能力究竟是怎样存在于参数之中的?模型是在记忆知识,还是学会了更一般的规律?能不能通过更好的训练和推理,在不增加参数的情况下让模型显著变强?AI 说,有效表示、参数空间中的低维结构、训练和推理计算如何影响能力,都是活跃的研究方向,但目前还没有一个被普遍接受的、用维度或参数量来定义智能的公式。
5.2 一个模型能发现相对论吗?
另一个思想实验。假设我们只用 1905 年以前物理学家知道的东西训练一个模型:当时的力学、电磁学、数学工具和实验结果,但不包括狭义相对论。如果给它足够的时间去思考光速不变和相对性原理,它能不能自己推导出这个理论?现在的模型可以解释相对论,也能重新推导相关公式,但这和在不知道答案的情况下发现它,是完全不同的两件事。
比较两个参数量相同的模型:A 只见过相对论之前的科学,B 见过现代科学。如果 B 能轻松推导出相对论而 A 不能,差别在哪里?是 B 记住了更多,是它的推理更一般,还是 A 其实已经有了所需的知识,只是缺少组织知识、搜索假设和检验假设的方法?AI 给了我一个很重要的区分:知道一个人类已经发现的理论,不等于有能力发现它。要检验发现的能力,就要让模型面对它没有见过答案的问题,提出假设,推导结论,再加以检验:在数学里靠证明,在自然科学里靠实验和观测。
人类的很多发现经历了几十年的观察、猜想、计算、失败和修正。如果 AI 能把这些过程大大加快,一百年的发现能不能在十天里完成?我感兴趣的「涌现」是这个意义上的:不是模型在某个测试上突然得分更高,而是它能提出此前没有人发现的、正确的规律。AI 告诉我,这方面已经有一些尝试,比如生成大量候选假设,用证明、程序测试或实验来筛选,再不断改进。但这并不意味着模型已经能稳定地发现重大理论,而且发现不仅受推理速度的限制,也受实验条件、新数据和验证成本的限制。
回头看,我一开始联想到的其实是几个不同的问题。信息是否在变换中丢失,是一个问题;如果没有丢失,能否高效地算回去,是另一个问题;更好的表示能否让问题变简单,是第三个问题;而这些能力能否带来新的科学规律,则要难得多。我仍然觉得它们之间有联系,但其中最重要的几个问题,我现在还回答不了:
- 模型的推理能力,是怎样体现在它的参数和计算过程中的?
- 是否存在某种与智能相关的有效维度或容量门槛?
- 改变知识的表示和组织方式,能否显著提高模型发现新规律的能力?
- 怎样区分一个模型是在重现训练过的知识,还是在做出真正的发现?
这些是我以后学习 Transformer 和 LLM 时想继续思考的问题。
6 回头看
这两章里,我最喜欢的不是某个公式或定理,而是重新理解它们的过程。第三章一开始看上去是一堆关于空间、维数和基的定义;想象一个简单的矩阵对三维空间做了什么之后,大部分定义都变成了同一个问题:一个变换保留了什么信息,又丢掉了什么。第四章里,我最初只是想知道为什么两个点不能确定一个二次函数,而三个点可以。沿着这个问题走下去,我重新遇到了秩、零空间、可逆性、范德蒙德矩阵和最小二乘。这些都在教材里,但从自己的问题出发重新遇到它们,感觉完全不一样。
这并不是说推导和证明不重要,它们告诉我们一个结论为什么成立、在什么条件下成立。但经过这些思考之后,我希望留在脑子里的不只是公式,而是一种能自然调用的直觉。如果一个复杂的概念,最后能被我用几句话、一个简单的例子或者一个自然的画面讲清楚,我才觉得自己真正开始理解它了。而当这些理解能和其他领域联系起来时,学习本身也会变得更有意思。