梯度下降优化-Momentum动量法
1. 问题引入
在优化复杂的损失函数时,普通的梯度下降法会遇到以下问题:
- 收敛速度慢:在平坦区域,梯度很小,更新步长很小
- 容易陷入鞍点:在鞍点处梯度接近0,算法可能停滞不前
- 震荡问题:在狭窄山谷中容易来回震荡,收敛慢
- 学习率敏感:需要精心调整学习率
Momentum(动量法) 通过引入"动量"的概念,模拟物理世界中物体运动的惯性,能够有效解决这些问题。
2. 物理类比:理解动量的直觉
2.1 生活中的类比
想象一个球从山坡上滚下来:
普通梯度下降(SGD):
- 球只根据当前位置的坡度来决定下一步的方向和速度
- 如果遇到平坦区域,球会立即减速甚至停止
- 如果遇到小坑(局部最优),球可能会被困住
- 在狭窄山谷中,球会在两侧来回震荡
Momentum(动量法):
- 球有"惯性"(动量),会记住之前的运动方向和速度
- 即使遇到平坦区域,由于惯性,球仍能继续前进
- 如果遇到小坑,之前的动量可以帮助球越过障碍
- 在狭窄山谷中,动量可以平滑路径,减少震荡
2.2 物理学的动量概念
在物理学中,动量(Momentum) 定义为:
$$
p = m \cdot v
$$
其中:
- $p$:动量(Momentum)
- $m$:质量(Mass)
- $v$:速度(Velocity)
动量的特点:
- 动量是矢量,有方向性
- 动量越大,物体越难改变运动状态
- 在没有外力的情况下,动量守恒
类比到优化问题:
- 参数 $\theta$ 相当于物体的位置
- 梯度 $\nabla L(\theta)$ 相当于作用在物体上的力
- 动量 $v$ 相当于物体的速度
- 学习率 $\alpha$ 相当于时间步长
3. 普通梯度下降法回顾
3.1 标准梯度下降更新公式
对于损失函数 $L(\theta)$,标准梯度下降的更新公式为:
$$
\theta_{t+1} = \theta_t - \alpha \cdot \nabla_\theta L(\theta_t)
$$
公式详细说明:
- $\theta_t$:第 $t$ 步的参数值(向量)
- $\theta_{t+1}$:第 $t+1$ 步的参数值(更新后)
- $\alpha$:学习率(learning rate),控制更新步长,通常取 0.01, 0.001 等
- $\nabla_\theta L(\theta_t)$:损失函数在 $\theta_t$ 处的梯度(偏导数向量)
更新方向: 沿负梯度方向(函数下降最快的方向)
更新步长: $\alpha \cdot |\nabla_\theta L(\theta_t)|$
3.2 普通梯度下降的问题
- 在平坦区域:梯度很小,更新步长很小,收敛慢
- 在鞍点:梯度接近0,可能被困住
- 在狭窄山谷:容易在两侧来回震荡
- 学习率敏感:需要精心调整学习率
3.3 鞍点问题示例
鞍点(Saddle Point)是优化中的一个重要概念:
- 定义:在某个方向上是最小值,在另一个方向上是最大值
- 特点:梯度接近0,但不是全局最优
- 问题:普通梯度下降可能在鞍点处停滞
数学定义:
- 对于函数 $f(x, y)$,如果 $\frac{\partial f}{\partial x} = 0$ 且 $\frac{\partial f}{\partial y} = 0$,但 $f$ 不是局部最小值,则 $(x, y)$ 是鞍点
4. Momentum(动量法)的数学推导
4.1 Momentum 的核心思想
Momentum 通过引入动量项来累积历史梯度信息,形成"惯性"效应。
核心思路:
- 不仅使用当前梯度,还使用历史梯度的加权平均
- 当梯度方向一致时,动量累积,加速收敛
- 当梯度方向变化时,动量平滑变化,减少震荡
4.2 Momentum 的更新公式
Momentum 的更新公式(标准形式):
$$
v_t = \beta \cdot v_{t-1} + \nabla_\theta L(\theta_t)
$$
$$
\theta_{t+1} = \theta_t - \alpha \cdot v_t
$$
公式详细说明:
第一步:计算动量项 $v_t$
- $v_t$:第 $t$ 步的动量(累积梯度),是一个向量
- $v_{t-1}$:第 $t-1$ 步的动量(历史动量)
- $\beta$:动量系数(momentum coefficient),通常取 0.9 或 0.99
- $\beta$ 越大,历史信息权重越大,惯性越强
- $\beta$ 越小,当前梯度权重越大,变化越敏感
- $\nabla_\theta L(\theta_t)$:当前梯度
- 物理意义:$v_t$ 是历史梯度的加权累积,$\beta$ 控制历史信息的衰减速度
第二步:参数更新
- $\theta_{t+1}$:更新后的参数
- $\theta_t$:当前参数
- $\alpha$:学习率
- 更新方向:沿负动量方向(而不是负梯度方向)
注意:有些文献中 Momentum 的公式略有不同,我们会在后面讨论。
4.3 Momentum 公式的完整推导
让我们从初始状态开始,逐步推导 Momentum 的更新过程。
初始条件:
$$
v_0 = 0
$$
第1步:
$$
v_1 = \beta \cdot v_0 + \nabla_\theta L(\theta_1) = \nabla_\theta L(\theta_1)
$$
$$
\theta_2 = \theta_1 - \alpha \cdot v_1 = \theta_1 - \alpha \cdot \nabla_\theta L(\theta_1)
$$
第2步:
$$
v_2 = \beta \cdot v_1 + \nabla_\theta L(\theta_2)
$$
$$
= \beta \cdot \nabla_\theta L(\theta_1) + \nabla_\theta L(\theta_2)
$$
$$
\theta_3 = \theta_2 - \alpha \cdot v_2 = \theta_2 - \alpha[\beta \cdot \nabla_\theta L(\theta_1) + \nabla_\theta L(\theta_2)]
$$
第3步:
$$
v_3 = \beta \cdot v_2 + \nabla_\theta L(\theta_3)
$$
$$
= \beta[\beta \cdot \nabla_\theta L(\theta_1) + \nabla_\theta L(\theta_2)] + \nabla_\theta L(\theta_3)
$$
$$
= \beta^2 \cdot \nabla_\theta L(\theta_1) + \beta \cdot \nabla_\theta L(\theta_2) + \nabla_\theta L(\theta_3)
$$
$$
\theta_4 = \theta_3 - \alpha \cdot v_3
$$
第t步(一般形式):
$$
v_t = \beta^{t-1} \cdot \nabla_\theta L(\theta_1) + \beta^{t-2} \cdot \nabla_\theta L(\theta_2) + ... + \beta \cdot \nabla_\theta L(\theta_{t-1}) + \nabla_\theta L(\theta_t)
$$
$$
v_t = \sum_{i=1}^{t} \beta^{t-i} \cdot \nabla_\theta L(\theta_i)
$$
关键洞察:
- $v_t$ 是历史梯度的加权和
- 越近的梯度权重越大($\beta^0 = 1$ 最大)
- 越远的梯度权重越小($\beta^{t-i}$ 指数衰减)
- 当梯度方向一致时,动量会累积,更新步长增大
- 当梯度方向变化时,动量会平滑变化,减少震荡
4.4 权重分析
让我们分析一下不同历史梯度的权重:
假设 $\beta = 0.9$,则:
- 第 $t$ 步(当前)的权重:$\beta^0 = 1$
- 第 $t-1$ 步的权重:$\beta^1 = 0.9$
- 第 $t-2$ 步的权重:$\beta^2 = 0.81$
- 第 $t-3$ 步的权重:$\beta^3 = 0.729$
- ...
- 第 $t-k$ 步的权重:$\beta^k = 0.9^k$
有效窗口大小:
- 当 $\beta = 0.9$ 时,$\beta^{10} \approx 0.35$,$\beta^{20} \approx 0.12$
- 通常认为前 $\frac{1}{1-\beta}$ 步的梯度对当前动量有显著影响
- 当 $\beta = 0.9$ 时,有效窗口约为 10 步

4.5 Momentum 公式的另一种形式
有些文献中,Momentum 的公式会写成:
$$
v_t = \beta \cdot v_{t-1} + (1 - \beta) \cdot \nabla_\theta L(\theta_t)
$$
$$
\theta_{t+1} = \theta_t - \alpha \cdot v_t
$$
区别:
- 标准形式:$v_t = \beta \cdot v_{t-1} + \nabla_\theta L(\theta_t)$
- 另一种形式:$v_t = \beta \cdot v_{t-1} + (1 - \beta) \cdot \nabla_\theta L(\theta_t)$
两种形式的关系:
- 如果我们将学习率调整为 $\alpha' = \frac{\alpha}{1-\beta}$,两种形式等价
- 另一种形式中,$v_t$ 是梯度的指数移动平均(EMA)
- 标准形式更常用,因为实现更简单
本教程使用标准形式:
$$
v_t = \beta \cdot v_{t-1} + \nabla_\theta L(\theta_t)
$$
$$
\theta_{t+1} = \theta_t - \alpha \cdot v_t
$$
5. Momentum 的优势分析
5.1 加速收敛
场景: 在梯度方向一致的区域
普通梯度下降:
- 每一步的更新步长为 $\alpha \cdot |\nabla L(\theta_t)|$
- 如果梯度大小不变,每一步的步长相同
Momentum:
- 第1步:$v_1 = \nabla L(\theta_1)$,步长 = $\alpha \cdot |\nabla L(\theta_1)|$
- 第2步:$v_2 = \beta \cdot \nabla L(\theta_1) + \nabla L(\theta_2) \approx (1+\beta) \cdot \nabla L$(假设梯度相同)
- 第3步:$v_3 = \beta^2 \cdot \nabla L(\theta_1) + \beta \cdot \nabla L(\theta_2) + \nabla L(\theta_3) \approx (1+\beta+\beta^2) \cdot \nabla L$
结论: 在梯度方向一致时,Momentum 的更新步长会逐渐增大,加速收敛。
5.2 减少震荡
场景: 在狭窄山谷中,梯度方向来回变化
普通梯度下降:
- 梯度方向变化时,参数更新方向立即改变
- 容易在两侧来回震荡
Momentum:
- 即使当前梯度方向改变,历史梯度仍会影响更新方向
- 动量会平滑路径,减少震荡
数学分析:
假设梯度在 $+g$ 和 $-g$ 之间交替:
- 第1步:$v_1 = +g$
- 第2步:$v_2 = \beta \cdot (+g) + (-g) = (\beta - 1) \cdot g$
- 第3步:$v_3 = \beta \cdot (\beta - 1) \cdot g + (+g) = (\beta^2 - \beta + 1) \cdot g$
当 $\beta = 0.9$ 时:
- $v_2 = -0.1 \cdot g$(震荡减小)
- $v_3 = 0.91 \cdot g$(方向恢复)
5.3 帮助逃离鞍点
场景: 在鞍点处,梯度接近0
普通梯度下降:
- 梯度接近0,更新步长接近0
- 可能被困在鞍点
Momentum:
- 即使当前梯度接近0,历史动量仍存在
- 动量可以帮助参数越过鞍点
数学分析:
假设在鞍点附近,梯度很小:$\nabla L(\theta_t) \approx 0$
- 第 $t$ 步:$v_t = \beta \cdot v_{t-1} + 0 = \beta \cdot v_{t-1}$
- 只要 $v_{t-1} \neq 0$,参数仍会更新
- 动量会逐渐衰减,但不会立即停止
6. 带有鞍点的损失函数示例
为了对比普通梯度下降和 Momentum 的效果,我们使用一个经典的鞍点函数:
$$
f(x, y) = x^2 - y^2
$$
函数特点:
- 在 $x$ 方向上:$f(x, y) = x^2$,是凸函数,最小值在 $x=0$
- 在 $y$ 方向上:$f(x, y) = -y^2$,是凹函数,最大值在 $y=0$
- 鞍点:$(0, 0)$,梯度为0,但不是全局最优
- 全局最优:不存在(函数无下界)
梯度:
$$
\frac{\partial f}{\partial x} = 2x
$$
$$
\frac{\partial f}{\partial y} = -2y
$$
在鞍点 $(0, 0)$ 处:
- $\frac{\partial f}{\partial x} = 0$
- $\frac{\partial f}{\partial y} = 0$
- 梯度为0,普通梯度下降会停滞
Momentum 的优势:
- 如果从某个方向接近鞍点,动量可以帮助越过鞍点
- 在 $x$ 方向上,梯度指向原点,动量会累积
- 在 $y$ 方向上,梯度远离原点,动量会帮助逃离

7. 对比实验:普通梯度下降 vs Momentum
7.1 实验设置
目标: 从不同起始点优化鞍点函数,对比两种方法的效果
实验参数:
- 学习率:$\alpha = 0.1$
- 动量系数:$\beta = 0.9$
- 最大迭代次数:100
- 起始点:选择几个不同的起始位置
预期结果:
- 普通梯度下降可能在鞍点附近停滞
- Momentum 应该能够更好地处理鞍点问题


================================================================================
详细计算过程:前10步
================================================================================
起始点: (2.000, 0.500)
学习率 α = 0.1, 动量系数 β = 0.9
普通梯度下降:
--------------------------------------------------------------------------------
步数 参数 (x, y) 梯度 (gx, gy) 更新 (Δx, Δy) 损失
--------------------------------------------------------------------------------
1 ( 2.00000, 0.50000) ( 4.00000, -1.00000) (-0.40000, 0.10000) 3.75000
2 ( 1.60000, 0.60000) ( 3.20000, -1.20000) (-0.32000, 0.12000) 2.20000
3 ( 1.28000, 0.72000) ( 2.56000, -1.44000) (-0.25600, 0.14400) 1.12000
4 ( 1.02400, 0.86400) ( 2.04800, -1.72800) (-0.20480, 0.17280) 0.30208
5 ( 0.81920, 1.03680) ( 1.63840, -2.07360) (-0.16384, 0.20736) -0.40387
6 ( 0.65536, 1.24416) ( 1.31072, -2.48832) (-0.13107, 0.24883) -1.11844
7 ( 0.52429, 1.49299) ( 1.04858, -2.98598) (-0.10486, 0.29860) -1.95415
8 ( 0.41943, 1.79159) ( 0.83886, -3.58318) (-0.08389, 0.35832) -3.03387
9 ( 0.33554, 2.14991) ( 0.67109, -4.29982) (-0.06711, 0.42998) -4.50952
10 ( 0.26844, 2.57989) ( 0.53687, -5.15978) (-0.05369, 0.51598) -6.58378
================================================================================
Momentum:
--------------------------------------------------------------------------------
步数 参数 (x, y) 梯度 (gx, gy) 动量 (vx, vy) 更新 (Δx, Δy) 损失
--------------------------------------------------------------------------------
1 ( 2.00000, 0.50000) ( 4.00000, -1.00000) ( 4.00000, -1.00000) (-0.40000, 0.10000) 3.75000
2 ( 1.60000, 0.60000) ( 3.20000, -1.20000) ( 6.80000, -2.10000) (-0.68000, 0.21000) 2.20000
3 ( 0.92000, 0.81000) ( 1.84000, -1.62000) ( 7.96000, -3.51000) (-0.79600, 0.35100) 0.19030
4 ( 0.12400, 1.16100) ( 0.24800, -2.32200) ( 7.41200, -5.48100) (-0.74120, 0.54810) -1.33255
5 (-0.61720, 1.70910) (-1.23440, -3.41820) ( 5.43640, -8.35110) (-0.54364, 0.83511) -2.54009
6 (-1.16084, 2.54421) (-2.32168, -5.08842) ( 2.57108, -12.60441) (-0.25711, 1.26044) -5.12546
7 (-1.41795, 3.80465) (-2.83590, -7.60930) (-0.52192, -18.95327) ( 0.05219, 1.89533) -12.46479
8 (-1.36576, 5.69998) (-2.73151, -11.39996) (-3.20124, -28.45790) ( 0.32012, 2.84579) -30.62446
9 (-1.04563, 8.54577) (-2.09126, -17.09154) (-4.97238, -42.70365) ( 0.49724, 4.27036) -71.93681
10 (-0.54839, 12.81613) (-1.09679, -25.63227) (-5.57193, -64.06555) ( 0.55719, 6.40655) -163.95252
9.3 实验2:从接近鞍点的位置开始
让我们测试从接近鞍点的位置开始优化,看看两种方法的表现。从接近鞍点的位置 (0.1, 0.1) 开始。
============================================================
实验2:起始点 (0.1, 0.1) - 接近鞍点
============================================================
普通梯度下降:
初始点: (0.100, 0.100)
最终点: (0.000000, 8281797.452201)
最终损失: -68588169039290.585938
迭代次数: 100
初始梯度: (0.200000, -0.200000)
Momentum:
初始点: (0.100, 0.100)
最终点: (-0.000285, 27104078502347760.000000)
最终损失: -734631071461429988212410463289344.000000
迭代次数: 100
最终动量: (0.002188, -90346928341159200.000000)
注意:由于鞍点函数 $f(x, y) = x^2 - y^2$ 在 y 方向上无下界,
从接近鞍点的位置开始优化时,参数会在 y 方向上发散。
上图只显示了前几步的优化路径(在合理范围内)。

10. 动量的可视化分析
10.1 动量的变化过程

10.2 优化过程对比

10.3 不同动量系数 $\beta$ 对优化效果的影响


不同beta值的总结:
------------------------------------------------------------
β=0 (SGD) 最终距离原点: 41408987.261007, 最终损失: -1714704225982265.000000, 迭代次数: 100
β=0.5 最终距离原点: 565256793155.264038, 最终损失: -319515242208172984762368.000000, 迭代次数: 100
β=0.9 最终距离原点: 135520392511738848.000000, 最终损失: -18365776786535762387446812257550336.000000, 迭代次数: 100
β=0.99 最终距离原点: 3821946198977634816.000000, 最终损失: -14607272747879590553106021257186377728.000000, 迭代次数: 100
11. 总结与关键要点
11.1 Momentum 的核心公式回顾
Momentum 更新公式:
$$v_t = \beta \cdot v_{t-1} + \nabla_\theta L(\theta_t)$$
$$\theta_{t+1} = \theta_t - \alpha \cdot v_t$$
公式中每一项的含义:
-
$v_t$(动量项):
- 第 $t$ 步的动量,是历史梯度的加权累积
- 物理意义:模拟物体运动的惯性
- 数学意义:$v_t = \sum_{i=1}^{t} \beta^{t-i} \cdot \nabla_\theta L(\theta_i)$
-
$\beta$(动量系数):
- 控制历史信息的权重,通常取 0.9 或 0.99
- $\beta$ 越大,历史信息权重越大,惯性越强
- $\beta$ 越小,当前梯度权重越大,变化越敏感
- 有效窗口大小:$\frac{1}{1-\beta}$ 步
-
$v_{t-1}$(历史动量):
- 上一步的动量,保留历史梯度信息
- 通过 $\beta$ 衰减,但不会立即消失
-
$\nabla_\theta L(\theta_t)$(当前梯度):
- 损失函数在当前参数位置的梯度
- 决定当前时刻的"力"
-
$\alpha$(学习率):
- 控制更新步长
- 与普通梯度下降中的学习率意义相同
-
$\theta_t$ 和 $\theta_{t+1}$(参数):
- 优化目标,需要更新的模型参数
11.2 Momentum 的优势
-
加速收敛:
- 在梯度方向一致的区域,动量累积,更新步长增大
- 能够更快地到达最优解附近
-
减少震荡:
- 在狭窄山谷中,动量平滑路径,减少来回震荡
- 提高优化的稳定性
-
帮助逃离鞍点:
- 即使当前梯度接近0,历史动量仍存在
- 可以帮助参数越过鞍点或小的局部最优
-
更稳定的训练:
- 对学习率的选择相对不敏感
- 训练过程更加平滑
11.3 Momentum 的适用场景
适合使用 Momentum 的情况:
- 损失函数有平坦区域
- 存在鞍点问题
- 优化路径需要平滑
- 需要加速收敛
需要注意的情况:
- $\beta$ 值需要合理选择(通常 0.9)
- 在某些情况下,过大的动量可能导致超调
- 需要与学习率配合调整
11.4 与普通梯度下降的对比
| 特性 | 普通梯度下降 | Momentum |
|---|---|---|
| 更新方向 | 负梯度方向 | 负动量方向 |
| 历史信息 | 不使用 | 使用(加权累积) |
| 收敛速度 | 较慢 | 较快 |
| 震荡问题 | 容易震荡 | 减少震荡 |
| 鞍点问题 | 容易停滞 | 可以越过 |
| 实现复杂度 | 简单 | 稍复杂 |
11.5 数学推导的关键步骤
- 初始条件:$v_0 = 0$
- 递推关系:$v_t = \beta \cdot v_{t-1} + \nabla_\theta L(\theta_t)$
- 展开形式:$v_t = \sum_{i=1}^{t} \beta^{t-i} \cdot \nabla_\theta L(\theta_i)$
- 权重分析:越近的梯度权重越大($\beta^0 = 1$),越远的梯度权重越小($\beta^k$ 指数衰减)
11.6 实践建议
-
动量系数选择:
- 通常从 $\beta = 0.9$ 开始
- 如果需要更强的历史信息,可以尝试 $\beta = 0.99$
- 如果希望更敏感,可以尝试 $\beta = 0.5$
-
学习率调整:
- Momentum 通常可以使用稍大的学习率
- 建议从普通梯度下降的学习率开始,逐步调整
-
与其他优化器结合:
- Momentum 是很多高级优化器(如 Adam)的基础
- 理解 Momentum 有助于理解其他优化算法
12. 参考文献与扩展阅读
-
原始论文:
- Polyak, B. T. (1964). Some methods of speeding up the convergence of iteration methods. USSR Computational Mathematics and Mathematical Physics.
-
相关优化算法:
- Nesterov Accelerated Gradient (NAG)
- Adam (Adaptive Moment Estimation)
- RMSprop
-
深入理解:
- 指数移动加权平均(EMA)
- 梯度下降法的变体
- 优化理论