思路参考一个框架看懂优化算法之异同 SGD/AdaGrad/Adam
SGD
随机梯度下降方法
g
t
=
∇
f
(
w
t
)
g_t = \nabla f(w_t)
gt=∇f(wt)
w
t
+
1
=
w
t
−
α
g
t
w_{t+1} = w_t - \alpha g_t
wt+1=wt−αgt
动量法
为了解决梯度下降收敛过慢的问题,因为存在病态曲率。
梯度下降沿着山沟的山脊反弹,向极小的方向移动较慢。这是因为脊的表面在W1方向上弯曲得更陡峭。
具体介绍病态曲率
动量法可以解决病态曲率的问题,动量法是指利用历史的梯度信息来平滑求和获得新的梯度,避免梯度走偏。
m
t
=
β
m
t
−
1
+
(
1
−
β
)
g
t
m_t = \beta m_{t-1} + (1-\beta)g_t
mt=βmt−1+(1−β)gt
w
t
+
1
=
w
t
−
α
m
t
w_{t+1} = w_t - \alpha m_t
wt+1=wt−αmt
这里的
β
\beta
β是动量参数。
如下图所示,利用动量分解,在错误方向上的历史动量会相互抵消,最终推动梯度向正确方向迭代。
AdaGrad
自适应学习率,面对神经网络众多参数,特别是embedding,我们希望对于经常更新的参数,学习率慢一点,不会被一个异常数据带跑偏,对于罕更新参数,学习率可快一点,加速更新。所以需要历史梯度的二阶动量作为更新梯度的权重。
V
t
=
∑
j
t
g
j
2
V_t = \sum_j^t g_j^2
Vt=∑jtgj2
所以,梯度更新为:
w
t
+
1
=
w
t
−
α
g
t
V
t
w_{t+1} = w_t - \alpha \frac{g_t}{V_t}
wt+1=wt−αVtgt
为了避免分母为0,会加平滑项,而且参数更新越频繁,二阶动量越大,学习率就越小
RMSProp
AdaGrad衰减速度太快,改进方法是利用指数平滑来改进二阶动量
V
t
=
β
V
t
−
1
+
(
1
−
β
)
∑
j
t
g
j
2
V_t = \beta V_{t-1} + (1-\beta) \sum_j^t g_j^2
Vt=βVt−1+(1−β)∑jtgj2
w
t
+
1
=
w
t
−
α
g
t
V
t
w_{t+1} = w_t - \alpha \frac{g_t}{V_t}
wt+1=wt−αVtgt
再切回到上面病态曲率的例子,实际上
w
1
w_1
w1方向就是错误方向,也是高频方向,而正确方向
w
2
w_2
w2是低频方向,所以RMSProp会降低错误方向迭代速度。
综上,动量法会提升正确方向迭代步长,而RMSProp(二阶动量法)会降低错误方向的步长。
Adam
Adam = Momentum + RMSProp
m
t
=
β
m
t
−
1
+
(
1
−
β
)
g
t
m_t = \beta m_{t-1} + (1-\beta)g_t
mt=βmt−1+(1−β)gt
V
t
=
β
V
t
−
1
+
(
1
−
β
)
∑
j
t
g
j
2
V_t = \beta V_{t-1} + (1-\beta) \sum_j^t g_j^2
Vt=βVt−1+(1−β)∑jtgj2
w
t
+
1
=
w
t
−
α
m
t
V
t
w_{t+1} = w_t - \alpha \frac{m_t}{V_t}
wt+1=wt−αVtmt
Nadam
即Nesterov adam
Nesterov方法是为了解决优化陷入局部最优,于是将梯度计算时提前想一步,直接计算在预先设计算法下下一步的梯度,这样有可能会跳出局部最优的情况
g
t
=
∇
f
(
w
t
−
α
m
t
V
t
)
g_t = \nabla f(w_t - \alpha \frac{m_t}{V_t})
gt=∇f(wt−αVtmt)
m
t
=
β
m
t
−
1
+
(
1
−
β
)
g
t
m_t = \beta m_{t-1} + (1-\beta)g_t
mt=βmt−1+(1−β)gt
V
t
=
β
V
t
−
1
+
(
1
−
β
)
∑
j
t
g
j
2
V_t = \beta V_{t-1} + (1-\beta) \sum_j^t g_j^2
Vt=βVt−1+(1−β)∑jtgj2
w
t
+
1
=
w
t
−
α
m
t
V
t
w_{t+1} = w_t - \alpha \frac{m_t}{V_t}
wt+1=wt−αVtmt
AdamW
引入自身参数解决参数过拟合
m
t
=
β
m
t
−
1
+
(
1
−
β
)
g
t
m_t = \beta m_{t-1} + (1-\beta)g_t
mt=βmt−1+(1−β)gt
V
t
=
β
V
t
−
1
+
(
1
−
β
)
∑
j
t
g
j
2
V_t = \beta V_{t-1} + (1-\beta) \sum_j^t g_j^2
Vt=βVt−1+(1−β)∑jtgj2
w
t
+
1
=
w
t
−
α
(
m
t
V
t
+
λ
w
t
)
w_{t+1} = w_t - \alpha(\frac{m_t}{V_t} + \lambda w_t)
wt+1=wt−α(Vtmt+λwt)
LAMB
Layer-wise Adaptive Moments optimizer for Batching training
提升训练速度的方法是提升batch size,但是batch size有隐形上限。
一旦突破这个上限,梯度更新极端的取值会导致自适应学习率调整后极为困难的收敛。
m
t
=
β
m
t
−
1
+
(
1
−
β
)
g
t
m_t = \beta m_{t-1} + (1-\beta)g_t
mt=βmt−1+(1−β)gt
V
t
=
β
V
t
−
1
+
(
1
−
β
)
∑
j
t
g
j
2
V_t = \beta V_{t-1} + (1-\beta) \sum_j^t g_j^2
Vt=βVt−1+(1−β)∑jtgj2
r
t
=
m
t
V
t
r_t = \frac{m_t}{V_t}
rt=Vtmt
w
t
+
1
=
w
t
−
α
∗
ϕ
(
∣
∣
w
t
∣
∣
)
∣
∣
r
t
+
λ
w
t
∣
∣
(
r
t
+
λ
w
t
)
w_{t+1} = w_t - \alpha *\frac{ \phi(||w_t||)}{||r_t+\lambda w_t||}(r_t+\lambda w_t)
wt+1=wt−α∗∣∣rt+λwt∣∣ϕ(∣∣wt∣∣)(rt+λwt)
这里的
ϕ
\phi
ϕ是可选择的映射函数。用来保证梯度和参数原来的值在同一个量级
LAMB只有在batch size>512才有效果。