AI 工程基础体系 · 第 37/100 篇。内容覆盖机器学习、深度学习与生成式 AI;模型、数据、评测、权限和成本会作为同一生产系统处理。
AI 优化基础:凸性、梯度下降、约束、鞍点与收敛判断
机器学习中的“训练”通常可以写成一个优化问题:
其中:
- 是模型参数,例如线性回归的权重、神经网络的全部参数或生成模型的参数;
- 是目标函数,通常由数据损失、正则项和其他约束相关项组成;
- 优化算法通过不断修改 ,寻找使 尽可能小的参数。
例如监督学习中,给定样本 ,经验风险可以写为:
这里 是参数为 的模型, 是单样本损失, 是训练样本数。
优化问题看似只是“让损失下降”,但实际需要回答至少五个问题:
- 目标函数是否具有凸性?
- 梯度下降为什么能够下降?
- 学习率应该如何选择?
- 如果参数或输出受到限制,如何处理约束?
- 训练停下来时,如何判断是收敛、停滞、发散,还是仅仅进入了鞍点附近?
这些问题在机器学习、深度学习和生成式 AI 中都存在。区别在于:传统凸优化往往可以给出全局最优保证,而深度模型通常是高维、非凸、随机且可能带有约束的优化问题。
1. 优化问题的基本组成
1.1 参数、目标函数与梯度
以一元函数为例:
它的最优点是 ,因为:
当 时,梯度为负,沿负梯度方向移动就是向右移动;当 时,梯度为正,沿负梯度方向移动就是向左移动。
多维情况下,导数扩展为梯度:
梯度指向函数增长最快的方向,因此负梯度方向是局部下降最快的方向:
需要注意,“负梯度方向是局部下降方向”并不等于“沿负梯度走任意长度都能下降”。步长过大时,可能越过低点,甚至直接发散。
1.2 梯度来自链式法则
神经网络的梯度不是凭空得到的,而是对复合函数使用链式法则。
假设:
则:
由于:
因此:
反向传播只是高效地组织并计算这些链式法则中的局部导数。优化器接收的是梯度,模型结构、激活函数和损失函数决定梯度如何产生。
1.3 批量梯度与随机梯度
全量目标函数为:
其梯度为:
全量梯度下降每次使用全部样本。若只抽取一个小批次 ,则使用:
在随机抽样均匀且实现正确时,通常有:
这意味着小批量梯度在期望意义上是全量梯度的无偏估计,但单次更新包含噪声。批量越小,更新通常越便宜、噪声越大;批量越大,梯度估计更稳定,但显存、计算和通信成本更高。
2. 凸性:为什么它能改变优化问题的难度
2.1 凸集合与凸函数
集合 是凸集,是指任意两个点 ,以及任意 ,都有:
直观上,集合中任意两点连成的线段仍然完全位于集合内部。
函数 在凸集合 上是凸函数,是指:
这表示函数图像不会高于任意两点之间的连线。对于一维函数,凸函数常被直观地描述为“碗形”,但“碗形”只是帮助理解,真正的定义是上述不等式。
严格凸函数要求当 且 时:
严格凸函数最多只有一个全局最优点。
2.2 可微凸函数的一阶条件
如果 可微,则 凸,当且仅当对任意 :
右侧是函数在 处的一阶切平面。这个条件的含义是:凸函数始终位于任意切平面的上方。
因此,如果某个点满足:
那么对任意 :
所以 是全局最优点。
这就是凸优化的重要性质:
对可微凸目标函数,任何一阶驻点都是全局最优点。
在非凸问题中, 只说明这里是一阶驻点,可能是局部最小点、局部最大点或鞍点。
2.3 二阶条件:Hessian 半正定
如果 二阶可微,则可以通过 Hessian 矩阵判断凸性:
若对定义域内所有 ,都有:
即对任意向量 :
那么 是凸函数。
对于二次函数:
其梯度和 Hessian 分别为:
因此,当 是对称半正定矩阵时, 是凸函数;当 是正定矩阵时, 是强凸函数,并且最优点唯一。
2.4 强凸性与光滑性
强凸性比普通凸性更强。若存在 ,使得:
则称 是 -强凸的。
强凸性意味着函数在任意方向上都有足够的曲率,不会出现完全平坦的方向。它通常带来:
- 最优点唯一;
- 参数距离和目标函数差距之间存在关系;
- 梯度下降具有更快的线性收敛界。
光滑性通常指梯度满足 Lipschitz 条件。若存在 ,使得:
则称 是 -smooth。
光滑性限制了梯度变化速度。它可以推出下降引理:
令:
得到:
只要:
右侧的额外项就是负的,因此这一步保证目标函数下降。常用的保守选择是:
这里的 是学习率,也称步长。
2.5 凸性不等于“容易训练”
线性回归的平方损失、逻辑回归的对数损失通常可以形成凸优化问题。但即使目标函数凸,仍然可能存在:
- 特征尺度差异导致条件数很大;
- 学习率选择不当导致震荡;
- 数据量巨大导致单步梯度成本很高;
- 约束或正则化改变问题结构;
- 目标函数数值计算不稳定。
深度神经网络的训练目标通常是非凸的,因为多层线性变换与非线性激活的组合会产生复杂的损失地形。预训练语言模型、扩散模型和其他生成式 AI 模型也通常属于非凸优化。
凸性提供的是理论保证,不是训练速度或系统质量的全部保证。
3. 梯度下降:更新规则与下降条件
3.1 基本算法
梯度下降的更新规则是:
其中:
- 是迭代次数;
- 是第 步参数;
- 是第 步的学习率;
- 是当前参数处的梯度。
这个更新可以看作在当前位置用一阶 Taylor 近似:
如果约束更新方向的长度为固定值,令:
则一阶项为:
只要梯度非零,一阶近似会下降。
但 Taylor 近似只描述局部行为,实际函数还有二阶及更高阶项,所以学习率不能无限大。
3.2 完整数值算例
考虑:
其梯度为:
设初始点 ,学习率 。更新公式为:
逐步计算:
| 步骤 | 当前点 | 梯度 | 更新后 | 函数值 |
|---|---|---|---|---|
| 0 | 0 | -3 | 1.5 | |
| 1 | 1.5 | -1.5 | 2.25 | |
| 2 | 2.25 | -0.75 | 2.625 | |
| 3 | 2.625 | -0.375 | 2.8125 |
误差满足:
因此每一步误差缩小为原来的一半,最终收敛到 。
如果学习率改成 ,则第一步直接得到:
因为该函数的曲率为 ,这个特殊例子可以一步到达最优点。
如果学习率改成 ,则:
误差绝对值会扩大 倍,点在最优点两侧交替跳动并发散。这个例子对应 ,而稳定条件要求:
所以 超出了稳定范围。
3.3 二次函数中的条件数
考虑多维二次函数:
其中 是对称正定矩阵。若 的最小和最大特征值分别为 和 ,则:
- 描述最小曲率;
- 描述最大曲率;
- 条件数为:
当 很大时,函数等高线像狭长的椭圆。梯度往往指向较陡方向,而不是直接指向最优点,导致算法在狭长谷底中左右摆动,收敛缓慢。
对于强凸且光滑的函数,使用合适固定学习率时,梯度下降通常具有线性收敛形式:
其中 , 与初始点有关。对于某些标准步长选择, 与:
同阶。条件数越大, 越接近 ,收敛越慢。
特征标准化、预条件方法、动量和自适应优化器的一个重要作用,就是改善不同方向上的尺度差异。但它们不能自动把非凸问题变成凸问题,也不能保证训练目标达到全局最优。
3.4 动量与自适应方法的边界
动量方法维护一个历史方向,例如:
其中 控制历史梯度的影响。动量可以减少狭长谷底中的来回震荡,并在连续一致的方向上加速。
自适应方法会根据历史梯度的大小调整每个参数的有效步长。它们在深度学习中常见,但“训练损失下降”不代表:
- 学习率一定合理;
- 参数一定接近全局最优;
- 验证集性能一定更好;
- 生成质量、事实性或安全性一定提高。
尤其在随机、非凸和带正则项的训练中,优化器改变的是参数搜索路径和隐含偏好,不只是单纯提高每一步的下降速度。
4. 约束优化:可行域决定哪些更新是合法的
4.1 约束问题的形式
带约束的优化问题可以写成:
满足:
满足所有约束的点构成可行域。若一个点违反任意约束,它就不是可接受解,即使其目标函数值很小。
机器学习中的约束可能包括:
- 参数范数不能超过指定上限;
- 概率向量的元素非负且和为 ;
- 资源分配比例必须满足总预算;
- 推理延迟、显存或成本受到限制;
- 生成输出必须符合长度、格式或安全策略;
- 多任务模型中不同指标需要满足最低阈值。
4.2 约束会改变“最优点”
考虑:
无约束最优点是 。现在增加约束:
最接近 的可行点是:
因此,约束优化的最优点不一定满足无约束梯度为零。此处:
如果只检查“梯度是否接近零”,会错误地认为算法没有收敛。正确判断必须同时检查约束边界和可行方向。
4.3 投影梯度下降
当可行域 是凸集时,可以先进行普通梯度更新,再把结果投影回可行域:
其中:
表示距离 最近的可行点。
继续使用上面的例子,令:
初始 ,学习率 。
第一步:
因为 ,投影后仍为:
第二步:
它违反 ,投影得到:
之后:
再次投影后仍为:
此时参数不再变化,虽然普通梯度为 ,但负梯度方向是向右的,而右侧已被约束阻挡。
4.4 可运行的投影梯度示例
下面的代码只使用 Python 和 NumPy,实现:
import numpy as np
def objective(x):
return 0.5 * (x - 3.0) ** 2
def gradient(x):
return x - 3.0
def project_to_feasible(x):
# 约束为 x <= 2
return min(x, 2.0)
x = 0.0
learning_rate = 0.5
for step in range(8):
grad = gradient(x)
unconstrained = x - learning_rate * grad
next_x = project_to_feasible(unconstrained)
print(
f"step={step:02d}, "
f"x={x:.6f}, "
f"grad={grad:.6f}, "
f"raw={unconstrained:.6f}, "
f"next={next_x:.6f}, "
f"loss={objective(x):.6f}"
)
x = next_x
print(f"final x={x:.6f}, feasible={x <= 2.0}")
预期结果的关键部分是:
step=00, x=0.000000, grad=-3.000000, raw=1.500000, next=1.500000
step=01, x=1.500000, grad=-1.500000, raw=2.250000, next=2.000000
step=02, x=2.000000, grad=-1.000000, raw=2.500000, next=2.000000
...
final x=2.000000, feasible=True
这里:
raw是不考虑约束的更新结果;next是投影后的可行参数;- 目标函数在前几步下降;
- 到达边界后,参数不再变化;
- 梯度不为零并不表示失败,因为零梯度不是带约束问题的必要条件。
这个示例的投影很简单。如果约束是欧氏球:
投影为:
而对概率单纯形:
投影需要使用专门的单纯形投影算法,不能简单地逐元素截断后直接认为结果仍然满足和为 。
4.5 KKT 条件:判断约束最优性的正式工具
对于问题:
满足:
定义拉格朗日函数:
其中:
- 是不等式约束乘子;
- 是等式约束乘子。
KKT 条件包括:
驻点条件
原始可行性
对偶可行性
互补松弛
互补松弛表示:
- 如果约束未触碰边界,,则必须有 ;
- 如果约束在边界上,乘子可以为正,表示该约束正在阻碍目标继续下降。
对于:
拉格朗日函数为:
在 处:
因此:
同时 ,原始可行性、对偶可行性和互补松弛全部成立。
在凸问题中,如果目标函数和不等式约束是凸的、等式约束是仿射的,并满足适当的约束资格条件,例如 Slater 条件,那么 KKT 条件通常不仅是必要条件,也是全局最优的充分条件。
4.6 惩罚法与屏障法
另一种处理约束的方法是把约束加入目标函数。
对于约束 ,惩罚法可以使用:
当 时,违反约束会增加损失; 越大,违反约束的代价越高。
但有限的 通常只会得到“近似可行”解,而不是严格可行解。如果 取值极大,目标函数可能变得病态,梯度尺度差异明显,优化反而困难。
屏障法则在接近边界时增加代价,例如:
它要求 ,并在接近 时令目标趋向无穷大。屏障法保持严格内部可行,但通常只能通过逐步减小 接近边界最优点。
工程上必须区分:
- 投影通常可以保证每一步满足某些简单约束;
- 惩罚项只是在目标中“鼓励”满足约束;
- 屏障法要求从严格可行点开始;
- 复杂约束可能需要专门的约束求解器,而不是简单修改损失函数。
5. 鞍点:不是最小值,也不一定是最大值
5.1 定义
点 是鞍点,通常指它在某些方向上像局部最小点,在另一些方向上像局部最大点。
典型函数是:
在 处:
但沿 轴:
原点像局部最小点;沿 轴:
原点又像局部最大点。因此原点不是局部最小值,而是鞍点。
Hessian 为:
它同时存在正特征值和负特征值,因此是不定矩阵。这是二阶可微函数中识别严格鞍点的典型信号。
5.2 梯度下降在鞍点附近的行为
对:
使用梯度下降:
若 ,则 方向逐渐靠近 ,但 方向会乘以大于 的因子并远离 。
例如 ,初始 :
方向下降, 方向增长。即使某些方向看起来已经稳定,整体也没有收敛到局部最小值。
5.3 深度学习中的鞍点与平坦区域
高维非凸函数中,鞍点可能比低维直觉中的“马鞍形”复杂得多。一个驻点的 Hessian 可能有:
- 正特征值:存在局部上升方向对应的下降路径;
- 负特征值:从该点沿某方向可以降低目标;
- 接近零的特征值:形成平坦方向。
实践中,大型神经网络常见大量近似平坦区域和尺度等价。例如不同层的参数重缩放可能产生相近的函数行为。于是:
并不自动说明模型处于理想最小值。
不过“非凸”也不等于“训练必然被鞍点困住”。随机小批量梯度中的噪声、参数初始化、归一化、学习率变化和模型结构都会影响离开鞍点或平坦区域的行为。不能仅凭“损失没有下降”就断定原因是鞍点。
5.4 最小值、最大值、鞍点的诊断差异
若 ,二阶 Hessian 可以提供局部判断:
- Hessian 正定:严格局部最小值;
- Hessian 负定:严格局部最大值;
- Hessian 不定:鞍点;
- Hessian 半正定或存在零特征值:二阶测试无法决定,需要更高阶分析。
深度模型中完整 Hessian 通常巨大,直接构造和分解成本很高。工程上更常使用:
- 梯度范数;
- 随机方向上的函数扰动;
- Hessian-vector product;
- 少量最大或最小特征值估计;
- 改变学习率或随机种子后的轨迹比较。
这些是诊断证据,不是对全局地形的完整证明。
6. 收敛:理论定义与工程判断不是一回事
6.1 不同意义下的收敛
“收敛”至少有四种不同含义。
参数收敛
表示相邻两步参数变化很小。
目标函数收敛
表示目标值变化很小。
梯度收敛
表示接近一阶驻点。
统计或任务指标收敛
例如验证集损失、准确率、生成质量、事实性、安全率或成本指标不再改善。
这些条件并不等价。例如:
- 学习率衰减到极小值时,参数变化很小,但目标可能仍然很差;
- 在约束边界上,梯度不为零,但已经达到约束最优;
- 训练损失稳定下降,但验证集损失已经上升,说明发生过拟合;
- 随机优化中,训练损失会在噪声水平附近波动,而不会严格单调下降。
6.2 凸优化中的理论收敛
对凸、-smooth 函数,固定学习率满足:
时,梯度下降有典型的次线性函数值收敛界:
如果函数同时是 -强凸的,则可以得到线性收敛:
这些结论依赖明确条件:
- 目标函数确实凸或强凸;
- 梯度满足相应光滑性;
- 学习率位于理论要求范围;
- 计算梯度足够准确;
- 问题没有被数值溢出或截断破坏。
不能把凸优化的全局收敛定理直接套用于深度网络、生成模型或任意 Adam 训练过程。
6.3 非凸优化中的常见保证
对于下界有限且梯度 -smooth 的非凸函数,固定足够小学习率时,常见结果是平均梯度平方范数下降:
这类结果通常表示算法能找到“一阶驻点附近”,而不是保证找到全局最小值。
在随机梯度情况下,还要考虑梯度估计方差。若:
其中 是噪声,则更新轨迹可能在最优点附近持续抖动。常见做法包括:
- 随训练降低学习率;
- 增大批量;
- 使用梯度裁剪控制异常更新;
- 对训练损失使用滑动平均;
- 使用独立验证集判断泛化效果。
但这些方法改变的是统计行为或数值稳定性,不会凭经验自动证明全局收敛。
7. 如何判断一次训练到底发生了什么
7.1 先看目标函数和更新量
每个训练阶段至少应记录:
还可以记录相对变化:
典型解释如下:
| 现象 | 可能原因 |
|---|---|
| 损失持续上升 | 学习率过大、梯度实现错误、数值溢出、数据或标签错误 |
| 损失剧烈振荡 | 学习率过大、条件数差、批次噪声大、动量过强 |
| 梯度和更新都很小 | 可能收敛,也可能梯度消失、学习率过小或进入平坦区域 |
| 训练损失下降、验证损失上升 | 过拟合、训练验证分布不一致或数据泄漏 |
| 损失正常但任务指标异常 | 损失与业务目标不一致、标签映射错误或评测实现错误 |
| 约束持续违反 | 投影、参数化或惩罚实现不正确 |
| 目标值变成 NaN/Inf | 溢出、非法对数、除零、混合精度不稳定或输入异常 |
任何单个指标都不足以证明收敛。至少要结合目标值、更新量、梯度、验证指标和约束违反程度。
7.2 约束问题的收敛判断
带约束问题需要同时查看:
原始约束残差
以及等式约束残差:
可行性
确认最终参数是否满足所有硬约束,而不是只查看惩罚后的总损失。
投影梯度或可行方向残差
普通梯度可能在边界上不为零,因此可以观察:
如果:
表示一步投影梯度更新几乎不再改变参数,是约束问题中更合适的一阶驻点指标。
7.3 用独立验证集判断“训练成功”
优化器只直接最小化训练目标,而生产系统关心的通常是独立数据上的效果。
对于分类模型,至少需要区分:
- 训练损失;
- 验证损失;
- 主要业务指标;
- 分群指标;
- 校准、鲁棒性和安全性指标。
对于生成式 AI,还可能包括:
- 任务成功率;
- 事实性或引用正确率;
- 拒答和安全策略的符合率;
- 输出格式合规率;
- 推理延迟;
- 单次请求成本;
- 上下文长度和显存使用。
如果把模型、数据、评测、权限和成本作为同一生产系统处理,那么“优化收敛”只是其中一层状态:
- 数据版本改变,目标函数就可能改变;
- 评测权限不足,指标可能无法完整计算;
- 成本预算受限,理论上更长训练不一定是可接受方案;
- 训练和推理资源不同,训练损失下降不代表线上延迟满足要求;
- 访问控制或安全过滤改变有效输出空间,相当于增加了系统约束。
因此,停止训练的依据不应只有“epoch 数量达到上限”,而应包括目标、验证指标、约束残差和资源状态。
8. 常见误解与反例
8.1 “梯度为零就是最优”
反例:
原点梯度为零,但它是鞍点。
在约束问题中,边界最优点甚至可能梯度不为零:
最优点为 ,梯度为 。
正确说法是:
- 无约束凸问题:梯度为零即可推出全局最优;
- 无约束非凸问题:梯度为零只能说明一阶驻点;
- 约束问题:要检查 KKT 条件或投影梯度残差。
8.2 “损失下降就一定在接近全局最优”
在非凸问题中,损失下降只说明当前更新降低了当前目标,不能说明:
- 已经找到了全局最优;
- 未来不会进入更好的区域;
- 验证集性能会继续提升;
- 其他随机初始化无法找到更好解。
即使目标是凸的,损失下降速度也可能因为条件数很大而非常慢。
8.3 “学习率越小越稳定,因此越小越好”
学习率过小虽然可能避免发散,但会造成:
长期都极小,训练在有限预算内几乎没有进展。对于随机梯度,学习率过小还可能使模型过早停留在初始化附近。
学习率的选择是稳定性、收敛速度、噪声尺度和总计算预算之间的折中,而不是越小越安全。
8.4 “惩罚项足够大就等于硬约束”
设:
当 有限时,某个轻微违反约束但目标函数明显更低的点,仍可能成为惩罚问题的最优点。增大 能减少违反程度,却可能造成严重的尺度差异和优化困难。
如果约束必须严格满足,应优先使用:
- 投影;
- 可行参数化;
- 专用约束算法;
- 优化后独立验证并拒绝不可行结果。
8.5 “训练损失最低的模型就是生产模型”
如果训练损失和线上目标不一致,最低训练损失可能对应:
- 验证集过拟合;
- 生成内容冗长但不准确;
- 对少数群体表现恶化;
- 安全约束违反;
- 推理成本过高;
- 延迟超过服务等级目标。
模型选择应在独立评测数据上完成,并将质量、风险、权限和成本作为显式决策条件。
9. 一套可复用的收敛检查流程
可以按以下顺序诊断一次优化过程:
第一步:确认目标是否正确
检查:
- 标签和预测是否对齐;
- 损失的 reduction 是否符合预期;
- 正则项是否被重复计算;
- 训练和验证预处理是否一致;
- 生成模型中的噪声、时间步或条件输入是否正确;
- 损失数值是否存在 NaN、Inf 或异常尺度。
如果目标函数实现错误,任何优化器调参都只是掩盖问题。
第二步:做小规模过拟合测试
取极少量样本,例如几个样本,尝试让模型几乎完全拟合它们。若简单模型在小数据上也无法降低损失,常见原因是:
- 梯度计算错误;
- 参数未真正更新;
- 优化器状态未正确初始化;
- 输入或标签形状错误;
- 学习率极端不合适;
- 约束或裁剪逻辑阻止了有效更新。
这项测试不能证明泛化良好,但能快速排除大量实现错误。
第三步:观察学习率对应的轨迹
固定其他因素,比较几个不同学习率:
- 极大时若立即 NaN 或爆炸,说明数值不稳定;
- 中等时若平稳下降,说明原学习率可能过大;
- 极小时若几乎不动,说明更新受限;
- 所有学习率都不动,应优先检查梯度和数据流,而不是继续调学习率。
第四步:分别记录训练、验证、约束和资源指标
不要把它们压缩成一个没有解释的总分。应分别记录:
对生产训练,还应记录:
- 数据版本;
- 模型和代码版本;
- 随机种子;
- GPU/CPU 时间;
- 显存和存储;
- 每步或每 epoch 成本;
- 评测数据的访问权限与完整性。
这样才能区分“算法没有收敛”和“指标没有权限计算”“数据版本不一致”“成本预算提前终止”等不同故障路径。
第五步:使用停止条件,但保留最佳检查点
一个实际停止规则可以同时要求:
连续若干次评估没有改善,并且:
对于非凸模型,还应根据验证集指标保存最佳检查点,而不是默认使用最后一个检查点。最后一个检查点可能已经过拟合、出现训练退化或只是随机噪声下的一次较差更新。
10. 从数学保证到生产取舍
凸性、梯度下降、约束、鞍点和收敛判断分别回答不同问题:
- 凸性回答:局部最优是否能推出全局最优?
- 梯度下降回答:如何根据局部斜率生成参数更新?
- 约束回答:哪些参数或输出是合法的?
- 鞍点回答:梯度为零时,为什么仍可能不是最小值?
- 收敛判断回答:训练停止时,究竟是接近目标、受约束阻挡、步长过小,还是发生了异常?
最重要的推理边界是:
只有在目标函数性质、约束条件、优化器行为、验证数据和生产指标都被分别检查后,才能对“收敛”作出可信判断。对于传统凸模型,可以依赖明确的全局收敛理论;对于深度学习和生成式 AI,更现实的目标通常是:在给定数据、计算、成本和安全约束下,找到一个稳定、可复现、验证指标良好且满足生产要求的一阶近似解。
系列导航与关联阅读
- 系列入口:AI 工程完整学习路线:从机器学习与 Transformer 到 RAG、Agent 和生产治理
- 上一篇:AI 微积分与自动微分:梯度、链式法则、Jacobian 和反向传播
- 下一篇:AI 信息论基础:熵、交叉熵、KL 散度、互信息与编码直觉
官方资料
本文依据研究论文、标准组织与主流框架官方文档重新梳理;正文、示例与工程清单由 WR BLOG 编写。

评论
0 条讨论