1 随机梯度下降
最原始的随机梯度下降算法主要依据当前梯度∂L/∂w乘上一个系数学习率α来更新模型权重w的。
w
t
+
1
=
w
t
−
α
∂
L
∂
w
t
w_{t+1}=w_t-\alpha \frac{\partial L}{\partial w_t}
wt+1=wt−α∂wt∂L
2 动量算法(Momentum)
动量算法使用带有动量的梯度(梯度的指数滑动平均,Polyak, 1964)而不是当前梯度来对w进行更新,采用指数滑动平均作为动量更新的方式几乎成为了一个业内标准。
w
t
+
1
=
w
t
−
α
V
t
w_{t+1}=w_t-\alpha V_t
wt+1=wt−αVt
V
t
=
β
V
t
−
1
+
(
1
−
β
)
∂
L
∂
w
t
V_t=\beta V_{t-1}+(1-\beta)\frac{\partial L}{\partial w_t}
Vt=βVt−1+(1−β)∂wt∂L
V初始化值为0。β一般会被设置为0.9。
与随机梯度下降相比,它为添加了一个动量的概念使得模型有可能冲出局部最小值,而且通过指数滑动平均的过程降低梯度震荡的程度,加速收敛。
3 自适应学习率算法(Adagrad)
自适应梯度算法,通过将学习率除以S的平方根来研究学习率分量,其中S为当前和过去平方梯度的累积和。请注意,和SGD算法相同,自适应学习率算法中的梯度分量也保持不变。
w
t
+
1
=
w
t
−
α
S
t
+
ϵ
⋅
∂
L
∂
w
t
w_{t+1}=w_t-\frac{\alpha}{\sqrt{S_t+\epsilon}}\cdot \frac{\partial L}{\partial w_t}
wt+1=wt−St+ϵα⋅∂wt∂L
S
t
=
S
t
−
1
+
[
∂
L
∂
w
t
]
2
S_t=S_{t-1}+[\frac{\partial L}{\partial w_t}]^2
St=St−1+[∂wt∂L]2
S的初始值置0,α = 0.01,ε = 10⁻⁷。
4 均方根传递算法(RMSprop)
均方根传递算法,是在AdaGrad算法上进行改进的另一种自适应学习率算法。 它使用指数加权平均计算,而不是使用累积平方梯度和。
w
t
+
1
=
w
t
−
α
S
t
+
ϵ
⋅
∂
L
∂
w
t
w_{t+1}=w_t-\frac{\alpha}{\sqrt{S_t+\epsilon}}\cdot \frac{\partial L}{\partial w_t}
wt+1=wt−St+ϵα⋅∂wt∂L
S
t
=
β
S
t
−
1
+
(
1
−
β
)
[
∂
L
∂
w
t
]
2
S_t=\beta S_{t-1}+(1-\beta)[\frac{\partial L}{\partial w_t}]^2
St=βSt−1+(1−β)[∂wt∂L]2
S的初始值置0,α = 0.001,β = 0.9,ε = 10⁻⁶。
5 自适应增量算法(Adadelta)
与RMSprop算法类似,Adadelta是在AdaGrad算法的基础上针对学习率进行改进的一种自适应算法。Adadelta算法和RMSprop算法的区别,在于Adadelta算法中用delta的指数加权平均值D来替代原来在Adadelta算法中的学习率参数。
w
t
+
1
=
w
t
−
D
t
−
1
+
ϵ
S
t
+
ϵ
⋅
∂
L
∂
w
t
w_{t+1}=w_t-\frac{\sqrt{D_{t-1}+\epsilon}}{\sqrt{S_t+\epsilon}}\cdot \frac{\partial L}{\partial w_t}
wt+1=wt−St+ϵDt−1+ϵ⋅∂wt∂L
D
t
=
β
D
t
−
1
+
(
1
−
β
)
[
Δ
w
t
]
2
D_t=\beta D_{t-1}+(1-\beta)[\Delta w_t]^2
Dt=βDt−1+(1−β)[Δwt]2
S
t
=
β
S
t
−
1
+
(
1
−
β
)
[
∂
L
∂
w
t
]
2
S_t=\beta S_{t-1}+(1-\beta)[\frac{\partial L}{\partial w_t}]^2
St=βSt−1+(1−β)[∂wt∂L]2
Δ
w
t
=
w
t
−
w
t
−
1
\Delta w_t=w_t-w_{t-1}
Δwt=wt−wt−1
D和S的初始值置0,β = 0.95,ε = 10⁻⁶。
6 适应性矩估计算法(Adam)
适应矩估计算法,是一种将动量和RMSprop结合使用的算法。它通过:使用梯度分量V,梯度的指数移动平均值(如动量)和将学习率α除以S的平方根,平方梯度的指数移动平均值(如在RMSprop中)来学习率分量而起作用。
w
t
+
1
=
w
t
−
α
S
^
t
+
ϵ
⋅
V
^
t
w_{t+1}=w_t-\frac{\alpha}{\sqrt{\hat S_t}+\epsilon}\cdot \hat V_t
wt+1=wt−S^t+ϵα⋅V^t
V
^
t
=
V
t
1
−
β
1
t
\hat V_t=\frac{V_t}{1-\beta_1^t}
V^t=1−β1tVt
S
^
t
=
S
t
1
−
β
2
t
\hat S_t=\frac{S_t}{1-\beta_2^t}
S^t=1−β2tSt
V
t
=
β
1
V
t
−
1
+
(
1
−
β
1
)
∂
L
∂
w
t
V_t=\beta_1V_{t-1}+(1-\beta_1)\frac{\partial L}{\partial w_t}
Vt=β1Vt−1+(1−β1)∂wt∂L
S
t
=
β
2
S
t
−
1
+
(
1
−
β
2
)
[
∂
L
∂
w
t
]
2
S_t=\beta_2S_{t-1}+(1-\beta_2)[\frac{\partial L}{\partial w_t}]^2
St=β2St−1+(1−β2)[∂wt∂L]2
V和S的初始值置0,α = 0.001,β₁ = 0.9,β₂ = 0.999,ε = 10⁻⁸。
模型的梯度是一个随机变量,一阶矩表示梯度均值,二阶矩表示其方差,一阶矩来控制模型更新的方向,二阶矩控制步长(学习率)。用moveing average来对一阶矩和二阶矩进行估计。bias correct是为了缓解初始一阶矩和二阶矩初始为0带来的moving average的影响。
参考
https://zhuanlan.zhihu.com/p/73962541