资讯动态

深度学习中的线性代数:从矩阵到SVD的实战笔记

发布时间:2026/10/22 6:06:34 来源:尧图企业网站定制
说实话我最初读这本《深度学习》教材的时候是从第三章直接开始的。当时觉得第二章线性代数属于本科早就学过的东西无非是矩阵乘法、逆矩阵、特征值那点事翻一翻标题就直接掠过了。直到后来在项目里接连碰壁——为什么PCA要用SVD算而不是直接求协方差矩阵的特征值为什么L2正则化让权重均匀变小而L1会直接把一堆参数砍到零为什么设计矩阵一出现线性相关最小二乘解就整个崩掉回头重新翻书才发现这些问题的钥匙全部躺在第二章里。这篇笔记就是我在重新细读Goodfellow《深度学习》第二章线性代数时真正看懂的、以及第一次略读时完全没意识到的内容。适合两类人一是学过线性代数但没把它跟深度学习串起来的读者二是刚开始读这本教材、总担心数学地基不稳的朋友。我会按章节的底层逻辑而不是教材原文顺序来梳理重点讲每个概念到底为了解决什么问题、在后面的神经网络里长什么样文末还会附上我自己踩过的三个坑和最小知识清单方便你对照检查。1. 第二章到底在讲什么一张地图胜过十次硬啃1.1 这本书为什么把线性代数放在最前面很多人会觉得这是一个“惯例”——所有理工科教材都要先讲数学基础。但《深度学习》这本教材的编排不是走形式它后面的每一章内容都会反复回来调用第二章的概念。你可以这么理解第一章绪论给你描述深度学习的愿景而从第二章开始到第四章概率与信息论、数值计算本质上是在给你搭建一套描述神经网络的“语言系统”。为什么偏偏是线性代数因为神经网络这个模型从数据表示到运算过程全部长在线性代数上面。一条样本通常被表示成一个特征向量一批样本叠起来就是一个矩阵全连接层做的是矩阵乘法加偏置卷积层在做一组局部线性相关运算反向传播计算梯度时要处理一批雅可比矩阵。更不用说线性回归本身就是最纯粹的线性代数问题逻辑回归是线性变换套了一个非线性激活。你要是把这一章的矩阵语言掌握了后面看网络结构图就像看电路图一样自然要是跳过后面随时可能因为一个特征值、一个奇异值、一个秩的概念卡住然后再回来补效率反而更低。我在实际带人的时候发现一个规律能顺利读完后面优化、正则化、PCA这些章节的人几乎都有同一个特征——他们能把第二章的公式翻译成“这个矩阵在做什么运动”“这个解在什么情况下存在”而不是停留在“会算”的层面。1.2 第二章各小节其实在逐层回答三个问题教材的章节顺序是标量向量矩阵张量、矩阵和向量相乘、单位矩阵与逆矩阵、线性相关与生成子空间、范数、特征分解、奇异值分解、Moore-Penrose伪逆、迹运算、行列式。中文版个别小节顺序略有调整但主线完全一致。如果把这十个小节串成一个故事它其实在回答三个逐层递进的问题。第一个问题怎么把现实问题写成矩阵的形式这是前三节解决的。你要能够把数据、权重、运算过程用人话翻译成“某个矩阵乘以某个向量”。许多人觉得这不难实际上后面很多困惑都出在第一步——搞不清楚哪个维度是特征、哪个维度是样本、权重矩阵的行列数分别是什么。第二个问题这个矩阵方程到底有没有解有几个解这是第四节“线性相关与生成子空间”的核心。很多做机器学习的人到后面才痛苦地发现自己用最小二乘拟合出来的“解”可能根本就不是唯一解而是无数个解里面被某个算法挑中的一个。教材在这里讲轶、讲生成子空间就是为了让你判断方程组是欠定、超定还是恰好确定。第三个问题解不出来的时候怎么办矩阵结构怎么理解第五节到第十节全部在回答这件事。范数告诉你怎样才算“接近”特征分解和奇异值分解告诉你如何把一个矩阵拆成容易理解的成分伪逆则专门处理“没有逆矩阵”的场合。这三件事在深度学习中几乎无处不在范数对应损失函数和正则化特征值和奇异值对应数据降维与网络压缩伪逆对应线性最小二乘问题。我自己重读时最大的感触是这一整章不是教你背定义而是在教你一种“退化思维”——矩阵可能不可逆方程组可能没有精确解数据可能存在冗余。深度学习里的绝大多数技巧本质上都是在和这种“不完美”共处。有了这个视角后面的内容理解起来会顺很多。2. 矩阵乘法不是“行乘列”而是把向量从一个空间搬到另一个空间2.1 从几何直觉理解矩阵乘法本科阶段学矩阵乘法老师教的是“左行右列”的手算规则考试也是这么考的。但如果你只记住这个规则后面读深度学习时会非常吃亏因为你根本不知道一个权重矩阵W乘以输入x之后数据到底被“做”了什么。更本质的视角是每个矩阵都定义了一个线性映射把输入空间中的一个向量送到输出空间中的另一个向量。矩阵的每一列恰好是输出空间中基向量被映射过去之后的样子。我举一个最简单的例子假设A [[2, 0], [0, 3]]。用A乘以任意向量(x, y)得到的(2x, 3y)x方向被拉长了2倍y方向被拉长了3倍。此时矩阵的两列分别是(2,0)和(0,3)正好对应x轴和y轴被映射后的位置。这种“把矩阵的列看成基向量的归宿”的习惯建议从一开始就建立起来。另一个经典例子是旋转矩阵R [[0, -1], [1, 0]]。它的第一列(0,1)说明原来的x轴基向量被转到了y轴方向第二列(-1,0)说明y轴基向量被转到了x轴负方向。乘以这个矩阵的效果就是整体逆时针旋转90度。你看只要抓住“列向量去向”这个线索矩阵作用就不再是抽象的符号运算而是一个非常具体的几何动作。放到神经网络里全连接层y Wx b做的事情就是先把输入向量做一次线性变换映射缩放旋转再加上一个平移b。训练网络的过程就是在学习这个线性变换的参数。你把W的每一列理解成“输入某个特征形成后如何影响输出的每个神经元”很多关于权重可视化的文章就会很容易看懂。2.2 线性方程组 Ax b 的“列组合”视角矩阵乘法还有一个等价的解读方式结果向量其实就是A的各个列向量按x的各个分量加权求和。比如A是一个3×2矩阵列向量分别是a1、a2乘以x (x1, x2)结果是x1·a1 x2·a2。也就是说Ax的结果一定落在“A列向量所能张成的所有加权组合”里面。这个视角直接决定了Axb有没有解。当你问“是否存在x使得Ax得到b”的时候本质上是在问“b这个向量能不能被A的列向量们组合出来”。如果能x就是解如果不能就无解。这个“组合出来”的空间教材里叫作生成子空间。这也是为什么我一直建议初学者不要死记“矩阵乘法规则”而是多想想列组合——它才是线性方程组有解无解判断的根基。实际项目里最常见的情况是数据矩阵Xm×n远不是方阵。样本数m通常远大于特征数n这时Xwy本质上是一个超定方程组绝大多数时候不存在精确解。为什么机器学习还是要硬着头皮去求一个w因为我们放弃“精确解”改求“误差最小的解”。这就是后面第6节伪逆、以及最小二乘法的由来。如果你一开始就从列组合视角理解了“无解”是常态后面理解损失函数就会特别顺畅——损失函数就是在度量“我们距离精确解还有多远”。2.3 逆矩阵的几何含义一个变换能被撤销吗教材在介绍单位矩阵和逆矩阵时会给出AA⁻¹ A⁻¹A I这样的代数定义。代数上很简单但几何上更有意思A的作用是把向量从一个空间映射到另一个空间A⁻¹的作用是把被映射过去的向量再“还原”回来。也就是说逆矩阵就是“撤销”操作。那什么情况下撤销不了一个直观例子如果A把x轴和y轴同时映射到了同一个方向上也就是两个列向量线性相关那么映射之后的信息就已经发生了合并两个不同来源的输入会变成同一个输出这时候没有任何一个线性变换能把这些混合的信息重新拆开。这就是“不可逆”的本质——信息丢失了。理解了这一点你就不会再把“矩阵可逆”单纯理解成一个代数性质而是一个关于信息保真度的几何性质。后面遇到正则化、权重衰减时你会看到它的另一次出场当数据矩阵不可逆或病态时我们加一个小的惩罚项本质上是往对角线上“塞”一点额外信息让原本丢失的方向重新变得可以被分辨。矩阵乘法不满足交换律这个结论教材里会提但很多人在初学时会觉得只是规则。用几何直觉就特别自然先旋转90度再沿x轴拉伸和先沿x轴拉伸再旋转90度得到的结果当然不同。两个变换的复合顺序改变了作用效果必然改变。这个“顺序敏感”的特性在后面理解网络层的顺序、理解卷积核顺序、甚至理解BN层放在激活之前还是之后时都会反复出现。3. 线性相关、秩与方程组的解欠定和超定不是玄学3.1 生成子空间与基一群向量能“走到”哪里教材第四节引入了生成子空间的概念一句话说就是给定一组向量所有能用它们的线性组合得到的向量共同构成一个空间。这个空间是这群向量“能到达的所有地方”。如果一组向量中某个向量可以被其他向量表示出来那它对生成子空间就没有任何贡献这就是线性相关。反过来如果每个向量都无法被其余向量表示它们就是线性无关的这时候它们构成这个空间的一组基。基的重要性在于同一个空间里每个向量用它来表达时表达方式是唯一的。把这句话翻译到机器学习场景假设你收集了一批样本数据每条样本有n个特征。如果其中一个特征恰好是另外两个特征的线性组合那你的数据矩阵实际上是“缺秩”的。这时你用这些特征去做线性回归看起来你有n个未知数实际上有效自由度没有那么多解要么不存在要么有无穷多个。这就是线性代数在数据预处理阶段最重要的一次出场。3.2 秩、行列式与解的存在唯一性判据教材很快就引入了秩的概念矩阵的秩就是它的列向量张成空间的维度。秩告诉我们这个矩阵映射之后输出空间真正占用了多少维。对于方阵还有个简明的判据工具——行列式。行列式不为零矩阵可逆方程组Axb对任意b都有唯一解行列式为零矩阵不可逆方程组要么无解要么有无穷多解。我把各种情况的组合整理成一个表方便你对照情形解的情况直观理解A为方阵且det(A)≠0任意b都有唯一解xA⁻¹b变换不丢信息可以完整撤销A为方阵且det(A)0与b有关无解或无穷多解变换把某些方向压扁了信息丢失方程数多于未知数mn一般无精确解只能求近似解约束太多不存在同时满足所有等式的解未知数多于方程数mn一般有无穷多解约束太少多余自由度无法确定b不在A的列空间中无解b无法由A的列向量组合出来这里有个很多人容易忽略的细节欠定和超定并不直接决定有没有解解是否存在还要看b是否落在列空间里。比如一个2×3的欠定方程组如果b恰好落在A的两个独立列张成的平面上那就存在精确解只不过解不唯一。实际做线性回归时我们通常面对的是超定系统——样本数远大于特征数这时最常见的情况是b根本不在列空间里于是才有了“最小二乘意义上最优”的说法。3.3 数据特征线性相关时发生了什么一个numpy小实验空谈不如动手。我用一个最简单的例子演示特征线性相关带来的问题构造一个数据矩阵X其中第二列是第一列的两倍。此时X的秩应该是1而不是2。import numpy as np # 生成50个样本2个特征第二个特征是第一个的2倍 x1 np.random.randn(50, 1) x2 2 * x1 X np.hstack([x1, x2]) # 真实权重 true_w np.array([1.5, -0.5]).reshape(-1, 1) y X true_w 0.01 * np.random.randn(50, 1) print(矩阵X的秩:, np.linalg.matrix_rank(X)) print(X^T X的条件数:, np.linalg.cond(X.T X))运行结果通常是秩为1条件数极大超过1e16。为什么条件数这么大因为XᵀX这个矩阵理论上不可逆数值计算只能算出“看起来可逆但实际上极其敏感”的结果。这种矩阵在数值上叫作病态矩阵你轻微扰动一下y求出来的权重就会翻天覆地。这时候L2正则化就出手了。你把优化目标从最小化‖Xw-y‖²改成最小化‖Xw-y‖² λ‖w‖²本质上是在XᵀX的对角线上加了一个正数λI把病态矩阵变成良态的。这也是为什么我在做特征工程时有个习惯发现条件数异常大先去查特征之间是不是有近乎线性的冗余再决定是删冗余特征还是上正则化。这个经验后面在第7节还会再提到。4. 范数长度定义决定了优化后的“形状”4.1 从“向量长度”到“可以度量的空间”范数这个概念教材给的定义是满足非负性、齐次性、三角不等式的一类函数。简单说它就是给向量一个“大小”的度量方式。普通人最熟悉的是L2范数也就是欧氏距离L1范数则是把每个分量的绝对值加起来。这两者在深度学习里太常出现了损失函数中的误差项、正则化项、距离度量全都要靠范数来定义。为什么需要多种范数因为不同场景对“大小”的定义不同。L2范数强调整体的欧氏距离它对大的分量惩罚更重L1范数对每个分量的惩罚是线性的不会因为某个分量特别大而急剧增加。Frobenius范数则把向量上的概念扩展到矩阵把矩阵所有元素的平方和开根号它是衡量“矩阵整体大小”的常用工具。我记得第一次看神经网络训练代码时看到weight_decay参数是0.0001这种极小值心里还疑惑过为什么惩罚项可以这么小。后来才明白这是因为L2范数在零附近梯度很平缓大权重被拉回来之后再继续收缩的动力会减弱所以即使系数很小长期训练也能保持权重在一个合理范围。理解了这一层你就不会再去盲目调大权重衰减系数了。4.2 为什么L2让权重均匀收缩、L1逼出稀疏性这是范数部分最值得深挖的一个点也是教材在正则化章节里会回头引用的结论。看梯度行为就能明白一大半。L2范数的平方对权重w求梯度是2w这意味着每个权重受到的“拉力”和它当前的大小成正比。权重越大被拉回得越狠权重越小被拉回得越轻。所以L2正则化不会强迫任何一个权重变成严格的零而是把所有权重整体往零的方向均匀收缩——大权重缩得多小权重缩得少。L1范数的情况完全不同。它对w的梯度在w0处不存在左右导数分别是-1和1在w不为0时是符号函数sign(w)。这意味着它给每个非零权重施加的拉力是恒定大小的不管权重是0.1还是10都会被用同样力度往零推。于是优化过程很容易把一个权重一路推到零点然后在零点“卡住”——因为越过零点会改变符号而改变符号通常会带来更大的损失。最终结果就是大量权重精确地变成0特征变得稀疏。我再用几何直觉补一刀。在带约束的最小化问题中解的落点是损失函数等高线和约束区域的切点。L2约束是圆形等高线椭球和圆形相切一般发生在坐标轴之外的某个位置所以切点处的权重各分量通常都不为0L1约束是菱形菱形的顶点在坐标轴上当等高线一旦触到角点解就直接落在坐标轴上对应分量为0。这就是“L1出稀疏L2不出稀疏”最直观的解释。对比维度L2正则化L1正则化罚项形式w各项的平方和w各项绝对值之和梯度行为梯度2w与权重大小成正比梯度sign(w)恒定拉力对权重的效果均匀收缩但极少精确到0可将一部分权重精确推为0适用场景防止过拟合、希望保留全部特征特征选择、压缩模型、解释性优先常用叫法权重衰减、岭回归Lasso实际项目中怎么选我的经验是如果特征数量中等、且都有可能是有效特征优先L2它的训练更稳定如果特征很多、怀疑大量特征是噪音或者你希望模型能自解释那就上L1。当然也可以同时用两者的组合即弹性网先L1选特征、再L2稳住整体这是后话。4.3 范数在损失函数里的日常用法除了正则化范数最直接的应用就是损失函数本身。回归问题的均方误差本质上是残差向量L2范数的平方除以样本数而平均绝对误差则是残差L1范数除以样本数。L2对离群点非常敏感因为误差被平方了一个异常值能拖动整个模型L1虽然鲁棒但在零点处导数不可导给优化带来一点麻烦。我在实践里通常会根据数据质量来选。数据干净、离群点少无脑MSE数据噪声大、有明确离群点换成MAE或Huber损失会更稳。这是把范数理解从“算长度”推进到“决定模型对不同误差的态度”的一个例子。后面读深度学习优化章节时你会发现几乎所有目标函数都可以表述成“某个范数某个正则项”的结构所以现在把范数的性质吃透等于给后面省了很多功夫。5. 特征分解与奇异值分解降维的两把钥匙怎么选5.1 特征分解找“只拉伸不转动”的方向特征值和特征向量这一节我初读时只是把它当成一个代数操作解|A-λI|0找到λ和v满足Avλv。现在回头看真正重要的是那个几何直觉——特征向量就是矩阵作用下方向保持不变的方向特征值就是这个方向上被拉伸或压缩的倍数。为什么这个信息极其重要因为一个矩阵即使看起来很复杂只要找到它的特征向量和特征值就能把它拆解成一个很清晰的结构在特征向量的方向上做独立的缩放在其他方向上等价于这些缩放的组合。教材里把这种分解写成A QΛQ⁻¹Q是由特征向量组成的矩阵Λ是对角线上放着特征值的对角阵。这里面有个前提条件A必须有足够多的线性无关特征向量这在一般情况下并不总是成立。于是教材顺势把话题引向一个特殊的矩阵类——对称矩阵。5.2 为什么对称矩阵在机器学习里这么受偏爱对称矩阵A Aᵀ在机器学习和数据科学中太常见了协方差矩阵是对称的格拉姆矩阵是对称的邻接矩阵很多也是对称的。对称矩阵有两项特别美好的性质一是它的所有特征值都是实数不像普通矩阵那样可能出现复数特征值这让它天然适合做实数域上的分析二是不同特征值对应的特征向量互相正交也就是说存在一组标准正交基可以把矩阵分解成非常干净的QΛQᵀ形式。这个性质最直接的应用就是PCA。数据矩阵X的协方差矩阵是XᵀX的缩放版它是一个对称半正定矩阵所以它的特征值都大于等于0对应的特征向量就是数据的主要变化方向。特征值越大说明这个方向上的方差越大也就是信息量越多。PCA做的事情本质上就是把数据旋转到这些主方向上然后只保留前几个最大特征值对应的方向。这里要特别提醒一个初学时的常见误区协方差矩阵的特征分解并不是数值上做PCA的首选方式。因为通过XᵀX这一步会平方数据的条件数让数值稳定性变差。更稳妥的做法是直接对中心化后的数据矩阵做奇异值分解。这就是SVD在PCA中的真正位置——不是替代特征分解而是提供了一条更稳的路径。5.3 SVD没有被“方阵”和“可对角化”卡住的分解奇异值分解不像特征分解那样要求方阵它对任意m×n矩阵都适用。教材给出的形式是A UDVᵀ其中U是m×m正交矩阵D是m×n对角矩阵V是n×n正交矩阵。如果你从行空间和列空间的几何关系理解它SVD的本质是任何矩阵都可以被拆成“旋转-按轴缩放-再旋转”三个步骤U和V就是那两个旋转/正交变换D就是沿新坐标轴上的缩放比例。矩阵分量维度实际含义Um×m输出空间的一组标准正交基列向量是左奇异向量Dm×n对角元素是奇异值表示各方向的缩放强度Vᵀn×n输入空间的一组标准正交基行向量是右奇异向量奇异值越大说明数据在这个方向上覆盖的“能量”越多。降维操作就是保留最大的k个奇异值、同时丢弃U和V中对应的列和行得到一个低秩近似矩阵。这个近似在Frobenius范数意义下是最优的也就是说它是“丢掉最少信息换维度”的数学上最优解。我在做数据预处理时最常用的场景是先用SVD看一下奇异值分布。如果后几个奇异值几乎为0说明原始数据本身就有严重的线性冗余这时候你可以放心地做降维或特征筛选如果奇异值分布很平缓那说明每个方向都承载着重要信息强行降维会丢东西。这个判断做法比单纯看方差解释率要更扎实。5.4 实际对比对同一份数据做特征分解和SVD为了把特征分解和SVD的关系讲透我用一个简单的二维数据例子说明。假设有一批中心化后的二维数据你想知道第一主成分的方向和方差占比。import numpy as np # 生成200个二维数据点带有一定的相关性 rng np.random.default_rng(42) X rng.multivariate_normal([0, 0], [[2, 1.5], [1.5, 1]], size200) # 零均值化 Xc X - X.mean(axis0) # 方法一协方差矩阵的特征分解 cov np.cov(Xc, rowvarFalse) eigval, eigvec np.linalg.eigh(cov) idx np.argsort(eigval)[::-1] print(特征值:, eigval[idx]) print(特征向量:\n, eigvec[:, idx]) # 方法二直接对数据矩阵做SVD U, s, Vt np.linalg.svd(Xc, full_matricesFalse) var_ratio s**2 / (s**2).sum() print(奇异值:, s) print(方差解释占比:, var_ratio)两种方法得到的主方向一致但注意特征分解的方差解释率需要拿特征值去除以特征值总和而SVD直接拿奇异值平方除以奇异值平方总和就行不需要显式构造协方差矩阵。这背后其实是数学上的一个等价关系X的奇异值平方等于XᵀX的特征值。包括教材后面讲到PCA时也提示实践中推荐用SVD而不是构造协方差矩阵就是因为这样可以绕开大矩阵相乘带来的数值精度损失。这个小例子值得你自己跑一遍跑完之后特征分解和SVD的关系应该会清晰很多。6. 伪逆、迹运算与行列式看似边角料却反复出现6.1 Moore-Penrose伪逆当“撤销”不可能时求最优近似逆矩阵要求矩阵必须是可逆方阵这限制太大。深度学习里大量矩阵都不是方阵或者即使方阵也缺秩。伪逆的出现就是为了扩展“逆”这个概念让求逆操作在不可逆或非方阵的情况下也有一席之地。Moore-Penrose伪逆定义下的A⁺可以说是一个“最小二乘意义下的逆”当Axy无解时x A⁺y给出的解是使‖Ax-y‖最小的解当方程有无穷多解时它给出的是其中范数最小的那个。这两种情况对应的是超定和欠定伪逆都给出了一个“最合理”的回答。计算方式也很漂亮对A做SVDA UDVᵀ然后把D中对角线上的非零奇异值全部取倒数、再转置维度得到D⁺最终A⁺ V D⁺ Uᵀ。我当年在项目里第一次被伪逆救回来是处理一个线性回归模型设计矩阵里有若干个几乎完全共线的特征XᵀX不可逆直接求逆会报错。后来改用np.linalg.pinv(X.T X) X.T算系数问题就解决了。虽然实际机器学习项目中我们很少手写这种公式但理解伪逆能帮你读懂很多“稳健求解”的底层逻辑比如在最小二乘问题里为什么有些库不给逆矩阵反而给伪逆。6.2 迹运算一条在推导中省很多事的规则迹运算就是方阵对角元素之和。单独看没什么特别的但它有一个极具威力的性质——循环置换不变性Tr(ABC) Tr(BCA) Tr(CAB)。这意味着在推导中你可以把矩阵乘积的顺序打乱只要保持循环次序结果不变。这个性质在推导机器学习目标函数关于参数的梯度时极其好用。举一个具体的例子Frobenius范数的平方‖A‖²_F Tr(AAᵀ) Tr(AᵀA)。利用这个等价关系你可以把关于矩阵的范数问题转化成迹运算然后用“对迹求梯度”的方式得到非常优雅的梯度表达式。另一个常见场景是推导线性回归的解析解目标函数Tr((Xw-y)ᵀ(Xw-y))对w求导并令导数等于0得到的正态方程XᵀXw Xᵀy。整个推导里迹运算是核心工具没有它你会被困在一堆分量的下标里。6.3 行列式体积缩放率为何能进入概率密度行列式在本科课堂上的定义往往是从代数余子式计算开始的这导致很多人对行列式只有计算没有直觉。实际上行列式最好的理解方式是矩阵作用在空间上时体积的缩放因子。一个2×2矩阵作用在单位正方形上行列式的绝对值就是变换后平行四边形的面积3×3就是体积比。这个“体积缩放”的含义在深度学习的几个角落特别突出。比如生成模型中的标准化流normalizing flow它们需要计算一个可逆变换的雅可比行列式用来把概率密度从一个空间变换到另一个空间时做修正。变换行列式为0的地方意味着空间被压缩成了退化形状概率密度会爆炸这正是数值不稳定的来源。另外在深度学习优化里二阶优化方法使用海森矩阵当海森矩阵行列式特征值乘积接近0时牛顿法就会失效这跟“矩阵不可逆”是同一个故事。所以别把行列式当成一个只出现在考试里的量。你在调试一个生成模型时神游到的“概率怎么会突然变成无穷大”往往就能从行列式的退化里找到线索。7. 读这章时最容易绊倒人的三个坑外加一份通关清单7.1 我用三个月才绕出来的三个误区第一个坑把SVD和特征分解当成一回事。我早期看很多文章混着用自己写代码时也随意替换直到一次处理非方阵数据时发现特征分解根本没法用、而SVD毫无障碍才认真去补两者的区别。特征分解要求方阵且特征向量未必正交SVD对任意矩阵适用U和V一定是正交矩阵。两者在对称矩阵上有交集但在一般情况下是两套不同的分解工具。现在我的习惯是看到方阵且对称先想特征分解矩阵不是方阵或者你关心主方向的稳健性直接用SVD。第二个坑以为PCA一定要走协方差矩阵的特征分解。教材背后其实藏着数值计算上的考量。我踩坑时特征是几千维直接构造协方差矩阵非常浪费内存而且大矩阵求特征值还会放大数值误差。后来改成对中心化数据做SVD又稳又快。如果你在项目里发现PCA的结果在不同机器上差异很大优先怀疑是不是没用SVD。第三个坑没做零中心化就直接做PCA。这个问题看起来基础得不值一提但我真在项目里见过因此跑出完全错误主方向的情况。如果不先减去均值第一主成分很可能被整体均值方向主导而不是数据真正的变化方向。中心化之后SVD才对应协方差矩阵的特征分解所以这个前置步骤不是可有可无而是一个数学必要条件。除了这三个大坑我还要重复一次第3节里的经验处理表格数据时先看一下矩阵的条件数。条件数超过1e12特征之间基本就是线性相关了这时候你可以用SVD的奇异值分布来确认冗余再决定是删除冗余特征还是加正则化。这可以说是第二章内容在实际项目中回报率最高的一条经验。7.2 通关清单合上书之前先确认你能回答这些问题如果你读完这一章试着不看教材回答下面这些问题。能流畅答出来说明基础打牢了卡住的地方就是需要回看的地方。标量、向量、矩阵、张量分别在说什么一条样本和一个批量样本分别用哪种结构表示给定Axbb在什么条件下有解什么时候解唯一欠定和超定分别意味着什么为什么L1正则化会形成稀疏解而L2不会从梯度和可行域两个角度各解释一次。特征分解和SVD分别适用于什么形状的矩阵它们之间什么时候等价、什么时候不等价PCA的标准流程中为什么推荐用SVD而不是直接求协方差矩阵的特征分解伪逆给出的解具有什么样的最优性它适合超定问题还是欠定问题或两者都适合迹运算的循环置换性质如何帮你化简一个矩阵范数的梯度7.3 一个受益很久的自测习惯所有数学知识不落到代码里总感觉飘。我自己的做法是每读到一个公式就在旁边开一个ipython随手把公式翻译成numpy表达式然后对比数值结果。比如看到Av λv就随机生成一个矩阵用np.linalg.eig算特征值和特征向量再验证等式是否成立。看到SVD的低秩近似就拿一张真实数据矩阵做截断重构计算重构误差和奇异值占比的关系。这个习惯帮我省掉了大量“以为自己懂了、其实没懂”的时间。《深度学习》第二章的内容密度很高第一次读读得懵是非常正常的后面每次遇到问题回来翻都会有新的理解。我现在偶尔还会翻到这一章把某个公式和手头项目的某个具体问题对上号产生一种“原来当初那句话是这个意思”的感觉。希望这份笔记也能帮你少走一点我走过的弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑