使用动量(Momentum)的SGD、使用Nesterov动量的SGD
参考:使用动量(Momentum)的SGD、使用Nesterov动量的SGD
一. 使用动量(Momentum)的随机梯度下降
虽然随机梯度下降是非常受欢迎的优化方法,但其学习过程有时会很慢。动量方法旨在加速学习(加快梯度下降的速度),特别是处理高曲率、小但一致的梯度,或是带噪声的梯度。动量算法累积了之前梯度指数级衰减的移动平均,并且继续沿该方向移动。
简单介绍一下什么是指数加权平均(exponential weight averages):指数加权平均值又称指数加权移动平均值,局部平均值,移动平均值。加权平均这个概念都很熟悉,即根据各个元素所占权重计算平均值。指数加权平均中的指数表示各个元素所占权重呈指数分布。假设存在数列
(
Q
1
,
Q
2
,
Q
3
,
.
.
.
)
(Q_1,Q_2,Q_3,...)
(Q1,Q2,Q3,...) ,令
V
0
=
0
V_0=0
V0=0,
V
1
=
β
V
0
+
(
1
−
β
)
Q
1
V_1=\beta V_0+(1-\beta)Q_1
V1=βV0+(1−β)Q1
V
2
=
β
V
1
+
(
1
−
β
)
Q
2
V_2=\beta V_1+(1-\beta)Q_2
V2=βV1+(1−β)Q2
V
3
=
β
V
2
+
(
1
−
β
)
Q
3
V_3=\beta V_2+(1-\beta)Q_3
V3=βV2+(1−β)Q3
其中
β
∈
[
0
,
1
]
\beta\in[0,1]
β∈[0,1]为衰减系数,
V
1
,
V
2
,
V
3
.
.
.
.
V_1,V_2,V_3....
V1,V2,V3....称为该数列的指数加权平均。为了更好地理解指数这两个字,我们展开
V
100
V_{100}
V100(为了方便书写,令
β
=
0.9
\beta=0.9
β=0.9 ,
1
−
β
=
0.1
1-\beta=0.1
1−β=0.1 ):
V
100
=
0.1
Q
100
+
0.1
∗
0.9
Q
99
+
0.1
∗
0.
9
2
Q
98
+
0.1
∗
0.
9
3
Q
97
+
.
.
.
.
.
.
+
0.1
∗
0.
9
99
Q
1
V_{100}=0.1Q_{100}+0.1*0.9Q_{99}+0.1*0.9^2Q_{98}+0.1*0.9^3Q_{97}+......+0.1*0.9^{99}Q_{1}
V100=0.1Q100+0.1∗0.9Q99+0.1∗0.92Q98+0.1∗0.93Q97+......+0.1∗0.999Q1
从上式可以看出指数加权平均是有记忆的,每一个V都包含了之前所有数据的信息。
在实践中,在衰减初期我们需要对偏差进行修正:
V
t
=
V
t
1
−
β
t
V_t=\frac{V_t}{1-\beta^t}
Vt=1−βtVt
动量梯度下降的参数更新公式:
在这个公式中,我们可以看到参数更新时并不是直接减去
a
d
W
a\mathrm{d}W
adW和
a
d
b
a\mathrm{d}b
adb,而是计算出了一个
v
d
W
v_{\mathrm{d}W}
vdW和
v
d
b
v_{\mathrm{d}b}
vdb。这又是什么呢?其实这就是指数加权平均。使用上面的公式,可以将之前的
d
W
\mathrm{d}W
dW和
d
b
\mathrm{d}b
db都联系起来,不再是每一次梯度都是独立的情况。让每一次的参数更新方向不仅仅取决于当前位置的梯度,还受到上一次参数更新方向的影响。
为了更加直观地理解,画个图吧。
注意
β
=
0
\beta=0
β=0时,就是传统的SGD。传统的SGD和使用动量的SGD对比图如下:
**带有动量的SGD本质:使用指数加权平均之后的梯度代替原梯度进行参数更新。**因为每个指数加权平均后的梯度含有之前梯度的信息,动量梯度下降法因此得名。
**带有动量的SGD算法如下:**在传统的SGD中引入变量v, 其实这个v 就是梯度的改变量。
动量参数
α
∈
[
0
,
1
)
\alpha\in[0,1)
α∈[0,1),决定了之前梯度的贡献衰减得有多快。如果动量算法总是观察到梯度g,那么他会在方向 -g 上不停加速,直到达到最终速度,其中步长为
1
1
−
α
ϵ
g
\frac{1}{1-\alpha}\epsilon g
1−α1ϵg
因此将动量的超参数视为
1
1
−
α
\frac{1}{1-\alpha}
1−α1有助于理解。在实践中,动量参数 $ \alpha$ 的一般取值为0.5、0.9、0.99,分别对应着最大速度2倍,10倍,100倍于SGD算法。
带有动量的SGD优点:
(1)可以通过局部极小点;
(2)加快收敛速度;
(3)抑制梯度下降时上下震荡的情况。
下面我们来看看动量法如何帮助我们缓解病态曲率的问题。下图中,梯度大多数发生更新在字形方向上,我们将每次更新分解为W1和W2方向上的两个分量。如果我们分别累加这些梯度的两个分量,那么W1方向上的分量将互相抵消,而W2方向上的分量得到了加强。
也就是说,基于动量法的更新,积累了W2方向上的分量,清空了W1方向上的分量,从而帮助我们更快地通往最小值。从这个意义上说,动量法也有助于抑制振荡。
动量法同时提供了加速度,从而加快收敛。但你可能想要搭配模拟退火,以免跳过最小值。当我们使用动量优化算法的时候,可以解决小批量SGD优化算法更新幅度摆动大的问题,同时可以使得网络的收敛速度更快。
在实践中,动量系数一般初始化为0.5,并在多个时期后逐渐退火至0.9。
二、使用Nesterov动量的SGD
Nesterov是Momentum的变种。与Momentum唯一区别就是,计算梯度的不同。Nesterov动量中,先用当前的速度
v
v
v 临时更新一遍参数,在用更新的临时参数计算梯度。因此,Nesterov动量可以解释为在Momentum动量方法中添加了一个校正因子。
完整的Nesterov动量算法如下所示:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)