文章

20 动量梯度下降法(Gradient Descent with Momentum)

20 动量梯度下降法(Gradient Descent with Momentum)

🧠 一、动机:为什么需要动量?

  标准梯度下降在优化具有“狭长椭圆”等高线的损失函数时,会出现剧烈振荡(尤其在垂直方向),导致:

  • 收敛速度慢;
  • 无法使用较大的学习率(否则会发散)。

目标:希望在垂直方向减速(抑制振荡),在水平方向加速(快速逼近最小值)。


⚙️ 二、动量法的核心思想

对梯度进行指数加权平均(Exponentially Weighted Average) ,用平滑后的“动量”代替原始梯度更新参数。

  这相当于给优化过程引入“惯性”,使参数更新更平稳、方向更一致。


📐 三、算法公式(推荐版本)

  在第 $t$ 次迭代中:

  1. 计算当前梯度(基于 mini-batch 或全批量):

    \[dW, \quad db\]
  2. 更新动量变量(指数加权平均):

    \[v_{dW} := \beta \cdot v_{dW} + (1 - \beta) \cdot dW\] \[v_{db} := \beta \cdot v_{db} + (1 - \beta) \cdot db\]
  3. 用动量更新参数

    \[W := W - \alpha \cdot v_{dW}\] \[b := b - \alpha \cdot v_{db}\]

  其中:

  • $\alpha$:学习率(learning rate)
  • $\beta$:动量系数(momentum coefficient),通常取 0.9
  • $v_{dW}, v_{db}$:初始化为与 $dW, db$ 同维的零矩阵/向量

🔍 四、关键细节解析

✅ 1. $\beta = 0.9$ 的含义

  • 表示大致对最近 10 次梯度进行平均(因为 $\frac{1}{1 - \beta} = 10$)。
  • 实践中非常鲁棒,是默认首选。

✅ 2. 是否需要偏差修正(Bias Correction)?

  • 理论上,初期 $v_{dW}$ 有偏差(因从 0 开始)。
  • 但实践中通常省略,因为 10 次迭代后偏差已很小,不影响性能。

✅ 3. 关于 $(1 - \beta)$ 项的争议

  有些文献写成:

\[v_{dW} := \beta \cdot v_{dW} + dW \quad \text{(省略 } 1 - \beta \text{)}\]
  • 这会导致 $v_{dW}$ 被放大 $\frac{1}{1 - \beta}$ 倍;
  • 需相应调小 $\alpha$;
  • 推荐保留 $(1 - \beta)$,更直观且超参解耦。

🎯 五、物理直觉(可选理解)

  将优化过程想象为小球滚下碗状曲面

  • 梯度 $dW$ → 提供加速度
  • 动量 $v_{dW}$ → 代表速度
  • $\beta < 1$ → 引入摩擦力,防止速度无限增长

小球因惯性可越过局部震荡,沿主方向更快滚向谷底。

💡 注:此类比有助于部分人理解,但非必需。


✅ 六、优势总结

特性标准 GDGD with Momentum
收敛速度
振荡明显被抑制
学习率容忍度更高
实现复杂度简单仅多两行代码

结论:动量法几乎总是优于标准梯度下降,是深度学习优化的基础技巧之一。


📌 七、伪代码(完整流程)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 初始化
v_dW = np.zeros_like(W)
v_db = np.zeros_like(b)

for t in range(num_iterations):
    # 1. 计算梯度(mini-batch)
    dW, db = compute_gradients(X_batch, y_batch, W, b)
    
    # 2. 更新动量
    v_dW = beta * v_dW + (1 - beta) * dW
    v_db = beta * v_db + (1 - beta) * db
    
    # 3. 更新参数
    W = W - alpha * v_dW
    b = b - alpha * v_db

🔜 下一步

  动量法虽有效,但仍有改进空间。后续可学习更先进的优化器,如:

  • RMSprop
  • Adam(结合动量 + 自适应学习率)

  这些将在后续课程中讲解。

本文由作者按照 CC BY 4.0 进行授权