本文主要参考(大部分翻译)自论文《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时刻的更新为