基础 · 01

线性代数的几何直觉

矩阵不是表格,是空间的扭曲。把向量、点积、矩阵乘法、特征向量都看成可以拖动的东西——一篇文章让公式长出形状。

16 min read

为什么从这里开始

打开任何一本机器学习书,第一章往往不是「神经网络」,而是一堆 WWXXΣ\Sigma。这不是装腔作势——

  • 一张 224×224 的 RGB 图像,是一个 224×224×3224 \times 224 \times 3 的张量。
  • 一句话的 embedding,是一个 4096 维的向量。
  • Transformer 里一次注意力计算,就是几次矩阵乘法。

ML 的语言是线性代数。但课本里的线性代数常常被讲成「行列式按定义展开」、「高斯消元到最简形」——让人记住了步骤却没看见它到底在动什么。这篇我们换一种视角:所有矩阵都是对空间的扭曲,所有矩阵乘法都是两次扭曲的叠加,特征向量是扭曲里不动的轴

向量:一个箭头

最简单的开始:二维向量 v=(3,2)\mathbf{v} = (3, 2) 是从原点出发指向 (3,2)(3, 2) 的箭头。

写成列向量更顺手:

v=[32]\mathbf{v} = \begin{bmatrix} 3 \\ 2 \end{bmatrix}

数字本身不重要——重要的是它代表一种移动:从原点走 3 步右、2 步上。机器学习里所谓「图像的 embedding」、「token 的 embedding」都是同一回事:高维空间里的一个箭头,方向编码了语义。

向量有长度(模):

v=32+22=13\|\mathbf{v}\| = \sqrt{3^2 + 2^2} = \sqrt{13}

长度衡量的是「这个箭头有多远」,在 embedding 空间里对应「这个信号有多强」。但更常见的操作不是比长度——而是比方向。

点积:投影与相似度

两个向量之间最基本的运算是点积(dot product)

ab=a1b1+a2b2++anbn\mathbf{a} \cdot \mathbf{b} = a_1 b_1 + a_2 b_2 + \cdots + a_n b_n

公式是「对应分量相乘再相加」,但这个公式的几何意义才是 ML 里真正用的:

ab=abcosθ\mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \cdot \|\mathbf{b}\| \cdot \cos\theta

其中 θ\theta 是两个箭头之间的夹角。翻译一下:

  • 点积 > 0:两个箭头方向大致相同(θ<90°\theta < 90°)。
  • 点积 = 0:两个箭头垂直(θ=90°\theta = 90°,互不相关)。
  • 点积 < 0:两个箭头方向大致相反。

还有一个更直观的读法:ab\mathbf{a} \cdot \mathbf{b} 等于 a\mathbf{a}b\mathbf{b} 方向上的投影长度乘以 b\|\mathbf{b}\|。如果你把 b\mathbf{b} 看成一根「尺子」,点积就是 a\mathbf{a} 在这根尺子上量出来有多长。

把两个向量都归一化(除以各自的长度),点积就变成了余弦相似度

cosθ=abab\cos\theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \cdot \|\mathbf{b}\|}

这就是 embedding 空间里「语义相似 = 夹角小 = 余弦相似度高」的数学基础。

在 Transformer 里,Attention 机制的核心操作就是Query 和 Key 的点积qk\mathbf{q} \cdot \mathbf{k}。它衡量的是「这个 query 和这个 key 有多匹配」——点积越大,说明两个向量指向越相似的方向,注意力权重就越高。整个 Attention 可以读作:用点积找到最相关的 key,然后取对应的 value

矩阵:一次空间变换

把一个 2×22 \times 2 的矩阵作用到向量上:

[abcd][xy]=[ax+bycx+dy]\begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} ax + by \\ cx + dy \end{bmatrix}

公式很无聊,直觉却惊艳:把这个矩阵作用到平面上每一个点,整个平面会被线性地扭曲——直线还是直线,原点不动,平行线还是平行线,但网格被拉、被压、被旋转、被翻折。

更关键的观察:矩阵的两列分别就是变换后的基向量

  • 第一列 (a,c)(a, c) = 原本指向 (1,0)(1, 0) 的单位向量 ı^\hat{\imath} 被送到了哪里。
  • 第二列 (b,d)(b, d) = 原本指向 (0,1)(0, 1) 的单位向量 ȷ^\hat{\jmath} 被送到了哪里。

知道了基向量去了哪里,整片平面去了哪里就自动确定了——因为任何向量 (x,y)=xı^+yȷ^(x, y) = x\,\hat{\imath} + y\,\hat{\jmath} 都是基向量的组合,变换是线性的,组合关系不会变。

矩阵就是一份关于「基向量去哪里」的说明书。 拖动滑块或点几个预设感受一下:

îĵ

变换矩阵

[
1.000.000.001.00
]

det = 1.00(面积缩放倍数

预设变换

矩阵的两列就是变换后的基向量。 î 原本指 (1,0), ĵ 原本指 (0,1)——它们去哪儿,整片网格就跟到哪儿。

下面那个 det\det(行列式)也有几何意义——它是单位方格变换后的面积det=2\det = 2 表示面积翻倍;det=0\det = 0 表示整片平面被压成一条线(信息丢了,矩阵不可逆);det<0\det < 0 表示平面被翻面——左右手互换了。

注意:矩阵-向量乘法 AxA\mathbf{x} 的每一行其实就是一次点积——第 ii 行和输入向量 x\mathbf{x} 做点积得到输出的第 ii 个分量。所以矩阵变换的本质是:同时做 mm 次点积(投影),每一行是一根不同方向的「尺子」。

乘法:变换的叠加

理解了「矩阵是变换」,乘法就不再神秘:

ABAB 表示先做 BB,再做 AA——从右往左读,像函数复合 f(g(x))f(g(x))

这立刻解释了一个反直觉的事实:

ABBAAB \neq BA

「先旋转 90° 再横向剪切」和「先剪切再旋转」当然结果不同——做事的顺序变了。矩阵乘法不满足交换律不是数学家的恶趣味,而是变换本身的性质。

顺带也能解释几个熟悉的符号:

  • 单位矩阵 II 是「什么都不做」的变换——基向量没动。
  • 逆矩阵 A1A^{-1} 是「把 AA 撤回去」的变换——所以 A1A=IA^{-1}A = I
  • detA=0\det A = 0 时矩阵不可逆——把平面压成一条线之后,没办法靠另一个线性变换把丢掉的那个维度变回来。

从 2D 到 4096 维

上面的所有演示都在二维平面上——但 LLM 的 embedding 是 4096 维,权重矩阵是 4096×4096。直觉还能用吗?

完全能用。 虽然人类无法想象 4096 维的空间,但线性代数的规则和 2D 一模一样:矩阵乘法还是「变换的叠加」,行列式为零还是「某些维度被压没了」,特征向量还是「不动的方向」。这就是线性代数的威力——规则不随维度变化

高维空间有一个新的重要概念:秩(rank)。一个 4096×40964096 \times 4096 的矩阵如果秩只有 8,意味着它把 4096 维空间压成了一个 8 维的「薄片」——3988 个维度的信息丢了。反过来说,这个矩阵只在 8 个方向上有「动作」。LoRA 微调就利用了这一点:假设大模型的权重更新 ΔW\Delta W 是低秩的(ΔW=BA\Delta W = BA,秩 = 8),只需训练 8×40968 \times 4096 + 4096×84096 \times 8 的参数,而不是完整的 409624096^2

特征向量:不动的方向

一次普遍的线性变换会把大多数向量旋转到一个新方向。但偶尔有些「幸运」的向量:它们的方向保持不变,只是长度被缩放。这些叫做特征向量(eigenvector),对应的缩放倍数叫特征值(eigenvalue)

数学定义就这一句话:

Av=λvA\,\mathbf{v} = \lambda\,\mathbf{v}

「矩阵作用在 v\mathbf{v} 上,等于直接给 v\mathbf{v} 乘一个数 λ\lambda」——这意味着 v\mathbf{v} 没有被旋转出它原来的方向。

变换矩阵

A =[
2112
]
方向 (1, 1):长度 × 3,方向不变 → 特征值 λ₁ = 3
方向 (1, -1):长度 × 1,方向不变 → 特征值 λ₂ = 1
其他方向:变换后都旋转到了别处。
点击「施加 A」。两条彩色的轴是这个矩阵的特征方向——所有别的箭头都被旋转走,只有它们留在自己的直线上。

为什么 ML 里到处是特征向量?因为「不被旋转的方向」就是变换的本质轴——它们告诉你这个矩阵真正在做什么。

  • PCA 找的是数据协方差矩阵的特征向量——在数据形成的高维云团中,找到方差最大(分布最广)的那几个方向,然后把数据投影过去。砍掉方差小的轴 = 降维。
  • SVD 把任意矩阵分解成三步:先旋转(VV^\top),再沿特征轴拉伸(Σ\Sigma),最后再旋转一次(UU)。无论一个矩阵多么复杂地扭曲了空间,它都能被精确地拆解成这三个简单操作的组合。
  • Google 的 PageRank 算的是网页转移矩阵的最大特征向量——稳态分布。
  • 谱聚类、图神经网络 在图的拉普拉斯矩阵的特征向量上做聚类。

特征向量出现在哪里,哪里就有「不变量」的故事。

为什么还需要非线性

到这里你已经掌握了线性代数的核心直觉。但有一个关键的限制必须点明:

无论你叠加多少次线性变换,结果还是一次线性变换。

数学上:A3A2A1=AnewA_3 \cdot A_2 \cdot A_1 = A_{\text{new}}——几个矩阵连乘还是一个矩阵。这意味着如果神经网络只做矩阵乘法(线性变换),不管堆多少层,效果都跟一层一模一样。

这就是为什么深度学习需要在每次矩阵乘法之后加入 ReLU 等激活函数——在线性扭曲之后,把空间折叠或弯曲一下。正是这个「非线性的弯」让多层叠加变得有意义,让模型能拟合出世界上极其复杂的非线性规律。这个故事我们会在神经网络那篇展开。

这个想法在前沿里