AI 工程基础体系 · 第 37/100 篇。内容覆盖机器学习、深度学习与生成式 AI;模型、数据、评测、权限和成本会作为同一生产系统处理。

AI 优化基础:凸性、梯度下降、约束、鞍点与收敛判断

机器学习中的“训练”通常可以写成一个优化问题:

minθF(θ)\min_{\theta} F(\theta)

其中:

  • θ\theta 是模型参数,例如线性回归的权重、神经网络的全部参数或生成模型的参数;
  • F(θ)F(\theta) 是目标函数,通常由数据损失、正则项和其他约束相关项组成;
  • 优化算法通过不断修改 θ\theta,寻找使 F(θ)F(\theta) 尽可能小的参数。

例如监督学习中,给定样本 (xi,yi)(x_i,y_i),经验风险可以写为:

F(θ)=1ni=1n(fθ(xi),yi)F(\theta)=\frac{1}{n}\sum_{i=1}^{n}\ell(f_\theta(x_i),y_i)

这里 fθf_\theta 是参数为 θ\theta 的模型,\ell 是单样本损失,nn 是训练样本数。

优化问题看似只是“让损失下降”,但实际需要回答至少五个问题:

  1. 目标函数是否具有凸性?
  2. 梯度下降为什么能够下降?
  3. 学习率应该如何选择?
  4. 如果参数或输出受到限制,如何处理约束?
  5. 训练停下来时,如何判断是收敛、停滞、发散,还是仅仅进入了鞍点附近?

这些问题在机器学习、深度学习和生成式 AI 中都存在。区别在于:传统凸优化往往可以给出全局最优保证,而深度模型通常是高维、非凸、随机且可能带有约束的优化问题。


1. 优化问题的基本组成

1.1 参数、目标函数与梯度

以一元函数为例:

f(x)=(x3)2f(x)=(x-3)^2

它的最优点是 x=3x=3,因为:

f(x)=2(x3)f'(x)=2(x-3)

x<3x<3 时,梯度为负,沿负梯度方向移动就是向右移动;当 x>3x>3 时,梯度为正,沿负梯度方向移动就是向左移动。

多维情况下,导数扩展为梯度:

F(θ)=[Fθ1Fθ2Fθd]\nabla F(\theta)= \begin{bmatrix} \frac{\partial F}{\partial \theta_1}\\ \frac{\partial F}{\partial \theta_2}\\ \vdots\\ \frac{\partial F}{\partial \theta_d} \end{bmatrix}

梯度指向函数增长最快的方向,因此负梯度方向是局部下降最快的方向:

d=F(θ)d=-\nabla F(\theta)

需要注意,“负梯度方向是局部下降方向”并不等于“沿负梯度走任意长度都能下降”。步长过大时,可能越过低点,甚至直接发散。

1.2 梯度来自链式法则

神经网络的梯度不是凭空得到的,而是对复合函数使用链式法则。

假设:

z=wx+b,y^=σ(z),L=(y^,y)z=wx+b,\qquad \hat y=\sigma(z),\qquad L=\ell(\hat y,y)

则:

Lw=Ly^y^zzw\frac{\partial L}{\partial w} = \frac{\partial L}{\partial \hat y} \cdot \frac{\partial \hat y}{\partial z} \cdot \frac{\partial z}{\partial w}

由于:

zw=x\frac{\partial z}{\partial w}=x

因此:

Lw=Ly^σ(z)x\frac{\partial L}{\partial w} = \frac{\partial L}{\partial \hat y} \cdot \sigma'(z) \cdot x

反向传播只是高效地组织并计算这些链式法则中的局部导数。优化器接收的是梯度,模型结构、激活函数和损失函数决定梯度如何产生。

1.3 批量梯度与随机梯度

全量目标函数为:

F(θ)=1ni=1ni(θ)F(\theta)=\frac{1}{n}\sum_{i=1}^{n} \ell_i(\theta)

其梯度为:

F(θ)=1ni=1ni(θ)\nabla F(\theta)=\frac{1}{n}\sum_{i=1}^{n}\nabla \ell_i(\theta)

全量梯度下降每次使用全部样本。若只抽取一个小批次 BB,则使用:

gB(θ)=1BiBi(θ)g_B(\theta)=\frac{1}{|B|}\sum_{i\in B}\nabla \ell_i(\theta)

在随机抽样均匀且实现正确时,通常有:

E[gB(θ)]=F(θ)\mathbb E[g_B(\theta)]=\nabla F(\theta)

这意味着小批量梯度在期望意义上是全量梯度的无偏估计,但单次更新包含噪声。批量越小,更新通常越便宜、噪声越大;批量越大,梯度估计更稳定,但显存、计算和通信成本更高。


2. 凸性:为什么它能改变优化问题的难度

2.1 凸集合与凸函数

集合 CC 是凸集,是指任意两个点 x,yCx,y\in C,以及任意 λ[0,1]\lambda\in[0,1],都有:

λx+(1λ)yC\lambda x+(1-\lambda)y\in C

直观上,集合中任意两点连成的线段仍然完全位于集合内部。

函数 ff 在凸集合 CC 上是凸函数,是指:

f(λx+(1λ)y)λf(x)+(1λ)f(y)f(\lambda x+(1-\lambda)y) \le \lambda f(x)+(1-\lambda)f(y)

这表示函数图像不会高于任意两点之间的连线。对于一维函数,凸函数常被直观地描述为“碗形”,但“碗形”只是帮助理解,真正的定义是上述不等式。

严格凸函数要求当 xyx\neq yλ(0,1)\lambda\in(0,1) 时:

f(λx+(1λ)y)<λf(x)+(1λ)f(y)f(\lambda x+(1-\lambda)y) < \lambda f(x)+(1-\lambda)f(y)

严格凸函数最多只有一个全局最优点。

2.2 可微凸函数的一阶条件

如果 ff 可微,则 ff 凸,当且仅当对任意 x,yx,y

f(y)f(x)+f(x)T(yx)f(y)\ge f(x)+\nabla f(x)^T(y-x)

右侧是函数在 xx 处的一阶切平面。这个条件的含义是:凸函数始终位于任意切平面的上方。

因此,如果某个点满足:

f(x)=0\nabla f(x^\star)=0

那么对任意 yy

f(y)f(x)+0=f(x)f(y)\ge f(x^\star)+0=f(x^\star)

所以 xx^\star 是全局最优点。

这就是凸优化的重要性质:

对可微凸目标函数,任何一阶驻点都是全局最优点。

在非凸问题中,f(x)=0\nabla f(x)=0 只说明这里是一阶驻点,可能是局部最小点、局部最大点或鞍点。

2.3 二阶条件:Hessian 半正定

如果 ff 二阶可微,则可以通过 Hessian 矩阵判断凸性:

H(x)=2f(x)H(x)=\nabla^2 f(x)

若对定义域内所有 xx,都有:

H(x)0H(x)\succeq 0

即对任意向量 vv

vTH(x)v0v^T H(x)v\ge 0

那么 ff 是凸函数。

对于二次函数:

f(x)=12xTAx+bTx+cf(x)=\frac12 x^T A x+b^T x+c

其梯度和 Hessian 分别为:

f(x)=Ax+b\nabla f(x)=Ax+b

2f(x)=A\nabla^2 f(x)=A

因此,当 AA 是对称半正定矩阵时,ff 是凸函数;当 AA 是正定矩阵时,ff 是强凸函数,并且最优点唯一。

2.4 强凸性与光滑性

强凸性比普通凸性更强。若存在 μ>0\mu>0,使得:

f(y)f(x)+f(x)T(yx)+μ2yx2f(y)\ge f(x)+\nabla f(x)^T(y-x)+\frac{\mu}{2}\|y-x\|^2

则称 ffμ\mu-强凸的。

强凸性意味着函数在任意方向上都有足够的曲率,不会出现完全平坦的方向。它通常带来:

  • 最优点唯一;
  • 参数距离和目标函数差距之间存在关系;
  • 梯度下降具有更快的线性收敛界。

光滑性通常指梯度满足 Lipschitz 条件。若存在 L>0L>0,使得:

f(x)f(y)Lxy\|\nabla f(x)-\nabla f(y)\| \le L\|x-y\|

则称 ffLL-smooth。

光滑性限制了梯度变化速度。它可以推出下降引理:

f(y)f(x)+f(x)T(yx)+L2yx2f(y) \le f(x)+\nabla f(x)^T(y-x)+\frac{L}{2}\|y-x\|^2

令:

y=xηf(x)y=x-\eta\nabla f(x)

得到:

f(xηf(x))f(x)η(1Lη2)f(x)2f(x-\eta\nabla f(x)) \le f(x)-\eta\left(1-\frac{L\eta}{2}\right)\|\nabla f(x)\|^2

只要:

0<η<2L0<\eta<\frac{2}{L}

右侧的额外项就是负的,因此这一步保证目标函数下降。常用的保守选择是:

0<η1L0<\eta\le\frac{1}{L}

这里的 η\eta 是学习率,也称步长。

2.5 凸性不等于“容易训练”

线性回归的平方损失、逻辑回归的对数损失通常可以形成凸优化问题。但即使目标函数凸,仍然可能存在:

  • 特征尺度差异导致条件数很大;
  • 学习率选择不当导致震荡;
  • 数据量巨大导致单步梯度成本很高;
  • 约束或正则化改变问题结构;
  • 目标函数数值计算不稳定。

深度神经网络的训练目标通常是非凸的,因为多层线性变换与非线性激活的组合会产生复杂的损失地形。预训练语言模型、扩散模型和其他生成式 AI 模型也通常属于非凸优化。

凸性提供的是理论保证,不是训练速度或系统质量的全部保证。


3. 梯度下降:更新规则与下降条件

3.1 基本算法

梯度下降的更新规则是:

θk+1=θkηkF(θk)\theta_{k+1} = \theta_k-\eta_k\nabla F(\theta_k)

其中:

  • kk 是迭代次数;
  • θk\theta_k 是第 kk 步参数;
  • ηk>0\eta_k>0 是第 kk 步的学习率;
  • F(θk)\nabla F(\theta_k) 是当前参数处的梯度。

这个更新可以看作在当前位置用一阶 Taylor 近似:

F(θ+Δ)F(θ)+F(θ)TΔF(\theta+\Delta) \approx F(\theta)+\nabla F(\theta)^T\Delta

如果约束更新方向的长度为固定值,令:

Δ=ηF(θ)\Delta=-\eta\nabla F(\theta)

则一阶项为:

ηF(θ)2-\eta\|\nabla F(\theta)\|^2

只要梯度非零,一阶近似会下降。

但 Taylor 近似只描述局部行为,实际函数还有二阶及更高阶项,所以学习率不能无限大。

3.2 完整数值算例

考虑:

f(x)=12(x3)2f(x)=\frac12(x-3)^2

其梯度为:

f(x)=x3f'(x)=x-3

设初始点 x0=0x_0=0,学习率 η=0.5\eta=0.5。更新公式为:

xk+1=xk0.5(xk3)x_{k+1}=x_k-0.5(x_k-3)

逐步计算:

步骤 当前点 xkx_k 梯度 xk3x_k-3 更新后 xk+1x_{k+1} 函数值
0 0 -3 1.5 1.1251.125
1 1.5 -1.5 2.25 0.281250.28125
2 2.25 -0.75 2.625 0.07031250.0703125
3 2.625 -0.375 2.8125 0.0175781250.017578125

误差满足:

xk+13=(1η)(xk3)=0.5(xk3)x_{k+1}-3 = (1-\eta)(x_k-3) = 0.5(x_k-3)

因此每一步误差缩小为原来的一半,最终收敛到 x=3x^\star=3

如果学习率改成 η=1\eta=1,则第一步直接得到:

x1=0(03)=3x_1=0-(0-3)=3

因为该函数的曲率为 11,这个特殊例子可以一步到达最优点。

如果学习率改成 η=2.5\eta=2.5,则:

xk+13=1.5(xk3)x_{k+1}-3=-1.5(x_k-3)

误差绝对值会扩大 1.51.5 倍,点在最优点两侧交替跳动并发散。这个例子对应 L=1L=1,而稳定条件要求:

0<η<2L=20<\eta<\frac{2}{L}=2

所以 η=2.5\eta=2.5 超出了稳定范围。

3.3 二次函数中的条件数

考虑多维二次函数:

f(x)=12xTAxf(x)=\frac12x^T A x

其中 AA 是对称正定矩阵。若 AA 的最小和最大特征值分别为 μ\muLL,则:

  • μ\mu 描述最小曲率;
  • LL 描述最大曲率;
  • 条件数为:

κ=Lμ\kappa=\frac{L}{\mu}

κ\kappa 很大时,函数等高线像狭长的椭圆。梯度往往指向较陡方向,而不是直接指向最优点,导致算法在狭长谷底中左右摆动,收敛缓慢。

对于强凸且光滑的函数,使用合适固定学习率时,梯度下降通常具有线性收敛形式:

F(θk)F(θ)CqkF(\theta_k)-F(\theta^\star) \le Cq^k

其中 0<q<10<q<1CC 与初始点有关。对于某些标准步长选择,qq 与:

LμL+μ\frac{L-\mu}{L+\mu}

同阶。条件数越大,qq 越接近 11,收敛越慢。

特征标准化、预条件方法、动量和自适应优化器的一个重要作用,就是改善不同方向上的尺度差异。但它们不能自动把非凸问题变成凸问题,也不能保证训练目标达到全局最优。

3.4 动量与自适应方法的边界

动量方法维护一个历史方向,例如:

vk+1=βvk+F(θk)v_{k+1}=\beta v_k+\nabla F(\theta_k)

θk+1=θkηvk+1\theta_{k+1}=\theta_k-\eta v_{k+1}

其中 β[0,1)\beta\in[0,1) 控制历史梯度的影响。动量可以减少狭长谷底中的来回震荡,并在连续一致的方向上加速。

自适应方法会根据历史梯度的大小调整每个参数的有效步长。它们在深度学习中常见,但“训练损失下降”不代表:

  • 学习率一定合理;
  • 参数一定接近全局最优;
  • 验证集性能一定更好;
  • 生成质量、事实性或安全性一定提高。

尤其在随机、非凸和带正则项的训练中,优化器改变的是参数搜索路径和隐含偏好,不只是单纯提高每一步的下降速度。


4. 约束优化:可行域决定哪些更新是合法的

4.1 约束问题的形式

带约束的优化问题可以写成:

minxf(x)\min_x f(x)

满足:

gi(x)0,i=1,,mg_i(x)\le0,\quad i=1,\ldots,m

hj(x)=0,j=1,,ph_j(x)=0,\quad j=1,\ldots,p

满足所有约束的点构成可行域。若一个点违反任意约束,它就不是可接受解,即使其目标函数值很小。

机器学习中的约束可能包括:

  • 参数范数不能超过指定上限;
  • 概率向量的元素非负且和为 11
  • 资源分配比例必须满足总预算;
  • 推理延迟、显存或成本受到限制;
  • 生成输出必须符合长度、格式或安全策略;
  • 多任务模型中不同指标需要满足最低阈值。

4.2 约束会改变“最优点”

考虑:

minx12(x3)2\min_x \frac12(x-3)^2

无约束最优点是 x=3x=3。现在增加约束:

x2x\le2

最接近 33 的可行点是:

x=2x^\star=2

因此,约束优化的最优点不一定满足无约束梯度为零。此处:

f(2)=23=10f'(2)=2-3=-1\neq0

如果只检查“梯度是否接近零”,会错误地认为算法没有收敛。正确判断必须同时检查约束边界和可行方向。

4.3 投影梯度下降

当可行域 CC 是凸集时,可以先进行普通梯度更新,再把结果投影回可行域:

x~k+1=xkηf(xk)\tilde x_{k+1}=x_k-\eta\nabla f(x_k)

xk+1=ΠC(x~k+1)x_{k+1}=\Pi_C(\tilde x_{k+1})

其中:

ΠC(z)=argminxCxz2\Pi_C(z)=\arg\min_{x\in C}\|x-z\|^2

表示距离 zz 最近的可行点。

继续使用上面的例子,令:

C=(,2]C=(-\infty,2]

初始 x0=0x_0=0,学习率 η=0.5\eta=0.5

第一步:

x~1=00.5(03)=1.5\tilde x_1=0-0.5(0-3)=1.5

因为 1.521.5\le2,投影后仍为:

x1=1.5x_1=1.5

第二步:

x~2=1.50.5(1.53)=2.25\tilde x_2=1.5-0.5(1.5-3)=2.25

它违反 x2x\le2,投影得到:

x2=2x_2=2

之后:

x~3=20.5(23)=2.5\tilde x_3 = 2-0.5(2-3) = 2.5

再次投影后仍为:

x3=2x_3=2

此时参数不再变化,虽然普通梯度为 1-1,但负梯度方向是向右的,而右侧已被约束阻挡。

4.4 可运行的投影梯度示例

下面的代码只使用 Python 和 NumPy,实现:

minx12(x3)2,x2\min_x \frac12(x-3)^2,\quad x\le2

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 是投影后的可行参数;
  • 目标函数在前几步下降;
  • 到达边界后,参数不再变化;
  • 梯度不为零并不表示失败,因为零梯度不是带约束问题的必要条件。

这个示例的投影很简单。如果约束是欧氏球:

x2R\|x\|_2\le R

投影为:

ΠC(z)={z,z2RRzz2,z2>R\Pi_C(z)= \begin{cases} z,&\|z\|_2\le R\\ R\frac{z}{\|z\|_2},&\|z\|_2>R \end{cases}

而对概率单纯形:

xi0,ixi=1x_i\ge0,\qquad \sum_i x_i=1

投影需要使用专门的单纯形投影算法,不能简单地逐元素截断后直接认为结果仍然满足和为 11

4.5 KKT 条件:判断约束最优性的正式工具

对于问题:

minxf(x)\min_x f(x)

满足:

gi(x)0,hj(x)=0g_i(x)\le0,\qquad h_j(x)=0

定义拉格朗日函数:

L(x,λ,ν)=f(x)+iλigi(x)+jνjhj(x)\mathcal L(x,\lambda,\nu) = f(x)+\sum_i\lambda_i g_i(x)+\sum_j\nu_jh_j(x)

其中:

  • λi\lambda_i 是不等式约束乘子;
  • νj\nu_j 是等式约束乘子。

KKT 条件包括:

驻点条件

xL(x,λ,ν)=0\nabla_x\mathcal L(x^\star,\lambda^\star,\nu^\star)=0

原始可行性

gi(x)0,hj(x)=0g_i(x^\star)\le0,\qquad h_j(x^\star)=0

对偶可行性

λi0\lambda_i^\star\ge0

互补松弛

λigi(x)=0\lambda_i^\star g_i(x^\star)=0

互补松弛表示:

  • 如果约束未触碰边界,gi(x)<0g_i(x^\star)<0,则必须有 λi=0\lambda_i^\star=0
  • 如果约束在边界上,乘子可以为正,表示该约束正在阻碍目标继续下降。

对于:

minx12(x3)2,x20\min_x \frac12(x-3)^2,\quad x-2\le0

拉格朗日函数为:

L(x,λ)=12(x3)2+λ(x2)\mathcal L(x,\lambda) = \frac12(x-3)^2+\lambda(x-2)

x=2x^\star=2 处:

Lx=x3+λ=1+λ=0\frac{\partial\mathcal L}{\partial x} = x-3+\lambda = -1+\lambda=0

因此:

λ=1\lambda^\star=1

同时 x2=0x^\star-2=0,原始可行性、对偶可行性和互补松弛全部成立。

在凸问题中,如果目标函数和不等式约束是凸的、等式约束是仿射的,并满足适当的约束资格条件,例如 Slater 条件,那么 KKT 条件通常不仅是必要条件,也是全局最优的充分条件。

4.6 惩罚法与屏障法

另一种处理约束的方法是把约束加入目标函数。

对于约束 g(x)0g(x)\le0,惩罚法可以使用:

Fρ(x)=f(x)+ρmax(0,g(x))2F_\rho(x) = f(x)+\rho\max(0,g(x))^2

g(x)>0g(x)>0 时,违反约束会增加损失;ρ\rho 越大,违反约束的代价越高。

但有限的 ρ\rho 通常只会得到“近似可行”解,而不是严格可行解。如果 ρ\rho 取值极大,目标函数可能变得病态,梯度尺度差异明显,优化反而困难。

屏障法则在接近边界时增加代价,例如:

Fμ(x)=f(x)μlog(g(x))F_\mu(x)=f(x)-\mu\log(-g(x))

它要求 g(x)<0g(x)<0,并在接近 g(x)=0g(x)=0 时令目标趋向无穷大。屏障法保持严格内部可行,但通常只能通过逐步减小 μ\mu 接近边界最优点。

工程上必须区分:

  • 投影通常可以保证每一步满足某些简单约束;
  • 惩罚项只是在目标中“鼓励”满足约束;
  • 屏障法要求从严格可行点开始;
  • 复杂约束可能需要专门的约束求解器,而不是简单修改损失函数。

5. 鞍点:不是最小值,也不一定是最大值

5.1 定义

zz^\star 是鞍点,通常指它在某些方向上像局部最小点,在另一些方向上像局部最大点。

典型函数是:

f(x,y)=x2y2f(x,y)=x^2-y^2

(0,0)(0,0) 处:

f(0,0)=[00]\nabla f(0,0)= \begin{bmatrix} 0\\ 0 \end{bmatrix}

但沿 xx 轴:

f(x,0)=x20f(x,0)=x^2\ge0

原点像局部最小点;沿 yy 轴:

f(0,y)=y20f(0,y)=-y^2\le0

原点又像局部最大点。因此原点不是局部最小值,而是鞍点。

Hessian 为:

2f(x,y)=[2002]\nabla^2 f(x,y) = \begin{bmatrix} 2&0\\ 0&-2 \end{bmatrix}

它同时存在正特征值和负特征值,因此是不定矩阵。这是二阶可微函数中识别严格鞍点的典型信号。

5.2 梯度下降在鞍点附近的行为

对:

f(x,y)=x2y2f(x,y)=x^2-y^2

使用梯度下降:

xk+1=xkη(2xk)=(12η)xkx_{k+1}=x_k-\eta(2x_k)=(1-2\eta)x_k

yk+1=ykη(2yk)=(1+2η)yky_{k+1}=y_k-\eta(-2y_k)=(1+2\eta)y_k

0<η<10<\eta<1,则 xx 方向逐渐靠近 00,但 yy 方向会乘以大于 11 的因子并远离 00

例如 η=0.1\eta=0.1,初始 (x0,y0)=(1,0.01)(x_0,y_0)=(1,0.01)

x1=0.8,y1=0.012x_1=0.8,\qquad y_1=0.012

x2=0.64,y2=0.0144x_2=0.64,\qquad y_2=0.0144

xx 方向下降,yy 方向增长。即使某些方向看起来已经稳定,整体也没有收敛到局部最小值。

5.3 深度学习中的鞍点与平坦区域

高维非凸函数中,鞍点可能比低维直觉中的“马鞍形”复杂得多。一个驻点的 Hessian 可能有:

  • 正特征值:存在局部上升方向对应的下降路径;
  • 负特征值:从该点沿某方向可以降低目标;
  • 接近零的特征值:形成平坦方向。

实践中,大型神经网络常见大量近似平坦区域和尺度等价。例如不同层的参数重缩放可能产生相近的函数行为。于是:

F(θ)0\|\nabla F(\theta)\|\approx0

并不自动说明模型处于理想最小值。

不过“非凸”也不等于“训练必然被鞍点困住”。随机小批量梯度中的噪声、参数初始化、归一化、学习率变化和模型结构都会影响离开鞍点或平坦区域的行为。不能仅凭“损失没有下降”就断定原因是鞍点。

5.4 最小值、最大值、鞍点的诊断差异

f(x)=0\nabla f(x^\star)=0,二阶 Hessian 可以提供局部判断:

  • Hessian 正定:严格局部最小值;
  • Hessian 负定:严格局部最大值;
  • Hessian 不定:鞍点;
  • Hessian 半正定或存在零特征值:二阶测试无法决定,需要更高阶分析。

深度模型中完整 Hessian 通常巨大,直接构造和分解成本很高。工程上更常使用:

  • 梯度范数;
  • 随机方向上的函数扰动;
  • Hessian-vector product;
  • 少量最大或最小特征值估计;
  • 改变学习率或随机种子后的轨迹比较。

这些是诊断证据,不是对全局地形的完整证明。


6. 收敛:理论定义与工程判断不是一回事

6.1 不同意义下的收敛

“收敛”至少有四种不同含义。

参数收敛

θk+1θk0\|\theta_{k+1}-\theta_k\|\to0

表示相邻两步参数变化很小。

目标函数收敛

F(θk+1)F(θk)0|F(\theta_{k+1})-F(\theta_k)|\to0

表示目标值变化很小。

梯度收敛

F(θk)0\|\nabla F(\theta_k)\|\to0

表示接近一阶驻点。

统计或任务指标收敛

例如验证集损失、准确率、生成质量、事实性、安全率或成本指标不再改善。

这些条件并不等价。例如:

  • 学习率衰减到极小值时,参数变化很小,但目标可能仍然很差;
  • 在约束边界上,梯度不为零,但已经达到约束最优;
  • 训练损失稳定下降,但验证集损失已经上升,说明发生过拟合;
  • 随机优化中,训练损失会在噪声水平附近波动,而不会严格单调下降。

6.2 凸优化中的理论收敛

对凸、LL-smooth 函数,固定学习率满足:

0<η1L0<\eta\le\frac1L

时,梯度下降有典型的次线性函数值收敛界:

F(θk)F(θ)=O(1k)F(\theta_k)-F(\theta^\star) = O\left(\frac1k\right)

如果函数同时是 μ\mu-强凸的,则可以得到线性收敛:

F(θk)F(θ)Cqk,0<q<1F(\theta_k)-F(\theta^\star) \le Cq^k,\qquad 0<q<1

这些结论依赖明确条件:

  • 目标函数确实凸或强凸;
  • 梯度满足相应光滑性;
  • 学习率位于理论要求范围;
  • 计算梯度足够准确;
  • 问题没有被数值溢出或截断破坏。

不能把凸优化的全局收敛定理直接套用于深度网络、生成模型或任意 Adam 训练过程。

6.3 非凸优化中的常见保证

对于下界有限且梯度 LL-smooth 的非凸函数,固定足够小学习率时,常见结果是平均梯度平方范数下降:

1Kk=0K1F(θk)2=O(1K)\frac1K\sum_{k=0}^{K-1} \|\nabla F(\theta_k)\|^2 = O\left(\frac1K\right)

这类结果通常表示算法能找到“一阶驻点附近”,而不是保证找到全局最小值。

在随机梯度情况下,还要考虑梯度估计方差。若:

gk=F(θk)+ξkg_k=\nabla F(\theta_k)+\xi_k

其中 ξk\xi_k 是噪声,则更新轨迹可能在最优点附近持续抖动。常见做法包括:

  • 随训练降低学习率;
  • 增大批量;
  • 使用梯度裁剪控制异常更新;
  • 对训练损失使用滑动平均;
  • 使用独立验证集判断泛化效果。

但这些方法改变的是统计行为或数值稳定性,不会凭经验自动证明全局收敛。


7. 如何判断一次训练到底发生了什么

7.1 先看目标函数和更新量

每个训练阶段至少应记录:

F(θk),F(θk),θk+1θkF(\theta_k),\qquad \|\nabla F(\theta_k)\|,\qquad \|\theta_{k+1}-\theta_k\|

还可以记录相对变化:

rF=Fk+1Fkmax(1,Fk)r_F= \frac{|F_{k+1}-F_k|} {\max(1,|F_k|)}

rθ=θk+1θkmax(1,θk)r_\theta= \frac{\|\theta_{k+1}-\theta_k\|} {\max(1,\|\theta_k\|)}

典型解释如下:

现象 可能原因
损失持续上升 学习率过大、梯度实现错误、数值溢出、数据或标签错误
损失剧烈振荡 学习率过大、条件数差、批次噪声大、动量过强
梯度和更新都很小 可能收敛,也可能梯度消失、学习率过小或进入平坦区域
训练损失下降、验证损失上升 过拟合、训练验证分布不一致或数据泄漏
损失正常但任务指标异常 损失与业务目标不一致、标签映射错误或评测实现错误
约束持续违反 投影、参数化或惩罚实现不正确
目标值变成 NaN/Inf 溢出、非法对数、除零、混合精度不稳定或输入异常

任何单个指标都不足以证明收敛。至少要结合目标值、更新量、梯度、验证指标和约束违反程度。

7.2 约束问题的收敛判断

带约束问题需要同时查看:

原始约束残差

rprim=maximax(0,gi(x))r_{\text{prim}} = \max_i\max(0,g_i(x))

以及等式约束残差:

req=maxjhj(x)r_{\text{eq}} = \max_j|h_j(x)|

可行性

确认最终参数是否满足所有硬约束,而不是只查看惩罚后的总损失。

投影梯度或可行方向残差

普通梯度可能在边界上不为零,因此可以观察:

Gη(x)=1η(xΠC(xηf(x)))G_\eta(x) = \frac1\eta\left(x-\Pi_C(x-\eta\nabla f(x))\right)

如果:

Gη(x)0\|G_\eta(x)\|\approx0

表示一步投影梯度更新几乎不再改变参数,是约束问题中更合适的一阶驻点指标。

7.3 用独立验证集判断“训练成功”

优化器只直接最小化训练目标,而生产系统关心的通常是独立数据上的效果。

对于分类模型,至少需要区分:

  • 训练损失;
  • 验证损失;
  • 主要业务指标;
  • 分群指标;
  • 校准、鲁棒性和安全性指标。

对于生成式 AI,还可能包括:

  • 任务成功率;
  • 事实性或引用正确率;
  • 拒答和安全策略的符合率;
  • 输出格式合规率;
  • 推理延迟;
  • 单次请求成本;
  • 上下文长度和显存使用。

如果把模型、数据、评测、权限和成本作为同一生产系统处理,那么“优化收敛”只是其中一层状态:

  • 数据版本改变,目标函数就可能改变;
  • 评测权限不足,指标可能无法完整计算;
  • 成本预算受限,理论上更长训练不一定是可接受方案;
  • 训练和推理资源不同,训练损失下降不代表线上延迟满足要求;
  • 访问控制或安全过滤改变有效输出空间,相当于增加了系统约束。

因此,停止训练的依据不应只有“epoch 数量达到上限”,而应包括目标、验证指标、约束残差和资源状态。


8. 常见误解与反例

8.1 “梯度为零就是最优”

反例:

f(x,y)=x2y2f(x,y)=x^2-y^2

原点梯度为零,但它是鞍点。

在约束问题中,边界最优点甚至可能梯度不为零:

minx12(x3)2,x2\min_x \frac12(x-3)^2,\quad x\le2

最优点为 x=2x=2,梯度为 1-1

正确说法是:

  • 无约束凸问题:梯度为零即可推出全局最优;
  • 无约束非凸问题:梯度为零只能说明一阶驻点;
  • 约束问题:要检查 KKT 条件或投影梯度残差。

8.2 “损失下降就一定在接近全局最优”

在非凸问题中,损失下降只说明当前更新降低了当前目标,不能说明:

  • 已经找到了全局最优;
  • 未来不会进入更好的区域;
  • 验证集性能会继续提升;
  • 其他随机初始化无法找到更好解。

即使目标是凸的,损失下降速度也可能因为条件数很大而非常慢。

8.3 “学习率越小越稳定,因此越小越好”

学习率过小虽然可能避免发散,但会造成:

θk+1θk=ηF(θk)\|\theta_{k+1}-\theta_k\| = \eta\|\nabla F(\theta_k)\|

长期都极小,训练在有限预算内几乎没有进展。对于随机梯度,学习率过小还可能使模型过早停留在初始化附近。

学习率的选择是稳定性、收敛速度、噪声尺度和总计算预算之间的折中,而不是越小越安全。

8.4 “惩罚项足够大就等于硬约束”

设:

Fρ(x)=f(x)+ρmax(0,g(x))2F_\rho(x)=f(x)+\rho\max(0,g(x))^2

ρ\rho 有限时,某个轻微违反约束但目标函数明显更低的点,仍可能成为惩罚问题的最优点。增大 ρ\rho 能减少违反程度,却可能造成严重的尺度差异和优化困难。

如果约束必须严格满足,应优先使用:

  • 投影;
  • 可行参数化;
  • 专用约束算法;
  • 优化后独立验证并拒绝不可行结果。

8.5 “训练损失最低的模型就是生产模型”

如果训练损失和线上目标不一致,最低训练损失可能对应:

  • 验证集过拟合;
  • 生成内容冗长但不准确;
  • 对少数群体表现恶化;
  • 安全约束违反;
  • 推理成本过高;
  • 延迟超过服务等级目标。

模型选择应在独立评测数据上完成,并将质量、风险、权限和成本作为显式决策条件。


9. 一套可复用的收敛检查流程

可以按以下顺序诊断一次优化过程:

第一步:确认目标是否正确

检查:

  • 标签和预测是否对齐;
  • 损失的 reduction 是否符合预期;
  • 正则项是否被重复计算;
  • 训练和验证预处理是否一致;
  • 生成模型中的噪声、时间步或条件输入是否正确;
  • 损失数值是否存在 NaN、Inf 或异常尺度。

如果目标函数实现错误,任何优化器调参都只是掩盖问题。

第二步:做小规模过拟合测试

取极少量样本,例如几个样本,尝试让模型几乎完全拟合它们。若简单模型在小数据上也无法降低损失,常见原因是:

  • 梯度计算错误;
  • 参数未真正更新;
  • 优化器状态未正确初始化;
  • 输入或标签形状错误;
  • 学习率极端不合适;
  • 约束或裁剪逻辑阻止了有效更新。

这项测试不能证明泛化良好,但能快速排除大量实现错误。

第三步:观察学习率对应的轨迹

固定其他因素,比较几个不同学习率:

  • 极大时若立即 NaN 或爆炸,说明数值不稳定;
  • 中等时若平稳下降,说明原学习率可能过大;
  • 极小时若几乎不动,说明更新受限;
  • 所有学习率都不动,应优先检查梯度和数据流,而不是继续调学习率。

第四步:分别记录训练、验证、约束和资源指标

不要把它们压缩成一个没有解释的总分。应分别记录:

train loss,validation loss,task metric,constraint residual,gradient norm,update norm\text{train loss},\quad \text{validation loss},\quad \text{task metric},\quad \text{constraint residual},\quad \text{gradient norm},\quad \text{update norm}

对生产训练,还应记录:

  • 数据版本;
  • 模型和代码版本;
  • 随机种子;
  • GPU/CPU 时间;
  • 显存和存储;
  • 每步或每 epoch 成本;
  • 评测数据的访问权限与完整性。

这样才能区分“算法没有收敛”和“指标没有权限计算”“数据版本不一致”“成本预算提前终止”等不同故障路径。

第五步:使用停止条件,但保留最佳检查点

一个实际停止规则可以同时要求:

rF<ϵFr_F<\epsilon_F

rθ<ϵθr_\theta<\epsilon_\theta

连续若干次评估没有改善,并且:

rprimϵconstraintr_{\text{prim}}\le\epsilon_{\text{constraint}}

对于非凸模型,还应根据验证集指标保存最佳检查点,而不是默认使用最后一个检查点。最后一个检查点可能已经过拟合、出现训练退化或只是随机噪声下的一次较差更新。


10. 从数学保证到生产取舍

凸性、梯度下降、约束、鞍点和收敛判断分别回答不同问题:

  • 凸性回答:局部最优是否能推出全局最优?
  • 梯度下降回答:如何根据局部斜率生成参数更新?
  • 约束回答:哪些参数或输出是合法的?
  • 鞍点回答:梯度为零时,为什么仍可能不是最小值?
  • 收敛判断回答:训练停止时,究竟是接近目标、受约束阻挡、步长过小,还是发生了异常?

最重要的推理边界是:

梯度小⇏全局最优\text{梯度小} \not\Rightarrow \text{全局最优}

损失下降⇏泛化更好\text{损失下降} \not\Rightarrow \text{泛化更好}

参数变化小⇏系统已经成功\text{参数变化小} \not\Rightarrow \text{系统已经成功}

只有在目标函数性质、约束条件、优化器行为、验证数据和生产指标都被分别检查后,才能对“收敛”作出可信判断。对于传统凸模型,可以依赖明确的全局收敛理论;对于深度学习和生成式 AI,更现实的目标通常是:在给定数据、计算、成本和安全约束下,找到一个稳定、可复现、验证指标良好且满足生产要求的一阶近似解。


系列导航与关联阅读

官方资料

本文依据研究论文、标准组织与主流框架官方文档重新梳理;正文、示例与工程清单由 WR BLOG 编写。