一、常见的三种梯度下降方法
SGD,Batch GD,mini-batch
SGD 训练速度快,收敛慢
Batch GD 训练慢,收敛快
这三种优化方法存在一些问题:
- 选择合适的学习率较为困难
- 每个参数的学习率是一样的,没有加以区分
- 训练中容易困在鞍点,在这种区域所有的优化方向都是0,没有办法继续优化
二、 Momentum
Momentum 是与 SGD 常为结合的一种方法,其不仅会使用当前的梯度,还会积累以前的梯度以确定走向。 v t = η ∗ v t − 1 − α ∗ ∇ θ J ( θ ) v_t = \eta * v_{t-1}-\alpha * \nabla_\theta J(\theta) vt=η∗vt−1−α∗∇θJ(θ) θ = θ − v t \theta = \theta-v_t θ=θ−vt 可以看到,这一方法观察了历史梯度 v t − 1 v_{t-1} vt−1 ,如果一致,则当前梯度就会增大,若不一致,当前梯度就会减小。
特点:
- 由于不完全依赖当前时刻的梯度方向,训练会比较稳定
- 学习更快
- 有一定摆脱局部最优的能力(梯度变大直接冲过局部最优值)
三、Nesterov Momentum
整体上看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。
梯度下降法师对每次所处位置上的坡度最大的方向;而牛顿法考虑的不仅是坡度大而且希望走完这一步之后,坡度变得更大(因为目光看的更远)。或者说,牛顿法是用一个二次曲面拟合当前所处位置的局部曲面,而梯度下降则是用平面来拟合。
总的来说,牛顿法看的更为长远,所以少走弯路,SGD 只考虑当前局部的最优,没有全局思想。
v
t
=
γ
∗
v
t
−
1
+
α
∗
∇
θ
J
(
θ
−
γ
∗
v
t
−
1
)
v_t =\gamma *v_{t-1} + \alpha * \nabla_\theta J(\theta-\gamma * v_{t-1})
vt=γ∗vt−1+α∗∇θJ(θ−γ∗vt−1)
θ
=
θ
−
v
t
\theta =\theta -v_t
θ=θ−vt
四、AdaGrad
对于更新频率较大的参数使用较小的学习率更新,否则用较大的学习率进行更新
设 g t , i g_{t,i} gt,i 为第 t t t 轮第 i i i 个参数的梯度,即 g t , i = ∇ θ J ( θ i ) g_{t,i}=\nabla_\theta J(\theta_i) gt,i=∇θJ(θi) e t , i = e t − 1 , i + g t , i 2 e_{t,i} = e_{t-1,i}+g_{t,i}^2 et,i=et−1,i+gt,i2 θ t + 1 , i = θ t , i − α e t , i + δ ⋅ g t , i \theta_{t+1,i}=\theta_{t,i}-\frac{\alpha}{\sqrt{e_{t,i}}+\delta}\cdot g_{t,i} θt+1,i=θt,i−et,i+δα⋅gt,i 其中, α e t , i + δ \frac{\alpha}{\sqrt{e_{t,i}}+\delta} et,i+δα 为自适应的学习率,由于 e t , i e_{t,i} et,i 的存在,梯度更新的越多,学习率就越小,但是其可能出现提前停止。
五、RMSProp
AdaGrad 在理论上有些较好的性质,但是在实践中表现的并不是很好,其根本原因就是随着训练周期的增长,学习率降低的很快,容易导致提前停止。RMSProp算法就在AdaGrad基础上引入了衰减因子,RMSProp在梯度累积的时候,会对“过去”与“现在”做一个平衡,通过超参数进行调节衰减量。
g
t
,
i
=
∇
θ
J
(
θ
i
)
g_{t,i}=\nabla_\theta J(\theta_i)
gt,i=∇θJ(θi)
e
t
,
i
=
β
∗
e
t
−
1
,
i
+
(
1
−
β
)
∗
g
t
,
i
2
e_{t,i} = \beta *e_{t-1,i} + (1-\beta)* g_{t,i}^2
et,i=β∗et−1,i+(1−β)∗gt,i2
θ
t
+
1
,
i
=
θ
t
,
i
−
α
e
t
,
i
+
δ
⋅
g
t
,
i
\theta_{t+1,i}=\theta_{t,i}-\frac{\alpha}{\sqrt{e_{t,i}}+\delta}\cdot g_{t,i}
θt+1,i=θt,i−et,i+δα⋅gt,i
其中,
β
\beta
β 常取作 0.1。
六、Adam
自适应学习率,每次迭代学习率都有个确定的范围。
m
t
=
β
1
m
t
−
1
+
(
1
−
β
1
)
g
t
m_t=\beta_1 m_{t-1}+(1-\beta_1)g_t
mt=β1mt−1+(1−β1)gt
v
t
=
β
2
v
t
−
1
+
(
1
−
β
2
)
g
t
2
v_t=\beta_2 v_{t-1}+(1-\beta_2)g_t^2
vt=β2vt−1+(1−β2)gt2
m
t
^
=
m
t
1
−
β
1
t
\hat{m_t}=\frac{m_t}{1-\beta_1^t}
mt^=1−β1tmt
v
t
^
=
v
t
1
−
β
2
t
\hat{v_t}=\frac{v_t}{1-\beta_2^t}
vt^=1−β2tvt
θ
t
−
1
=
θ
t
−
α
v
t
^
+
δ
⋅
m
t
^
\theta_{t-1}=\theta_t-\frac{\alpha}{\sqrt{\hat{v_t}}+\delta}\cdot \hat{m_t}
θt−1=θt−vt^+δα⋅mt^