第二篇|线性代数:描述空间变化的语言
上一篇我们聊了AI的全局认知地图——从符号AI到大模型,看清了五次范式变迁。在那张地图上,有一个绕不过去的路口:数学。
以前我对线性代数的记忆就是公式——不管是课堂上还是各路名师课程,都在教我们推导行列式的展开公式、背诵"横着加竖着减对角线乘起来"的口诀速算特征值。公式会背了,题会做了,但你问我"这些东西到底是干什么的",我说不清楚。
后来才发现,不是我一个人——很多人学完线性代数的感受都是"考过了,也忘了,更不知道有什么用"。
直到当我看到 Transformer 的注意力公式全是矩阵乘法,看到神经网络每一层不过是 y = Wx + b,看到 Embedding 把一个词变成768维向量——那一刻我突然意识到:线性代数不是数学考试里的计算题,它也是描述AI世界运转规律的一门语言。
这篇文章的目标是:帮你建立线性代数的直觉——知道那些概念"在干什么"、“为什么需要它”、“在AI算法中用来做什么”。每个公式旁边都配了直观解释。
阅读约需:20分钟 | 适合人群:对线性代数感兴趣、想真正理解AI数学原理 | 前置阅读:建议先看本系列第一篇
本文脉络
- "线性"到底是什么意思?线性代数又是什么?
- 为什么要用线性代数?——把复杂性藏到模型里
- 线性代数的两个核心优势:坐标无关性和线性性
- 矩阵的语义:它不是一个数字表格
- 核心运算:每个操作解决什么问题?
- 线性代数在深度学习中的应用全景
- 从数学原理到AI应用:一个完整链路的追踪
- 向量能表示语义吗?
- 动手实战:用NumPy感受向量和矩阵
- 回顾与总结
一、"线性"到底是什么意思?线性代数又是什么?
1.1 先说"线性"
你可能听过"线性关系"这个词,但未必认真想过它到底指什么。
用最朴素的话说:“线性"就是"成正比、可叠加”。
去超市买东西——苹果3块一个,香蕉2块一根。买2个苹果加3根香蕉,总价就是 3×2 + 2×3 = 12块。先算苹果钱再加上香蕉钱,或者混在一起算,结果一样。买多少,钱就按比例加多少,不存在"买到第5个苹果突然涨价"这回事。
这个看似简单的"单价乘数量再加总"的公式,就是最朴素的线性关系。
数学上把这种关系拆成了两条规则(别被符号吓到,意思就是上面那句话):
- 可加性:f(x + y) = f(x) + f(y) — 分开算再加起来,和加完再算,结果一样
- 齐次性:f(kx) = k·f(x) — 输入翻k倍,输出也翻k倍
说白了:线性关系就是"公平交易"——没有隐藏费用,没有突然变卦,一切都是按比例来的。
1.2 线性代数是什么?——不是数学公式的堆砌,是一套建模语言
如果只想建立直觉,理解"线性代数=描述空间变化的建模语言"这一句话就够了,可直接跳到第二节。
我们来看一个根本性的问题:
线性代数到底是一种客观的自然规律,还是人为的设计?
中学学的函数、方程、几何,大多能对应到生活经验——速度乘时间等于路程、圆的面积公式——你觉得它们"天然就是这样"。但线性代数的符号和运算规则——矩阵乘法为什么要那样乘?行列式为什么那样算?——你很难在生活里找到直接对应。它太抽象、太"不像自然规律"了。
答案是:线性代数本质上是人为设计的——它是在初等数学基础上,设计出来的一套专门处理"空间"和"变换"问题的高层建模语言。
类比可以帮助理解:
类比一:军事地图的等高线系统。 真实的山不是由一圈圈线组成的,但等高线这种"人为发明"能精确描述地形。一旦你学会了读等高线,你就能快速判断哪里陡、哪里平、哪里适合行军。线性代数的向量和矩阵,就是描述高维数据空间的"等高线"。
类比二:音乐的五线谱。 声音本身是空气振动,五线谱是人为发明的一套符号系统——规定了音符的位置代表音高、符头的形状代表时值。学会读谱,你就能"看见"音乐。线性代数就是数据空间的"五线谱"——向量代表位置,矩阵代表运动。
类比三(给写代码的读者):SQL。 SQL不是在"发现"数据之间的关系,它是人为设计的一套语言——用SELECT、WHERE、JOIN这些语法操作关系模型。线性代数同理:向量和矩阵是"语法",线性变换是"语义",NumPy和CUDA是"编译器"。
这三个类比指向同一个结论:
线性代数是一种人为设计的领域建模语言。它建立了一套模型(向量模型),定义了一套语法(向量运算、矩阵乘法),并保证每种语法映射到确定的语义(空间变换)。只要你在规则内操作,结果一定正确——就像只要SQL语法正确,数据库引擎保证返回正确的查询结果。

从程序员的视角:线性代数的"奇怪运算"——点积、叉积、矩阵乘法——不是因为数学"本来就这样",而是因为这些运算应用太广、复用价值太大,所以被定义成了"标准库函数"。 比如,大量问题涉及"计算两个方向的夹角"或"求一个向量在另一个方向上的投影",于是数学家定义了"点积"这个运算来统一处理。
这和编程语言把常用算法纳入标准库是同一个逻辑——复杂性总要有个去处,不是语言承担,就是使用者承担。
所以,你学线性代数时觉得"这些运算好奇怪"——你的直觉没错。它们就像 std::sort 一样是人设计的。设计的目的,就是让你用一行公式解决原本需要多步才能搞定的问题。
二、为什么要用线性代数?——把复杂性藏到模型里
我们用两个具体例子来看:同一个问题,用初等数学和向量模型分别怎么解决。
例子一:三角形的面积
给定三角形三个顶点的坐标 (x₁, y₁), (x₂, y₂), (x₃, y₃),求面积。
初等数学思路:找到底边长度,找到对应的高,面积 = 1/2 × 底 × 高。如果三角形恰好有一条边在坐标轴上,好办。但如果没有呢?你得画辅助线、分解图形、分类讨论。三角形稍微歪一点,难度翻倍。
向量模型思路:把两条边看作向量,用叉积:
面积 = 1/2 × |cross_product(v₁, v₂)|
其中 v₁ = (x₂-x₁, y₂-y₁), v₂ = (x₃-x₁, y₃-y₁)。一行公式,不需要找底和高,不需要辅助线,不需要分情况讨论。三角形怎么歪怎么转,计算方式完全一样。

例子二:点到平面的距离
给定三维空间中的一个点 (x₀, y₀, z₀) 和一个平面 a·x + b·y + c·z + d = 0,求点到平面的垂直距离。
解析几何思路:用公式 |a·x₀ + b·y₀ + c·z₀ + d| / √(a² + b² + c²) ——这是课本上的标准公式,但你有没有想过这个公式是怎么来的?从解析几何角度推导几乎复杂到没法下手。
向量模型思路:平面的法向量 n = (a, b, c) 天然存在——它就是平面方程的系数!取平面上任意一点 (x₁, y₁, z₁),构造向量 w = (x₀-x₁, y₀-y₁, z₀-z₁),然后把 w 投影到 n 的方向上,投影的长度就是距离。整个过程就是两次运算:减法求差向量,点积求投影。每一步的几何含义都清清楚楚。
这两个例子说明了什么?
不是向量模型"发明了"新的数学事实——这些事实在初等数学里也存在。但初等数学直接处理它们,需要大量技巧和分情况讨论。向量模型把复杂性吸收到了模型内部,暴露给使用者的是一个简洁的接口。
这就是任何好模型的价值:隐藏复杂性,暴露简单性。 你不需要知道叉积内部是怎么算的,就像你不需要知道 std::sort 内部用的是快排还是归并。
所有的模型都是错的(是对现实的简化),但好的模型是有用的。线性代数之所以历经几百年还是AI的数学基石,就是因为它对"空间问题"的建模足够好。
三、线性代数的两个核心优势:坐标无关性和线性性
如果说微积分的核心是"变化率",概率论的核心是"不确定性",那线性代数的核心是什么?
两个东西:坐标无关性和线性性。理解这两个,就理解了线性代数为什么不可替代。
3.1 坐标无关性:换个角度看,本质不变
是什么?
笛卡尔坐标系是一种"绝对框架"——点的位置由它到坐标轴的距离定义。坐标系一转,所有坐标全变。
向量模型不同:它关心的是向量之间的相对关系——角度、距离、投影——这些不会因为你怎么摆坐标轴而改变。 内积、叉积、线性组合的结果,坐标系随便转,结果一样。
生活类比
两个人面对面站着。你站在他们旁边看到的"左右",和你走到对面看到的"左右",是反的——这就是"坐标系依赖"。但两个人的相对位置本身从来没变过。向量模型关心的就是"相对位置本身",不是"从你站的位置看过去是什么样"。
解析几何代表"绝对世界观"(位置取决于观察者框架),向量模型代表"相对世界观"(本质关系不依赖观察角度)。
对AI的意义:线性坐标变换不破坏数据结构
意味着:对同一组向量做线性坐标变换(统一缩放、旋转坐标轴),数据点之间的相似度排名、方差最大的方向——这些结构性结论不变。
这就是数据标准化的底层逻辑。“年龄”(0-100)和"年收入"(0-1000000)量纲差了几个数量级,直接算距离,年收入会把年龄完全淹没。标准化的做法 z = (x - 均值) / 标准差 本质上是给所有特征统一坐标尺度——变换后的数据,相似度排名和方差方向仍然反映了数据本身的真实结构。
边界澄清:编码方式不是"换坐标系"
这里有一个容易混淆的点,我自己初学时就踩过坑。
坐标无关性管的是"同一组向量,换不同坐标系看,结构关系不变"。但 One-Hot vs Target Encoding 不是在换坐标系——是在构造两组完全不同的向量。One-Hot 把类别变成互相正交的稀疏向量,Target Encoding 把类别替换成目标变量的统计值,两种方式造出的数据点在高维空间中的相对位置完全不同。这已经不是同一个几何问题了,坐标无关性管不了这个。
同一个分类任务,两种编码效果差了近 8 个点——这不叫"坐标无关性失效了",而是"你压根就不是在同一组数据上换坐标系"。
3.2 线性性:复杂问题拆成简单问题的叠加
是什么?
线性性 = 可加性 + 齐次性(第一节讲过)。推论很强:
任何复杂的线性问题,都可以拆成几个简单线性问题的叠加。
直观类比
一束白光通过三棱镜,分解成七色光——因为光的折射近似满足线性关系,各色光互不干扰,叠加就是白光。傅里叶变换把任意声音拆成正弦波的叠加,也是同一个逻辑。
对深度学习的意义
线性性意味着:你不需要一个"一步到位"处理所有复杂情况的超级函数。你只需要设计很多层简单的线性变换(每层 = 一个矩阵乘法),让它们叠加。 中间会插入非线性的激活函数(W3微积分会讲为什么需要它),但骨架是线性的——数据流过一层层矩阵乘法,在空间中不断被重新组织。
凡是满足线性关系的系统,都是向量模型的用武之地。大量非线性系统在局部可以被线性近似——这比你以为的要多得多。
四、矩阵的语义:它不是一个数字表格
可能很多人初学线性代数时只是把矩阵当成一个装满数字的表格来记,而不是一个有意义的操作。
4.1 矩阵 = 线性变换 = 对空间做一次"整形"
先忘掉矩阵乘法的计算规则。记住一个画面:
要理解一个矩阵做了什么,就看它把基向量 î=[1,0] 和 ĵ=[0,1] 送去了哪里。矩阵的第一列,就是变换后 î 的位置;第二列,就是变换后 ĵ 的位置。
比如这个矩阵:
[2 0]
[0 1]
第一列 [2,0] → î 被拉长到2倍。第二列 [0,1] → ĵ 没动。整体效果:“x方向拉伸2倍”。
再比如这个矩阵:
[0 -1]
[1 0]
第一列 [0,1] → î 被转到了y轴。第二列 [-1,0] → ĵ 被转到了-x轴。整体效果:“逆时针旋转90度”。
不用背。看基向量去哪儿,你就看到变换长什么样。

4.2 矩阵的三种身份
同一个矩阵,换个角度看,可以扮演完全不同的角色:
身份一:变换(动作视角) — 矩阵代表一个操作。比如权重矩阵 W,它的含义是"把输入空间扭到新的形态"。你关心的不是矩阵里的数字,而是它对数据做了什么。
身份二:容器(数据视角) — 矩阵是一组向量排列在一起。一行一个样本,一列一个特征。你关心的不是"变换",而是这些行/列向量之间的统计关系——比如哪些特征相关、哪些样本相似。
身份三:方程(求解视角) — Ax = b。已知A和b,要找那个被A"变成"b的x。这是最古老的线性代数问题,但背后的直觉是一样的:你知道变换规则和变换结果,要反推输入。
这三种身份不是三个不同的东西,是同一个东西的三个用途。理解这一点,矩阵就从"需要死记硬背的公式表"变成了"可以灵活切换视角的工具箱"。
4.3 矩阵乘法为什么不满足交换律?
AB ≠ BA。这个性质让很多人困惑——为什么乘法不能交换?
因为矩阵乘法不是"乘法",是你对空间连续施加两个变换。
你先穿上袜子再穿鞋,和先穿鞋再穿袜子,结果能一样吗?(这个例子够生活化吧。)
先旋转再拉伸(A×B)和先拉伸再旋转(B×A),一般情况下结果不同。不是因为运算规则"奇怪",而是因为变换的顺序本身就不可交换。
五、核心运算:每个操作解决什么问题?
以下6个运算构成了深度学习和机器学习算法的计算骨架。每个都从三个层面理解:直觉(它在干什么)→ 语义(它解决什么类型的问题)→ 在神经网络/机器学习中主要用来做什么。
5.1 向量加法
直觉:两个箭头首尾相接,得到一个新的箭头。想象你在一个大房间里,先向东走3步(v₁),再向北走4步(v₂),你最终的位置就是 v₁+v₂。
语义:平移。 把空间中的点整体搬到一个新位置。
在深度学习中的典型应用:偏置项 +b。没有偏置,所有变换必须过原点——相当于你只能以自己为中心转圈,不能挪地方。加上偏置,变换才能覆盖整个空间。
5.2 数乘
直觉:把箭头拉长或缩短或反向。×2 变两倍长,×0.5 缩一半,×(-1) 反过来指。
语义:缩放。 保持方向不变,只改变大小。
在深度学习中的典型应用:学习率就是做数乘——梯度告诉你"往哪个方向调",学习率告诉你"这一步迈多大"。这也是为什么学习率太大模型震荡、太小收敛太慢——数乘的本质就是在同方向上控制步长。
5.3 点积
直觉:将向量a投影到向量b上,投影长度乘以b的长度。点积衡量了"两个向量有多指向同一个方向"。

- 点积 > 0 → 大致同向(正相关)
- 点积 = 0 → 垂直(完全无关)
- 点积 < 0 → 大致反向(负相关)
语义:相似度。 “这两个东西有多像?”
在深度学习中的典型应用:这是语义搜索和注意力机制的基石。Transformer里Attention公式中的 QKᵀ,就是一个巨大的点积矩阵——“这句话里每个词,和其他每个词有多相关?” 整张"注意力地图"就是点积画的。
5.4 矩阵乘法
直觉:不是"乘法",是连续施加两个空间变换。先做变换B,再做变换A,合在一起的效果 = A×B。
语义:变换的叠加(复合)。 “把这个东西先这样扭、再那样转。”
在深度学习中的典型应用:整个深度网络就是矩阵乘法链。输入x,经过W₁变换→W₂变换→W₃变换,每一层都是对数据空间重新"塑形"。多层叠加,就能把一团乱麻的数据慢慢"扭"到可分的位置。
5.5 行列式
直觉:变换后,单位正方形的面积变成了多少倍。
- det = 2 → 面积扩到2倍
- det = 0 → 空间被"压扁"到更低维度(信息丢失!变换不可逆!)
- det < 0 → 空间翻转(镜像)
语义:信息保留度。 “这个变换有没有把某些维度压没了?”
在机器学习中的典型应用:行列式接近0意味着特征矩阵中存在严重的线性冗余——比如你同时用了"身高(cm)"和"身高(m)“作为特征,或者"总价”“单价”“数量"三个特征中任意两个就能推算出第三个。这种冗余导致矩阵"不可逆”——可以理解为:方程组中有些方程是其他方程的简单倍数,无法唯一确定每个变量的值。
具体到线性回归:求解正规方程 θ = (XᵀX)⁻¹Xᵀy 需要计算 XᵀX 的逆矩阵。当特征冗余导致 XᵀX 的行列式接近0时,逆矩阵不存在(或数值上极不稳定),方程直接无解。
这个问题工程上可以通过正则化(如 Ridge 回归:θ = (XᵀX + λI)⁻¹Xᵀy)解决——给矩阵对角加一个小常数让它恢复可逆。
5.6 特征值与特征向量
直觉:施加变换后,大部分向量的方向都变了。但总有少数特殊向量,方向死活不变,只是被拉长或缩短了。这些"方向保持者"叫特征向量,被拉伸的倍数叫特征值。用公式说就是:
A @ v = λ v
一个矩阵A对一个向量v做变换,结果竟然和v只差一个缩放因子λ——方向上完全没变!比如绕着z轴旋转,z轴上的任何向量 [0,0,1] 旋转后还是 [0,0,1]——它就是旋转矩阵的一个特征向量,特征值为1。

语义:系统的不变结构。 “无论施加什么变换,什么东西保持不变?”
在机器学习中的典型应用:上面这个"最大特征值方向统治长期行为"的性质,直接解释了PCA(主成分分析)。协方差矩阵的每个特征向量代表数据的一个"变化方向",对应的特征值代表数据沿这个方向的方差大小。为什么最大特征值的方向"包含最多信息"?
想象一团散落在2D平面上的数据点。如果你只能选一根轴把数据"投影"上去(比如为了压缩存储),你肯定会选数据散得最开的那个方向——投影后数据点之间的区分度最大,丢失的信息最少。
而"散得最开的方向"在数学上就是方差最大的方向,恰好对应协方差矩阵最大特征值对应的特征向量。保留前k个特征向量,从高维压到k维,信息损失最小。
为什么特征值和特征向量能揭示"重要性"?
这个直觉非常关键:拿任意向量v₀,反复用矩阵A去乘。任何向量都可以分解为A的特征向量加权和——v₀ = c₁·e₁ + c₂·e₂ + ...。每次乘法让第i个分量乘上λᵢᵏ。如果某个特征值明显大于其他,它的分量以指数级压倒其他方向——系统状态最终被最大特征值的方向统治。
这就是特征向量能揭示系统"本质结构"的根本原因:
- Google PageRank:网页链接关系构成一个巨大的矩阵A(如果网页i链向网页j,A[i,j]有值)。反复迭代"每个网页的重要性 = 链向它的网页的重要性加权平均",最终收敛的那个向量就是A的最大特征向量——它告诉你每个网页的"最终重要性分数"。
- 人口迁徙模型:城市间人口流动构成迁移矩阵。反复迭代几十年后,人口分布趋于稳定——这个稳定分布就是迁移矩阵的最大特征向量。
- PCA:协方差矩阵的最大特征向量,代表"数据在反复自相关后最稳定的变化方向"——也就是方差最大的方向。
特征向量回答了"这个系统长期来看会稳定在什么状态"。它之所以重要,不是因为它是一个数学魔术,而是因为大量现实系统的长期行为天然地由特征向量决定。
以上6个运算,构成了深度学习中线性代数运算的绝大部分。不是因为这6个运算"恰好够用",而是因为它们分别解决了神经网络和机器学习算法必须回答的6个基本问题:平移(偏置)、缩放(学习率控制)、相似度(注意力/检索)、复合变换(多层网络)、信息保留(特征冗余检测)、稳定结构(降维/长期均衡)。
六、线性代数在深度学习中的应用全景
下面我们直接从深度学习系统的各个核心环节来看,线性代数到底长在哪些地方。
6.1 数据表示:万物皆向量
AI要处理的原始世界是文本、图片、声音——这些都不是"数字"。第一步永远是向量化。
| 原始数据 | 对应的线性代数结构 | 具体形式 |
|---|---|---|
| 一个词/一段文本 | 向量 | [0.23, -0.45, 0.67, ..., 0.12](768维) |
| 一张图片 | 张量(三维矩阵) | [高 × 宽 × 颜色通道],如 [224 × 224 × 3] |
| 一段音频 | 向量/矩阵 | 频谱向量,或 [时间帧 × 频率] 矩阵 |
| 一个数据集 | 矩阵 | [样本数 × 特征数],每行一个样本 |
| 一个batch | 张量 | [batch_size × 特征维度 × ...] |
这里用到的线代知识:向量和张量的概念、reshape操作、维度对齐。
6.2 神经网络的前向传播:矩阵乘法的接力赛
一个最简单的全连接层做什么?
y = W @ x + b
三个操作:矩阵乘法(W@x)→ 向量加法(+b)→ 非线性激活(σ)。前两个是纯线代的。
多层网络就是把这种操作串起来:
output = W₃ @ σ(W₂ @ σ(W₁ @ x + b₁) + b₂) + b₃
数据在空间中一层一层被"扭"——旋转、拉伸、剪切、投影——直到原始数据从一团乱麻变成整齐的分类边界。
这里用到的线代知识:矩阵乘法、向量加法、矩阵的形状对齐(shape匹配)。
6.3 Transformer的注意力机制:纯矩阵运算的艺术
这是整个深度学习领域目前最重要的架构。注意力公式:
Attention(Q, K, V) = softmax(QKᵀ / √dₖ) @ V
拆解每一步:
QKᵀ→ 两个矩阵相乘,得到 [序列长度 × 序列长度] 的注意力矩阵。本质:所有词两两之间做点积,衡量"谁应该关注谁"。softmax(...)→ 把分数变成概率分布(概率论的部分,W4细讲)@ V→ 用注意力权重对V加权求和。本质:每个位置的输出 = 所有位置的V向量按"关注度"加权平均。
从头到尾全是矩阵乘法。Transformer 的GPU效率之所以极高,就是因为它几乎没有需要串行的计算——所有位置的注意力可以同时算。
这里用到的线代知识:矩阵乘法、转置、点积的批量计算(batch matrix multiply)。
6.4 反向传播与梯度:雅可比矩阵的链式法则
模型是怎么"学"的?通过反向传播调整权重——计算损失函数对每个参数的梯度,沿梯度反方向调整参数。但深度网络有上亿个参数,逐个算梯度不可行。数学上这靠的是雅可比矩阵的链式法则:
矩阵求导链做了什么? 以三层网络为例,损失L对第一层权重W₁的梯度,按链式法则展开:
∂L/∂W₁ = (∂L/∂h₃) @ (∂h₃/∂h₂) @ (∂h₂/∂h₁) @ (∂h₁/∂W₁)
公式里每个 ∂hᵢ/∂hᵢ₋₁ 是一个雅可比矩阵(Jacobian),它的第[i,j]个元素是"输出第i维对输入第j维的偏导数"。所以上面那串公式的本质是:损失对W₁的梯度 = 一连串雅可比矩阵的乘积——不是逐元素标量求导,而是一次矩阵乘法批量算出整层的梯度。
为什么矩阵运算比逐元素计算高效? 对比一下:一个 [1000×1000] 的权重矩阵有100万个参数,逐元素求导就要算100万次。而矩阵求导公式
∂L/∂W = (∂L/∂y) @ xᵀ一行算完,底层由BLAS/LAPACK这些经过几十年优化的线性代数库执行——分块(tiling)、向量化(SIMD)、缓存优化全部用上,同样的计算量比标量循环快几十到上百倍。
自动微分框架(PyTorch、TensorFlow、JAX)底层做的,就是替你构建这些雅可比矩阵的乘法链并在GPU上高效执行。把链式法则从"逐元素计算"变成"批量矩阵运算",正是线性代数在深度学习中最核心的效率贡献。
6.5 语义搜索与RAG:在高维空间中找"最近的邻居"
你问"怎样治疗失眠",RAG系统要在知识库里找最相关的文档。这一步在做什么?
- 把问题和所有文档分别变成向量(Embedding)
- 计算问题向量和每个文档向量的余弦相似度
- 取Top-K个最相似的文档
余弦相似度为什么有效?——不只是"归一化后的点积"
点积有一个隐藏问题:受向量长度影响。假设文档A是"一篇3万字AI综述",文档B是"一段50字AI简介"——语义上都讲AI,但A的向量长度(L2范数)可能远大于B。直接用点积,A和任何问题的点积都天然偏大,不是因为它更相关,只是因为它的向量更长。
余弦相似度解决了这个长度偏差:
cosine(a,b) = (a·b) / (|a| × |b|)
它把两个向量都缩到单位长度(各自除以其模长),然后做点积。实质上,余弦相似度衡量的是"方向的一致性",而不是"长度的相似性"。两个向量指向同一方向 → 余弦≈1,完全相反 → 余弦≈-1,垂直 → 余弦=0。
在语义空间中,"方向"比"长度"更能代表语义——语义相似的文档,无论长短,向量指向的方向大致相同。这就是为什么余弦相似度是语义搜索的事实标准。
6.6 降维与可视化:PCA和SVD
当你面对一个100维的数据集,想用2D散点图"看"它的时候,怎么办?
PCA(主成分分析)的步骤:
- 计算数据的协方差矩阵
- 对这个矩阵做特征值分解
- 取最大的k个特征值对应的特征向量
- 把原始数据投影到这k个特征向量上

SVD(奇异值分解)的泛化能力更强:任意矩阵 A 都可以分解为 A = U @ Σ @ Vᵀ。其中 Σ 对角线上的奇异值告诉你"每个方向的重要性"。
SVD 在推荐系统(协同过滤)、模型压缩(低秩分解)、主题模型(LSA)中都是核心工具。
6.7 GPU并行:为什么矩阵乘法"天生适合加速"?
矩阵乘法 C = A @ B,其中 C[i,j] = A的第i行 · B的第j列。
关键点:C的每个元素的点积计算互相完全独立。 一个 [1000 × 1000] 的矩阵乘法,100万个点积可以同时算。GPU有几千个核心,每个算一块,总量碾压CPU的串行计算。
这就是为什么深度学习能在GPU上演化到今天的规模。不是巧合——是整个AI的计算范式就是围绕"可以并行的矩阵运算"设计的。 从神经网络的第一天起,这种计算结构就选定了——因为它恰好也是最有效的硬件加速结构。
线性代数提供了高效的计算语言,GPU提供了执行这种语言的硬件。两者的结合,让从简单矩阵运算到智能涌现的规模跨越成为可能。
这里可以反思一个问题:线性代数的高效性是否也在某种程度上限制AI研究的方向?后续在W9会展开讨论。
以上讲到了6个核心运算、7个应用场景。可以先记住最核心的画面:矩阵是对空间做变换,点积是量相似度,特征向量是系统不会变的骨架。剩下的细节,用到的时候翻回来看就行。下面我们把前面所有概念串起来,看一个完整的例子,你就能看到这些碎片是怎么拼成一张图的。
七、从数学原理到AI应用:一个完整链路的追踪
现在我们用一个具体例子,把前面讲的所有概念串起来。
假设你在用一个AI模型识别手写数字(MNIST)。整个过程从数学原理到最终应用,线性代数每一步都在场:
[步骤1] 输入:一张28×28的灰度图片
↓
数学表示:一个 784维向量(把28×28的像素矩阵拉成一列)
线代知识:向量、reshape
[步骤2] 第一层变换:784维 → 128维
↓
h₁ = σ(W₁ @ x + b₁)
W₁: [128 × 784] 矩阵,b₁: [128] 偏置向量
矩阵每一行是一个"特征探测器"——比如有一行专门检测"竖线"
线代知识:矩阵乘法、向量加法
[步骤3] 第二层变换:128维 → 64维
↓
h₂ = σ(W₂ @ h₁ + b₂)
空间进一步被压缩和重组,"竖线"+"横线"+"斜线"组合成"圆圈"
线代知识:矩阵乘法的复合
[步骤4] 输出层:64维 → 10维(对应0-9十个数字)
↓
y = W₃ @ h₂ + b₃
10维向量的每个分量代表"这个数字是几"的原始分数
线代知识:矩阵乘法
[步骤5] 判断结果:10维 → 1个数字
↓
softmax把10个分数变成概率,概率最大的就是预测结果
(softmax涉及指数运算,这是W4概率论的内容,但底层的矩阵计算是纯线代)
[步骤6] 计算损失、反向传播、更新参数
↓
损失对W₃的梯度 → 损失对W₂的梯度 → 损失对W₁的梯度
每一步都是雅可比矩阵乘法
参数更新:W_new = W_old - lr × 梯度(数乘+减法)
一个简单的手写数字识别,从头到尾就是:向量化 → 矩阵乘法链 → 输出向量 → 反向传播更新矩阵 → 循环。

现在放大到GPT-4:同样是这个流程,只是矩阵从 [128 × 784] 变成了 [12288 × 12288](GPT-3的隐藏维度),层数从3层变成了96层、120层。计算的本质没变,规模变了——而规模,就是涌现的起点。
八、向量能表示语义吗?
8.1 直接回答:向量本身不能
一个768维的数字数组,本身只是一串数字。它不知道自己是"猫"还是"民主"。
那为什么词向量有用?因为语义不在单个向量的数值里,而在向量与向量之间的关系里。
举个例子:如果"国王"的向量减去"男人"的向量再加上"女人"的向量,结果恰好等于"王后"的向量——这不是因为单个向量有什么魔力,而是因为在训练过程中,模型学会了把语义关系编码为向量之间的方向和距离。
来源:Mikolov et al., “Linguistic Regularities in Continuous Space Word Representations” (NAACL 2013) 中的 Figure 2 示意图
Word2Vec训练的实质:不是"请把每个词映射到一个好向量",而是"请预测周围可能出现的词"。为了完成这个预测任务,模型自发地发现——把语义相近的词放在空间中靠近的位置,把语义关系(如"性别对"、“首都-国家”)编码为一致的平移方向,能让预测更准确。
语义是"涌现"在向量之间的关系中的,不是"存储"在单个向量的数值里的。
而这种"关系"的建立,线性代数自己搞不定——它只管把数据放到空间中、定义距离和变换,但"往哪个方向调整、调多少、调到什么程度算好",需要微积分、概率论和信息论一起配合。这个留到后面再展开。
九、动手实战:用NumPy感受向量和矩阵
打开Jupyter Notebook,跟着敲一遍。
9.1 语义相似度:把句子变成向量,量距离
import numpy as np
# 用最简单的词袋模型模拟向量化
# 词汇表:[机器学习, 深度学习, 神经网络, 梯度, 烹饪, 菜谱, 厨房, 美食]
s1 = np.array([3, 2, 1, 1, 0, 0, 0, 0]) # AI文章1
s2 = np.array([2, 3, 2, 0, 0, 0, 0, 0]) # AI文章2
s3 = np.array([0, 0, 0, 0, 2, 3, 1, 1]) # 烹饪文章
s4 = np.array([1, 1, 0, 1, 0, 0, 0, 1]) # 混合内容
def dot(v1, v2):
return np.sum(v1 * v2)
def cosine(v1, v2):
return dot(v1, v2) / (np.sqrt(dot(v1, v1)) * np.sqrt(dot(v2, v2)))
def euclidean(v1, v2):
return np.sqrt(np.sum((v1 - v2) ** 2))
print("s1 vs s2 (两篇AI文章) → 余弦相似度:", cosine(s1, s2)) # 接近1.0
print("s1 vs s3 (AI vs 烹饪) → 余弦相似度:", cosine(s1, s3)) # 接近0.0
print("s1 vs s4 (AI vs 混合) → 余弦相似度:", cosine(s1, s4)) # 中间值
这个简单实验的结论:余弦相似度越接近1,内容越"像"。 向量数据库、RAG检索、推荐系统——底层都在干这件事。
9.2 可视化:矩阵变换长什么样
import matplotlib.pyplot as plt
np.random.seed(42)
points = np.random.randn(50, 2) # 50个随机点
scale = np.array([[2, 0], [0, 1]]) # x方向拉伸
rotate = np.array([[0, -1], [1, 0]]) # 逆时针旋转90度
shear = np.array([[1, 0.5], [0, 1]]) # 剪切变换
scaled = points @ scale.T
rotated = points @ rotate.T
sheared = points @ shear.T
fig, axes = plt.subplots(1, 4, figsize=(16, 4))
for ax, data, title in zip(
axes,
[points, scaled, rotated, sheared],
['原始数据', '拉伸 x×2', '旋转 90°', '剪切变形']
):
ax.scatter(data[:, 0], data[:, 1], alpha=0.7, c='steelblue', s=50)
ax.axhline(y=0, color='gray', ls='--', alpha=0.3)
ax.axvline(x=0, color='gray', ls='--', alpha=0.3)
ax.set_xlim(-4, 4); ax.set_ylim(-4, 4)
ax.set_aspect('equal'); ax.set_title(title); ax.grid(True, alpha=0.2)
plt.tight_layout()
plt.savefig('linear_transform_demo.png', dpi=150, bbox_inches='tight')
plt.show()
运行这段代码,你会看到三个矩阵做了什么。神经网络每一层的权重矩阵W,就是在对数据做同样的事——反复拉伸、旋转、剪切——直到不可分的数据变得可分。
9.3 问题检验
学完之后,试试能不能讲清楚:
- 为什么两个向量的点积能衡量"相似度"?用"方向一致性"来解释,而不是用公式。
- 如果同事问"线性代数在AI中到底用来干什么",你能在60秒内讲清楚吗?
- 矩阵乘法为什么不满足交换律?用"先旋转再拉伸 ≠ 先拉伸再旋转"来解释。
十、回顾与总结
五个关键收获:
-
线性代数是一种人为设计的模型语言 — 它在初等数学之上建立了向量模型,用向量和矩阵定义了一套描述空间变换的语法和语义。就像五线谱描述音乐、等高线描述地形,线性代数描述"高维空间里的事物如何移动和变形"。
-
它的两个核心优势是坐标无关性和线性性 — 前者让你从不同角度看到相同的本质,后者让你把复杂问题拆成简单问题的叠加。
-
矩阵不是数字表格,是空间变换 — 看一个矩阵做了什么,就看它把基向量送去了哪里。
-
AI的每一个计算环节都是线性代数 — 从数据表示到注意力机制,从反向传播到语义搜索,全是向量和矩阵运算。不是"AI用到了线性代数",而是"AI就是用线性代数写成的"。
-
向量本身不携带语义,向量之间的关系才是语义 — 这种关系是靠梯度下降(微积分)+ 损失函数(信息论)+ 概率建模(概率论)一起训练出来的。接下来三周,我们会一一解锁。
一个比喻收尾:如果把AI比作盖房子——
- 线性代数是建材和施工机械——提供"怎么做"
- 微积分是图纸和测量工具——告诉你"往哪砌、砌多少"
- 概率论是结构安全评估——告诉你"倒塌的概率"
- 信息论是质量标准——告诉你"施工质量打几分"
四块拼图,我们刚拿起了第一块。

当你习惯了用向量的眼睛看世界,数据就不再是表格里的数字。它们是一个个在高维空间中移动、旋转、聚拢、分开的箭头。AI的学习过程,就是这些箭头在空间中逐渐找到自己位置的舞蹈——简单规则的反复执行,在规模越过临界点的那一刻,涌现出智能。
“The purpose of computing is insight, not numbers.” — Richard Hamming
计算的目的不是数字,是洞见。线性代数教我们的不是怎么算矩阵,是看见数字背后的空间。
下期预告:第三篇「微积分直觉与梯度下降」—— 梯度下降就像闭着眼睛从山顶走到山谷,我们用它讲清楚导数、偏导数和链式法则。不见不散。
—*
参考资料:《程序观点下的线性代数》、3Blue1Brown《线性代数的本质》、Gilbert Strang《Introduction to Linear Algebra》、Ian Goodfellow《Deep Learning》
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)