本文基于目前深度学习中使用较多的优化学习算法进行总结。
1 深度学习中的优化算法
优化算法之前讨论两个问题:
(1) 局部最小值问题
在深度学习中,最优化问题其实并不容易困在局部最小值点。在高维度空间时(如20000维),局部最小值点需要在所有维度上都取得最小值,概率为
2−20000
2
−
20000
,相反更容易困在鞍点处。
同时平稳端(plateaus)也会使得学习变慢,因此可以通过自适应学习率算法如Adam或者RMSProp加速学习。
(2) 指数加权(移动)平均(Exponentially Weighted (moving) average)
在数据抖动较大的情况下,利用之前的整体变化趋势预测当前值。例如预测今天的气温,可以对之前一段时间的气温做平滑处理,即指数加权移动平均,一般形式为:
其中数据 vt v t 利用了前 11−β 1 1 − β 天的整体趋势平均。
为什么是前 11−β 1 1 − β 时刻的的指数平均可以从上图看出。当我们迭代带入数值计算时, 一般认为当 (t−n) ( t − n ) 时刻的权重小于 t t 时刻的分之一( (1−ε)1ε≈1e ( 1 − ε ) 1 ε ≈ 1 e ,取 β=(1−ε) β = ( 1 − ε ) ,参数变换即 β11−β≈1e β 1 1 − β ≈ 1 e )时,就不再认为 (t−n) ( t − n ) 时刻前的数据参与平均。那么可以看到当 β β 为0.9的时候,指数系数为10,也即 β11−β=0.910 β 1 1 − β = 0.9 10 ,共10个时刻的数据参与平均,当 β β 为0.98时,指数系数为50,也即 β11−β=0.9850 β 1 1 − β = 0.98 50 ,认为共50个时刻的数据参与平均。
1.1 随机梯度下降(SGD)
深度学习中的SGD指mini-batch gradient descent。在训练过程中,采用固定的学习率。
其中,
η
η
是学习率,
gt
g
t
是梯度。SGD完全依赖于当前batch的梯度,所以
η
η
可理解为允许当前batch的梯度多大程度影响参数更新。
通常来说,就总训练时间和最终代价而言,最优初始化学习率的效果会好于大约迭代100次后的效果。
缺点:
(1) 选择合适的learning rate比较困难,且对所有的参数更新使用同样的learning rate
(2) SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点(其实在合适的初始化和step size的情况下,鞍点的影响并没有很大)
1.2 动量(momentum)
动量方法旨在加速学习,特别是在面对小而连续的梯度但是含有很多噪声的时候。动量模拟了物体运动时的惯性,即在更新的时候在一定程度上会考虑之前更新的方向,同时利用当前batch的梯度微调最终的结果。这样则可以在一定程度上增加稳定性,从而更快的学习。
特点:
(1) 下降初期时,使用上一次参数更新,当下降方向一致时能够加速学习
(2) 下降中后期,在局部最小值附近来回振荡时,gradient–>0,使得更新幅度增大,跳出陷阱;
(3) 在梯度改变方向时,能减少更新。总体而言,momentum能够在相关方向上加速学习,抑制振荡,从而加速收敛
1.3 Nesterov动量
Nesterov项在梯度更新时做出校正,避免前进太快,同时提高灵敏度。在动量中,我们将其展开为:
可以看到,此前积累的动量
mt−1
m
t
−
1
并没有直接改变当前梯度
gt
g
t
,所以Nesterov的改进就是让之前的动量直接影响当前的动量,即:
所以,加上Nesterov项后,梯度在大的跳跃后,进行计算对当前梯度进行校正。
Nesterov动量和标准动量的区别在于梯度的计算上。Nesterov动量的梯度计算是在施加当前速度之后。因此,Nesterov动量可以解释为往标准动量方法中添加了一个校正因子。
1.4 自适应学习率算法
在训练开始的时候,我们远离最终的最优值点,需要使用较大的学习率。经过几轮训练之后,我们需要减小训练学习率。
在采用mini-batch梯度下降时,迭代的过程中会伴随有噪音,虽然cost function会持续下降,但是算法收敛的结果是在最小值附近处摆动,而减小学习率,则会使得最后的值在最小值附近,更加接近收敛点。
1.4.1 AdaGrad
Divide the learning rate of each parameter by the root mean square of its previous derivatives(将每个参数除以之前所有梯度的均方和)。
此处,对
nt
n
t
从t=1开始进行递推形成一个约束项regularizer,
ε
ε
保证分母非0。
特点:
(1) 前期
gt
g
t
较小的时候,regularizer较大,能够放大梯度
(2) 后期
gt
g
t
较大的时候,regularizer较小,能够约束梯度
(3) 适合处理稀疏梯度。
缺点:
(1) 需要手动设置一个全局的学习率
(2)
η
η
设置过大时,会使regularizer过于敏感,对梯度的调节太大
(3) 中后期,分母上梯度平方的累积将会越来越大,使gradient–>0,使得训练提前结束
1.4.2 Adadelta
Adadelta是Adagrad的拓展,最初方案依旧是对学习率进行自适应约束,但是进行了计算上的简化。Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。即:
在此时Adadelta还是依赖于全局学习率,但是作者在处理后
此时Adadelta已经不再依赖于全局学习率了。
特点:
(1) 训练初中期,加速效果不错
(2) 训练后期,反复在局部最小值附近抖动
1.4.3 RMSProp
RMSProp可以看做为Adadalta的一个特例,也即上述式子中
ρ=0.5
ρ
=
0.5
,然后再求根的话,就变成RMS(均方根):
随着
ηt
η
t
在不同范围内(
11−v
1
1
−
v
)的平均,对于变化较大的值方向能够抑制变化,较小的值方向加速变化,消除摆动加速收敛。
RMSProp的特点如下,
优点:
(1) 由于采用了梯度平方的指数加权平均,改进了AdaGrad在深度学习中过早结束的问题,效果趋于二者之间
(2) 适用于处理非平稳过程(也即过程依赖于时间,采用指数加权平均时对于非平稳过程处理较好)-对于RNN效果较好
缺点:
(1) 仍然依赖于全局学习率
1.4.4 Adam
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSProp,它利用了梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正(Bias correction,为了修正在训练初期的误差,当t变大后,偏置校正效果减弱)后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
偏置修正(Bias Correction)的效果:
当初始化
v0=0
v
0
=
0
时,
v1=0.98v0+0.02θ1
v
1
=
0.98
v
0
+
0.02
θ
1
(其中
θ1
θ
1
为当前时刻的值),可以看到
v1
v
1
远小于当前的值
θ1
θ
1
,接下来
v2=0.98v1+0.02θ=0.98∗0.02θ1+0.02θ2
v
2
=
0.98
v
1
+
0.02
θ
=
0.98
∗
0.02
θ
1
+
0.02
θ
2
,得到的结果
θ2
θ
2
远小于当前时刻的值
θ2
θ
2
,因此在训练初期时与真实值会有较大误差(也即初期时绿色线和紫色线的差别)。
因此采用
vt=vt1−βt
v
t
=
v
t
1
−
β
t
时,当t较小时,
vt
v
t
能得到修正偏差,也即下图右边所示,而当t逐渐变大时,由于
β
β
小于1,则偏置效果减弱。
Adam优化算法如下:
通常,
μ
μ
的值可以设置为0.9,
v
v
的值可以设置为0.999。其中,,
nt
n
t
分别是梯度一阶矩估计和二阶矩估计,可以看做对期望
E|gt|
E
|
g
t
|
,
E∣∣g2t∣∣
E
|
g
t
2
|
的估计,近似为对期望的无偏估计。
特点:
(1) 结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
(2) 对内存需求较小(指数加权平均不需要存储大量的值就能平均)
(3) 为不同的参数计算不同的自适应学习率
(4) 适用于大多非凸优化 - 适用于大数据集和高维空间