本文主要参考(大部分翻译)自论文《An Overview of Gradient Descent Optimization Algorithm》
3.Challenge
通常来说,mini-batch gradient descent算法在应用的时候,会有以下一些问题需要考虑:
1. 如何选择一个合适的学习率
2. 如何在训练的时候调整学习率
3. 所有的参数能不能不要都用相同的学习率更新
4. 如何逃避局部最优以及鞍点
4. Gradient descent optimization algorithms
下面介绍几种神经网络中常用的梯度下降方法,来解决之前第三节提到的challenge.对于那些不适用于神经网络的的方法,比如一些二阶优化的方法(牛顿法),这里就不做介绍了。
4.1. Momentum[1]
SGD在经过峡谷(navigating ravines)时候会碰到问题。这里ravine的意思是说,画出object function的等值面,那些在某些方向上的梯度很大,在其他方向上的梯度很小的地方,就叫做ravine。在这些点上,SGD算法在收敛到局部最优点的过程中容易产生振荡。如下图(a)所示:
(a)图上面靠近椭圆等值面的长轴附近的区域应该就是上面说的ravine,在这些区域短轴方向梯度比较大,长轴方向梯度比较小,在用SGD算法的时候,容易造成振荡。虽然可能也能收敛到local optimal,但是收敛的速度会比较慢。
Momentum的方法
普通SGD的梯度更新策略如下式:
加上momentum项的梯度更新策略如下式:
也就是说,当前时刻权重的变化量和当前时刻的梯度以及前一时刻的权重的变化量相关。ituitively来说,设置momentum项的原因在于,当目标函数的surface存在一个长而狭窄的vally的时候,梯度的方向几乎总是和长轴的方向垂直。系统因此不断地沿着短轴的方向在震荡,沿着长轴方向的速度很慢。而momentum项能够部分抵消当前时刻沿长轴方向的梯度分量,增大沿短轴方向的分量。这样可以加快收敛。
4.2. Nesterov accelerated gradient[2]
Nesterov accelerated gradient(NAG)的思想是,前面momentum方法里面,在还没有求当前位置梯度的情况下,其实我们是已经知道一部分权重的增量γvt−1 。
那么我们干脆先让权重改变这么多增量,然后再求改变之后位置的梯度。具体的公式如下:
权重更新的示意图如下所示:
蓝线表示momentum的更新过程,短蓝线表示当前的梯度,长蓝线表示前一时刻的梯度增量。红线表示NAG的梯度更新过程,NAG首先根据前一时刻的梯度增量向前更新一大步,然后在新的位置计算梯度进行校正。这种方法在训练RNN的时候表现比较好。
4.3. Adagad[3]
Adagrad的思想是:对于原来不怎么更新的参数,提高它们的学习率,对于原来经常更新的参数,降低它们的学习率。我们前面介绍的梯度更新策略是对于所有的参数的学习率设置成一样。Adagrad的策略不太一样,假设 gt,i 表示目标函数关于参数 θi在t时刻的梯度,即
SGD对于每一个参数 θi的在t时刻的更新为
Adagrad对于每一个参数的学习率设置取决的这个参数在t时刻之前梯度的累积量:
其中 Gt 是一个对角矩阵 对角线(i,i)位置的值表示到t时刻目标函数对 θi 的导数的平方和。Adagrad主要的好处是能够自动调节各个参数的学习率,不好的地方在于因为G矩阵对角线元素始终是正的,并且在不断地累加,这样会导致各个参数的学习率在不断地下降,最终变成一个无限小的数,这样网络的参数难以更新,也就不能够继续学习下去了。
4.4. Adadelta[4]
Adadelta的提出是为了解决Adagrad中参数学习率在不断衰减的问题。相比于累加t时刻之前所有的梯度平方和,Adadelta限制累加的时间范围为w。为了计算方便,Adadelta采用了decaying average的方法来计算w时长的梯度平方和。假设在t时刻梯度的平方和为 E[g2]t,则其更新的表达式为:
所以Adadelta的更新策略是:
注意到分母其实就是均方差RMS,因此可以把 E[g2]t−−−−−√写成 RMS[g]t
作者在论文中提到SGD,momentum以及前面的Adagrad都存在mismatch of units。而二阶导的形式才是增量值和原值match的: Δθ∝H−1g∝∂f/∂θ∂2f/∂θ2∝ uints of θ
为此有
因为 ∂f/∂θ 我们已经用g表示了,因此只需要再用running average的方法表示 Δθ。在t时刻,Δθ是未知要求的量,但是我们可以用前一时刻的值来近似表示当前的值。所以得到最终Adadelta的更新公式为
有趣的是,Adadelta这么设计,可以使得它完全不需要设置base learning rate
4.5. RMSprop
RMSprop是一个未发表的,自适应调节每一个参数学习率的方法,其实就是Adadelta的一种特殊情况
4.6. Adam[5]
Adaptive Moment Esitimation(Adam)是另外一种自适应计算每一个参数学习率的方法。相比之前的Adagrad和RMSprop保存了之前时刻梯度平方的running average vt Adam算法同时保存了之前梯度的running average mt。
mt和vt分别是一阶(mean)和二阶(variance)统计量的估计。作者在实验的时候发现当mt和vt用0初始化,并且衰减系数 β1和 β2比较大(接近1)的时候,mt和vt一直在趋于0,为了抵消这种趋势,作者计算修正之后的一阶和二阶估计量
接下来就是用这里的g的一阶估计量和二阶估计量替换前面方法中的对应项,如下式所示:
4.7.Visulization of algorithms
上面两张图显示了之前介绍的几种优化算法在实际应用中的情况。第一张图是各个算法在loss function surface上的更新情况。可以看到,Adagrad,Adadelta和RMSprop直接朝向最优点,momentum和NAG一开始跑偏了,但是还能纠正回来,SGD更新的很慢。
第二张图表示各个算法在应对鞍点时候的表现,可以看到,SGD一直在鞍点附近震荡,其他的算法最后都能逃离鞍点,就是速度上有快慢之分。
4.8优化方法的选择
如果输入数据是稀疏的,那么最好用之前提到的几种adaptive learning rate的方法,这些方法的另外一个好处是,没有太多需要调节的参数,仅有的几个参数保持默认值可能就能得到很好的结果。
总的来说,RMSprop是Adagrad的拓展,缓解了Adagrad学习率在不断降低的问题,它和Adadelta差不多,除了Adadelta对于分子也采用了RMS更新策略。Adam相比RMSprop,只是将 gt替换成了它的估计,并做了bias修正。在实验中,RMSprop,Adadelta和Adam效果都差不多,Adam的效果要稍微好一点。