第四部分 · 不确定与多维
一次处理很多维:线性代数与向量空间
上一课我们学会和一个不确定的量讲道理。可现代问题从来不只一个量——一张图、一份数据、一个物理状态,动辄几百上千个数同时变动。一个一个处理是死路。这一课,我们造出一次摆弄一大群数的语言。
留下的问题:但真实问题里的量从来不是孤单一个。一张照片是几百万个像素亮度,一个推荐系统是几千个用户特征,一个物理系统有无数个坐标。这些数互相牵连、同时变化;要是一个变量一个变量地写方程、列算式,人脑和纸笔根本招架不住。能不能把一大串数当成单个对象来处理?
本课新增:把一串数捆成一个对象——向量;把"线性变换"捆成一张表——矩阵;以及维度、基、线性映射。这就是现代数据与人工智能所说的语言。
向量:把一串数捆成一个对象
最朴素的念头,往往最有力:既然要处理一大串数,那就给这一串数起一个名字,把它们当成一个整体。这个整体就是向量。一个向量,就是一串有序的数:
v = (x₁, x₂, …, xₙ) (读作"向量 v,分量是 x 下标 1 到 x 下标 n")
"有序"很关键:(3, 1) 和 (1, 3) 是两个不同的向量,位置不能乱换。这一串数可以有两种看法,缺一不可:
- 当成一个点:(3, 1) 就是平面上横坐标 3、纵坐标 1 的那个位置。三个数就是三维空间的一个点,n 个数就是 n 维空间的一个点。
- 当成一支箭:从原点指向那个点的箭头。箭有长度、有方向,正好用来表示"位移""速度""一组特征的强弱组合"这类东西。
关键是:无论这串数有 2 个还是 200 万个,"向量"这个词都把它打包成单个对象。我们对它做的事——相加、缩放、变换——都是对整串数一次性地做。一个一个处理的噩梦,从此变成对一个对象的一次操作。全体 n 个实数组成的向量构成的空间,记作 ℝⁿ(读作"R 的 n 次方",即 n 维实数空间)。
为什么偏偏是"线性"
向量能做两件最基本的事,而且做完还落在同一个空间里:
- 相加:对应分量相加。(3, 1) + (1, 2) = (4, 3)。几何上是两支箭首尾相接。
- 数乘:整体乘一个数(叫"标量")。2 · (3, 1) = (6, 2)。几何上是把箭拉长或压短。
"线性"指的就是只用这两种操作搭起来的世界:满足可加(先变换再相加,等于先相加再变换)与可数乘(先变换再放大,等于先放大再变换)。为什么数学家偏爱它到近乎偏执?因为线性是最温顺、却出奇有用的结构:
当然,真实世界并不全是线性的(否则就太无聊了)。但线性是我们唯一能彻底算清的一块;现代方法的通用策略,就是"用线性逼近 + 一点非线性点缀"——这一点,本课结尾会接到机器学习上。
矩阵:把"变换整个空间"捆成一张表
向量是"被处理的对象",那"处理"本身是什么?我们想要的是一种线性变换:把空间里每个点都搬到新位置,而且搬法是"线性"的——网格线变换后依旧保持平行、依旧等距,原点不动。直观地说,它把整张方格纸均匀地拉伸、旋转、剪切或压扁,绝不弯折、不撕裂。
神奇之处在于:这样一个作用在整个空间上的变换,只需要少数几个数就能完全确定。因为线性,只要你告诉我两个基准箭——指向右的单位箭 î = (1, 0)(读作"i 帽")和指向上的单位箭 ĵ = (0, 1)(读作"j 帽")——变换后各落到哪里,整个平面的变换就被锁死了。把这几个"落点"按列排成一张表,就是矩阵:
M = [ a b ; c d ] (第一列 (a, c) 是 î 的落点,第二列 (b, d) 是 ĵ 的落点)
这里我用分号隔开两行:第一行是 a, b,第二行是 c, d。所以一张冷冰冰的 2×2 数表,真正的身份是"对整个平面的一次变换"。这是本课最该记住的一句话:矩阵不是数表,矩阵是动作。
矩阵乘向量:变换一个点
既然矩阵 M 是个动作,把它"作用"到向量 v 上,就是看这个点被搬到了哪里。算法是矩阵乘向量:
M · (x, y) = (a·x + b·y, c·x + d·y)
它读起来正是"线性"的化身:新位置 = x 份的 î 落点 + y 份的 ĵ 落点。因为变换是线性的,任意点 (x, y) = x·î + y·ĵ 的去向,就是两个基准去向的同等组合——这就是为什么"知道两个基准、就知道全部"。把许多向量排成一张大表去乘,便能一次性变换整批数据,这正是图形渲染、神经网络一层前向计算在做的事。
行列式:面积被放大了几倍
变换会把一块区域拉大或缩小。一个自然的问题是:变换后,面积变成了原来的几倍?这个倍数,就是矩阵的行列式,记作 det(M)。对 2×2 矩阵:
det(M) = a·d − b·c
读作"a 乘 d 减 b 乘 c"。它的含义极其几何:原本由 î、ĵ 张成的单位正方形(面积 1),变换后成了一个平行四边形,它的面积正好是 |det(M)|(行列式的绝对值)。det = 2 就是面积翻倍,det = 0.5 就是缩成一半。而最要命的一种情况是:
下面的小实验让你亲手拨动 a, b, c, d,看整张方格纸被拉伸、旋转、剪切,看着 î、ĵ 跟着跑;尤其试试把行列式调到 0,看网格"啪"地塌成一条线。
维度的威力:从二维直觉到 ℝⁿ
现在收回最初的承诺。我们在平面上把一切都看清了:向量是点,矩阵是变换,行列式是面积倍数。关键在于,这套语言一个字都不用改,就能搬到任意维度。三维里向量是三个数、矩阵是 3×3、行列式是体积缩放;到了 n 维(ℝⁿ),向量是 n 个数、矩阵是 n × n 的表,"行列式 = 0 即压扁降维、不可逆"原封不动地成立。
我们想象不出五百维空间长什么样——但根本不必想象。二维里磨出的直觉(加法、缩放、变换、压扁),靠的是代数原样推广上去,几何想象只是脚手架。这就是线性代数最深的馈赠:它让"几百上千个数同时变动"这件本来无从下手的事,变得和摆弄平面上一个点一样有章可循。上一课用概率驯服了一个随机的量;这一课用向量与矩阵,一次驯服了千万个维度。
这门语言通向哪里
不夸张地说,今天的人工智能就泡在线性代数里。一段文字、一张图、一个用户,都先被编码成高维向量;神经网络的每一层,本质就是一次矩阵乘法(线性变换)外加一点非线性"折一下"——线性负责一次性搅动所有维度,非线性负责让它能拟合弯曲的现实。搜索与推荐,核心是在高维向量空间里找"方向相近"的邻居。想看这门语言怎样落地成会写字、会画画的模型,可以接着读 《从零构建 GPT》 与 《连续生成模型:扩散与流匹配》——你在这一课建立的"向量 + 矩阵 + 维度"直觉,正是读懂它们的入场券。
常见误解
- "向量就是带箭头的物理量(力、速度)。"那只是它最早、最窄的一个出身。在数学里,向量是任何能相加、能数乘的有序数组:一句话的词频、一支股票的特征、一张灰度图的全部像素,都是向量。死盯着"箭头",会让你以为它只属于物理,错过它作为通用数据容器的真正威力。
- "矩阵只是一张数表。"这是把肉身当成了灵魂。数表是它的记法,它的身份是一个作用在整个空间上的线性变换。矩阵乘法为什么是那套看着别扭的"行乘列"?正因为它对应着"先做一个变换、再做另一个变换"的复合——把它当动作,一切就顺理成章。
- "高维想象不出来,所以没用。"恰恰相反。我们确实想象不出高维,但线性代数的全部要点,就是让你不必想象:所有结论都靠代数从二、三维严格推广上去。正是这种"绕开想象力"的能力,才让处理几百万维的数据成为可能——高维不是它的障碍,是它的主场。