文献来源:An Overview of Gradient Descent Optimization Algorithms
作者:Sebastian Ruder(NUI Galway / Aylien Ltd.)
arXiv:1609.04747v2 · 2017 年 6 月
推荐指数:⭐⭐⭐⭐⭐
如果你正在训练神经网络,一定打开过 PyTorch 或 TensorFlow 的文档,看到密密麻麻的优化器选项——SGD、Adam、RMSprop、Adagrad……
大多数人会直接复制别人的代码,默默用上 Adam,却不知道为什么。
Sebastian Ruder 的这篇综述正是为此而写。它系统梳理了梯度下降的三种变体、五大核心挑战、八种主流优化算法、分布式训练策略,以及若干重要的训练技巧,是深度学习从业者不可不读的经典文献。
梯度下降的本质是:沿目标函数 关于参数 的负梯度方向更新参数,以最小化损失:
其中 为学习率。根据每次更新所使用的数据量,分为三种变体:
每次更新使用全部训练数据计算梯度:
每次更新仅使用单个样本:
折中方案,每次使用 个样本组成的小批量更新:
💡 Mini-batch GD 是当前神经网络训练的事实标准,后续算法均在此基础上改进。
预设退火策略(如按固定 epoch 衰减)需要人工设计,无法自适应数据特征,在新任务上迁移性差。
当特征稀疏、不同参数的重要性差异显著时,统一学习率会导致:
Dauphin 等人的研究表明,高维非凸优化中,真正的障碍不是局部最小值,而是鞍点——在某些维度梯度为正(上坡),在另一些维度为负(下坡)。鞍点附近梯度趋近于零,SGD 极难逃脱。
深层网络中,梯度在反向传播过程中可能指数级衰减(梯度消失)或爆炸,同时 Hessian 矩阵的病态条件数会导致不同方向的收敛速度差异悬殊。
动机:SGD 在"沟壑"(ravines,一个维度曲率远大于另一个维度的区域)中会横向震荡、纵向缓慢前进。动量法通过引入"惯性"加速收敛。
更新规则:
直觉类比:像一个滚下山坡的球,不断积累动量,在正确方向加速,在震荡方向互相抵消。
关键参数:动量系数 通常设为 0.9
效果:
动机:动量法"盲目"地沿累积速度方向冲,可能冲过最小值后才反应。NAG 引入"前瞻"机制,在预估的下一步位置处计算梯度。
更新规则:
与 Momentum 的关键区别:
效果:防止走过头(overshooting),对 RNN 等序列模型性能提升显著。
动机:解决"统一学习率无法适应稀疏特征"问题——对频繁更新的参数降低学习率,对稀疏参数提高学习率。
更新规则(逐参数):
其中 是对角矩阵, 为历史梯度平方累加, 为数值稳定项。
优点:
致命缺陷: 单调递增,分母不断累积增大,导致学习率单调递减直至趋于 0,模型停止学习。
动机:修复 Adagrad 的学习率消失问题,同时消除手动设置学习率的需要。
核心思想:用梯度平方的指数加权移动平均替代全量累加:
参数更新向量:
其中 ,分子的 通过参数更新的指数移动平均估计。
最大亮点:更新规则中完全消除了手动设置的学习率,单位也与参数量纲一致。
来源:Geoff Hinton 在 Coursera 课程(Lecture 6e)中提出,与 Adadelta 独立同期发展。
更新规则(与 Adadelta 第一步等价):
推荐默认值:,
与 Adadelta 的区别:RMSprop 保留了手动学习率,Adadelta 用参数更新的 RMS 替代了分子中的 ,两者在其他方面基本等价。
动机:在 RMSprop 的基础上,同时引入动量机制,并对偏差进行校正。
更新规则:
第一步:计算梯度的一阶矩(均值)和二阶矩(方差)的指数移动平均:
(动量项)
(梯度平方项)
第二步:偏差校正(初始阶段 偏向 0,需要校正):
第三步:参数更新:
推荐默认值:,,,
为何 Adam 最主流:
原理:将 Adam 中基于 范数的梯度缩放推广到 范数:
特点: 范数数值更稳定,无需对 做偏差校正。推荐默认值:,,。
原理:将 NAG 的"前瞻动量"引入 Adam,用当前动量估计 替代前一步估计 :
效果:综合了 Adam 的自适应学习率和 NAG 的前瞻性动量,收敛速度通常优于 Adam。
文章提供了两组可视化对比,直观展现各算法的优劣:
结论:自适应学习率方法(Adagrad 系列、Adam)对鞍点问题的鲁棒性远优于纯动量方法。
⚠️ 重要补充:近年大量论文(尤其是图像分类领域的 SOTA 工作)仍使用带动量的 SGD + 学习率退火,因为其在充分训练后泛化能力往往优于 Adam。实践中建议两者都试。
随着训练进行,每层的输入分布发生漂移(内部协变量偏移)。Batch Norm 在每个 mini-batch 上重新归一化激活值,并将该操作纳入模型结构参与反向传播。
效果:
"Early stopping is a beautiful free lunch." —— Geoff Hinton
监控验证集误差,在其不再下降时提前停止训练。是防止过拟合最简单有效的方法之一。
在每步梯度更新中添加高斯噪声:
方差按调度衰减:
作用:帮助深层、复杂网络逃离鞍点和较差的局部极小值,提升对糟糕初始化的鲁棒性。
本文引用的核心文献:
这篇综述的价值在于帮助你理解每种算法解决了什么问题、引入了什么新问题、在什么条件下会失效。真正掌握优化算法的工程师,能在训练出现问题时——无论是收敛过慢、震荡发散还是过拟合——迅速定位根因并针对性调整策略。
理解算法,而非依赖算法。