11.3 梯度与优化:从下降方向到可验证的解
你站在一座看不见全貌的山上,每一步只能测量脚下坡度。沿负梯度走是自然的起点,但真正的优化还要回答:走多远、何时停止、是否受约束,以及停下的位置究竟是什么。
本课目标
- 从局部一阶近似推导梯度下降;
- 区分凸问题、局部极小值、鞍点和驻点;
- 理解学习率、随机梯度与动量的作用;
- 建立比“损失下降了”更可靠的优化检查清单。
1. 从局部模型得到下降步骤
对可微函数 $f$,在 $\mathbf{x}$ 附近有:
$$ f(\mathbf{x}+\Delta\mathbf{x}) \approx f(\mathbf{x})+\nabla f(\mathbf{x})^\mathsf{T}\Delta\mathbf{x}. $$
在欧氏范数下,负梯度是局部下降最快的方向,于是得到:
$$ \mathbf{x}_{t+1} =\mathbf{x}_t-\eta_t\nabla f(\mathbf{x}_t), $$
其中 $\eta_t>0$ 是步长或学习率。
这个推导是局部的。步长过大时,一阶近似不再可靠,可能越过谷底甚至发散;步长过小时,进展缓慢,也可能在数值精度范围内看似不动。
2. 一个可检查的单变量例子
对
$$ f(x)=x^2+3x+2, $$
导数是 $f'(x)=2x+3$,解析最小点为 $x=-1.5$。
def loss(x: float) -> float:
return x * x + 3 * x + 2
def gradient(x: float) -> float:
return 2 * x + 3
x = 8.0
learning_rate = 0.2
for step in range(100):
grad = gradient(x)
if abs(grad) < 1e-10:
break
x -= learning_rate * grad
print(step, x, loss(x), gradient(x))这个问题是严格凸二次函数,结构非常友好。把它的行为直接推广到神经网络,会忽略非凸性、随机梯度、病态曲率和参数冗余。
3. 驻点不等于最小值
满足 $\nabla f(\mathbf{x})=0$ 的点称为驻点,可能是:
- 局部极小值;
- 局部极大值;
- 鞍点;
- 更高阶的平坦点。
一维中可用二阶导数辅助判断。多元函数的 Hessian 矩阵由二阶偏导数组成:
$$ H_{ij}=\frac{\partial^2 f}{\partial x_i\partial x_j}. $$
在驻点附近,Hessian 正定通常表示严格局部极小,负定表示严格局部极大,不定表示鞍点;半正定只靠二阶条件可能无法下结论。
若目标函数是凸函数,任意局部极小值也是全局极小值。若还是严格凸,极小值至多一个。但“使用梯度下降”本身不保证收敛:还需要对光滑性、步长等条件作出约束。对一般非凸函数,更不能声称一定收敛到局部最优;算法可能停在鞍点附近、振荡或发散。
4. 学习率控制局部模型的可信范围
常见步长策略:
- 固定学习率:简单,但需要调参;
- 衰减学习率:后期减小震荡;
- 线搜索:尝试满足充分下降条件;
- 自适应方法:根据历史梯度调整不同参数的有效步长。
Adam、RMSprop 和带动量的 SGD 都利用历史信息,但它们的行为、内存成本和收敛性质不同。不能把“最终都减去某个更新量”理解成它们在所有问题上等价。
动量的一种形式为:
$$ \mathbf{v}_{t+1}=\beta\mathbf{v}_t+\nabla f(\mathbf{x}t), \qquad \mathbf{x}=\mathbf{x}t-\eta\mathbf{v}. $$
它能在方向一致时积累速度、减轻狭长谷地中的来回摆动,也会引入新的超参数和过冲风险。
5. 全批量、随机与小批量梯度
机器学习目标常写成样本损失的平均:
$$ F(\mathbf{w})=\frac{1}{N}\sum_{i=1}^{N}\ell_i(\mathbf{w}). $$
- 全批量梯度每步使用所有样本,方向稳定但成本高;
- 随机梯度每步使用单个样本,便宜但噪声大;
- 小批量梯度在硬件并行、估计噪声和吞吐之间折中。
随机性有时帮助离开某些平坦区域,但它不是全局最优保证。抽样方式、批大小和数据顺序都会影响训练轨迹。
6. 有约束优化不能只做普通更新
若参数必须满足约束,例如概率非负且和为 1,直接梯度下降可能走出可行域。常见思路包括:
- 投影梯度:更新后投影回可行集合;
- 重新参数化:用 softmax 等结构保证约束;
- 拉格朗日乘子:分析等式约束下的必要条件;
- 惩罚或障碍方法:把约束违反转入目标函数。
不同方法改变了问题的几何和数值性质,不是简单加一项公式就结束。
7. 优化结果的检查清单
停止训练前至少检查:
- 目标值是否下降并趋于稳定;
- 梯度范数或参数更新量是否足够小;
- 是否出现 NaN、无穷大或明显震荡;
- 约束是否满足;
- 验证集指标是否与训练目标一致;
- 更换初值或随机种子后结果是否稳定;
- 数值梯度检查是否支持自动微分结果。
仅看训练损失会把过拟合、数据泄漏和错误目标函数藏起来。优化器只负责寻找你写下的目标,不负责判断目标是否代表真实需求。
常见误区
- 负梯度指向全局最小值:它只给出当前点的局部下降方向。
- 梯度为零就是训练成功:还可能是鞍点、极大值或数值下溢。
- 损失下降说明模型正确:错误标签、泄漏特征和不合适目标也能被优化。
- 自适应优化器不需要学习率:它们仍有全局步长和其他关键超参数。
练习
- 改变单变量示例的学习率,观察稳定、振荡和发散区域。
- 分析 $f(x,y)=x^2-y^2$ 在原点的梯度和 Hessian,说明它为何是鞍点。
- 为约束 $x+y=1$ 的最小化问题写出拉格朗日函数。
- 给一个训练循环设计停止条件,避免只依赖固定迭代次数。
小结
梯度下降来自局部线性近似,学习率决定一次能相信这个近似多远。凸性提供全局结构,Hessian 描述局部曲率,随机梯度和动量改变计算成本与轨迹。真正可信的优化结果还需要约束检查、数值检查和任务指标验证。
最后一章会处理两类经常被藏在公式背后的边界:信息究竟怎样度量,以及同一个数学表达式为什么在有限精度计算机上可能给出完全不同的结果。