1.Momentum要解决的问题
SGD有个问题就是收敛过程会产生震荡,这个相信大家都明白。Momentum主要解决的就是这个问题。
具体的解决思路为在SGD基础上引入一阶动量,公式可以表示如下:
m
t
=
β
1
⋅
m
t
−
1
+
(
1
−
β
1
)
⋅
g
t
m_t = \beta_1 \cdot m_{t-1} + (1- \beta_1) \cdot g_t
mt=β1⋅mt−1+(1−β1)⋅gt
其中, β 1 \beta_1 β1为超参数,经验值为0.9。 β 1 \beta_1 β1越大,说明当前动量主要由以前累积的方向决定。而 β 1 \beta_1 β1越小,说明当前动量更多由当前梯度决定。
2.Momentum为什么能解决震荡
首先大家回忆一下为什么传统的SGD会有收敛震荡问题?
假设前一时刻的梯度与当前的梯度方向几乎相反,那么用传统SGD迭代的时候,该点徒弟就必有大幅的徘徊,这个时候就必然会引起震荡。
而Momentum积累了历史的梯度,此刻的梯度收到前一时刻的影响,会导致当前时刻梯度徘徊的幅度大幅减小。从直观来讲,就是当前时刻梯度如果与历史积累相似,这种趋势会得到加强。而当前时刻梯度如果与历史时刻相反,当前时刻的梯度会减弱,这样就能达到减小收敛震荡的效果。
3.动量能加速收敛
动量不光能解决收敛震荡问题,还能加速优化问题收敛。
由第一部分我们将动量公式可以表示为
m
t
=
α
⋅
m
t
−
1
+
ϵ
⋅
g
t
m_t = \alpha \cdot m_{t-1} + \epsilon \cdot g_t
mt=α⋅mt−1+ϵ⋅gt
假设每个时刻梯度
g
t
g_t
gt的方向都一致,那么有
m
t
=
ϵ
⋅
g
t
1
−
α
m_t = \frac{\epsilon \cdot g_t}{1 - \alpha}
mt=1−αϵ⋅gt
如果
α
=
0.5
\alpha = 0.5
α=0.5,此时动量法的收敛速度是传统SGD的2倍。
如果
α
=
0.9
\alpha = 0.9
α=0.9,此时动量法的收敛速度是传统SGD的10倍。
如果
α
=
0.99
\alpha = 0.99
α=0.99,此时动量法的收敛速度是传统SGD的100倍。
4.动量法的算法流程
假定初始参数为 θ \theta θ,初始动量 v v v,动量超参数为 α \alpha α,梯度超参数为 ϵ \epsilon ϵ,则整个动量法算法流程如下:
1.从训练集中采样m个样本
x
(
1
)
x^{(1)}
x(1),
x
(
2
)
x^{(2)}
x(2)…,
x
(
m
)
x^{(m)}
x(m),对应的标签为
y
(
i
)
y^{(i)}
y(i)。
2.计算梯度
g
=
▽
θ
∑
i
L
(
f
(
x
(
i
)
;
θ
)
,
y
(
i
)
)
g = \bigtriangledown_\theta \sum_i L(f(x^{(i)}; \theta), y^{(i)})
g=▽θ∑iL(f(x(i);θ),y(i))
3.计算动量更新
v
=
α
v
−
ϵ
g
v = \alpha v - \epsilon g
v=αv−ϵg
4.参数更新
θ
=
θ
+
v
\theta = \theta + v
θ=θ+v