梯度下降算法原理此处不做过多说明
梯度下降法的变式
1. SGD
随机梯度下降法是梯度下降法的一个小变形,就是每次使用一批(batch)数据进行梯度的计算,而不是计算全部数据的梯度,因为现在深度学习的数据量都特别大,所以每次都计算所有数据的梯度是不现实的,这样会导致运算时间特别长,同时每次都计算全部的梯度还失去了一些随机性,容易陷入局部误差,所以使用随机梯度下降法可能每次都不是朝着真正最小的方向,但是这样反而容易跳出局部极小点。
2. Momentum
第二种优化方法就是在随机梯度下降的同时,增加动量(Momentum)。这来自于物理中的概念,可以想象损失函数是一个山谷,一个球从山谷滑下来,在一个平坦的地势,球的滑动速度就会慢下来,可能陷入一些鞍点或者局部极小值点,如图3.22所示。
这个时候给它增加动量就可以让它从高处滑落时的势能转换为平地的动能,相当于惯性增加了小球在平地滑动的速度,从而帮助其跳出鞍点或者局部极小点 。
动量怎么计算呢?动量的计算基于前面梯度,也就是说参数更新不仅仅基于当前的梯度,也基于之前的梯度,可以用图3.23来简单地说明。
记住我们更新的是梯度的负方向,红色表示梯度,蓝色表示更新方向,图中绿色的虚线就是动量,可以看到也就是之前一次梯度的负方向。(因为我看到的是黑白图片,所以大家凑合看吧)
除此之外,对于动量还有一个变形,即 Nesterov。我们在更新参数的时候需要计算梯度,传统的动量方法是计算当前位置的梯度,但是 Nesterov 的方法是计算经过动量更新之后的位置的梯度。
3. Adagrad
这是一种自适应学习率 (adaptive) 的方法,它的公式是:
通过公式,我们可以看到学习率在不断变小,且受每次计算出来的梯度影响,对于梯度比较大的参数,它的学习率就会变得相对更小,里面的根号特别重要,没有这个根号算法表现非常差。同时是一个平滑参数,通常设置为
,这是为了避免分母为0。
自适应学习率的缺点就是在某些情况下一直递减的学习率并不好,这样会造成学习过早停止。
4. RMSprop
这是一种非常有效的自适应学习率的改进方法,它的公式是:
这里多了一个a,这是一个衰减率,也就是说 RMSprop 不再会将前面所有的梯度平方求和,而是通过一个衰减率将其变小,使用了一种滑动平均的方式,越靠前面的梯度对自适应的学习率影响越小,这样就能更加有效地避免 Adagrad 学习率一直递减太多的问题,能够更快地收敛。
5. Adam
这是一种综合型的学习方法,可以看成是 RMSprop 加上动量 (Momentum) 的学习方法,达到比 RMSProp 更好的效果。
以上介绍了多种基于梯度的参数更新方法,实际中我们可以使用 Adam 作为默认的优化算法,往往能够达到比较好的效果,同时 SGD+Momentum 的方法也值得尝试。