这篇blog是阅读prince Chapter6 之后的一些感想与困惑的解答

从梯度下降到 AdamW:常见优化算法全解(GD / SGD / Momentum / NAG / Adam / AdamW)

在机器学习与深度学习中,优化算法(Optimizer)决定了模型如何根据损失函数不断更新参数。一个好的优化器不仅可以让模型收敛更快,还可以提高最终性能与稳定性

本文将系统介绍以下六种经典优化方法,并给出直观解释与数学公式:

  • Gradient Descent(GD)
  • Stochastic Gradient Descent(SGD)
  • SGD with Momentum
  • Nesterov Accelerated Gradient(NAG)
  • Adam
  • AdamW

1. Gradient Descent(GD, 梯度下降)

基本思想

GD 在每一次参数更新时使用全部训练数据来计算梯度。

更新公式

设损失函数为 L(θ)L(\theta),学习率为 η\eta

θt+1=θtηθL(θt) \theta_{t+1} = \theta_t - \eta \nabla_\theta L(\theta_t)

缺点

  • 每步计算代价极高
  • 无法用于大规模数据
  • convex函数可以收敛最小,但对于non-convex函数如果initial point选的不好容易陷入局部极小值或鞍点

鞍点定义: 梯度为0的点。 但该点既不是极大值也不是极小值。 在该点的某些方向上函数值增加,在另一些方向上函数值减少。


2. Stochastic Gradient Descent(SGD,随机梯度下降)

基本思想

每次只使用一个样本(或一个 mini-batch)来估计梯度。

更新公式

θt+1=θtηiBtθL(θt;xi) \theta_{t+1} = \theta_t - \eta \sum_{i\in B_t}{\nabla_\theta L(\theta_t; x_i)}

-其中 BtB_t 为当前 mini-batch。
-L(θt;xi)L(\theta_t; x_i) 表示在样本 xix_i 上的损失。

优点

  • 计算效率高
  • 加了噪声,有助于跳出鞍点

缺点

  • 有太多噪声,收敛路径不平滑,收敛速度慢

3. SGD with Momentum(动量法)

核心思想

引入“速度变量”,让参数沿着累积的历史梯度方向前进,减少震荡。

更新公式

vt+1=μvt+θL(θt)θt+1=θtηvt+1 \begin{aligned} v_{t+1} &= \mu v_t + \nabla_\theta L(\theta_t) \\ \theta_{t+1} &= \theta_t - \eta v_{t+1} \end{aligned}

其中:

  • vtv_t 为速度
  • μ[0,1)\mu \in [0, 1) 为动量系数(常取 0.9)

直观理解

像一个小球在损失函数表面滚动,惯性让它在“对的方向”跑得更快。

优点

  • 比起pure SGD, momentum让收敛路径更平滑,收敛速度更快

4. Nesterov Accelerated Gradient(NAG)

核心思想

先往前“看一眼”再计算梯度,避免过度冲过最优点。在算梯度之前先更新参数 θt\theta_t ,使其往 vtv_t 方向移动一点,在一个“未来“的位置计算梯度。

更新公式

vt+1=μvt+θL(θtμηvt)θt+1=θtηvt+1 \begin{aligned} v_{t+1} &= \mu v_t + \nabla_\theta L(\theta_t - \mu \eta v_t) \\ \theta_{t+1} &= \theta_t - \eta v_{t+1} \end{aligned}

与 Momentum 的区别

Momentum Nesterov
在当前位置算梯度 在“未来位置”算梯度
容易 overshoot 更稳定、收敛更快

5. gradient normalization

GD的问题: 无法获得一个很好的学习率,有时候学习率太小会导致收敛速度过慢,学习率太大会导致步长过大,不稳定。

为了解决学习率选择的问题,我们可以对梯度进行归一化处理, 使得每次更新的步长大小保持一致。

mt=θL(θt)vt=(θL(θt))2θt+1=θtηmtvt+ϵ \begin{aligned} m_t &= \nabla_\theta ​L(θ_t​) \\ v_t &= (\nabla_\theta ​L(θ_t​))^2 \\ \theta_{t+1} &= \theta_t - \eta \frac{m_t}{\sqrt{v_t} + \epsilon} \end{aligned}

注意:这里的平方和开根都是pointwise的,只对矩阵里的每个元素进行平方和开根操作。

你会发现最终只有 mtm_t 里元素的符号是有用的,因为normalization之后矩阵里所有值都是1,更新的时候乘了一个学习率 η\eta ,所有的步长都变成 η\eta 了。只能通过梯度矩阵里的符号来判断更新的时候是加上步长还是减去步长。
只使用gradient normalization这种方法的问题是,步长是固定值,会在最优值附近来回震荡,收敛不到最优,因此要使用Adam。

如下图所示,a是普通GD,但是学习率太低导致收敛太慢;b也是普通GD但是学习率太高导致步长过大,来回波动不稳定;c是normalized gradient, 步长固定但是在最优值附近来回震荡,收敛不到最优。 d是adam,收敛效果最好。

gd

6. Adam(Adaptive Moment Estimation)

核心思想: Adam = Momentum + gradient normalization

note: Adam中的梯度是SGD而不是GD。

更新公式

mt=β1mt1+(1β1)θL(θt)vt=β2vt1+(1β2)(θL(θt))2m^t=mt1β1tv^t=vt1β2tθt+1=θtηm^tv^t+ϵ \begin{aligned} m_t &= \beta_1 m_{t-1} + (1 - \beta_1) \nabla_\theta ​L(θ_t​) \\ v_t &= \beta_2 v_{t-1} + (1 - \beta_2) (\nabla_\theta ​L(θ_t​))^2 \\ \hat{m}_t &= \frac{m_t}{1 - \beta_1^t} \\ \hat{v}_t &= \frac{v_t}{1 - \beta_2^t} \\ \theta_{t+1} &= \theta_t - \eta \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} \end{aligned}

常用超参数:

  • β1=0.9\beta_1 = 0.9
  • β2=0.999\beta_2 = 0.999
  • ϵ=108\epsilon = 10^{-8}, +ϵ\epsilon 是对 v^t\sqrt{\hat{v}_t} 中所有元素加。

优点

  • 自适应学习率,不用特地去找一个好的学习率,直接用上面的常用超参数就行了。

缺点

  • 泛化性能有时不如 SGD
  • 权重衰减实现不理想

7. AdamW(Adam with Decoupled Weight Decay)

Adam 的问题

在 Adam 中,L2 正则项被混入梯度计算,导致:

  • 权重衰减效果被自适应学习率破坏
  • 正则化失效

AdamW 的改进

本来Adam里L2正则化是在加在loss计算里面的,现在AdamW里loss计算不加L2正则化,而是把这个正则化直接放在参数更新里面。解决了adam中L2正则化失效的问题。

更新公式

θt+1=θtη(m^tv^t+ϵ+λθt) \theta_{t+1} = \theta_t - \eta \left( \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} + \lambda \theta_t \right)

其中 λ\lambda 为 weight decay 系数。

实践结论

AdamW 是当前 Transformer / 大模型训练的事实标准优化器


8. 总结

方法 是否自适应 LR 是否有动量 泛化性能
GD
SGD
Momentum
NAG ✅✅ 更好
Adam 一般
AdamW 很好

什么时候用哪种?

  • 小模型 / 强泛化需求 → SGD + Momentum
  • 快速原型 / 稀疏梯度 → Adam
  • Transformer / NLP / CV 大模型 → AdamW
  • 理论分析 / 教学 → GD / SGD