03-训练核心 核心 预计 30 分钟 ★ 最小路径

梯度下降家族:SGD、动量与 Adam

梯度下降(Gradient Descent)沿负梯度方向小步更新参数 θ ← θ − η∇L,随机梯度下降(SGD)用小批次噪声梯度代替全量梯度;动量(Momentum)累积历史更新方向抑制振荡,Adam 进一步为每个参数自适应缩放步长,四者构成现代训练优化器的演进主线。

一句话定义

梯度下降(Gradient Descent)沿负梯度方向小步更新参数 θ ← θ − η∇L,随机梯度下降(SGD)用小批次噪声梯度代替全量梯度;动量(Momentum)累积历史更新方向抑制振荡,Adam 进一步为每个参数自适应缩放步长,四者构成现代训练优化器的演进主线。

直觉

kp-001 的下山类比在这里具体化:SGD 是「每步问一次坡度就走」的莽汉;动量是「带惯性的滚球」,来回拉扯的震荡被惯性抹平、一路下坡的方向被加速;Adam 是「给每个方向装了独立油门的越野车」,坡度一直陡的方向自动收油、一直缓的方向自动给油。

为什么重要

优化器是训练循环(kp-016)三件套之一,选型与调参直接决定收敛速度与最终精度。不收敛的问题十有八九先查优化器与学习率(kp-011),而理解 SGD→动量→Adam 的每一层改进动机,才能在 kp-027 的调试方法论里对症下药,而不是盲试。

前置知识

  • kp-007(梯度从哪来)、kp-009(损失定义)。
  • 库外前置:向量与标量乘法;指数移动平均的直觉。

核心概念

  • 学习率 η(learning rate):每步沿负梯度走多远,全库最重要的单一超参数(kp-011 专题)。
  • 批(batch):每次估计梯度用的样本子集;小批梯度带噪声,反而是正则化与逃离鞍点的助力。
  • 动量 v:梯度的指数移动平均,抑制高频振荡。
  • 二阶矩估计 v(RMSProp/Adam):梯度平方的移动平均,用来给每个参数自适应缩放步长。
  • 偏差修正(bias correction):Adam 对初期估计偏小的问题做 1/(1−βᵗ) 修正。
  • 权重衰减 vs L2:AdamW 把解耦的权重衰减从 Adam 的自适应缩放中剥离,是 Transformer 时代默认选择。

原理与机制

朴素 SGD:θ ← θ − η·∇L(θ; B)。批次 B 越小梯度噪声越大——噪声看似坏事,实际提供了逃离尖锐局部极小与鞍点的随机扰动,且计算可并行分摊,这是「随机」版本的工程胜利。动量 SGD 引入速度变量:v ← βv + ∇L(β 常取 0.9),θ ← θ − ηv。数学上等价于对历史梯度做指数加权平均:近期梯度权重高、久远梯度按 βᵗ 衰减;在峡谷状损失面上,来回震荡的分量正负相消,一致下坡的分量被累加,等效步长最高放大 1/(1−β)=10 倍(Sutskever 等 2013 还指出动量配合合理初始化有类似「预热的额外助推」)。RMSProp 发现 AdaGrad(历史梯度平方求和)会让步长单调衰减至停滞,改用移动平均:s ← β₂s + (1−β₂)(∇L)²,更新时除以 √s——梯度长期很大的参数自动缩步、很小的参数自动扩步。Adam(Kingma & Ba 2015)= 动量(一阶矩 m)+ RMSProp(二阶矩 v)+ 偏差修正:m̂ = m/(1−β₁ᵗ),v̂ = v/(1−β₂ᵗ),θ ← θ − η·m̂/(√v̂+ε)。默认 β₁=0.9、β₂=0.999。经验图景:Adam 对学习率不敏感、起步快,适合快速出结果与 NLP/稀疏梯度场景;调好的 SGD+动量泛化上限常更高,适合精调的视觉任务。Loshchilov 与 Hutter 的 AdamW(2019)指出 Adam 中 L2 正则被自适应缩放扭曲,解耦后表现更稳,已成为默认推荐。

公式或模型

四个优化器的更新方程(θ 为参数,g=∇L 为当前批梯度,t 为步数):

SGD:      θ ← θ − η g
动量:     v ← β v + g ,        θ ← θ − η v          (β≈0.9)
RMSProp:  s ← β₂ s + (1−β₂) g² ,  θ ← θ − η g/(√s + ε)
Adam:     m ← β₁ m + (1−β₁) g          m̂ = m/(1−β₁ᵗ)
           v ← β₂ v + (1−β₂) g²         v̂ = v/(1−β₂ᵗ)
           θ ← θ − η m̂/(√v̂ + ε)

变量说明:m 为梯度均值估计、v 为梯度平方均值估计,ε=1e−8 防除零。对照 kp-007:这里的 g 正是反向传播输出的 ∂L/∂W⁽ˡ⁾ 的集合。

图示

损失等高线(狭长峡谷)上的轨迹对比:

纯 SGD:   ↘↑↘↑↘↑ ↘↘↘ ↘↘ ↘      (横向来回震荡)
SGD+动量: ↘  ↘  ↘→→→↘↘↘↘        (惯性压平震荡、加速下坡)
Adam:     ↘  →  ↘   ↘   ↘        (各方向独立步长,路径平滑)

直观类比

偏差修正像「新车磨合期修正里程表」:指数平均从零起步,前几步读数偏小,m̂ = m/(1−β₁ᵗ) 相当于按开了多久折算真实读数,避免起步时步长被低估。

实例或案例

同一 MLP 在 MNIST 上的选型实验:Adam(lr=1e−3) 3 个 epoch 达到约 97% 测试准确率;SGD(lr=0.1) 前 1 个 epoch 明显落后,但配合余弦退火(kp-011)训练 30 epoch 后反超约 0.3~0.5 个百分点——「Adam 快、SGD 上限高」的经典复现。kp-016 的训练循环默认给 Adam(追求最小调参成本),kp-021 的 CIFAR-10 项目则展示 SGD+动量+调度器的完整配置,让学习者在两个战役中亲手体验两种哲学。

常见误区

  • 「Adam 一律优于 SGD」:Adam 默认参数在视觉精调上常输给调好的 SGD+动量,选型要看任务与调参预算。
  • 「学习率在 Adam 中不重要」:不敏感 ≠ 无关,1e−2 常见发散、1e−4 常见欠拟合,扫描仍不可省。
  • 把优化器 state 和梯度混淆:zero_grad 清的是参数 .grad,不动优化器内部的 m/v 状态。
  • 忽略 AdamW:对 Transformer 类模型用带 L2 的 Adam 是历史遗留错误,应直接用 AdamW。

与其他知识点的关系

kp-011 专讲其最大超参 η 的调度;kp-012 的初始化方差决定了这些更新从哪个起点出发;kp-013 的权重衰减与 AdamW 的关系是进阶阅读点;kp-027 的「发散/震荡/停滞」三型损失曲线分别对应学习率过大/缺动量/过小的诊断。

自测题

  1. 写出带动量 SGD 的两行更新式,并解释 β=0.9 时等效步长放大的来源。

答案要点:v←βv+g,θ←θ−ηv;稳定状态下 Σβᵗ=1/(1−β)=10 倍累加。

  1. Adam 相比 RMSProp 多了什么?偏差修正解决什么问题?

答案要点:多了一阶矩动量项与修正因子;修正指数平均从零起步导致的前期低估。

  1. 为什么小批次噪声梯度反而是优点?

答案要点:噪声提供逃离鞍点/尖锐极小的扰动,且批次小使单位算力更新次数更多(另见 kp-011)。

延伸阅读

  • Kingma、Ba《Adam: A Method for Stochastic Optimization》ICLR 2015;Loshchilov、Hutter《Decoupled Weight Decay Regularization》ICLR 2019(AdamW)。
  • 李沐《动手学深度学习》第 7 章「优化算法」(各优化器可视化)。

学习状态

状态保存在浏览器本地,用于首页与路径页的进度统计。