第 2 步 · 让收敛更快更稳
优化器 · SGD 到 AdamOptimizers · From SGD to Adam
同样的损失面,不同优化器走出截然不同的路径——看懂动量、自适应学习率如何加速训练。
12 分钟
阅读 + 实操
1 个
交互演示
中级
难度
优化器赛跑 · 交互演示
学习率—
迭代0
损失曲面等高线
损失-迭代曲线
为什么学这步?
选对优化器,训练时间可能差几倍。Adam 已成为深度学习的默认选择,但知其所以然才能在不同任务上调好它。
📌 发生了什么
- SGD 纯跟随当前梯度
- 动量平滑并加速收敛
- Adam 自适应每参数步长
⚠️ 常见陷阱
- 学习率太大直接发散
- Adam 泛化有时不如 SGD
- 动量过大冲过最优点
✅ 本章小结
- 优化器决定参数更新方式
- 动量与自适应各有优势
- 默认 Adam,细调再换 SGD
📐 优化器的数学演化
从 SGD 到 Adam,每一步改进都在解决前者的痛点:方向震荡、步长不一、起步偏慢。
SGD 沿负梯度更新;动量(Momentum)引入一阶矩的指数加权移动平均,累积历史方向以抑制震荡、加速收敛。
RMSProp 用梯度平方的滑动平均自适应缩放每个参数的学习率,防止大梯度维度步长过大。
Adam 同时维护一阶矩 m(动量)与二阶矩 v(自适应缩放),并做偏差校正消除初始零偏差,使早期训练也稳定。
🎛 优化器收敛对比
同一损失曲面,不同优化器的收敛轨迹差异巨大。
| 优化器 | 收敛速度 | 结果 |
|---|---|---|
| SGD | 方向震荡,易卡在窄谷 | 慢 |
| Momentum | 累积动量冲出浅谷 | 较快 |
| RMSProp | 自适应步长,平稳下降 | 快 |
| Adam | 动量 + 自适应,起步快 | 最佳 |
💡 Adam 默认 β₁=0.9, β₂=0.999, ε=1e-8,是大多数任务的"开箱即用"首选。
💻 Adam 优化器实现
Adam 单步更新的 Python 实现(与上方演示器逻辑一致):
# Adam 单步更新(每个参数独立维护 m、v)
def adam_step(param, grad, state, t, lr, b1, b2, eps):
state['m'] = b1 * state['m'] + (1 - b1) * grad # 一阶矩
state['v'] = b2 * state['v'] + (1 - b2) * grad * grad # 二阶矩
m_hat = state['m'] / (1 - b1 ** t) # 偏差校正
v_hat = state['v'] / (1 - b2 ** t)
return param - lr * m_hat / (np.sqrt(v_hat) + eps)
# 默认:lr=0.001, b1=0.9, b2=0.999, eps=1e-8
📚 参考文献与延伸阅读
- Kingma & Ba (2015), Adam: A Method for Stochastic Optimization, ICLR — Adam 原始论文
- Sutskever et al. (2013), On the importance of initialization and momentum in deep learning, ICML — 深度学习中的动量
- Goodfellow, Bengio & Courville, Deep Learning (2016), §8.5 Optimization Algorithms for Training Deep Models
- Ruder: An overview of gradient descent optimization algorithms — 优化器综述
📝 课后练习
检验你的理解——答对为止