把矩阵看作变换
从向量的组合到秩,以及矩阵会丢掉什么
本文译自英文原文 Matrices as Transformations,如有出入,以英文版为准。
1 从向量的组合到矩阵
前面我们讨论了向量的一些基本概念和运算。现在,我们从三个向量开始:
\[ \vec{u}= \begin{bmatrix}1\\-1\\0\end{bmatrix}, \quad \vec{v}= \begin{bmatrix}0\\1\\-1\end{bmatrix}, \quad \vec{w}= \begin{bmatrix}0\\0\\1\end{bmatrix} \]
假设我们分别用 \(x_1\)、\(x_2\)、\(x_3\) 去缩放这三个向量,再把它们加起来:
\[ \begin{aligned} x_1\vec{u}+x_2\vec{v}+x_3\vec{w} &= x_1\begin{bmatrix}1\\-1\\0\end{bmatrix} +x_2\begin{bmatrix}0\\1\\-1\end{bmatrix} +x_3\begin{bmatrix}0\\0\\1\end{bmatrix}\\ &= \begin{bmatrix} x_1\\ x_2-x_1\\ x_3-x_2 \end{bmatrix} \end{aligned} \]
这很好理解。我们有三个向量,可以用不同的数去乘它们,把它们拉长、缩短,甚至反向。最后把它们加起来,得到一个新的向量(图 1)。
但我们可以把这个式子写得更简洁:
\[ \underbrace{ \begin{bmatrix} 1&0&0\\ -1&1&0\\ 0&-1&1 \end{bmatrix}}_A \underbrace{ \begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}}_{\vec{x}} = \underbrace{ \begin{bmatrix} x_1\\ x_2-x_1\\ x_3-x_2 \end{bmatrix}}_{\vec{b}} \]
或者干脆写成:
\[ A\vec{x}=\vec{b} \]
这个式子虽然看起来更简单,但我觉得它带来了一个非常有意思的视角转换。
之前,\(x_1\)、\(x_2\)、\(x_3\) 只是用来缩放向量的三个系数。现在,我们把这三个数合成了一个新的向量 \(\vec{x}\)。
从这个角度看,矩阵 \(A\) 对输入向量 \(\vec{x}\) 做了一次线性变换。之所以叫“线性”,是因为它和向量的两种基本运算相容:\(A(\vec{x}+\vec{y})=A\vec{x}+A\vec{y}\),\(A(c\vec{x})=cA\vec{x}\)。先对输入做加法或数乘再变换,和先变换再做加法或数乘,结果一样。
我们可以直接观察这个变换:
\[ \begin{aligned} x_1&\longrightarrow x_1\\ x_2&\longrightarrow x_2-x_1\\ x_3&\longrightarrow x_3-x_2 \end{aligned} \]
也就是说,原来的向量 \((x_1,x_2,x_3)\) 被变换成了另一个向量。图 2 展示了整个空间同时被变换的过程。
对于任意给定的输入 \(\vec{x}\),我们都可以作用矩阵 \(A\),得到对应的输出 \(\vec{b}\)。
其实,这两种视角描述的是完全相同的数学运算。
一种视角把矩阵与向量的乘法看作矩阵各列的线性组合,另一种把它看作作用在输入向量上的线性变换。
\(A\vec{x}\) 还有第三种读法,也是我们手算时通常用的方法:\(\vec{b}\) 的每一个分量,都是 \(A\) 的某一行与 \(\vec{x}\) 的点积。\(A\) 的第二行是 \((-1,1,0)\),而 \((-1,1,0)\cdot(x_1,x_2,x_3)=x_2-x_1\),正好是 \(\vec{b}\) 的第二个分量。所以,上一篇里的点积其实藏在每一次矩阵乘法里。
正是从这里,我开始从几何的角度理解矩阵:矩阵不只是一堆数,它还可以表示空间中的一个线性变换。
2 把矩阵看作线性变换
如果矩阵表示一个线性变换,就会自然地产生一个问题:作用这个变换之后,空间里的向量到底发生了什么?
我们不只看一个向量,而是看一整组向量。
假设输入向量 \(\vec{x}\) 可以取三维空间中的任意值。作用矩阵 \(A\) 之后,这些向量会构成一个什么样的集合?
或者把问题问得更具体一些。
假设所有输入向量都限制在三维单位球内:
\[ x_1^2+x_2^2+x_3^2\leq1 \]
经过一次线性变换,这个球会变成什么?
它会被拉伸成一个椭球吗?会被压到一个二维平面上,变成一个椭圆盘吗?甚至会坍缩成一条线段或一个点吗?
这些都有可能。1 图 3 在低一维的情形下展示了同样的想法:球变成了圆盘,它的像可以是一个椭圆、一条线段,或者一个点。
1 线性变换能产生什么形状? 我一开始的想法是,线性变换几乎可以把一个球变成任意形状,比如立方体或长方体。和 AI 一起探索时,它指出这是做不到的:球在线性变换下只能变成椭球,或者椭球的某种退化形式,比如椭圆盘、线段或一个点。要把球变成立方体,需要非线性变换。为什么会有这个限制,我还没有研究过,留到以后。
我觉得这个视角特别有意思。我们不再只研究一个向量怎么变化,而是研究一整组向量是怎样被变换的。
从这个角度看,矩阵可以描述各种线性变换,比如拉伸、压缩、旋转、反射和投影。
我们还可以研究在这些变换中,哪些性质被保留了下来,比如向量的长度、向量之间的夹角,以及变换后空间的维数。
2.1 线性变换的几个例子
先看一个简单的例子:单位矩阵。
\[ I= \begin{bmatrix} 1&0&0\\ 0&1&0\\ 0&0&1 \end{bmatrix} \]
对任意向量:
\[ I\vec{x}=\vec{x} \]
它不改变输入向量的任何坐标。原来的向量是什么,变换之后还是什么。
再看另外两个矩阵:
\[ P_1= \begin{bmatrix} 1&0&0\\ 0&0&0\\ 0&0&0 \end{bmatrix} \]
\[ P_2= \begin{bmatrix} 1&0&0\\ 0&1&0\\ 0&0&0 \end{bmatrix} \]
它们的变换是:
\[ P_1 \begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} = \begin{bmatrix}x_1\\0\\0\end{bmatrix} \]
\[ P_2 \begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} = \begin{bmatrix}x_1\\x_2\\0\end{bmatrix} \]
图 4 展示了这些矩阵对单位球做了什么。
第一个矩阵只保留 \(x_1\) 坐标,去掉了另外两个坐标。
如果原来的输入集合是一个三维的球,变换后的集合会完全落在 \(x_1\) 轴上,成为一条线段。
第二个矩阵保留 \(x_1\) 和 \(x_2\),去掉了 \(x_3\)。
同一个三维的球会变成 \(x_1x_2\) 平面上的一个圆盘。
换句话说,这些矩阵降低了原集合的维数,丢掉了一部分信息。
如果我们修改矩阵的某些元素,比如把 \(P_2\) 的一个非零对角元从 1 改成 2,得到的圆盘就会变成椭圆盘(图 4 中的第四个例子)。
如果一个矩阵保留全部三个坐标,只是按不同的比例缩放它们,又会怎样?例如:
\[ S= \begin{bmatrix} 1.5&0&0\\ 0&1&0\\ 0&0&0.5 \end{bmatrix} \]
它的变换是:
\[ S \begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} = \begin{bmatrix}1.5x_1\\x_2\\0.5x_3\end{bmatrix} \]
在 图 4 中选 \(S\):球沿 \(x_1\) 轴被拉长、沿 \(x_3\) 轴被压扁,变成一个椭球。和 \(P_1\)、\(P_2\) 不同,\(S\) 没有去掉任何坐标,所以结果仍然是三维的,也没有丢失信息。
再看另一个矩阵:
\[ R= \begin{bmatrix} 1&0&0\\ 0&0&-1\\ 0&1&0 \end{bmatrix} \]
它做的变换是:
\[ R\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} = \begin{bmatrix}x_1\\-x_3\\x_2\end{bmatrix} \]
这个变换有一个有意思的性质。
它不改变向量的长度:
\[ \begin{aligned} \|R\vec{x}\|^2 &=x_1^2+(-x_3)^2+x_2^2\\ &=x_1^2+x_2^2+x_3^2\\ &=\|\vec{x}\|^2 \end{aligned} \]
从几何上看,这个矩阵表示绕 \(x_1\) 轴旋转 \(90^\circ\)。在 图 4 中选 \(R\):球看起来没变,但箭头显示它已经转过去了。
我们还可以算出它的行列式:2
2 行列式、旋转与缩放。 一开始我以为,所有行列式为 1 的矩阵都表示旋转。AI 指出并不是这样。行列式描述的是有向面积或体积的缩放倍数,而不是向量长度的缩放倍数。保持所有向量长度不变的条件是 \[ A^TA=I \] 满足这个条件的矩阵叫作正交矩阵。AI 还告诉我,把一个矩阵拆成旋转、反射以及沿不同方向的缩放,和奇异值分解(SVD) \(A=U\Sigma V^T\) 有关。这些我都还没有学过,先留在这里,以后再探索。
\[ \det(R)=1 \]
2.2 关于神经网络和计算的一点想法
把矩阵理解为线性变换,也让我想到了神经网络。
如果暂时忽略非线性的部分,神经网络中的很多计算都可以理解为:用大量参数对输入数据依次施加一系列线性变换。
当然,真正的神经网络要复杂得多。我们暂时忽略了偏置项、激活函数和许多其他结构。
但从这个高度简化的视角,我们可以想象一个输入经过一连串矩阵运算,产生新的表示,最后得到输出。
不过,这个简化里有一个陷阱。接连作用几个矩阵,本身也只是一个矩阵:\(W_3(W_2(W_1\vec{x}))=(W_3W_2W_1)\vec{x}\)。3没有非线性的部分,一百层能做到的事,一层也能做到,而且它们仍然只能把球变成椭球。层与层之间的非线性激活函数,才让网络能把空间弯成更复杂的形状,这和注 1 里把球变成立方体的问题是同一个问题。4
3 变换是唯一的吗? 有一天下楼的时候,我想到一个问题。假设一个线性变换把 \(\vec{a}\) 变成 \(\vec{b}\),它可能是一个矩阵 \(A\),也可能是几个矩阵 \(B\)、\(C\)、\(D\),那么 \(BCD=A\)。我最初的想法是:如果 \(A\) 可逆,这个变换就一定是唯一的;如果 \(A\) 不可逆,它就不一定唯一。AI 指出我把两个问题混在了一起。单独一对 \(\vec{a}\)、\(\vec{b}\) 永远确定不了一个矩阵:\(A\) 有 \(n^2\) 个未知数,而 \(A\vec{a}=\vec{b}\) 只给出 \(n\) 个方程。要确定 \(A\),需要很多对数据。把输入作为 \(X\) 的列、输出作为 \(Y\) 的列,那么当且仅当 \(X\) 的秩为 \(n\) 时,\(AX=Y\) 才有唯一解。所以需要可逆的是数据,而不是 \(A\)。而且即使 \(A\) 唯一,它的分解也不唯一,因为对任意可逆矩阵 \(M\),都有 \(BCD=(BM)(M^{-1}C)D\)。
4 把训练看作寻找变换。 接着我想到,神经网络做的是同样的事,只不过用的是线性加非线性的变换,所以训练就是在寻找这样一个变换。我原以为全连接网络不管参数多大都只是线性变换,后来的网络加了一些非线性但效果一般,而 Transformer 成功是因为它的非线性让拟合程度大大提高。AI 指出,带激活函数的全连接网络本身就是非线性的;有一个叫万能逼近定理的结果说,这样的网络只要足够宽,就能在有界区域上逼近任何连续函数。它还告诉我,训练数据上的拟合程度不是正确的衡量标准,因为一张查找表就能完美拟合;真正重要的是泛化能力,也就是网络在从没见过的输入上表现如何。它还告诉我,Transformer 主要改变了两点:它的注意力机制根据输入本身算出混合矩阵;它能在长序列上并行训练,这让巨大的规模成为可能。AI 也补充说,这只是常见的解释,并没有被证明:这些模型为什么泛化得这么好,目前还没有被很好地理解,而且在相近的规模下,一些其他结构的效果也相差不远。
所以按我现在的理解,问题是这样的:给定海量的数据对 \((\vec{a}_i,\vec{b}_i)\),选定一个函数族,在其中寻找一个 \(f\),让输出 \(f(\vec{a}_i)\) 接近 \(\vec{b}_i\),并且这种效果能推广到新的输入上。这些我都还没有学过,先记在这里。
这也让我想到,为什么 GPU 特别适合做这些计算。
矩阵乘法包含大量可以并行执行的乘加运算,而 GPU 正是为高效地进行大规模并行计算而设计的。5
5 关于物理矩阵乘法器的一个想法。 我还有一个有意思的想法:如果某些物理规律天然就在做加法或线性叠加,我们能不能造一个直接做矩阵乘法的物理装置,而不完全依赖传统的数字逻辑电路?比如,能不能利用电流、电压、光,或者材料的某些物理性质,通过物理过程来完成计算?
后来我了解到,相关的方法已经存在,比如模拟计算、光计算和忆阻器交叉阵列架构。在忆阻器交叉阵列里,这个想法几乎是字面意义上的:每个交叉点存储一个电导 \(G\),欧姆定律 \(I=GV\) 完成乘法,基尔霍夫电流定律把流进每根导线的电流加起来。
不过,即使某些物理操作可以大规模并行地完成,也不意味着任意规模的矩阵乘法都能达到 \(O(1)\) 复杂度。硬件规模、输入输出的开销、数值精度和数据搬运仍然很重要。
这个想法有点偏离本文的主题,所以以后可能单独探索。
3 从正向变换到逆问题
现在回到最初的方程:
\[ A\vec{x}=\vec{b} \]
到目前为止,我们都假设 \(\vec{x}\) 已知,任务是算出 \(\vec{b}\)。
我们已经讨论了两种视角。
第一种是:已知三个向量 \(\vec{u}\)、\(\vec{v}\)、\(\vec{w}\) 和三个系数 \(x_1\)、\(x_2\)、\(x_3\),计算它们的线性组合。
第二种是:已知输入向量 \(\vec{x}\),对它施加矩阵 \(A\) 所表示的线性变换,得到输出向量 \(\vec{b}\)。
这两种视角虽然不同,得到的结果却完全一样。
现在,我们把问题反过来。
假设矩阵 \(A\) 已知,输出向量 \(\vec{b}\) 也已知。我们能还原出原来的输入向量 \(\vec{x}\) 吗?
从线性组合的角度,我们问的是:
应该怎样组合 \(\vec{u}\)、\(\vec{v}\)、\(\vec{w}\),才能得到一个指定的向量 \(\vec{b}\)?
从线性变换的角度,我们问的是:
如果知道变换和它的输出,能不能还原出原来的输入?
对于可逆矩阵,我们可以写成:
\[ \vec{x}=A^{-1}\vec{b} \]
但 \(A^{-1}\) 到底是什么?
回到前面的例子:
\[ \begin{bmatrix} 1&0&0\\ -1&1&0\\ 0&-1&1 \end{bmatrix} \begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} = \begin{bmatrix}b_1\\b_2\\b_3\end{bmatrix} \]
可以把它展开成一个方程组:
\[ \begin{cases} x_1=b_1\\ x_2-x_1=b_2\\ x_3-x_2=b_3 \end{cases} \]
然后解出原来的变量:
\[ \begin{cases} x_1=b_1\\ x_2=b_1+b_2\\ x_3=b_1+b_2+b_3 \end{cases} \]
再把这些方程写成矩阵形式:
\[ \begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} = \underbrace{ \begin{bmatrix} 1&0&0\\ 1&1&0\\ 1&1&1 \end{bmatrix}}_{A^{-1}} \begin{bmatrix}b_1\\b_2\\b_3\end{bmatrix} \]
所以逆矩阵是:6
6 看看这两个矩阵各自做了什么。\(A\) 求相邻分量的差,\(A^{-1}\) 求累加和:\(x_3=b_1+b_2+b_3\)。求和抵消了求差,就像积分抵消了求导,这一对矩阵就是它的一个小小的离散版本。
\[ A^{-1}= \begin{bmatrix} 1&0&0\\ 1&1&0\\ 1&1&1 \end{bmatrix} \]
这意味着,对于任意给定的输出向量 \(\vec{b}\),我们都能找到唯一一个对应的输入向量 \(\vec{x}\)。
所以,矩阵 \(A\) 是可逆的。
但是,是不是每个矩阵都有这个性质?
4 线性相关与线性无关
我们把原来的矩阵稍微改一下。
保持 \(\vec{u}\) 和 \(\vec{v}\) 不变,把第三个向量换成:
\[ \vec{w}^*= \begin{bmatrix}-1\\0\\1\end{bmatrix} \]
现在得到一个新的矩阵:
\[ C= \begin{bmatrix} 1&0&-1\\ -1&1&0\\ 0&-1&1 \end{bmatrix} \]
变换变成了:
\[ C\vec{x}= \begin{bmatrix} x_1-x_3\\ x_2-x_1\\ x_3-x_2 \end{bmatrix} = \begin{bmatrix}b_1\\b_2\\b_3\end{bmatrix} \]
我们试着解这个方程:
\[ \begin{cases} x_1-x_3=b_1\\ x_2-x_1=b_2\\ x_3-x_2=b_3 \end{cases} \]
如果把三个方程加起来,有意思的事情发生了。
所有 \(x\) 项都抵消了:
\[ 0=b_1+b_2+b_3 \]
因此:
\[ b_1+b_2+b_3=0 \]
这意味着什么?
首先,无论选择什么输入向量 \(\vec{x}\),变换的输出都必须满足这个条件。
从几何上看,满足这个方程的所有向量都落在三维空间中的一个平面上:
\[ b_1+b_2+b_3=0 \]
换句话说,虽然原来的输入向量可以充满整个三维空间,但作用 \(C\) 之后,它们的输出被限制在一个二维平面上(图 5)。
我们丢掉了一个维度。
4.1 丢掉的那个维度去哪了?
考虑一个特殊情况:
\[ \vec{b}= \begin{bmatrix}0\\0\\0\end{bmatrix} \]
方程变成:
\[ \begin{cases} x_1-x_3=0\\ x_2-x_1=0\\ x_3-x_2=0 \end{cases} \]
因此:
\[ x_1=x_2=x_3=c \]
其中 \(c\) 可以是任意实数。
这意味着,所有形如
\[ \vec{x}= c\begin{bmatrix}1\\1\\1\end{bmatrix} \]
的向量,都会被变换成零向量:
\[ C\begin{bmatrix}c\\c\\c\end{bmatrix} = \begin{bmatrix}0\\0\\0\end{bmatrix} \]
从几何上看,这些向量都落在一条经过原点、方向为 \((1,1,1)\) 的直线上。
整条直线被压缩成了一个点:原点。
这是不是意味着,沿这个方向的所有信息都被抹掉了?
其实,还有更有意思的事情。
对任意输入向量 \(\vec{x}\),假设我们沿 \((1,1,1)\) 方向加上任意的量:
\[ \vec{x}'= \vec{x} +c\begin{bmatrix}1\\1\\1\end{bmatrix} \]
那么:
\[ C\vec{x}'=C\vec{x} \]
即使两个输入向量不同,它们的输出也完全一样。
矩阵 \(C\) 已经无法区分这些输入了。这也是为什么在 图 5 中,27 个不同的输入只得到 19 个不同的输出。
这给了信息丢失一个几何上的解释:不同的输入被映射到同一个输出,所以原来的输入再也无法被唯一地还原。
在这个例子里,三维的输入空间被映射到了一个二维的输出平面上。
7 丢掉的方向与输出平面。 我原以为被抹掉的方向总是垂直于输出平面。AI 指出一般并非如此:矩阵的零空间和像空间不一定互相垂直,这里只是恰好如此。我还不明白其中的原因,留到以后。
4.2 看看矩阵的列
现在回到矩阵 \(C\) 本身。
它的三个列向量是:
\[ \vec{u}= \begin{bmatrix}1\\-1\\0\end{bmatrix}, \quad \vec{v}= \begin{bmatrix}0\\1\\-1\end{bmatrix}, \quad \vec{w}^*= \begin{bmatrix}-1\\0\\1\end{bmatrix} \]
我们马上可以注意到:
\[ \vec{u}+\vec{v}+\vec{w}^*=\vec{0} \]
或者:
\[ \vec{w}^*=-\vec{u}-\vec{v} \]
第三个向量可以表示成前两个向量的线性组合。
这意味着,虽然我们有三个向量,但只有两个独立的方向。
前两个向量已经张成了一个二维平面,而第三个向量恰好落在同一个平面上(图 6)。
因此,无论怎样缩放和组合这三个向量,我们都只能得到这个平面上的向量,得不到平面外的任何向量。
这就是线性相关。
相比之下,最初的三个向量 \(\vec{u}\)、\(\vec{v}\)、\(\vec{w}\) 是线性无关的(把 图 6 切换到 \(A\))。
在那个例子里,第三个向量不在前两个向量张成的平面上,它引入了一个新的独立方向。
这三个向量合在一起,可以张成整个三维空间。
但在矩阵 \(C\) 中,第三个向量没有提供新的独立方向。
结果,它的各列只能张成一个二维平面。
5 秩与维数
从前面的例子,我们可以开始理解一个非常重要的概念:秩。
对于一个矩阵,我们可以问:它的列向量张成了多少维?
考虑最初的矩阵:
\[ A= \begin{bmatrix} 1&0&0\\ -1&1&0\\ 0&-1&1 \end{bmatrix} \]
它的三个列向量线性无关,张成了整个三维空间。
因此:
\[ \operatorname{rank}(A)=3 \]
再考虑修改后的矩阵:
\[ C= \begin{bmatrix} 1&0&-1\\ -1&1&0\\ 0&-1&1 \end{bmatrix} \]
它的三个列向量线性相关,只张成了一个二维平面。
因此:
\[ \operatorname{rank}(C)=2 \]
从线性变换的角度看,秩告诉我们输出空间里有多少个独立方向,也就是变换所能到达的空间的维数。
对于从三维空间到三维空间的变换:
- 秩为 3,意味着输出可以充满整个三维空间。
- 秩为 2,意味着输出被限制在一个二维平面上。
- 秩为 1,意味着输出落在一条直线上。
- 秩为 0,意味着每个输入都被变换成零向量。
所以,我们可以把秩看作线性变换的输出中保留下来的独立维数。
当然,这里说的是整个输出空间的维数,而不是表示单个向量所用的坐标个数。8
8 秩–零化度定理。 AI 告诉我,我们在 \(C\) 上看到的现象,即二维的输出加上一个被抹掉的输入方向,是一个一般定理的特例: \[ \operatorname{rank}(A)+\operatorname{nullity}(A)=n \] 其中 \(n\) 是输入空间的维数,零化度是被映射为零的那些输入所构成的子空间的维数。这个定理我还没有学。
6 秩、线性相关与可逆性
现在,我们可以把几个起初看起来毫不相干的概念联系起来了。
对于最初的矩阵 \(A\),三个列向量线性无关。它的秩是 3,各列张成了整个三维空间。
因此,对于任意给定的 \(\vec{b}\),都有且只有一个解:
\[ \vec{x}=A^{-1}\vec{b} \]
这意味着 \(A\) 是可逆的。
但矩阵 \(C\) 的情况不一样。
它的三个列向量线性相关,秩只有 2。
于是,我们会遇到两种可能的情况。
第一种情况:无解。
如果给定的输出向量 \(\vec{b}\) 不满足
\[ b_1+b_2+b_3=0 \]
它就不在三个列向量张成的平面上。
无论怎样选择 \(x_1\)、\(x_2\)、\(x_3\),它们的线性组合都得不到这个向量。
因此,方程无解。
第二种情况:无穷多个解。
如果给定的输出向量 \(\vec{b}\) 落在这个平面上,我们就能找到一个对应的输入。
但是,因为三个列向量线性相关,第三个向量可以表示成前两个的组合。
这意味着,同一个输出可以由无穷多种不同的系数组合得到。
例如,对任意满足 \(b_1+b_2+b_3=0\) 的 \(\vec{b}\),我们可以取:
\[ \begin{aligned} x_1&=t\\ x_2&=t+b_2\\ x_3&=t-b_1 \end{aligned} \]
其中 \(t\) 可以是任意实数。
改变 \(t\),就得到无穷多个不同的输入向量 \(\vec{x}\),它们产生完全相同的输出 \(\vec{b}\)。
这些解有一个熟悉的形状。写成向量,
\[ \vec{x}= \begin{bmatrix}0\\b_2\\-b_1\end{bmatrix} +t\begin{bmatrix}1\\1\\1\end{bmatrix}, \]
它们是一个特解,加上 \(C\) 映射为零的那条直线上的任意一点,也就是前面找到的那条直线。所有的解彼此之间只在被抹掉的方向上有差别。图 7 把两种情况放在了同一幅图里。
这就解释了为什么矩阵 \(C\) 不可逆。
一个维度的信息丢失了。即使知道输出,我们也无法唯一地确定原来的输入。
从这个角度看,线性相关、秩和可逆性是紧密相连的。它们描述的是同一个根本问题的不同侧面。
线性相关告诉我们,矩阵的列向量里是否包含多余的方向。
秩告诉我们,这些列向量能张成多少维。
可逆性告诉我们,能否从变换的输出唯一地还原出原来的输入。
对于一个 \(3\times3\) 矩阵,如果它的三个列向量线性无关,那么它的秩是 3,矩阵可逆。
如果三个列向量线性相关,那么它的秩小于 3,矩阵不可逆。
我们还可以用行列式来判断一个方阵是否可逆:
\[ \det(A)\neq0 \quad\Longleftrightarrow\quad A\text{ 可逆} \]
如果
\[ \det(A)=0 \]
那么这个矩阵没有通常意义上的逆。
对于我们的两个例子,\(\det(A)=1\)(三角矩阵的行列式等于对角元的乘积),而 \(\det(C)=0\)。
事实上,对于可逆方阵,我们有:
\[ A^{-1}=\frac{\operatorname{adj}(A)}{\det(A)} \]
其中 \(\operatorname{adj}(A)\) 是伴随矩阵。
如果行列式为零,这个公式的分母就是零,所以无法用这个式子求出逆矩阵。
但不可逆更深层的几何原因,正是我们前面讨论过的:变换把不同的输入映射到同一个输出,因此无法唯一地还原出原来的输入。
行列式也符合这幅图景。正如注 2 所说,行列式是一个变换对体积的缩放倍数。\(C\) 把整个三维空间压扁到一个平面上,而任何扁平的东西体积都是零,所以 \(\det(C)\) 必然为零。行列式为零并不是一条单独的规则,它就是同一次坍缩,只不过是用体积来衡量。在 图 3 里可以亲眼看到这一点:当两列逐渐对齐时,阴影平行四边形越来越细,面积趋于零。
这是我重新学习线性代数时慢慢意识到的。
许多起初看起来毫不相关的概念,比如矩阵、线性组合、线性相关、秩、行列式和逆矩阵,其实都可以从线性变换这个统一的几何视角来理解。
当我们不再只关注怎样计算公式,而是试着去理解在变换中向量和整个空间发生了什么时,这些概念之间的联系就清楚多了。