
很多人学人工智能习惯直接从模型库调接口、跑训练脚本框架越用越熟但一碰到维度不匹配、梯度爆炸、模型不收敛这类问题就完全抓瞎。这时候回头排查问题多半卡在数学基础上。AI的数学基础教材第一章通常是微积分与最优化铺垫第二章则几乎毫无悬念地让位给线性代数。我刚接触深度学习那阵子也觉得线性代数不过是解方程组、算行列式的老古董跟写代码关系不大直到第一次手搭网络结构为了弄明白输入输出张量的维度变换、参数矩阵的排列方式、损失函数反向传播时的梯度链式法则才后悔当初没把这一章彻底吃透。这一章的内容相当于AI世界的“空间语言”。你后面看到的向量、矩阵、张量、嵌入、注意力权重都是在这套语言体系里运转的。这篇文章不打算复述教科书我想站在一名工程实践者的角度把这一章里真正决定你“能不能用”的核心概念拆开来讲配合代码、案例和踩坑记录给你一份可以直接照着理解和实操的参考。1. 向量与向量空间AI中的数据到底长什么样1.1 为什么说AI里的数据本质上都是向量这一章开篇的第一个核心对象就是向量。很多人以为向量只是高中数学里那个带箭头的线段但放到机器学习的语境里向量的含义要宽泛得多一条样本、一张图片、一个单词、一段音频特征只要能被编码成一串有序数字就能看作一个向量。举个例子一张 28×28 像素的灰度手写数字图片在进入神经网络之前会被“拉平”成 784 维的向量。这里的每个维度对应一个像素的灰度值。一张彩色图片更典型RGB 三个通道如果尺寸是 224×224通常会被组织成 (3, 224, 224) 的张量但在做某些线性代数运算时同样可以按通道展开拼接成更长的向量。自然语言处理里的词向量更直接——每个单词对应一个几百维的稠密向量词和词之间的语义关系就藏在这些向量的方向和距离里。理解这一点你就抓住了这一章的主线AI 的绝大多数操作都是在高维空间里对向量做变换。所以这一章讲的向量加法、数乘、内积、范数不是抽象定义而是后续做相似度计算、特征归一化、注意力打分时的底层操作。比如内积Transformer 里注意力权重的核心计算就是查询向量与键向量的内积而范数则直接决定了你在训练时用哪种正则化方式、如何约束梯度的大小。1.2 线性组合、线性相关与“空间的边界”有了向量之后这一章马上会引入一个概念线性组合。一组向量通过“分别乘一个系数再加起来”就能得到新的向量。这个概念看起来很基础但它是理解“特征空间到底有多大”的钥匙。这里有个常被初学者忽略的点一组向量张成的空间其维度并不一定等于向量的个数。比如在一个平面上向量 a 和向量 2a 虽然有两个但它们只能张成一条直线因为第二个向量方向与第一个完全一样。这时候我们说这两个向量是线性相关的。在线性相关的条件下你手里虽然有两组数据但信息量并没有翻倍——冗余了。把“线性相关”这个概念放到实际工程里看就特别有感觉。假设你在做特征工程一口气构造了十多个特征结果发现有一半特征是另外几个特征的线性组合比如“面积 长 × 宽”是乘法关系不算但“总面积 客厅面积 卧室面积 厨房面积”就是严格线性相关。在这种情况下模型拿到的特征矩阵实际上是“不满秩”的奇异值会有一个或多个直接归零最小二乘解会不稳定训练出来的模型泛化能力也会变差。理解线性相关之后基和维度就顺理成章了。一个向量空间的基是一组线性无关的向量它们能通过线性组合表示空间里的任意其他向量。这个空间的维度就是基向量的个数。放到神经网络里你可以把每一层的“神经元数量”看作这一层特征空间的维度把网络要学习的权重矩阵看作在这个空间里做线性变换。这也是为什么 layer size 的选择如此重要——维度太低表达能力不足维度太高容易过拟合且计算开销大。1.3 内积、范数与相似度AI 里最常用的度量工具向量部分的另一个重点是内积和范数。内积是衡量两个向量“方向接近程度”的量内积越大两个向量方向越一致。范数则是衡量向量“长度”的量。这两个操作在 AI 里几乎无处不在。余弦相似度计算两个向量夹角余弦值本质是归一化后的内积常用于文本检索、推荐系统中的向量召回。L2 范数也就是向量的欧几里得长度做权重衰减Weight Decay时用的就是它。L1 范数各维度绝对值之和诱导稀疏性在特征选择和高维数据降维中很实用。我见过很多刚接触 NLP 的同学搞不清为什么 embedding 向量要做 L2 归一化之后再去算相似度。原因很简单两个向量本身的长度可能相差很大如果直接用内积比较长度大的向量天然占便宜而我们在语义相似度场景里通常只关心方向不关心向量长度。做完归一化之后两个向量的模长都是 1内积就等价于余弦相似度排序结果更干净。2. 矩阵AI 的高维变换器2.1 矩阵乘法的本质远比“行乘列”更重要进入第二章的核心地带矩阵正式登场。教科书会告诉你矩阵乘法的规则是“左行右列”逐项相乘再相加但我更愿意把矩阵乘法理解成一种“批量线性变换”一个矩阵左乘一个向量本质上是把向量从原来的空间映射到另一个空间——旋转、缩放、投影都是线性变换的具体表现。有一次我辅导一个入门的同学他发现神经网络的全连接层不就是一个“矩阵乘法 偏置 激活函数”吗为什么能拟合那么复杂的东西这个问题问得很好。关键在于多层矩阵乘法复合之后即使每一层本身是线性的中间穿插非线性激活函数后整个网络的表达能力就会从“单纯的线性变换”跃升为“可以逼近任意连续函数”。也就是说矩阵是网络的骨架激活函数是让它“活”起来的关键。从计算图的角度看矩阵乘法还有一层更实际的意义它在批量数据处理时可以充分利用张量并行。比如一批 64 张图片输入形状是 (64, 784)第一个全连接层的权重是 (784, 256)一次矩阵乘法就能把整批图片映射到 256 维的隐藏空间。这个运算在 GPU 上非常高效因为矩阵乘法天生适合并行输出的每一行、每一列之间互不依赖。这也是为什么几乎所有的深度学习框架都会把核心计算收敛到矩阵乘法上。2.2 逆矩阵、转置与求解线性方程组时踩过的坑矩阵部分的第二个重点是逆矩阵与线性方程组求解。方程 Ax b 在几何上可以理解为寻找一个向量 x使得经过矩阵 A 线性变换之后刚好落到 b 的位置。如果矩阵 A 可逆两边左乘 A⁻¹ 就能解出 x。但实际操作中A 不可逆、接近奇异或者维度很大的情况太常见了直接求逆并不是一个好主意。我在实际工程项目里踩过不少次跟求逆有关的坑。最典型的是用正规方程求解线性回归参数的最优解是 (XᵀX)⁻¹Xᵀy。这个公式看起来简洁但一旦特征维度很高或者特征之间存在共线性XᵀX 就会接近奇异。此时直接求逆的结果数值上会非常不稳定——参数绝对值可以变得极大稍微加一点噪声解就面目全非。这背后涉及到一个重要概念条件数。它衡量的是输入微小的扰动会导致输出产生多大的变化。条件数很大时矩阵“病态”哪怕数据只有一位小数的误差计算结果可能完全不可信。遇到这种情况常规方案是改用岭回归加一个小的惩罚项让 XᵀX 变成 XᵀX λI或者用 SVD 做伪逆而不是硬着头皮求逆。这里顺便说一个做代码实现时的常见误区很多人在 numpy 里习惯用np.linalg.inv去算逆矩阵但求解线性方程组更推荐用np.linalg.solve。solve底层用的是 LU 分解数值稳定性和效率都优于显式求逆。显式求逆只在极少数需要“拿到逆矩阵本身”的场景才合适比如某些推导过程或理论分析。2.3 矩阵的秩与信息量矩阵的秩是这一章里最容易被低估的概念。秩衡量的是矩阵行或列中线性无关向量的最大数量通俗讲就是“这个矩阵里真正有效的信息维度有多少”。秩满意味着没有冗余秩亏说明信息折叠在了一起。在机器学习中秩的概念帮你理解为什么“数据降维是可行的”。一堆高维数据比如 1000 维的文本向量如果它们的秩远小于 1000说明数据实际分布在一个更低维的子空间中。这种情况下用 PCA 或 SVD 把它压到 200 维损失的信息往往很小却带来了显著的计算加速和去噪效果。理解了秩你就能明白降维不是“玄学”而是在利用数据本身的结构特点。3. 特征值与特征向量打开矩阵内部结构的钥匙3.1 特征值到底在“特征”什么第二章的后半部分通常会重点讲特征值与特征向量。定义很简单对矩阵 A如果存在非零向量 v 和标量 λ使得 Av λv那么 λ 是特征值v 是对应特征向量。但很多人记了这个公式却不知道它到底意味着什么。我的理解方式是这样特征向量是矩阵线性变换下“方向不变”的向量特征值则是这个方向上被拉伸或压缩的比例。想象一块橡皮泥往不同方向拉它会变形总有几个方向上只被拉长或压缩方向本身没有改变这几个方向就是特征向量的方向拉伸的比例就是特征值。这个视角放到数据里非常有用。协方差矩阵的特征分解是 PCA 的理论基础。PCA 做的事情本质上就是找到数据变化最剧烈的几个方向特征值最大的特征向量方向把原始数据投影到这些方向上从而用更少的维度保留尽可能多的方差信息。在我做过的特征压缩项目里把几百维特征降到五十维模型效果反而提升正是因为降维去掉了大量噪声维度让信噪比更高。3.2 从特征分解到 SVD为什么 SVD 才是真正的全能选手这里必须强调一个重点特征分解只对方阵适用而 SVD奇异值分解对任意矩阵都能做。现实中的大多数数据矩阵都不是方阵比如用户-物品评分矩阵用户数 m物品数 n这时候特征分解无能为力SVD 就派上了用场。SVD 把任意矩阵 A 分解为 UΣVᵀ其中 U 和 V 是正交矩阵Σ 是奇异值按从大到小排列的对角矩阵。奇异值的大小代表了对应方向上矩阵作用力的强弱。拿奇异值分解去做截断只保留前 k 个最大的奇异值及对应的左右奇异向量就得到了一个低秩近似矩阵。这个操作在推荐系统里对应隐因子模型的核心思想用户和物品的评分矩阵可以通过低秩近似找到潜在特征。除了推荐系统SVD 在图像压缩里的应用也很经典。一张灰度图片是一个矩阵对它做 SVD 后保留前若干个奇异值再重建出来的图片依然能保留大部分结构信息但存储量大大减少。我曾经拿一张 512×512 的图片做实验保留前 50 个奇异值图片肉眼几乎看不出明显损伤数据量却从 26 万多个元素降到了大约 5 万个。这种“压缩感”不是玄学而是数学结构在起作用。3.3 谱范数与深度学习的稳定性这一章如果深入一点还会触及谱范数。谱范数其实就是矩阵的最大奇异值它刻画了矩阵作为线性变换时最大的“拉伸倍数”。在深度学习中谱范数的作用体现在稳定性和泛化性上比如生成对抗网络里常见的谱归一化就是约束判别器网络的 Lipschitz 常数通过强制每一层权重矩阵的谱范数不超过某个阈值让训练过程更稳定避免判别器“学得太快”而把生成器逼入死角。我当时第一次看到谱归一化时回头翻线代第二章才意识到这些看起来高级的东西底层还是特征值和奇异值那套体系。所以这一章真的不是“过时理论”它是现代模型设计的基石之一。4. 实操用 Python 把这一章“跑”起来4.1 基础向量与矩阵操作这一章只看不练是绝对记不牢的。我的建议是每学一个概念马上用代码验证。下面是我的常用练习方式。import numpy as np # 定义一个向量和一个矩阵 v np.array([1, 2, 3]) A np.array([[1, 2], [3, 4]]) # 矩阵乘法 w np.array([1, 0]) result A w print(A w , result) # 转置 print(A.T , A.T) # 内积与范数 a np.array([1, 0, 0]) b np.array([0, 1, 0]) print(内积 , np.dot(a, b)) print(L2范数 , np.linalg.norm([3, 4]))这些操作建议手动推一遍再跑尤其是矩阵乘法我会先在纸上算一遍A w得到[1, 3]再让代码输出对比。只有“纸笔推导结果”和“代码输出结果”对上了才算真正理解。这个习惯可以帮你避开很多“代码能跑但不知道在算什么”的假掌握状态。4.2 用 Numpy 验证特征分解与 SVD做特征分解和 SVD 的实操时有几个极容易踩的坑想重点提醒。第一np.linalg.eig返回的特征向量矩阵中每个特征向量对应哪一列要分清楚。返回值的第二项是一个矩阵它的每一列是对应的特征向量而不是每一行。很多人第一次用的时候取错了维度导致后续计算全部对不上。第二特征向量的符号是不确定的。一个特征向量乘以 -1 仍然是特征向量不同版本的 LAPACK 实现可能给出完全相反的符号。你在验证特征分解时不要指望两次运行结果完全一致要验证的是A v ≈ λ * v这个等式是否成立。第三np.linalg.svd返回的 V 是转置后的 Vᵀ不是 V。我自己当初在这个细节上翻过车代码写着np.linalg.svd(A)然后直接去拿 V结果维度对不上还以为是 SVD 理解错了。其实文档写得很清楚但急躁的时候就是会忽略。下面是一个 SVD 重建图片的验证代码值得自己动手跑一遍import numpy as np from sklearn.datasets import load_sample_image image load_sample_image(china.jpg) # 转成灰度方便直接当矩阵处理 gray image.mean(axis2) U, S, Vt np.linalg.svd(gray, full_matricesFalse) # 只保留前 k 个奇异值 for k in [10, 30, 80]: approx (U[:, :k] * S[:k]) Vt[:k, :] print(fk{k}, 原图尺寸{gray.shape}, 保存元素数{U[:,:k].size S[:k].size Vt[:k,:].size})这个例子做完之后你对“低秩近似”的理解会远超死读书的效果。这里再提醒一个细节U[:, :k] * S[:k]等价于U[:, :k] np.diag(S[:k])这是利用了 numpy 的广播机制把奇异值按列乘到 U 的每一列上。如果不熟悉广播建议先显式用对角矩阵做乘法逻辑更清楚不容易出错。4.3 求解线性方程组与正规方程对比在线性回归场景下试着对比三种求解方式的效果X np.random.randn(100, 5) true_w np.array([1, -2, 3, 0, 4]) y X true_w 0.1 * np.random.randn(100) # 方法1正规方程直接求逆 w_inv np.linalg.inv(X.T X) X.T y # 方法2使用 solve w_solve np.linalg.solve(X.T X, X.T y) # 方法3使用 lstsq底层走 SVD w_lstsq, *_ np.linalg.lstsq(X, y, rcondNone) print(w_inv) print(w_solve) print(w_lstsq)当特征之间出现强相关性时方法1可能给出数值上明显异常的结果方法2相对稳定方法3最稳。我在实际工程中默认用lstsq或solve尽量避免显式求逆。这不是说求逆不能用而是说它对数值稳定性要求更高在随手写的分析代码里没必要冒这个风险。5. 学这一章的常见盲区与避坑指南5.1 只背公式不建立几何直觉我观察过很多初学者最典型的问题是把这一章学成了“公式背诵课”。特征值、特征向量、内积、范数都能背下来但一遇到实际问题完全不知道用哪个。原因就在于缺少几何直觉。建立直觉最快的方法是画图。比如二维空间里随便取两个线性相关的向量你会发现张成的空间永远是一条直线取两个线性无关的向量张成的空间是整个平面。把这个图看明白你对“秩”“生成空间”“维度”这几个概念的理解会直接上一个台阶。我之前就是这么做的在纸上画了几个例子之后再看抽象的 n 维空间内心就不再发怵。5.2 忽略数值计算细节这一章的纸上推导是理想化的实数运算但放到计算机里浮点误差无处不在。最典型的例子一个理论的秩为 2 的矩阵在计算机里计算奇异值最小的那个奇异值可能不是精确的 0而是一个极小的数如 1e-15。新手很容易拿着这个数去判断“不满秩”从而误判数据存在严重共线性。我的经验是判断数值问题不要用绝对标准要看奇异值之间是否有数量级的断崖。如果最大的奇异值是 100最小的奇异值是 1e-15那基本可以认定矩阵数值上是奇异的但如果奇异值是 130、3、1.2哪怕最小的只有 1.2矩阵大概率还是良态的不应该轻易做降维或删除特征的处理。5.3 忽视形状Shape带来的挫败感另一个让新手崩溃的问题是张量形状不匹配。明明矩阵乘法规则背得滚瓜烂熟一写代码就报 shape 错误。这里我给一个最实用的检查方法写代码之前先把两个张量的形状标注出来比如 A 的形状是 (3, 4)B 的形状是 (4, 2)那么 A B 的结果一定是 (3, 2)。心里有这个预期再对照代码里的.shape输出大多数维度错误都能提前发现。深入一点说深度学习里频繁出现的维度变换比如从 (batch, seq_len, hidden) 变成 (batch, hidden, seq_len)本质上还是矩阵转置和矩阵乘法那套规则。你把第二章的矩阵乘法吃透了这些操作就不会再成为拦路虎。5.4 工具选择与练习路线建议最后聊聊学习工具。纸上推导我推荐用简单的网格纸手动做一次 3×3 矩阵乘法比盯着屏幕看十遍都有用。写代码验证用 Python 的 Numpy 就足够不用一上来就上 PyTorch 或 TensorFlow先把数学工具的用法掌握扎实。可视化方面低维向量可以用 Matplotlib 的箭头来画感受一下内积正负、向量加减的几何效果这种直观经验很难替代。练习路线上我建议每学完一个概念自己给自己出一个小问题比如“给定三个向量判断它们是否线性相关并说明理由”然后用代码验证。等到特征值、SVD 学完再去找一份公开的数据集试着做一次 PCA 可视化把高维数据降维到二维观察聚类结构。整个过程走下来你不仅学会了这一章的知识还提前掌握了实践中最常用的降维方法。我现在带新人时几乎都会让他们先把这一章的每道课后习题亲手推一遍、写代码验证一遍不允许直接抄答案。因为这一章是后续所有模型原理的共同地基地基建得不牢后面学 Transformer、学卷积、学生成模型都会反复回来补课。把这一章啃下来后面的路会顺畅很多。