动量梯度下降(Momentum Gradient Descent)是一种优化算法,用于训练机器学习模型,特别是神经网络模型。它是在标准梯度下降算法的基础上引入了动量概念,以解决梯度下降中的一些问题,例如局部最小值、鞍点等。
提出背景:
动量梯度下降算法的提出是为了解决传统梯度下降算法中的一些问题。
- 在高度曲折的损失函数表面上的震荡
- 收敛速度缓慢等。
通过引入动量的概念,可以在一定程度上加速收敛,并且有助于跳出局部最小值。
理论:
动量梯度下降的核心思想是引入动量因子,使得更新方向不仅取决于当前梯度,还考虑了之前更新方向的影响。这样可以在一定程度上平滑更新路径,加速收敛。
公式
- While 条件:
- g ← ∇ θ k − 1 L ( θ ) g \leftarrow \nabla_{\theta_{k-1}} L(\theta) g←∇θk−1L(θ) # 计算梯度
- w k = α w k − 1 + ( 1 − α ) g w_k = \alpha w_{k-1} + (1 - \alpha) g wk=αwk−1+(1−α)g # 计算动量
- θ k = θ k − 1 − η w k \theta_{k} = \theta_{k-1} - \eta w_k θk=θk−1−ηwk # 更新参数
θ
k
−
1
\theta_{k-1}
θk−1是第k-1步的模型参数向量。
∇
L
(
θ
k
−
1
)
\nabla L(\theta_{k-1})
∇L(θk−1) 是损失函数
L
L
L 对参数
θ
k
−
1
\theta_{k-1}
θk−1 的梯度。
η
\eta
η是学习率。
α
\alpha
α是动量参数,通常取值在 0 到 1 之间,决定了历史梯度对当前更新的影响程度。
w
k
w_k
wk是动量,表示历史梯度的加权累积。
代码示例
下面是一个简单的 Python 代码示例,演示了如何使用动量梯度下降算法来训练一个简单的线性回归模型:
import numpy as np
def momentum_gradient_descent(params, grads, velocities, lr=0.01, momentum=0.9):
for param, grad, velocity in zip(params, grads, velocities):
velocity[:] = momentum * velocity + lr * grad
param[:] -= velocity
优缺点
优点:
- 加速收敛:动量可以帮助加速SGD在相关方向上的收敛,并抑制振荡,使得训练过程更快。
- 降低震荡:通过平滑梯度,动量方法可以减少训练过程中的震荡,使得更新过程更稳定。
- 逃离局部最小:动量的累积可以帮助算法跳出局部最小值。
缺点:
- 超参数敏感:动量系数的选择对算法的性能影响很大,需要仔细调整。
- 可能错过最小值:过大的动量可能会导致算法在最小值附近“冲过头”,从而错过最优解。