优化算法就是用来寻找一组参数,使得一个目标函数达到最小值或最大值的数学方法。

你可以把它想象成:
- 目标: 在一片复杂的地形中,找到最低的谷底。
- 你: 一个身处其中但看不见全貌的探险者。
- 优化算法: 你遵循的寻路策略(一直往最陡的下坡方向走)。
- 地形: 由目标函数定义。
- 你的位置: 当前的参数值。
- 最低谷底: 目标函数的最优解(最小值)。
在机器学习中,这个“地形”通常是损失函数,参数就是模型的权重,目标就是找到让模型预测误差最小的那组权重。
核心要素与分类
要理解优化算法,需要把握几个关键要素,并据此进行分类。
核心要素
- 目标函数: 需要被最小化或最大化的函数。
- 参数: 我们可以调整的变量。
- 梯度: 函数在当前点的“最陡上升方向”,优化中常用其反方向——“最陡下降方向”。
- 学习率: 每次参数更新所迈的“步长”,这是最重要的超参数之一。
常见分类维度
-
按是否使用导数(梯度)分类:
- 一阶优化算法: 利用目标函数的一阶导数(梯度)信息。绝大多数机器学习算法属于此类,如梯度下降及其变种。
- 二阶优化算法: 利用目标函数的二阶导数(海森矩阵)信息,收敛更快、更精确,但计算和存储成本极高(如牛顿法),不适用于大规模深度学习。
- 零阶/无导数优化: 不使用导数,仅通过评估函数值来搜索,适用于不可导问题(如启发式算法:遗传算法、粒子群优化)。
-
按每次更新使用的数据量分类(特指梯度下降家族):
- 批量梯度下降: 使用全部训练数据计算梯度,优点:方向准确;缺点:速度慢,内存要求高。
- 随机梯度下降: 每次随机使用一个样本计算梯度,优点:更新快,能跳出局部极小;缺点:方向波动大,收敛不稳定。
- 小批量梯度下降: 每次使用一小批数据计算梯度。这是深度学习中的标准实践,在速度与稳定性之间取得了最佳平衡。
经典的优化算法演进路线
理解下面这个演进路线,对掌握优化算法至关重要:
梯度下降 —— 基石
- 公式核心:
新参数 = 旧参数 - 学习率 * 梯度 - 问题: 在山谷中会剧烈震荡,收敛慢;容易陷入局部最优或鞍点。
引入动量 —— 惯性思想
- 代表: Momentum
- 思想: 不仅看当前梯度,还累积过去的梯度方向作为“动量”,下坡时加速,遇到反向坡度时能减速并越过局部小坑。
- 效果: 减少震荡,加速在稳定方向的收敛。
自适应学习率 —— 为每个参数定制步长
- 思想: 不同参数的重要性/更新频率不同,应为它们设置不同的学习率。
- 代表算法:
- AdaGrad: 为频繁更新的参数减小学习率,为不频繁的参数增大学习率,但学习率会单调下降至过小。
- RMSProp: 改进AdaGrad,引入衰减系数,只关注最近一段时间的梯度平方,避免学习率过早衰减。
- Adam: 当前最流行、默认首选的算法,可以看作是 Momentum + RMSProp 的结合体,它同时考虑了梯度的一阶矩估计(带有动量的梯度方向)和二阶矩估计(自适应学习率),并进行了偏差校正。
优点:通常收敛快,对超参数(尤其是学习率)相对鲁棒。
优化中的关键挑战
- 局部最优 vs. 全局最优: 算法可能困在某个“小山谷”(局部最优),而非找到“最低的海洋”(全局最优),深度学习模型参数空间巨大,局部最优往往也是可接受的解。
- 鞍点问题: 在鞍点处,梯度为零,但并非极值点,一阶优化算法可能会在此停滞,动量法和自适应方法有助于逃离鞍点。
- 梯度消失/爆炸: 在深度网络中,梯度在反向传播时会指数级地减小或增大,导致底层参数无法更新或更新过大,这更多是网络结构(如RNN)和初始化问题,但优化算法(如使用梯度裁剪对抗爆炸)也能缓解。
- 学习率的选择: 学习率太小,收敛慢;学习率太大,可能无法收敛甚至发散,自适应算法部分解决了这个问题。
实践建议与总结
-
对于初学者和大多数应用:
- 首选 Adam,它通常能快速、稳定地获得不错的结果,无需花费太多精力调整学习率。
- 将学习率设置为一个较小的默认值(如
3e-4或1e-3)开始尝试。
-
当追求极致性能或稳定性时:
- 可以考虑使用带动量的SGD,虽然调优成本更高(需要仔细调整学习率和动量参数),但一些研究表明,SGD+Momentum 可能比 Adam 找到更泛化的解(测试集性能更好)。
-
学习率调度: 不是固定学习率,而是在训练中动态调整。
- 常用策略: 热身、按步衰减、指数衰减、余弦退火等,这相当于在初期大步探索,后期小步精调。
-
监控至关重要: 始终绘制训练损失和验证损失曲线,它们是判断优化是否正常工作的最重要依据。
- 损失平稳不降?学习率可能太小或模型已收敛。
- 损失剧烈震荡?学习率可能太大。
- 验证损失上升而训练损失下降?可能过拟合了。
优化算法是驱动机器学习模型“学习”的引擎,从基础的梯度下降出发,为了解决震荡和收敛速度问题,发展出了引入历史梯度方向的动量法;为了解决不同参数更新差异的问题,发展出了自适应学习率方法(AdaGrad, RMSProp)。Adam 巧妙地将两者结合,成为了当前实践中的“万能”首选。
理解这些算法的核心思想(他们想解决什么问题)比死记公式更重要,在实际工作中,从 Adam 开始,学会有效监控训练过程,并适时使用学习率调度,就能解决绝大多数优化问题。