20 动量梯度下降法(Gradient Descent with Momentum)
20 动量梯度下降法(Gradient Descent with Momentum)
🧠 一、动机:为什么需要动量?
标准梯度下降在优化具有“狭长椭圆”等高线的损失函数时,会出现剧烈振荡(尤其在垂直方向),导致:
- 收敛速度慢;
- 无法使用较大的学习率(否则会发散)。
目标:希望在垂直方向减速(抑制振荡),在水平方向加速(快速逼近最小值)。
⚙️ 二、动量法的核心思想
对梯度进行指数加权平均(Exponentially Weighted Average) ,用平滑后的“动量”代替原始梯度更新参数。
这相当于给优化过程引入“惯性”,使参数更新更平稳、方向更一致。
📐 三、算法公式(推荐版本)
在第 $t$ 次迭代中:
计算当前梯度(基于 mini-batch 或全批量):
\[dW, \quad db\]更新动量变量(指数加权平均):
\[v_{dW} := \beta \cdot v_{dW} + (1 - \beta) \cdot dW\] \[v_{db} := \beta \cdot v_{db} + (1 - \beta) \cdot db\]用动量更新参数:
\[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$ → 引入摩擦力,防止速度无限增长
小球因惯性可越过局部震荡,沿主方向更快滚向谷底。
💡 注:此类比有助于部分人理解,但非必需。
✅ 六、优势总结
| 特性 | 标准 GD | GD 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 进行授权