动量法(Momentum)
动量法(Momentum)是一种优化算法,旨在加速梯度下降法的收敛,尤其是在存在高曲率、嘈杂梯度或小但一致梯度的情况下。动量法通过引入动量概念,使得参数更新不仅依赖于当前的梯度,还考虑了之前梯度的累计效果,从而加速收敛并减少参数更新时的震荡。
动量法的原理
动量法的核心思想是引入一个动量项(velocity),记录之前的梯度信息,并在每次参数更新时加上这个动量项。具体来说,动量法的更新公式如下:
-
动量更新:
v t = β v t − 1 + ( 1 − β ) ∇ θ J ( θ ) v_t = \beta v_{t-1} + (1 - \beta) \nabla_{\theta} J(\theta) vt=βvt−1+(1−β)∇θJ(θ)
其中:
- v t v_t vt是第 t t t次迭代的动量项。
- β \beta β是动量超参数,通常取值在0到1之间,控制之前梯度的影响程度。
- ∇ θ J ( θ ) \nabla_{\theta} J(\theta) ∇θJ(θ)是损失函数 J ( θ ) J(\theta) J(θ)对参数 θ \theta θ的梯度。 -
参数更新:
θ = θ − α v t \theta = \theta - \alpha v_t θ=θ−αvt
其中:
- θ \theta θ是模型参数。
- α \alpha α是学习率,控制每次更新的步长。
具体数据示例
假设我们有一个简单的线性回归问题,训练数据集如下:
x | y |
---|---|
1 | 2 |
2 | 3 |
3 | 4 |
4 | 5 |
我们要拟合的线性模型为 h ( θ ) = θ 0 + θ 1 x h(\theta) = \theta_0 + \theta_1 x h(θ)=θ0+θ1x。
步骤1:初始化参数
假设 θ 0 = 0 \theta_0 = 0 θ0=0, θ 1 = 0 \theta_1 = 0 θ1=0,学习率 α = 0.01 \alpha = 0.01 α=0.01,动量系数 β = 0.9 \beta = 0.9 β=0.9,并且初始化动量项 v 0 = 0 v_0 = 0 v0=0。
步骤2:计算梯度
损失函数
J
(
θ
)
J(\theta)
J(θ)为均方误差(MSE):
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
(
θ
)
−
y
i
)
2
J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h(\theta) - y_i)^2
J(θ)=2m1∑i=1m(h(θ)−yi)2
其中,
m
m
m是训练样本的数量。
对于第一个样本
(
x
1
,
y
1
)
=
(
1
,
2
)
(x_1, y_1) = (1, 2)
(x1,y1)=(1,2),模型预测值为:
h
(
θ
)
=
θ
0
+
θ
1
x
1
=
0
h(\theta) = \theta_0 + \theta_1 x_1 = 0
h(θ)=θ0+θ1x1=0
计算损失函数对参数的梯度:
∂
J
∂
θ
0
=
h
(
θ
)
−
y
1
=
0
−
2
=
−
2
\frac{\partial J}{\partial \theta_0} = h(\theta) - y_1 = 0 - 2 = -2
∂θ0∂J=h(θ)−y1=0−2=−2
∂
J
∂
θ
1
=
(
h
(
θ
)
−
y
1
)
x
1
=
−
2
⋅
1
=
−
2
\frac{\partial J}{\partial \theta_1} = (h(\theta) - y_1) x_1 = -2 \cdot 1 = -2
∂θ1∂J=(h(θ)−y1)x1=−2⋅1=−2
步骤3:更新动量项和参数
-
更新动量项:
v 0 = β v − 1 + ( 1 − β ) ∇ θ J ( θ ) = 0.9 × 0 + 0.1 × ( − 2 ) = − 0.2 v_0 = \beta v_{-1} + (1 - \beta) \nabla_{\theta} J(\theta) = 0.9 \times 0 + 0.1 \times (-2) = -0.2 v0=βv−1+(1−β)∇θJ(θ)=0.9×0+0.1×(−2)=−0.2 -
更新参数:
θ 0 = θ 0 − α v 0 = 0 − 0.01 × ( − 0.2 ) = 0.002 \theta_0 = \theta_0 - \alpha v_0 = 0 - 0.01 \times (-0.2) = 0.002 θ0=θ0−αv0=0−0.01×(−0.2)=0.002
θ 1 = θ 1 − α v 0 = 0 − 0.01 × ( − 0.2 ) = 0.002 \theta_1 = \theta_1 - \alpha v_0 = 0 - 0.01 \times (-0.2) = 0.002 θ1=θ1−αv0=0−0.01×(−0.2)=0.002
第二次迭代
假设下一次随机选择的样本是 ( x 2 , y 2 ) = ( 2 , 3 ) (x_2, y_2) = (2, 3) (x2,y2)=(2,3)。
-
计算新的预测值:
h ( θ ) = θ 0 + θ 1 x 2 = 0.002 + 0.002 × 2 = 0.006 h(\theta) = \theta_0 + \theta_1 x_2 = 0.002 + 0.002 \times 2 = 0.006 h(θ)=θ0+θ1x2=0.002+0.002×2=0.006 -
计算新的梯度:
∂ J ∂ θ 0 = h ( θ ) − y 2 = 0.006 − 3 = − 2.994 \frac{\partial J}{\partial \theta_0} = h(\theta) - y_2 = 0.006 - 3 = -2.994 ∂θ0∂J=h(θ)−y2=0.006−3=−2.994
∂ J ∂ θ 1 = ( h ( θ ) − y 2 ) x 2 = − 2.994 × 2 = − 5.988 \frac{\partial J}{\partial \theta_1} = (h(\theta) - y_2) x_2 = -2.994 \times 2 = -5.988 ∂θ1∂J=(h(θ)−y2)x2=−2.994×2=−5.988 -
更新动量项:
v 1 = β v 0 + ( 1 − β ) ∇ θ J ( θ ) = 0.9 × ( − 0.2 ) + 0.1 × ( − 2.994 ) = − 0.4794 v_1 = \beta v_0 + (1 - \beta) \nabla_{\theta} J(\theta) = 0.9 \times (-0.2) + 0.1 \times (-2.994) = -0.4794 v1=βv0+(1−β)∇θJ(θ)=0.9×(−0.2)+0.1×(−2.994)=−0.4794 -
更新参数:
θ 0 = θ 0 − α v 1 = 0.002 − 0.01 × ( − 0.4794 ) = 0.006794 \theta_0 = \theta_0 - \alpha v_1 = 0.002 - 0.01 \times (-0.4794) = 0.006794 θ0=θ0−αv1=0.002−0.01×(−0.4794)=0.006794
θ 1 = θ 1 − α v 1 = 0.002 − 0.01 × ( − 0.4794 ) = 0.006794 \theta_1 = \theta_1 - \alpha v_1 = 0.002 - 0.01 \times (-0.4794) = 0.006794 θ1=θ1−αv1=0.002−0.01×(−0.4794)=0.006794
第三次迭代
假设下一次随机选择的样本是 ( x 3 , y 3 ) = ( 3 , 4 ) (x_3, y_3) = (3, 4) (x3,y3)=(3,4)。
-
计算新的预测值:
h ( θ ) = θ 0 + θ 1 x 3 = 0.006794 + 0.006794 × 3 = 0.027176 h(\theta) = \theta_0 + \theta_1 x_3 = 0.006794 + 0.006794 \times 3 = 0.027176 h(θ)=θ0+θ1x3=0.006794+0.006794×3=0.027176 -
计算新的梯度:
∂ J ∂ θ 0 = h ( θ ) − y 3 = 0.027176 − 4 = − 3.972824 \frac{\partial J}{\partial \theta_0} = h(\theta) - y_3 = 0.027176 - 4 = -3.972824 ∂θ0∂J=h(θ)−y3=0.027176−4=−3.972824
∂ J ∂ θ 1 = ( h ( θ ) − y 3 ) x 3 = − 3.972824 × 3 = − 11.918472 \frac{\partial J}{\partial \theta_1} = (h(\theta) - y_3) x_3 = -3.972824 \times 3 = -11.918472 ∂θ1∂J=(h(θ)−y3)x3=−3.972824×3=−11.918472 -
更新动量项:
v 2 = β v 1 + ( 1 − β ) ∇ θ J ( θ ) = 0.9 × ( − 0.4794 ) + 0.1 × ( − 3.972824 ) = − 0.8292424 v_2 = \beta v_1 + (1 - \beta) \nabla_{\theta} J(\theta) = 0.9 \times (-0.4794) + 0.1 \times (-3.972824) = -0.8292424 v2=βv1+(1−β)∇θJ(θ)=0.9×(−0.4794)+0.1×(−3.972824)=−0.8292424 -
更新参数:
θ 0 = θ 0 − α v 2 = 0.006794 − 0.01 × ( − 0.8292424 ) = 0.015086424 \theta_0 = \theta_0 - \alpha v_2 = 0.006794 - 0.01 \times (-0.8292424) = 0.015086424 θ0=θ0−αv2=0.006794−0.01×(−0.8292424)=0.015086424
θ 1 = θ 1 − α v 2 = 0.006794 − 0.01 × ( − 0.8292424 ) = 0.015086424 \theta_1 = \theta_1 - \alpha v_2 = 0.006794 - 0.01 \times (-0.8292424) = 0.015086424 θ1=θ1−αv2=0.006794−0.01×(−0.8292424)=0.015086424
总结
动量法通过引入动量项,使得参数更新不仅依赖于当前的梯度,还考虑了之前梯度的累积效果,从而加速收敛并减少参数更新时的震荡。通过具体数据示例,可以清楚地看到动量法如何在每次迭代中逐步更新动量项和参数,使模型逐步逼近最优解。