标签

人工智能的数学基础:优化算法入门指南

发布时间:2026-05-17 07:47来源:微信阅读:3

阅读指南:本文为零基础读者精心设计。你无需任何数学基础,只需保持好奇心和耐心即可。

本文的核心思想:通过日常生活的类比来理解抽象概念,用直觉感知取代死记硬背。

⚠️进阶提示:文中标有 📌 的内容是为希望深入理解的读者准备的补充材料,首次阅读时可以选择性跳过,这不会影响你对整体内容的把握。

💡数学家的惯例:为与机器学习领域的习惯保持一致,本文统一讨论最小化问题。日常生活中"最大化满意度"等同于"最小化不满意程度"(只需给目标函数加上负号即可)。因此后文所有的"下山"、"谷底"、"寻找最低点",本质上都是在寻找最小值。

牢记这个口诀:最大化= 最小化。

想象你走进一家奶茶店,菜单上排列着无数种配料组合:珍珠、椰果、布丁、芋泥、奶盖……每种配料你可以选择"加"或"不加",糖度可以从0%到100%自由调节,冰量也有多档选择。

最优化要解决的问题就是:在这些所有可能的组合中,找出让你最满意的那一杯。

你的"满意度"可以用一个目标函数(Objective Function)来量化。例如:

最优化要做的工作,就是调整各种配料的用量,使这个满意度达到最大。

💡 前面提到,为统一数学符号,我们把"最大化满意度"转化为"最小化不满意程度"。就像寻找"最暖和的地方"等同于寻找"最不冷的地方"——方向相反,但目的地相同。

每个最优化问题,都由三个核心要素组成:

📌关于约束的数学表述:数学上习惯将约束统一写成""的形式。例如"预算不能超过30元"实际上就是 预 算 ,这样我们就可以用一套统一的工具来处理所有约束。

📌进阶部分:在机器学习中,决策变量通常是模型的参数(比如神经网络中每条连接的权重),目标函数是损失函数(预测值与真实值的差距),我们的目标就是最小化这个损失。

想象你被蒙住双眼,站在一座山的山顶,目标是走到山脚下的最低点。你看不到道路,只能感受到脚下的坡度。

这正是梯度下降法(Gradient Descent)的核心直觉。

梯度(Gradient)告诉你:在当前位置,往哪个方向走会让函数值下降最快。

如果目标函数是,那么在点处的梯度记为:

每个分量告诉你:如果只改变第个变量,函数值会如何变化。

📌进阶部分:叫偏导数。想象你站在山坡上,偏导数就是你分别朝东、朝北走一小步时,高度的变化率。

知道了梯度,我们就可以一步步往低处走:

这里的(读作"eta")叫学习率(Learning Rate),它控制每一步迈多大:

📌进阶部分:梯度下降可以理解为:在当前点附近,用切平面(一阶近似)代替真实的曲面,然后沿着切平面最陡峭的下降方向走一步。牛顿法则用二阶泰勒展开(抛物面近似),理论上能更准确地跳到谷底。

小时候调收音机找电台,你会先快速转动旋钮(大步长),等声音近了再微调(小步长)。这其实就是学习率衰减的思想:

随着时间推移,步长自动变小,既保证初期快速接近目标,又保证后期精细调整不震荡。

📌进阶部分:现代大模型训练(如BERT、GPT)通常采用Warmup + 余弦退火(Cosine Annealing):

📌进阶部分:除了固定衰减曲线,还有ReduceLROnPlateau策略:监控验证集上的损失,如果连续几个"epoch"(训练轮次)都没有改善,就自动降低学习率。这就像爬山时如果发现走了很久高度都没下降,就主动放慢脚步仔细探路。

📌进阶部分:还有一种高效的学习率调度叫OneCycleLR:学习率先从低谷快速上升到峰值(热身),再按余弦曲线(默认策略)下降到接近零的低谷。这种"先急后缓"的策略在图像分类和自然语言处理中,往往比单纯的余弦退火收敛更快。

📌进阶部分:当你使用多GPU训练,把 batch size 扩大倍时(比如从32扩大到256),对于SGD优化器,经验法则是学习率也应近似扩大倍(线性缩放规则),这样每个参数看到的平均梯度噪声不变,收敛行为保持一致。但请注意,该规则主要源于 SGD 的理论;若使用Adam / AdamW等自适应优化器,学习率通常只需更小幅度调整,建议配合实验重新搜索。

📌进阶部分:在深度学习中,几乎总是用小批量梯度下降。批量大小(Batch Size)通常选32、64、128等,这既兼顾了内存对齐与GPU并行效率,也考虑了收敛稳定性——2的幂次便于显存分块,从而提升计算和访存效率。

📌进阶部分:当GPU显存不足以支撑理想的 batch size 时,可以使用梯度累积(Gradient Accumulation):把一个大 batch 拆成多个小 batch 分别计算梯度,先不更新参数,而是把梯度累加起来,等凑够目标 batch size 后再统一更新。这就像分几次称量食材,最后一起下锅。在优化器状态不依赖于 batch 内统计量时,梯度累积在梯度计算层面和单个大 batch 几乎等价。

⚠️注意:梯度累积在梯度计算层面确实等价,但如果你的网络使用了Batch Normalization(批归一化),各小 batch 统计出的均值和方差与单一大 batch 会有差异,此时行为并非完全等价。对于使用 LayerNorm 的模型(如Transformer),这种差异则小得多。

⚠️重要提醒:对于非凸函数,梯度下降只能保证找到局部最优(附近的最低点)。如果山是丘陵地形,你到达的谷底未必是整座山的最低点。好消息是,对于凸函数,在满足适当条件下,梯度下降可以保证收敛到全局最优。这是第3章要讨论的话题。

梯度下降只看了"脚下的坡度"(一阶信息),但还有一种方法能看得更远——牛顿法(Newton's Method)。

想象你不仅感受坡度,还用手摸地面的弯曲程度:

牛顿法的更新规则是:

这里的叫海森矩阵(Hessian Matrix),它记录了函数在各个方向上的"弯曲程度"。

为什么深度学习不用牛顿法?

假设神经网络有100万个参数,海森矩阵就是一个的庞然大物。直接存储和计算它的逆矩阵,代价高达,这在深度学习中是不现实的。

📌进阶部分:实际上,数值优化中并不直接求逆(不稳定且计算量巨大),而是通过求解以海森矩阵为系数的线性方程组来得到更新方向。但即便如此,对百万参数的神经网络仍然算不起。

折中方案——拟牛顿法:

科学家们发明了L-BFGS等拟牛顿法,它们不直接计算海森矩阵,而是通过历史梯度信息"猜测"曲率。这在中小规模问题上效果很好(如某些传统机器学习模型),但在百万参数的大模型中,仍然不如一阶方法实用。

💡 所以,深度学习几乎只用"一阶方法"(梯度下降、Adam等),不是因为二阶信息没用,而是因为算不起。

📌进阶部分:近年研究者提出了更聪明的折中方案,让大模型也能"偷瞄"二阶信息:

想象你不是一个人下山,而是推着一个有惯性的小铁球下山。

这就是动量(Momentum)的思想。在梯度下降中加入动量后,更新规则变为(标准的PyTorch写法):

其中是动量系数(通常取0.9)。就像小球的速度,它不仅看当前的坡度,还记住之前的运动趋势。是学习率,控制每一步的整体大小。

为什么需要动量?

📌进阶部分:不同框架对动量公式的实现略有差异。上述是PyTorch/经典形式,TensorFlow原始实现可能会在梯度前加的系数。换框架时若发现效果不同,可检查此细节。两种写法本质上是等价的,只是的数值尺度略有不同。

📌进阶部分:还有一种更聪明的动量——Nesterov 加速梯度(NAG, Nesterov Accelerated Gradient)。普通动量先算梯度再滚,Nesterov 则是先按惯性方向"向前看"一步,再在那个位置计算梯度并修正。这就像开车时看远处的路况来调整方向,而不是只看眼前。理论证明,NAG 在某些情况下收敛更快,PyTorch 的SGD优化器可以通过设置nesterov=True来启用。

动量解决了"方向"问题,但还没解决"步长"问题。想象你开车去陌生城市,不同路段路况不同:平坦高速可以加速,颠簸山路必须减速。

Adam(Adaptive Moment Estimation,自适应矩估计)就像车载电脑,自动为每个参数调整步长。它同时维护两套记忆:

更新规则为:

直觉理解:

Adam是目前深度学习最常用的优化器之一,因为它对大多数任务都"开箱即用",不需要像SGD那样精细调参。

📌进阶部分:Adam的默认参数(动量衰减)、(二阶矩衰减)在绝大多数情况下无需修改。和的纠偏操作(除以)是为了在训练初期(很小)防止估计值偏向0。

📌进阶部分:Adam 并非终点。研究者提出了多种改进:

反向传播就像从山顶往山脚传话,每经过一层神经元,信息要么指数级衰减,要么指数级放大。

为什么会出现?想象你每次传话时都乘以一个小数(如0.3)或一个大数(如3),传10层后就是或。

如何应对?

📌进阶部分:残差连接是深度学习史上最重要的发明之一。它让网络可以训练到数百层甚至上千层(如ResNet、Transformer),彻底解决了"越深越难训练"的困境。

📌进阶部分:现代大模型(如GPT、BERT)广泛采用FP16/BF16 混合精度训练。用16位浮点数代替32位,能节省显存、加速计算。但两种16位格式天差地别:

📌进阶部分:当模型大到单张GPU显存装不下时,梯度检查点(Gradient Checkpointing)是重要的省空间技巧:以时间换空间,只保留部分中间计算结果,反向传播时重新计算被丢弃的前向激活值。这就像做复杂数学题时,为了节省草稿纸,把中间步骤擦掉,需要时再重新推导一遍。

梯度下降的结果严重依赖起点。如果所有人都从同一个地方出发,可能会集体困在同一个局部最优。

更关键的是,在神经网络中,如果所有参数一开始都设为相同的值(比如全设为0),那么反向传播会让所有神经元学到完全一样的特征——这叫做对称性问题。

因此,神经网络参数通常采用随机初始化:给每个参数一个微小的随机值,打破对称性,让不同的神经元探索不同的方向。

📌进阶部分:不同的激活函数需要不同的初始化策略:

如果混用激活函数和初始化策略(比如 ReLU 配 Xavier),可能会导致初始梯度规模不合适,训练一开始就陷入梯度消失或爆炸。

想象三种地形:

凸函数就像碗,只有一个全局最小值。非凸函数就像丘陵,有很多局部最小值。而鞍点则是高维空间中的"陷阱"——梯度为零,但不是谷底。

一个函数是凸函数,如果对于任意两点和任意,都有:

直觉理解:连接函数图像上任意两点的线段,始终位于函数图像的上方(或重合)。

📌进阶部分:如果不等号严格成立(),称为严格凸函数,此时最小值唯一。

📌进阶部分:对于二阶可导的函数,有一个更实用的判断方法:计算海森矩阵(即二阶偏导数组成的矩阵)。如果海森矩阵在定义域内处处半正定(所有特征值),则是凸函数。这就像检查碗的每个方向是否都"向上翘"——如果是,就是碗状。

⚠️注意:海森矩阵"半正定"即可,不一定要求"正定"。以线性回归的MSE损失为例,其海森矩阵为,它是半正定的。只有当特征矩阵列满秩时才是正定;若存在多重共线性或特征数大于样本数,则为半正定,此时存在无穷多等价最优解。

好消息是:很多经典的机器学习问题(如线性回归、逻辑回归、SVM)都是凸优化问题。

坏消息是:深度神经网络的损失函数通常是非凸的。但神奇的是,实践中梯度下降在深度网络上表现还不错——这是因为:

📌进阶部分:更深层的理论正在揭示为什么深度网络"其实没那么怕非凸":

鞍点听起来可怕——前后都是上坡,左右都是下坡,你刚好卡在正中间,梯度为零。但在高维空间(如百万参数的神经网络)中,鞍点反而比局部最小值更容易逃离。原因有四:

📌进阶部分:一系列理论研究表明,在高维非凸损失函数中,鞍点的数量可能随维度指数级增长,而真正的坏局部最小值的密度反而相对较低。这解释了为什么深度网络虽然理论上非凸,实践中却很少因为"局部最小值"而训练失败。Dauphin等人(2014)最早系统性地指出鞍点(而非局部极小值)是训练深层网络的主要障碍,并提出了相应的二阶优化方法。

不需要每次都验证定义,记住这些常见函数的凸性:

凸函数的组合规则:

📌进阶部分:本身是凹函数,所以最小化不是凸优化问题。但如果你在机器学习中看到"最大化对数似然",这等价于"最小化负对数似然",而后者在定义域上是凸的,因此属于凸优化范畴。定义域很重要——没有的约束,在处无定义。

📌进阶部分:在机器学习中,最核心的两个损失函数恰好(在一定条件下)都是凸的:

这意味着线性回归和逻辑回归的优化问题都有全局最优保证,你不必担心"困在坏谷底"。

假设你经营一家奶茶店,要设计一款成本最低的招牌奶茶。但你发现"理论上成本最低的配方"只要2元——全是糖水,顾客满意度只有30分,远低于你要求的80分底线。

这就是一个带约束的最优化问题:

(也就是说,满意度必须大于等于80分)

法国数学家拉格朗日想出了一个巧妙的方法:把约束"融入"到目标函数中。

构造一个新的函数,叫拉格朗日函数:

这里的(读作"lambda")叫拉格朗日乘子,它是一个惩罚系数(且):

那么,最优解处会不会"超额满足"?

答案是:可能会。如果即使不强制要求满意度80,成本最低的配方本来满意度就有90分,那么约束在最优解处"不起作用",此时。只有当约束"绑紧"了最优解时(最低成本的配方刚好满意度=80),才可能大于0。

📌进阶部分:拉格朗日乘子有一个优美的几何解释。在最优解处,目标函数的梯度(成本上升最快的方向)和约束函数的梯度(满意度降低最快的方向)必须平行(方向相反):

这就像你在山谷里走,被一堵墙(约束边界)挡住了。你既不能穿墙而过,也不想远离墙。此时你前进的方向必须与墙面平行——墙面的法向量()与你想要走的方向()刚好对齐。

💡补充说明:拉格朗日函数是构造最优性条件的数学工具,它的值变大或变小并不直接对应"配方更好或更差"。真正重要的是通过它推导出的KKT条件(见§4.4),这些条件才是判断最优解的"体检报告"。

拉格朗日乘子法很优雅,但对于一些"简单约束",有更直观的算法——投影梯度下降(Projected Gradient Descent)。

想象约束是一个围栏围起来的区域(比如参数必须非负,):

这就像你蒙眼下山,但山脚下有一圈护栏。你只管往下走,如果撞到了护栏,就贴着护栏继续滑。

什么时候用投影梯度下降?

对于复杂的非线性约束,投影可能很难计算,这时拉格朗日乘子法更合适。

对于一般的不等式约束优化问题:

最优解必须满足KKT条件(Karush-Kuhn-Tucker Conditions):

直觉理解:

📌进阶部分:对于凸优化问题,KKT 条件天然是充分条件(满足 KKT 必为最优)。如果再满足Slater 条件(存在至少一个严格满足所有不等式约束的点,即),则 KKT 条件也是必要条件(最优必满足 KKT),二者合起来才是充要条件。直观地说,Slater 条件要求可行域不能"薄如纸片",必须有内部空间。对于非凸问题,KKT 条件只是必要条件(满足KKT不一定最优,但最优一定满足KKT)。

📌进阶部分:注意等式约束的乘子可正可负,没有非负限制,只有不等式约束的乘子才要求。

拉格朗日乘子法不仅给出了最优解的条件,还引出了一个对偶问题。简单来说:

这两个问题就像一枚硬币的两面。有时对偶问题比原问题更容易求解,而且无论原问题多复杂,对偶问题的最优值总是原问题最优值的"下界"。

📌进阶部分:SVM(支持向量机)的核技巧就依赖对偶形式——通过求解对偶问题,我们可以把数据映射到高维空间,而无需显式计算高维坐标。

经典拉格朗日乘子法虽然优美,但在数值计算中有一个问题:乘子的更新容易震荡,收敛较慢。现代工程中有两个重要的改进:

增广拉格朗日法(Augmented Lagrangian):

对于等式约束,增广拉格朗日函数为:

这个额外的就像给约束加了一层"弹簧":一旦偏离约束,弹簧就会强力把你拉回来,显著改善收敛稳定性。

对于不等式约束,经典做法通常引入松弛变量将其转化为等式,再构造增广拉格朗日函数。工程实现中,也可采用带投影的惩罚形式作为近似:

这样只有当约束被违反()时,惩罚项才会"激活"。

ADMM(交替方向乘子法): 当目标函数可以拆成几部分(比如),且各自有简单约束时,ADMM 把它们"分而治之":

这就像两个部门合作完成项目:各自先按自己的理解做一版,然后开会协调差异,再各自修改,反复迭代。ADMM 广泛用于稀疏编码、压缩感知、联邦学习和神经网络剪枝。

拉格朗日乘子有一个深刻的经济学含义:影子价格(Shadow Price)。

它表示:如果满意度要求放宽1分(约束变松),成本最多能降低元。如果,意味着你少要求1分满意度,最多能省0.5元成本。

在机器学习中,SVM的求解就大量使用了拉格朗日乘子法。那些的样本点,就是支持向量——它们"支撑"起了决策边界。

想象你在教一个孩子识别猫。你给他看了100张猫的照片,其中70张是橘猫。结果孩子得出结论:"所有猫都是橘色的,不是橘色的就不是猫。"

这就是过拟合(Overfitting):模型过度适应了训练数据的细节(包括噪声),失去了泛化能力。

奥卡姆剃刀原则说:"如无必要,勿增实体。"在模型选择中,这意味着:

如果两个模型解释力相当,选择更简单的那个。

"简单"在数学上通常意味着参数值较小。正则化就是在目标函数中加入一个惩罚项,阻止参数变得太大:

最常见的两种正则化:

直觉:像弹簧一样,把参数往0拉。拉力的强度与参数大小成正比——大参数受大惩罚,小参数受小惩罚。

效果:参数变得小而均匀,没有绝对为0的参数。

直觉:在零点附近有一个"吸引区"——只要参数已经很小,就容易被推精确到0;而较大的参数则按固定力度向0收缩。这会产生稀疏解——很多参数恰好为0。

效果:自动做特征选择,只保留最重要的特征。

📌进阶部分:L1和L2正则化可以从贝叶斯概率的角度理解:

从这个角度看,正则化强度反映了我们对"简单模型"这个先验信念的置信度——越大,我们越相信参数应该接近0。

💡数值实现提示:在连续数学中,L1确实能把参数精确压到0;但在计算机的浮点精度下,有时得到的是"极接近0"的极小值。工程实现中通常会配合一个阈值,把足够小的参数直接截断为0,以获得真正的稀疏性。

📌进阶部分:L1 正则化在处不可导,严格意义上不能直接用普通梯度下降求解,而需要用到次梯度(Subgradient)的概念,或采用近端梯度下降(Proximal Gradient Descent)等专门算法。近端方法的核心思想是:在每一步梯度更新后,额外执行一个"收缩"操作,直接把足够小的参数精确压到0。经典的 ISTA / FISTA 算法就是求解 L1 正则化问题的标准工具。

想象你在一个二维平面上寻找损失函数的最小值。

📌进阶部分:L1正则化产生的稀疏性在深度学习中也有应用,比如稀疏自编码器和网络剪枝(Pruning),通过把不重要的权重设为0来压缩模型。

有时候我们既想要L1的特征选择能力,又想要L2的稳定性。于是有了弹性网络(Elastic Net):

其中控制两者的比例。

在标准SGD(随机梯度下降)中,L2正则化与权重衰减(Weight Decay)数学上是严格等价的——两者都把参数往0推。但在现代深度学习常用的Adam优化器中,两者不等价。

在Adam中,由于每个参数的学习率是自适应的,L2正则化的效果会被学习率的缩放"扭曲"。因此,现代训练(如Transformer、BERT、GPT)几乎都用AdamW——一种把权重衰减与梯度更新解耦的优化器。

📌进阶部分:如果你在使用预训练模型(如BERT、GPT),配置文件中通常写的是weight_decay而不是L2_penalty,这就是原因。

正则化家族不止L1/L2,还有几种极其重要的成员:

训练模型时,监控模型在验证集(没见过的新数据)上的表现。当验证集上的损失不再下降、反而开始上升时,立即停止训练。

直觉:就像烤面包,闻到香味就该出炉了,再烤下去只会焦掉。早停是最简单、最有效的正则化手段之一,而且完全"免费"——不需要修改模型或损失函数。

📌进阶部分:这里要区分三个数据集:

如果把测试集当成验证集反复用,就像把高考卷子当练习题做,最后分数一定虚高——这叫做数据泄露(Data Leakage)。

在训练神经网络时,每次迭代都随机"关掉"一部分神经元(比如每次随机选50%的神经元,让它们这次不参与计算)。

直觉:就像让一支球队训练时每次随机少上几名主力,强迫每个球员(神经元)都能独当一面,不能过度依赖队友。这防止了神经元之间的共适应(co-adaptation),让网络更鲁棒。

数据增强是最强大的隐式正则化之一。比如训练图像识别时,把图片随机裁剪、翻转、加噪声,相当于不花钱就获得了更多训练样本。

直觉:模型被迫学习"本质特征"(猫有尖耳朵、长胡须)而非"表面细节"(这张照片的背景是沙发、那只猫刚好在伸懒腰)。在计算机视觉中,数据增强的效果往往超过L1/L2正则化。

📌进阶部分:数据增强的"增强"不是随意乱改——旋转角度不能太大(否则猫倒过来不像猫),裁剪不能裁掉主体。好的增强策略需要符合数据的物理或语义约束。

传统训练中,猫的图片标签是"100%是猫"。标签平滑把它改成"90%是猫,10%是其他"。

直觉:就像老师不告诉学生"这道题只有一种解法",而是说"主流解法是这个,但也可能有其他思路"。这防止模型对训练集过度自信,是Transformer训练的标配技巧。

Mixup:把两张图片和它们的标签按比例"混合"(比如一张猫和一张狗,按0.6:0.4混合成一张新图,标签也混合)。

CutMix:从一张图上挖一块补丁贴到另一张图上。

直觉:强迫模型学习"过渡态"——如果一张图介于猫和狗之间,模型应该输出介于"猫"和"狗"之间的概率,而不是武断地二选一。这让决策边界更平滑,泛化能力更强。

在训练深层网络(如ResNet,以及部分深层Transformer变体)时,每次迭代随机跳过某些完整的层(比如随机让某些残差块"消失")。

直觉:就像训练一支特种部队,每次任务随机少带几件装备,强迫士兵适应"任何 subset 都能完成任务"。这减轻了深层网络的训练负担,同时起到强大的正则化效果。

前面说过,深度网络有很多"谷底"。但不同的谷底,泛化能力天差地别:

📌进阶部分:2021年后流行的SAM(Sharpness-Aware Minimization)优化器,核心理念就是"不仅要找低损失的谷底,还要找最平坦的那个"。它在每一步更新时,会"探一探"周围区域的坡度,主动避开尖谷。实验证明,SAM 能显著提升模型的泛化性能,尤其是在图像分类和自然语言处理任务上。

前面讨论的优化问题,决策变量通常是连续的(比如糖度可以是30%、31%、31.5%……)。但生活中很多问题是离散的:

这类问题叫组合优化(Combinatorial Optimization),通常比连续优化更难。

贪婪算法(Greedy Algorithm)的策略很简单:每一步都做出当前看起来最好的选择,不考虑未来。

例子:用有限的钱买书,每本书有价格和评分。贪婪策略是每次都买"性价比最高"的书,直到钱花完。

优点:简单、快速。 缺点:可能错过全局最优。比如两本便宜书加起来比一本贵书评分更高,但贪婪算法会先买贵书。

动态规划(Dynamic Programming)解决了一个关键问题:子问题的重叠。

核心思想:把大问题拆成小问题,记住小问题的答案,避免重复计算。

背包问题的递推公式:

设表示:考虑前件物品,在容量为时能获得的最大价值。

解释:对于第件物品,我们只有两种选择:

很多组合优化问题可以写成整数线性规划(Integer Linear Programming, ILP)的形式:

这里的表示"选"(1)或"不选"(0)。

📌进阶部分:ILP是NP-hard问题,直接求解很困难。一个核心技巧是LP 松弛(LP Relaxation):先把"必须是0或1"的硬约束放松为"可以在0到1之间连续取值"(),求解这个"松弛后"的连续线性规划问题。如果运气好,松弛后的最优解恰好全是整数,那它就是原问题的最优解。如果不是整数,求解器会采用分支定界(Branch and Bound)——对某个非整数变量分别尝试"设为0"和"设为1",把问题拆成两个子问题继续求解,逐步缩小搜索范围。现代求解器(如Gurobi、CPLEX)利用这些技巧,往往能高效求解实际规模的ILP问题。

对于大规模组合优化问题,精确算法可能算到天荒地老。这时我们需要启发式算法——不保证最优,但能在合理时间内找到"足够好"的解。

像炼钢降温:初期温度高,分子活跃,允许接受"差解"( uphill )以跳出局部最优;随着温度降低,越来越严格,最终稳定在优质解附近。

直觉:下山时,初期允许偶尔往上爬几步(探索),后期只接受下坡(收敛)。

保留一群候选解(种群),通过交叉(两个好方案各取一部分组合)和变异(随机小改动)不断进化出更好的后代。

直觉:不是一个人下山,而是派一支探险队,优秀的队员繁衍后代,劣质的自然淘汰,最终整个种群会聚集在最好的谷底。

对于NP-hard问题,有时我们不需要最优解,一个"足够好且有理论保证"的近似解就够了。比如旅行商问题存在2-近似算法——保证找到的路线长度不超过最优解的两倍。

📌进阶部分:神经网络架构搜索(NAS)本质上就是组合优化——从无数种层组合中找到最优架构。实践中大量使用遗传算法、强化学习或梯度近似方法来避免穷举。

前面提到的启发式算法多用于离散组合问题。但还有一种场景:你需要调一组连续参数(比如神经网络的超参数:学习率、正则化强度、层数),但每试一次代价很高(训练一次模型要几小时)。

贝叶斯优化(Bayesian Optimization)就像一位经验丰富的实验设计师:

直觉:不像网格搜索那样"地毯式轰炸",也不像随机搜索那样"瞎蒙",而是"哪里看起来有金矿,就往哪里钻"。贝叶斯优化是AutoML和超参数调优的核心工具,与遗传算法、模拟退火形成很好的互补。

在学习最优化时,初学者常会遇到以下困惑。这里集中澄清:

澄清:只有凸函数才能保证。非凸函数(如深度神经网络的损失函数)可能存在无数个局部最小值、鞍点和平台区。梯度下降只能保证找到"附近的谷底",未必是整座山的最低点。

实践中深度网络表现好的原因是:现代过参数化网络中,部分理论研究与经验观察表明"坏的"局部最小值非常稀少;高维空间中鞍点与平台区(plateau)比局部极小值更普遍;SGD的噪声、动量和自适应学习率有助于逃离平坦区域。

澄清:两者几何性质截然不同,不能互相替代:

如果你需要压缩模型或筛选特征,L1 是更好的选择;如果你只是想让参数不要太大,L2 更稳定。

澄清:反映的是约束的"紧张程度"。如果约束在最优解处不起作用(例如,即使不强制要求满意度80,成本最低的配方本来满意度就有90分),那么。只有当约束"绑紧"了最优解时,。

澄清:学习率过小会导致:

理想策略是自适应学习率:初期大步快走,后期小步微调(如Warmup + 余弦退火,或更高级的 Adam 算法)。

澄清:凸优化"简单"是指理论上有保证(局部最优=全局最优),并不意味着计算量一定小。一个高维凸优化问题(如百万维度的线性规划)仍然需要高效的数值算法和大量计算资源。只是相比之下,我们更有信心它最终能找到正确答案。

澄清:在标准SGD中两者数学严格等价,但在Adam/AdamW等自适应优化器中,两者不等价。现代深度学习训练几乎都用AdamW(解耦的权重衰减),而非把L2惩罚加到损失函数上。如果你混用两者,可能会导致正则化效果不符合预期。

澄清:早停(Early Stopping)是非常"正规"且强大的正则化手段。它不需要修改损失函数,实现简单,效果往往不输复杂的正则化项。在实际项目中,早停+Dropout+L2的组合是常见做法。

澄清:Adam像自动挡汽车,SGD像手动挡。Adam在训练初期收敛快,对超参数不敏感,"开箱即用"。但在很多任务(如图像分类的精调阶段、某些生成模型)中,经过精心调参的SGD + Momentum最终能达到比Adam更高的精度。现代训练常用"Adam预热 + SGD精调"的两阶段策略。

澄清:对于现代过参数化的深度网络(如ResNet、Transformer),部分理论研究与经验观察表明,局部最小值往往并不可怕——它们的损失值与全局最小值非常接近。真正需要警惕的是鞍点(梯度为零但不是极值的点)、平台区(梯度极小但损失仍高)和梯度消失(深层网络冻住)。

澄清:Warmup是"预热"(从0慢慢升温),衰减是"降温"(从峰值慢慢回落)。两者通常配合使用:没有Warmup直接用大学习率,就像冷车地板油,容易损坏发动机(参数发散);没有衰减则后期难以精细收敛。现代大模型训练的标配是Warmup + Cosine Annealing。

最优化是人工智能的"引擎":

如果你读到这里,已经对最优化有了扎实的直觉基础。下一步可以深入了解:

数学不是冰冷的符号,而是人类理解世界的语言。每一个公式背后,都有一个可以被直觉把握的故事。

希望这篇文章让你感受到:最优化不是遥不可及的数学殿堂,而是生活中处处可见的"寻找更好"的智慧。

"数学的本质不在于计算,而在于理解。"—— 理查德·费曼