首页 / 资讯中心 / 文章详情

AI底层原理:从向量矩阵到梯度下降与反向传播的数学逻辑

AI底层原理:从向量矩阵到梯度下降与反向传播的数学逻辑 ★ FEATURED ARTICLE
AI的底层原理听起来像是只有数学天才才能搞懂的东西但在我自己从“会调库”到“能改模型”的转变过程中最深的体会是真正拦住大家的往往不是公式推导而是不知道每个数学概念在训练过程中到底扮演什么角色。向量、矩阵、梯度和反向传播这些词单独拎出来每个都认识但拼在一起就不知道它们在干吗了。这篇文章我想把这些年吃透的东西掰开揉碎讲清楚——从AI的数学本质、训练机制的运转逻辑到实际训练中那些“早知道就好了”的经验。它适合两类人看一类是在用AI但想搞清楚“里面到底发生了什么”的开发者另一类是刚开始啃深度学习、需要一条清晰主线的初学者。1. 一张万能的函数拟合网AI的数学本质很多人第一次接触AI时容易被“神经网络”“深度学习”这些词吓到觉得里面藏着一套极其神秘的机制。剥掉这些术语外壳AI要做的事情其实用一句话就能概括找一个函数让它能把输入映射到正确的输出。1.1 从线性回归到神经网络一切都是函数逼近如果回到统计学的地基最简单的“AI”就是线性回归用一个直线方程y wx b拟合一堆散点。手写数字识别也好机器翻译也好抛开表面的复杂度本质上都是在做同一件事——函数逼近。只不过手写数字识别需要的是一个超高维的、极度扭曲的函数直线方程根本表达不了于是我们需要能表达更复杂形态的模型。神经网络就是干这个的。它不再只用一条直线而是把大量简单函数以特定结构组合在一起通过增加层数和每层的宽度获得逼近任意复杂函数的能力。这个性质在理论上有一个非常著名的支撑——万能近似定理只要隐藏层神经元数量足够多一个前馈神经网络就可以逼近任何连续函数。注意这里有前提是“理论上”。现实中受限于数据量、计算资源和优化难度真正能逼近到什么程度取决于训练好不好。1.2 为什么数学视角比代码视角更重要我见过不少同学学习AI是纯代码视角跑通了某个开源项目能改几行参数让效果变好一点但一旦遇到模型不收敛或者效果奇差便完全无从下手。原因很简单——代码写的是“怎么算”数学告诉我们“算的是什么”以及“为什么不收敛”。比如模型训练中损失函数不下降纯代码视角只能干瞪眼但如果你知道梯度消失这个概念就会想到反向传播时链式法则会把多个小于1的导数连乘导致靠近输入层的参数几乎学不到东西就知道要去检查网络深度、检查激活函数选择。模型训练过程中的每个决策——损失函数怎么选、学习率怎么设、层数怎么定——背后全是数学在提供依据。这也是我觉得这篇文章最值得读的部分你不是在学公式而是在补上做决策时缺的那块底图。2. 向量与矩阵神经网络里流动的语言一旦进入神经网络内部你立刻会发现里面的数据不是单个数字在流动而是成批成批的数字在同步运算。这就引入了AI世界里最基本的一套符号系统——向量和矩阵。2.1 特征向量一个样本的“多维身份”先从一个样本说起。假设我们要预测房价一个样本包含面积、卧室数量、地段评分这几个特征。拿Python表示就是一个列表[area, bedrooms, location_score]在数学中这就是一个向量一个带有方向和长度的数值数组。AI体系里我们管它叫特征向量每个维度代表样本的一个属性。向量不只是一个存储结构。它之所以在数学中有意义是因为维度之间可以发生运算关系。两个向量可以相加、求点积、算夹角这些运算赋予了样本数值之间更深层的含义。比如两个样本向量的点积越大某种意义上说它们在特征空间中越“相似”——这正是很多推荐系统做用户和商品匹配时依赖的基础。2.2 矩阵乘法一次处理一整层神经元的秘密单个向量描述一个样本但训练时我们不可能一个一个算那样太慢了。于是我们把一批样本按行堆叠起来形成一个矩阵比如一个批次128个样本、每个样本384维就成了一个128 × 384的矩阵。神经网络每一层的计算本质上就是矩阵乘法加一个偏置向量再加一次非线性变换输出 激活函数(输入矩阵 × 权重矩阵 偏置)权重矩阵在这里扮演的是“特征变换器”。它是一个插在两层之间的桥梁输入维度是多少输出维度要变成多少都由这个矩阵的尺寸决定。比如输入层是384维第一层想放128个神经元那权重矩阵就是384 × 128的形状。矩阵里的每个数值在训练之前都是随机初始化的它们会在训练过程中被不断修正直到找到能正确把输入变换成合适输出的一组参数。2.3 激活函数没有它多层网络和单层没有任何区别矩阵乘法做完了为什么还要加一步“非线性变换”这是一个关键问题。如果每一层只做线性操作矩阵乘法和加法那么不管叠多少层整个网络在数学上仍然等价于一个线性函数——因为线性变换的复合结果还是线性变换。可以说“深度学习”的“深度”如果没有激活函数就只是“深度的假象”。激活函数给网络注入了非线性能力让函数曲线可以弯折、扭曲去贴合复杂的数据分布。常见的ReLUmax(0, x)之所以流行不是因为它数学上最优雅而是实测下来它的梯度在正区间恒为1能有效减轻深层网络中的梯度消失问题。选激活函数不只是一个调用API的动作它直接决定了信号在网络中如何流动、哪些信息能传到下一层。3. 损失函数与梯度下降误差如何变成动力网络结构搭建好之后它还只是一张空白画布。要让它能准确预测我们需要一种机制来告诉她“画错了什么”以及“怎么改”。这就是损失函数和优化器的舞台。3.1 损失函数给模型当标尺损失函数计算的是模型预测值和真实值之间的差距。它用一个标量数字量化了整个模型在某个样本或一批样本上的表现。这个数字越小代表预测越接近真实答案。回归任务里最常用的是均方误差把每个样本预测误差平方之后取平均分类任务则更常用交叉熵它从概率分布的视角衡量“预测分布”和“真实分布”之间的距离。选择哪一个损失函数不是随便决定的。用均方误差做分类任务一个直接后果是收敛变慢——因为它的梯度在输出接近0或1时非常平缓模型学不动了。理解损失函数的结构才能解释为什么同样的训练步数效果天差地别。3.2 梯度下降沿着最陡方向下山有了误差数字之后怎么把这个数字转化成参数更新的具体数值答案是梯度下降。想象你站在一座山上周围大雾看不清路但你知道山脚就是损失最低的位置。你该怎么走最合理的策略是感受脚下哪个方向坡度最陡朝那个方向迈一步。这个坡度就是梯度用数学表达就是损失函数对每个参数的偏导数。偏导数告诉我们某个参数增大一点点损失会变大还是变小、幅度有多大。参数更新公式长得极其简单权重 权重 - 学习率 × 梯度学习率就是“迈步的幅度”。它可能是训练里最需要小心调的一个数。设太大模型会跨过最优点来回震荡损失曲线像心电图设太小模型学得慢如蜗牛训练几个小时候损失还在高位徘徊。我在实际项目里通常会先用较大的学习率让损失快速下降再配合学习率衰减策略逐步缩小步长效果比全程用固定学习率稳定得多。学习率不是一个一次设好就忘的参数它是一个需要伴随训练全程监控和调整的动态量。3.3 从批量梯度下降到小批量随机梯度下降计算梯度时有一个选择用全部样本算还是用一小部分算全量样本算出来的梯度最准确但计算量太大现代数据集动辄百万级样本跑一轮更新等不起。逐个样本算速度快但梯度噪声大、方向飘忽不定。工程上用的折中方案叫小批量随机梯度下降每次随机取一小批样本比如64或128个计算梯度并更新参数。它既有速度又有一定的随机性——这种随机性甚至还有好处可以帮助模型跳出局部最优点找到更平坦的极小值。小批量的随机性不是bug是feature。这也是为什么训练时经常把数据随机打乱的原因保证每个批次都尽可能代表整体分布。4. 反向传播从误差倒流回参数的每一环梯度的数值怎么算靠的是一套称为反向传播的机制。可以说它是深度学习中让训练真正跑起来的“引擎”。我当初啃这块花了很久后来发现只要抓住一个点——反向传播就是链式法则在复合函数上的系统应用——整个机制就顺了。4.1 链式法则误差责任的层层分摊神经网络就是一个超大号的复合函数输入经过第一层得到中间结果中间结果再经过第二层得到下一个中间结果一路传到输出。最终输出的误差是每一层参数共同作用的结果。问题来了怎么知道每一层各自的“责任”有多大链式法则给了答案。输出误差对某一层权重参数的导数可以拆解成一系列偏导数的连乘误差对输出的导数乘以输出对中间变量的导数再乘以中间变量对权重的导数。反向传播的工作方式非常像一场“责任追溯”从输出端出发把总误差逐层往回传每一层根据传回来的误差信号计算自己参数的梯度。4.2 前向与反向训练为什么这么吃算力训练一个网络时每次迭代实际做两趟传播。第一趟是前向传播输入数据从输入层一路流过每一层产生预测值算出损失。第二趟是反向传播从损失出发反方向逐层计算梯度最后用梯度更新所有参数。所以训练时间大约是纯推理的两倍这个估算很粗略但方向是对的。这也是为什么模型推理可以做得很快训练却总是又漫长又费电。任何号称能“加速训练”的工具本质上都在优化这两趟传播中的某一环比如梯度累积减少反向传播次数混合精度训练减少前向和反向中的计算精度开销。4.3 手算一个最简单网络的梯度打通最后一公里纸上谈兵终究不如亲手算一次。我们构造一个最简单的网络验证一下过程中的几个关键点。假设网络只有一层输入x 2真实标签y 4初始权重w 1偏置b 0没有激活函数用均方误差做损失。这是一个线性模型前向传播算预测值y_pred 1 × 2 0 2损失L (4 - 2)^2 4接下来反向传播算梯度。损失对预测值的导数dL/d(y_pred) 2(y_pred - y) 2(2 - 4) -4预测值对权重的导数d(y_pred)/dw x 2预测值对偏置的导数d(y_pred)/db 1链式法则得出损失对权重的梯度dL/dw dL/d(y_pred) × d(y_pred)/dw -4 × 2 -8如果学习率设为0.1更新后w_new 1 - 0.1 × (-8) 1.8第二次前向传播y_pred 1.8 × 2 3.6损失降为(4-3.6)^2 0.16。一步迭代损失从4降到0.16效果很直观。整个过程演示了反向传播的完整链路前向算出误差反向把误差传回参数更新参数后误差缩小。所有深度学习框架做的不过是在更复杂的网络上自动重复这个基本流程。建议不要跳过这一步。哪怕只在纸上算一次这样的微型网络你对梯度下降和反向传播的理解都会从一个模糊概念变成一个具体的操作过程。5. 训练中的隐形拦路虎过拟合、学习率与初始化真正动手训练模型就会发现最花时间的往往不是结构设计而是和几个反复出现的“隐形拦路虎”较劲。它们不会在教科书里被大篇幅渲染但每一个都值得单独拎出来好好讲。5.1 为什么权重不能全部初始化为零随机初始化是现代训练中默认可空省略的步骤但很多新手不理解它为什么存在。如果所有权重都初始化为零同一个网络层内所有神经元在前向传播时拿到完全相同的信号反向传播时梯度也完全相同于是这些神经元永远在同步更新学出来的东西一模一样。那这一层挂再多的神经元实际起作用的就是一个神经元。这种情况称为“对称性问题”。解决办法看起来很简单用随机数打破对称。但随机数也有讲究。如果初始化的值太大信号经过多层放大后趋于发散太小信号逐层衰减前向传播还没到输出层信号就快没了。常用的Xavier初始化和He初始化都是在根据每层的输入输出维度推导一个合适的方差范围让信号在网络中传播时保持相对稳定的尺度。好的初始化是训练能够稳定进行的第一道保障。5.2 过拟合模型在“背答案”而不是“学规律”训练的常见困境训练集上损失降得很低但一到验证集表现就垮掉。这大概率是过拟合——网络参数太多、容量太大把训练样本里的噪声和随机细节都记下来了却没有抓住背后的规律。理解过拟合的底层逻辑很重要网络没有“理解”数据它只是在做模式压缩。当数据规模远小于参数数量时网络完全有足够的“记忆力”把每个训练样本单独存下来这在数学上表现为损失趋近于零但它对没见过的数据毫无泛化能力。缓解过拟合的主要手段增加数据量最根本的手段也是最贵的正则化在损失函数上增加对权重大小的惩罚项逼着模型用更小的参数值去拟合倾向于寻找简单规律Dropout训练时随机丢弃一部分神经元强迫网络不依赖单一通路早停法监控验证集损失一旦验证损失开始抬升就停止训练5.3 学习率过大梯度下降变成“梯度蹦极”学习率过大时会出现一种经典现象损失曲线来回震荡有时看起来在下降但下一点又冲上去了。原因很直观——步长太大每一步都跨过了最低点跑到对面白白浪费了迭代次数。更严重的是如果学习率大到一定程度梯度可能越来越大参数呈发散状态训练直接失败。实践中我建议一个排查顺序先看损失曲线形状。如果震荡剧烈先降学习率如果平稳下降但太慢可以适当调大。另外配合使用带有动量项的优化器比如Adam它能平滑更新方向减少震荡对新手更友好。学习率不是一个“设好就忘”的数字整个训练过程里都值得盯住它。6. 一个完整训练流程中的数学脉络从数据到模型把前面这些概念放进一个完整的训练流程里看才能串成一条清晰的主线。我自己带过几个模拟项目之后发现很多新手不是不理解单个概念而是不知道它们该出现在流程的哪个位置、互相之间怎么衔接。6.1 数据归一化为什么必须做这一步数据进入网络之前通常要先做归一化/标准化处理。原因不在网络本身而在梯度下降的几何形状。如果特征量纲相差悬殊比如一个特征取值范围0到1另一个是0到100000损失函数的等高线会变成非常狭窄的椭圆形。梯度下降在这个椭圆的陡峭边上来回震荡收敛慢且不稳定。归一化之后等高线更接近圆形梯度方向更直接地指向最低点训练速度和稳定性都有明显提升。数据预处理不是数据工程的琐事它直接影响优化问题的几何形态。6.2 训练循环内的每一步对应什么一个典型的训练循环里每个主要步骤都有清晰的数学映射数据批次的组织对应矩阵的构建——一个批次构成一个采样矩阵代表对整体分布的一次估计。前向传播对应矩阵乘法和非线性函数的连续复合——把输入空间一步步变换到输出空间。损失计算对应目标函数的求值——降低这个目标函数的值就是训练的全部意义。反向传播对应链式法则的逐层应用——把总误差分解到每个参数头上。参数更新对应梯度下降的一个迭代步——沿着梯度的反方向移动一组参数。理解这个映射关系后再看深度学习框架的代码思路会完全不一样。你看到的不是“调用一个API”而是在一个数学过程中的某个固定环节找到它在整条链路中的位置。6.3 损失值下降快慢中的信息量训练过程中观察损失曲线相当于医生在看心电图。曲线快速下降期代表模型正在从“完全瞎猜”变成“有点感觉”。曲线进入平台期代表浅层规律已经被学完剩下的都是更难的模式。曲线不降反升大概率是学习率过大或者出现过拟合。每一段曲线形态都是网络状态在数值上的投影值得用记录日志的方式认真对待。我自己常用的实践是记录每个epoch遍历一遍全部训练数据的周期的训练损失和验证损失画在同一张图上。两条线同时平缓下降一切良好训练损失还在降但验证损失开始抬头过拟合的信号考虑提前停止或者调正则两条线都纹丝不动可能是学习率太低或者梯度消失需要检查网络结构和初始化。6.4 从数学到实践训练这件事的整体图景写到这里我想把整张图景做一个大的收束。所有深度学习训练不管用什么框架、什么模型都在重复同一件事定义一张可微的巨型函数网络标定一个量化目标用梯度下降迭代优化参数让网络输出和目标值尽可能一致。听起来很简洁但细节里藏着无数容易踩坑的地方——权重初始化关系着训练的起步学习率决定前进的节奏损失函数设定目标本身反向传播保障每一步更新有据可依数据归一化影响梯度的几何走向。关于这些我一路走来的体会是数学原理不是用来背的而是用来在关键时刻提供判据的。当模型训不出来时靠直觉乱试是最低效的路径靠原理定位大致原因再针对性地调整才是从业者该有的方式。我的建议是不要急着一口气学完全部推导先从这篇文章里提到的几个核心概念入手用小型实验跑一个简单网络打印出每一层的梯度数值观察它们在训练过程中的变化再回去看对应的数学定义。亲手摸过这些数值之后那些抽象符号会变得亲近可感。这也是我每次带新人时固定安排的第一步效果远好过直接丢一堆论文让他啃。
阅读完成 · 觉得有帮助?
咨询建站