

文献来源: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 的关键区别:
Momentum | NAG | |
|---|---|---|
梯度计算位置 | 当前参数 | 预估位置 |
前瞻能力 | ❌ | ✅ |
收敛速度 | 快 | 更快 |
效果:防止走过头(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)对鞍点问题的鲁棒性远优于纯动量方法。
场景 | 推荐算法 | 理由 |
|---|---|---|
通用深度学习(首选) | Adam | 综合最优,几乎无需调参 |
稀疏特征(NLP/推荐) | Adagrad / Adam | 自适应处理不同频次的梯度 |
追求泛化极限 | SGD + Momentum + 退火 | 最终泛化性能有时优于自适应方法 |
无需手调学习率 | Adadelta | 更新规则中无 η |
训练 RNN | Nadam / NAG | 前瞻动量效果显著 |
嵌入稀疏梯度 | Adagrad / AdaMax | 处理高维稀疏梯度更稳定 |
⚠️ 重要补充:近年大量论文(尤其是图像分类领域的 SOTA 工作)仍使用带动量的 SGD + 学习率退火,因为其在充分训练后泛化能力往往优于 Adam。实践中建议两者都试。
方法 | 机构 | 核心思想 | 适用场景 |
|---|---|---|---|
Hogwild! | CMU | 无锁并行 SGD,允许 CPU 无锁读写共享内存 | 数据稀疏场景 |
Downpour SGD | 异步多副本训练,通过参数服务器同步 | 大规模分布式 | |
Delay-tolerant SGD | AdaGrad 扩展,适应通信延迟 | 异步分布式 | |
TensorFlow | 计算图按设备切分,Send/Receive 通信 | 通用分布式框架 | |
EASGD | NYU | 弹性力链接各工作节点,增加参数空间探索 | 异步 SGD 改进 |
随着训练进行,每层的输入分布发生漂移(内部协变量偏移)。Batch Norm 在每个 mini-batch 上重新归一化激活值,并将该操作纳入模型结构参与反向传播。
效果:
"Early stopping is a beautiful free lunch." —— Geoff Hinton
监控验证集误差,在其不再下降时提前停止训练。是防止过拟合最简单有效的方法之一。
在每步梯度更新中添加高斯噪声:
方差按调度衰减:
作用:帮助深层、复杂网络逃离鞍点和较差的局部极小值,提升对糟糕初始化的鲁棒性。
算法 | 自适应学习率 | 动量 | 偏差校正 | 需调学习率 | 适合稀疏 |
|---|---|---|---|---|---|
SGD | ❌ | ❌ | ❌ | ✅ | ❌ |
Momentum | ❌ | ✅ | ❌ | ✅ | ❌ |
NAG | ❌ | ✅前瞻 | ❌ | ✅ | ❌ |
Adagrad | ✅ | ❌ | ❌ | 可默认 | ✅ |
Adadelta | ✅ | ❌ | ❌ | ❌无需 | ✅ |
RMSprop | ✅ | ❌ | ❌ | ✅ | ✅ |
Adam | ✅ | ✅ | ✅ | 可默认 | ✅ |
AdaMax | ✅∞范数 | ✅ | 部分 | 可默认 | ✅ |
Nadam | ✅ | ✅前瞻 | ✅ | 可默认 | ✅ |
本文引用的核心文献:
这篇综述的价值在于帮助你理解每种算法解决了什么问题、引入了什么新问题、在什么条件下会失效。真正掌握优化算法的工程师,能在训练出现问题时——无论是收敛过慢、震荡发散还是过拟合——迅速定位根因并针对性调整策略。
理解算法,而非依赖算法。