本篇博客主要内容参考图书《神经网络与深度学习》,李航博士的《统计学习方法》National Taiwan University (NTU)李宏毅老师的《Machine Learning》的课程,在下文中如果不正确的地方请积极指出。
如果喜欢请点赞,欢迎评论留言 ! o( ̄▽ ̄)ブ
在本小节主要对训练神经网络代价函数的梯度下降算法及其变形进行讲解。因为随机梯度只是将用整体数据改变为采用部分数据训练,其主体仍是梯度下降方法,所以从梯度下降算法出发,介绍算法的来源及实现,再根据梯度下降算法学习率固定且迭代次数长的缺点引出两类改进的方法。一类是可以自动调整学习率的Adagrad;但是Adagrad将所有的历史信息统一看待,针对这样的不足引出了RMSProp方法;另一类是利用二阶导数信息的牛顿法,但是牛顿法具有计算复杂度高等较大的缺点,进而引出了可以利用导数变化信息但是无需计算海森矩阵的Momentum方法。最后将RMSProp与Momentum方法结合得到Adam方法。
1. 梯度下降方法回顾
首先讲述为什么梯度下降方法可以使得损失函数的值下降,将代价函数抽象为关于统一参数 w=(w1,w2,...,wn) w = ( w 1 , w 2 , . . . , w n ) 的代价函数 C(w) C ( w ) ,其中的参数 w w 包括了原始神经网络中权值和偏置在内的所有参数,借助泰勒展开式,代价函数可以在点
处被近似为
因此可以得到
当 Δw=−η∇C Δ w = − η ∇ C 时,可以得到
代价函数的值总是在下降的过程中,因此这个方法时可行的(具体的推导过程及如何通过反向传播算法实现可以参照《三、梯度下降与反向传播(含过程推导及证明)》。在神经网络中使用梯度下降法去寻找权重 w w 和偏置 减小代价函数,具体表现是
用一个过程图体现就是如下图
图1 .梯度下降过程示意图
在上图中,红色的方向为计算出的梯度方向,蓝色方向是参数实际移动的方向,参数 w w 按照公式 X 的移动的过程即如上所示。
但是这样的方法有三个明显的局限性,第一个局限性在于在学习的过程中学习率
是固定的,无法根据神经网络训练的程度调整参数;其次在这里只用到了梯度,但是没有用到梯度的变化情况,因此再求函数最优质的过程中走的并不是最短距离;最后该方法明显在高原、鞍点以及局部最小点处表现不佳。因此在接下来的部分分别从改进学习率和利用梯度变化情况两个方面介绍基于梯度下降的改进方法。
2. 改进学习率
在上述的梯度下降方法中,学习率是一个定值,不会随着神经网络的学习而发生改变,如下图所示
图2 .不同学习率对于训练过程的影响
从上图中可以看到,如果学习率是按照红色箭头的值设定的,在迭代的过程中正好可以达到全局最优解;但是如果学习率的值设的比较小,去蓝色的箭头所示,虽然可以肯定会达到最优解,但是速度却十分缓慢;若加大学习率,很有可能像绿色箭头那样一直在某一个值附近震荡,或者像黄色的箭头那样直接发散出去,所以选择合适的学习率是十分重要的。上图中左侧的图只是针对具有一个参数的模型,对于神经网络这种多参数的是无法画出左侧这种曲线的,因此需要通过损失函数随迭代次数变化的曲线来判断神经网络的学习情况。如上图的右图所示,我们需要做的就是找到类似与红色曲线所对应的学习率。
为达到上述的效果,在这里可以选用一种自动调整学习率的方法。这种方法要达到的目标是在开始的时候具有较大的学习率,但是随着迭代次数的增加,学习率逐渐下降,以便精准的达到的最优值。
2.1 Adagrad
Adagrad就是一种可以满足上述要求的自动调节学习率的方法。它的过程如下所示