打开AI大门的数学钥匙:微积分核心概念解析
您想了解的人工智能核心知识,我们第一时间送达
阅读指南:本文为零基础读者精心打造。你不需要任何数学背景,只需要有好奇心和耐心。
本文的核心理念:用生活中的案例理解抽象概念,用直觉替代公式记忆。
⚠️进阶提示:文中带 📌 标记的内容是为想深入理解的读者准备的补充说明,第一次阅读可以跳过,不影响整体理解。
在讨论多变量之前,我们先搞清楚单个变量的情况。这是所有微积分的起点。
你开车从 A 到 B,路程是 300 公里,用了 3 小时。你的平均速度是:
这就是平均变化率——总变化量除以总时间。但它有一个问题:它掩盖了过程中的细节。你可能前两个小时开了 200 公里,第三个小时只开了 100 公里;也可能第三个小时遇到了堵车,速度降到了 20 公里/小时。
生活比喻:平均变化率就像你问一个人“这辈子平均幸福感是多少”,他回答“还行”。但这个数字完全无法告诉你他昨天是中了彩票还是丢了钱包。
我们真正想知道的是:在某个精确的时刻,比如下午 2 点 15 分 32 秒,车速是多少?
为了捕捉这个“刹那”,数学家想了一个办法:把观察的时间间隔不断缩小,看看速度会趋近于什么值。
假设你的路程函数是,表示时刻走过的距离。我们想求时刻的瞬时速度:
如果这个极限存在,我们就得到了瞬时变化率,也就是导数:
生活比喻:想象你正在看一部电影的某一帧画面。电影是 24 帧/秒,每一帧都是静止的。但如果你把帧率提高到无限大,画面就“流动”起来了。导数就是在无限高的“时间分辨率”下,捕捉那一刹那的变化。
把函数曲线不断放大,任何光滑的曲线在局部看起来都像一条直线。导数就是这条“局部直线”的斜率。
生活比喻:你站在山坡上,脚下极小的一块地看起来是平的。这块平地倾斜的程度(坡度)就是导数。站的位置不同,坡度不同,所以导数是位置的函数。
如果函数是,在点处的导数记作:
两种记号的区别:
经典例子:(绝对值函数)在处是个尖角。从左边走近 0,坡度是 -1;从右边走近 0,坡度是 +1。左右坡度不一致,所以 0 点没有导数。
📌 虽然在处严格来说没有导数,但工程上我们可以定义一个次梯度(subgradient):只要取值在之间,都能描述这个“尖角”处的局部变化趋势。这直接呼应了后面第7节对 ReLU 激活函数的处理方式。
📌 这个“尖角不可微”的概念非常重要,后面讲 ReLU 激活函数时会再次遇到。
不需要死记硬背,理解“为什么”更重要:
1. 常数的导数是 0
直觉:平路没有坡度。
2. 幂函数的导数
直觉:比增长得快,所以它的“坡度”不仅取决于位置,还取决于幂次。越大,变化越剧烈。
3. 加法法则
直觉:两个坡叠在一起,总坡度是各自坡度之和。
4. 乘法法则
直觉:两个都在变化的量相乘,总变化有“交叉贡献”——不仅在变,也在变,两者互相影响。
5. 链式法则(一元版本)
直觉:如果通过间接依赖于,那么对的影响是“两段影响的乘积”。就像传话游戏,第一个人对最后一个人的影响,是每个人对下一个人的影响的连乘。
📌 链式法则是整个深度学习的数学基石。神经网络就是一层套一层的复合函数,没有链式法则,就没有反向传播。
机器学习要同时处理很多因素。比如预测房价,输入包括面积、卧室数、地段评分……想知道“面积变化一个单位,房价会变多少”,就必须把其他因素先“按住”。这就是偏导数的思想。
生活比喻:你煮咖啡时,想研究研磨粗细对苦味的影响,就要固定水温、冲泡时间,只改变研磨度。品出苦味的这一丝变化,就是“苦味对研磨度的偏导数”。
如果函数是,那么对的偏导数记作:
它的定义与普通导数一样,只是把当成常数:
📌只是一个符号,提醒我们这里是多变量函数,但计算方法跟一元导数没有本质区别。
几何直觉:把二元函数看成一座山的形状,偏导数就是沿着坐标轴方向切一刀,看切面曲线的斜率。比如表示你只朝东走时的坡度。
📌重要提醒:偏导数存在不代表函数在该点连续或可微。经典反例是:
这个函数在原点两个偏导数都存在(都是 0),但函数甚至不连续。这说明偏导存在只是可微的必要条件,不是充分条件。
如果你在山上,想知道往哪个方向走能最快增加高度,单独看一个方向的坡度是不够的。你需要一个能把所有方向的斜率打包的东西——这就是梯度。
梯度把所有偏导数排成一个向量:
对于个输入的函数,梯度就是一个维向量。它有两个关键性质:
生活比喻:你在一个露天剧场找最快到舞台的路。到处都有坡度,而梯度就像你口袋里突然出现的一个指南针,指针永远指向最陡下山(或上山)的方向。机器学习里的梯度下降,就是每次朝着负梯度方向走一小步,慢慢滚到最低点。
📌严格前提:梯度指向最陡方向,这要求函数在该点可微。如果函数有尖角(如某些损失曲面),梯度可能不存在,这时要用次梯度(subgradient)的概念。
如果损失函数是,是很多参数的向量,梯度下降的更新规则为:
其中是步长(学习率)。这就是模型学习的核心引擎。
📌 实际深度学习几乎不用全部数据算一次梯度,而是用一小批数据(Mini-batch),即SGD(随机梯度下降)。否则大数据集上算一次梯度就要等到天荒地老。
📌严格来说,传统教材中 SGD 指每次只用一个样本算梯度,Mini-batch 是其推广。但在现代深度学习的实践中,这两个词几乎已经混用——人们口中的 SGD 通常默认指小批量随机梯度下降。因为 GPU 并行计算的特性,真正的单样本训练反而效率极低。
📌 梯度只是“局部”的近视眼镜。它指向当前位置最陡的上坡方向,但损失函数的山峰往往崎岖不平(非凸)。深度学习里的损失曲面可能有:
📌 特别值得注意的是:在高维空间中(比如神经网络的参数空间有百万甚至上亿维),严格的局部极小值其实非常罕见。想象一下,要在所有方向上都“朝上凸”,概率极低。更常见的是鞍点——Hessian 矩阵(二阶导数矩阵)的特征值有正有负,意味着某些方向是上坡、某些方向是下坡。随机梯度下降引入的噪声恰好有助于优化过程“逃离”这些鞍点,继续向更优解前进。这也是深度学习虽然理论上很难,实际却能训练成功的重要原因之一。
生活比喻:梯度就像你在浓雾中爬山,只能看清脚下5米的坡度。你顺着最陡方向走,可能只走到一个小土坑(局部最优),而不是真正的山谷(全局最优)。现代优化器(如 Adam、Momentum)就是给这个近视的人配了“惯性眼镜”和“自适应步幅”,帮助他冲出小土坑。
📌 学习率太大和太小都不好:
在深入优化之前,我们必须区分两种截然不同的“地形”。
一个函数是凸函数,如果任意两点之间的连线都在函数图像的上方。数学上,对任意和:
生活比喻:凸函数就像一个光滑的碗。无论你从碗的哪个边缘放一个小球,它最终都会滚到碗底——而且只有一个碗底。这个碗底就是全局最小值。
凸函数有一个极其美好的性质:局部最小值就是全局最小值。这意味着在步长合适的情况下,梯度下降永远不会被困在“小土坑”里,只要沿着负梯度走,一定能找到最好的解。
线性回归、逻辑回归(损失函数)、支持向量机(SVM)的损失函数都是凸的。这也是为什么这些经典算法在理论上如此优雅,优化起来如此可靠。
📌严格凸的补充:上述不等式定义的是普通凸函数(convex),等号是允许的,因此函数可能在一段平坦的“谷底”上有无数个最小值(比如对所有都成立)。在机器学习语境中,如果我们希望损失函数有唯一的全局最小值,则需要它是严格凸的——即等号仅在时成立。不过即使只是普通凸函数,“局部最小即全局最小”依然成立,只是最优解可能不唯一。
📌 既然逻辑回归的损失函数已经是凸的,为什么还要用神经网络?因为凸函数虽然好优化,但表达能力有限。逻辑回归本质上只能学线性决策边界,而神经网络通过多层非线性变换,可以逼近任意复杂的函数。代价就是:损失函数变成了非凸的,优化变得更困难。
神经网络的损失函数几乎从来不是凸函数。原因很简单:即使单层网络加上凸激活函数(如ReLU),当考虑关于参数的损失时,由于非线性激活与损失函数的组合,损失函数一般已经不再是凸的了。而一旦多层嵌套,参数与激活输出的乘积耦合(如),以及海量参数的共同作用,更会彻底破坏凸性,把“碗”扭曲成了极度复杂的“山地”。
生活比喻:非凸函数就像一片真实的山脉——有无数个小山谷、悬崖、高原和迷宫般的地形。你站在某个山谷底部,以为到了最低处,其实翻过一座山,远处可能有更深的盆地。
📌 非凸性是现代深度学习优化的根本挑战。它解释了为什么:
📌 好消息是:尽管深度学习损失函数非凸,但在实践中,大规模神经网络的损失曲面往往具有某种“良性”结构——比如高维空间中的鞍点比局部极小值更常见,而随机梯度下降的噪声恰好有助于逃离鞍点。这也是深度学习虽然理论上很难,实际却能训练成功的原因之一。
微积分的另一个核心思想是:用简单的函数去近似复杂的函数。泰勒展开就是这个思想的集大成者。
假设你站在山坡上某点,想知道往前走一小步后,高度会变成多少。如果只看脚下的坡度,最好的猜测是:
这就是一阶泰勒展开——用“切线”(一次函数)代替原来的曲线,在局部做近似。
生活比喻:你站在一条蜿蜒的山路上,想知道前面 10 米的高度。一阶泰勒展开就像你只看脚下的坡度,然后假设这条路是一条笔直的斜坡延伸出去。只要步长不大,这个近似相当靠谱。
📌严格版本:对于零基础读者,上面的近似式已经足够直观。如果想知道更精确的表述,完整的泰勒展开会带一个误差项:。其中表示“比更快趋近于零的量”。只要足够小,误差项就可以忽略。
梯度下降正是基于这个近似:为了让尽量小,我们选择,于是:
只要足够小且,函数值就会下降。
对于多变量函数,一阶泰勒展开变为:
梯度下降选择,于是:
只要足够小且梯度不为零,函数值就会下降。
一阶近似只考虑了坡度,没考虑路是弯的还是直的。二阶泰勒展开引入了二阶导数(也叫曲率):
生活比喻:一阶近似是“用直尺量路”,二阶近似是“用弯尺量路”。如果路是下凸的(,开口向上像碗),弯尺会告诉你直尺的估计偏乐观了——实际走起来比预想的更陡。
📌 对于多变量函数,二阶导数推广为Hessian 矩阵,它记录了所有两两偏导数。梯度下降只用了一阶信息,而牛顿法等二阶优化方法利用 Hessian,可以“看穿”曲率,一步迈得更准。但计算和存储 Hessian 的开销极大,所以深度学习主要仍用一阶方法。
📌平坦极小值 vs 尖锐极小值:Hessian 的特征值都很小的极小值叫“平坦极小值”,模型泛化能力通常更好;特征值很大的叫“尖锐极小值”,泛化能力较差。这解释了为什么“找到最低点”不如“找到平坦的低点”重要。
📌更精确地说,“平坦”是一个多维概念。Hessian 矩阵的谱分布(所有特征值的分布情况)决定了极小值的整体形状。如果大部分特征值都很小,即使个别方向曲率较大,整体仍可能是平坦的。反之,如果特征值普遍很大,极小值就很尖锐。在实际中,我们常用 Hessian 的迹(特征值之和)或最大特征值来粗略判断平坦程度。
很多时候,函数是一层套一层的。气温随海拔变化,海拔又随位置变化。想知道气温如何随位置变化,就要把两段变化的效应“乘起来”。
一元的链式法则:
如果通过等多个中间变量依赖于,多变量链式法则会把各条路径的效应加起来:
生活比喻:你想知道加班()对幸福指数()的总影响。加班直接导致疲劳(),也直接增加收入()。疲劳降低幸福,收入提升幸福。总效应 = 疲劳路径的影响 + 收入路径的影响。每条路径都是“上游变量对下游变量的偏导数”连乘。
这就是为什么深度神经网络无论多深,都能把误差从输出层一直传到输入层——因为它就是无数个微小变化通过链式法则连在一起的复合函数。
📌 反向传播的本质是一长串向量-Jacobian 乘积(VJP)。如果网络很深(比如100层),而很多层的局部梯度都略小于1,连乘后梯度会指数级衰减到几乎为0(梯度消失),前面的参数根本学不到东西;反之若都略大于1,梯度会指数级爆炸(梯度爆炸)。
生活比喻:链式法则像传话筒游戏。100个人排成一队,第100个人听到的消息要反向传给第1个人。如果每个人都把消息“稍微扭曲一点点”,传到第1个人时已经完全失真;如果每个人都“夸大一点点”,传到第1个人时已经变成谣言爆炸。
📌 现代架构(ResNet、LSTM、LayerNorm 等)本质上都是为解决这个问题设计的。比如 ResNet 的,反向传播时梯度有一条“高速公路”直接回传,缓解了深层连乘的问题。但要注意:残差连接提供的是梯度捷径,而内部仍然有权重矩阵的连乘;真正让深层网络可训练的是残差连接 + 合理的初始化 + 批归一化的共同作用,不能简单归功于某一项。
神经网络实际上就是一个很长的复合函数:
训练时要算出损失相对每一层权重、偏置的梯度,然后去更新它们。
如果从输入端正向一层层推梯度(正向模式),计算复杂度会与输入维度成正比。而神经网络是参数成百万上千万,损失却只有一个标量的场景。反向传播(即反向模式)的聪明之处在于:我们从输出端开始,把算好的梯度记录并重复利用,一层层往回传。反向模式的复杂度与输出维度成正比。对于神经网络这种参数极多、损失只有一个标量的场景,输出维度为 1,反向模式只需一次反向传播就能同时算出全部参数的梯度,远比正向模式高效。
设想一个极简计算: 我们想知道对的偏导数。
这个过程完全依赖链式法则:每个节点的梯度 = 该节点的输出对输入的局部偏导数从损失端传回来的累积梯度。
对于真实网络,反向传播就是系统化地应用这个原则,让一次正向一次反向就同时算出全部参数的梯度。梯度下降拿到这些梯度后,给每个参数“指路”,让损失慢慢降下来。
📌 很多人害怕反向传播,其实它的本质就是:把损失当作“责任”,按链式法则反向分配给每一个神经元连接,谁贡献大,谁多调整。
📌 神经网络常用的 ReLU 激活函数在处严格来说不可微(图像有个尖角)。按纯数学,这里偏导数不存在。但工程上我们直接定义该点导数为0或1(次梯度),训练依然跑得很好。这解释了为什么深度学习能在“不严格光滑”的函数上取得成功——也呼应了前面讲的“尖角不可微”概念。
📌Dead ReLU 问题:如果某个 ReLU 神经元的输入持续为负数,它的输出永远为0,梯度也永远为0。这意味着这个神经元在训练过程中“死亡”了,再也无法更新。这解释了为什么实践中常用 Leaky ReLU(给负数一个微小斜率)、PReLU 或 GELU 等改进版激活函数——它们像给每个神经元装了“生命维持系统”,即使输入为负也保留一丝梯度。
前面我们讨论的导数大多是标量对标量的。但神经网络中,损失是标量,参数却是矩阵(或更高维的张量)。我们需要把求导推广到向量和矩阵。
假设有一个向量值函数,输入是维向量,输出是维向量。那么它的导数不再是一个数,而是一个的Jacobian 矩阵:
矩阵的每个元素,表示“输出第个分量对输入第个分量的敏感度”。
生活比喻:Jacobian 矩阵就像一张“影响关系表”。假设公司有个部门(输入),个产品(输出),每个元素记录“某部门预算增加1元,某产品利润变化多少元”。反向传播本质上就是在这张表上不断做向量-Jacobian 乘积(VJP)——它不需要显式算出完整的 Jacobian 矩阵,而是将上游传回的梯度向量与局部 Jacobian 相乘,高效地把梯度往回传。对于神经网络这种参数动辄百万级的场景,这种“按需计算”的方式至关重要。
📌维度追踪法:一个极实用的调试技巧——在 PyTorch/TensorFlow 中,梯度张量的形状总是与参数张量的形状完全相同。如果你发现维度对不上,一定是哪里算错了。
这是深度学习中最常见的组合之一,也是理解“复杂导数可以惊人简化”的最佳案例。
Softmax 函数把一个任意实数向量转化为概率分布:
交叉熵损失衡量预测概率与真实标签的差距(假设真实标签是第类,即 one-hot 向量):
单独看 Softmax 的导数,公式已经相当复杂。但当我们把 Softmax 和交叉熵组合起来求导时,奇迹发生了:
其中是真实标签(第类为1,其余为0)。
生活比喻:这就像一个复杂的机械表,拆开看每个齿轮的传动关系眼花缭乱,但当你把整个表组装好,输出端的指针转动规律却异常简单——只取决于“预测概率与真实标签的差距”。
这个简洁的结果意味着:如果模型对正确类别的预测概率已经很高(),梯度就接近0,几乎不需要调整;如果预测错了,梯度会很大,模型会大力修正。这是神经网络训练可行的核心原因之一。
前面我们花了大量篇幅讲“微分”——研究函数在某一点的瞬时变化。但微积分的另一半是积分——研究如何把局部的变化累积成整体的结果。
想象你要计算一个不规则形状的面积。你可以把它切成很多细长的竖条,每个竖条约等于“宽度高度”,然后把所有竖条的面积加起来。当竖条无限细分时,这个求和就变成了积分:
生活比喻:积分就像你记录一整天的步数。每一步(局部)只走了几十厘米,但积分把这些步数累积起来,告诉你今天总共走了多少公里。
积分在人工智能中无处不在,尤其在概率与统计领域:
1. 概率与期望
连续型随机变量落在区间内的概率是密度函数的积分:
函数的期望(平均值)也是积分:
生活比喻:概率密度就像一条河流的流速分布——不同位置流速不同。积分就是计算“某段河道流过的总水量”。
📌 变分推断(VAE)和策略梯度(强化学习)的核心都是估计期望。当积分无法解析计算时,我们用采样来近似(蒙特卡洛方法)。
2. 归一化常数
很多概率模型需要确保总概率为1,这就要计算归一化常数:
对于复杂的高维分布(如能量模型、玻尔兹曼机),这个积分往往无法精确计算,是机器学习的经典难题之一。由此衍生出 MCMC 采样、重要性采样、归一化流等技术。
3. 微分熵
信息论中的熵推广到连续分布就是积分:
它衡量一个连续分布的“不确定性”。在变分自编码器(VAE)中,我们最小化重构损失的同时,还要让隐变量分布接近标准正态分布——这个目标就涉及微分熵的计算。
4. 微积分基本定理
微分和积分是互逆运算:
直觉:你先累积变化(积分),再求累积结果的瞬时变化率(微分),当然就回到了原来的变化率本身。
这个定理揭示了微分与积分的互逆关系。而在深度学习中,自动微分解决的是导数计算问题,而非积分问题。它利用的是链式法则的“逆向传播”——把正向计算拆解成一张初等操作图,然后从输出端反向传递梯度,自动、精确地求出每个参数的偏导数,无需手动推导复杂的导数公式。
你可能想:为什么不直接给函数求导公式让电脑算?那就是符号微分,容易产生极其庞大的表达式,效率很低。而数值微分用近似,又慢又不精确。
自动微分的思路不一样——它不推导出整个函数的公式,而是把所有运算拆解成最基本的加减乘除、指数、对数等操作,形成一张计算图,然后利用链式法则在这张图上传递梯度。这样既精确又高效,是现代深度学习框架(PyTorch,TensorFlow 等)的基石。
自动微分有两种模式:
实现上,框架会在你定义运算时暗暗构建计算图,每个张量记得自己是通过什么操作产生的。调用.backward()时,就从最后的标量出发,按图索骥,一路把累积的梯度乘回来,直到每一个叶子结点。
📌实际使用中的小技巧:在 PyTorch 中,torch.no_grad()或tensor.detach()用于告诉框架“这部分不需要算梯度”。比如模型推理(只预测不训练)、冻结预训练模型的某些层、或者把张量从计算图中剥离出来作为普通数值使用时,都需要用到它们。这能节省大量内存和计算。
一句话总结:自动微分让我们不必手动推导任意复杂函数的梯度,只要写出正向计算,机器就能自己算出各个输入对输出的敏感程度。整个深度学习的训练能如此轻松,全靠这把精准的“梯度手术刀”。
📌 这是一个进阶技巧,在强化学习和变分推断中极为重要。
假设你想求一个概率分布对参数的梯度,但这个分布的期望无法直接求导(因为是从中采样出来的,采样操作本身不可微)。对数导数技巧巧妙地把问题转化了:
直觉:,所以。我们绕过了对采样过程求导,改为对概率的“对数”求导——而对数函数通常有简洁的解析形式。
生活比喻:你想知道调整抽奖规则()对平均奖金(期望)的影响。但奖金是抽出来的,抽奖本身没有导数。对数导数技巧就像你转而研究“每种奖品的对数概率如何随规则变化”,然后加权求和——权重就是实际抽到的奖金。
📌重要前提:上述公式成立的前提是不依赖于参数。如果本身也随参数变化(某些高级强化学习场景),公式需要增加额外项。
📌REINFORCE 算法(策略梯度的鼻祖)和Score Function Estimator都基于这个技巧。它是连接“采样”与“梯度”的桥梁,让强化学习中的策略优化成为可能。
📌 与对数导数技巧并列的,还有一条在生成模型中更常用的路径——重参数化技巧(Reparameterization Trick)。
问题背景相同:我们想对期望求梯度,但是通过采样得到的,采样过程不可微。虽然我们可以用对数导数技巧(第11节)来估计这个梯度,但那种基于得分函数的估计器方差往往很大,训练时波动剧烈。
重参数化技巧的核心思想是:不把随机性放在参数上,而是把它“外移”到一个独立的噪声变量上。例如,如果我们从一个正态分布采样,可以改写为:
现在对和的依赖变成了确定性的计算,随机性完全来自与参数无关的。这样梯度就能顺畅地流过和了。
生活比喻:你想研究厨师手艺(参数)对菜品口味的影响,但每道菜的味道还取决于当天食材的随机波动。对数导数技巧像是“不管食材波动,只看手艺改变对整体满意度的统计影响”;重参数化技巧则像是“把食材波动单独隔离出来,让手艺的影响变成一条清晰的因果链”。
📌 重参数化技巧是变分自编码器(VAE)训练的核心。它通常比 Score Function Estimator 方差更小、梯度更稳定。对于高斯分布等连续分布,可以将采样重写为确定性变换;对于离散分布(如类别分布)则不能直接套用,但可以通过Gumbel-Softmax等连续松弛近似,从而间接使用重参数化。
📌 在扩散模型(Diffusion Models)中,重参数化技巧同样至关重要——扩散过程的每一步噪声添加都被重参数化为确定性函数,使得整个生成过程可以通过梯度下降来优化。
📌 现实世界的优化很少是“无约束”的。拉格朗日乘数法是处理带约束优化问题的通用框架,在机器学习中无处不在。
假设你想最小化,但必须满足约束。拉格朗日乘数法告诉我们:在最优解处,目标函数的梯度与约束函数的梯度必须平行(同向或反向)。也就是说,存在一个常数,使得:
我们构造拉格朗日函数:
然后对和分别求偏导并令其为0,就能找到满足约束的最优解。
生活比喻:你想在山区的公路上找到海拔最低的点。约束就是这条公路本身。你不能随便往山下跑,必须沿着路走。拉格朗日乘数法告诉你:在路的最低点,路的走向(约束的梯度)与你最想去的最陡下坡方向(目标函数的梯度)恰好“对齐”——只是被路给挡住了。
支持向量机(SVM):SVM 的核心优化问题是“最大化间隔”。硬间隔 SVM 要求所有样本被正确分类;而实际更常用的软间隔 SVM 则允许一定误差,通过惩罚项控制违规程度。两种形式的推导都依赖拉格朗日乘数法。那些著名的“支持向量”,正是对应拉格朗日乘子的样本。
变分推断中的概率归一化约束:在变分推断中,我们要寻找最优的变分分布来近似真实后验。在求解过程中(例如均值场近似),我们需要保证每一个候选的都是合法的概率分布——最重要的条件就是它在整个空间上的积分必须等于1。 这个“积分等于1”的约束,正是用拉格朗日乘数法来处理的:我们引入一个乘子,要求解满足的最优分布。拉格朗日乘数法在这里的作用是把归一化约束嵌入优化目标,从而解出各因子的最优解析形式。 📌 顺便一提,变分推断中常用的 ELBO(证据下界),其一种常见的直观推导利用了Jensen 不等式(利用对数函数的凹性),从另一个角度给出了下界;而拉格朗日乘数法则专门负责处理“概率分布必须归一化”这一约束条件。
正则化与约束的等价性:机器学习中常见的 L2 正则化 损 失 ,其实可以看作拉格朗日函数的一种形式——它等价于“最小化损失,同时约束参数范数不超过某个值”。
📌 在深度学习中,带约束的优化问题(如某些流形学习、正交约束、或增广拉格朗日法中的显式约束)会用到拉格朗日思想。而常见的权重裁剪、梯度裁剪属于直接的投影/截断操作——直接把超出范围的值拉回来,虽然目的是限制参数范围,但机制上不属于拉格朗日方法。
微积分不是一堆冰冷的公式,而是一套理解变化、预测趋势、优化决策的思维工具。从梯度下降到反向传播,从概率建模到强化学习,从凸优化到生成模型,这套工具贯穿了现代人工智能的每一个角落。掌握它,你就掌握了打开 AI 黑箱的第一把钥匙。