DL ML Learning Lab
02 / 10
第 2 步 · 让收敛更快更稳

优化器 · SGD 到 AdamOptimizers · From SGD to Adam

同样的损失面,不同优化器走出截然不同的路径——看懂动量、自适应学习率如何加速训练。

12 分钟
阅读 + 实操
1 个
交互演示
中级
难度

优化器赛跑 · 交互演示

学习率
迭代0
损失曲面等高线
损失-迭代曲线
损失曲面
学习率
SGD
Momentum
RMSProp
Adam

为什么学这步?

选对优化器,训练时间可能差几倍。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 — 优化器综述

📝 课后练习

检验你的理解——答对为止