深度学习笔记:2.6 momentum | 2.7 RMSprop | 2.8 Adam

        今天要介绍三种优化算法,momentum,RMSprop和Adam。很多人提出了很多优化算法,但随着越来越多的优化算法提出,大家开始质疑优化算法的效果,因为毕竟有一些优化算法只在小部分上有效果,对于各种各样的神经网络适用范围并不是那么广泛,但是今天介绍的这三种优化算法在大多数的神经网络上都奏效,被大家广泛使用并认为有很好效果。

2.6 momentum

这一节讲动量梯度下降法(gradient descent with momentum)。从介词with可以看出,这个方法实际是对梯度下降法的改进,就是在梯度下降法中加入了动量(momentum),为什么称为动量呢?和物理学中的动量有关系吗?接下来你就会明白这个名字的含义了。

首先我们先来复习一下梯度下降法,假设上图中轮廓表示我们的目标函数值,中间的红点表示我们想要得到的全局最小值,从一个点开始,我们使用梯度下降法,路径如图中蓝色部分所示,直至收敛到达红点。那加上动量的梯度下降法又是怎样的呢?

我们先从公式上来看动量是如何对梯度下降法作出改变的。首先,在每一轮迭代t,我们通过mini-batch计算得到W和b的梯度,接着不同于梯度下降法的直接使用每一轮迭代计算出来的梯度,我们先对梯度做一个变换,即计算梯度的指数加权移动平均,然后再将其作为梯度进行权重的更新,如上图中蓝色公式所示。

加了动量之后的梯度下降路径为图中红线所示,为什么加了动量的梯度下降路径由原来的蓝色变为现在的红色呢?了解指数加权平均的同学应该知道,加入动量的梯度下降法在计算第t轮的梯度时,相当于平均了前1/(1-\beta )轮的梯度值。这也是路径为什么发生了改变,因为对于每一蓝色箭头,都可以将其方向分为水平和垂直两个方向,而垂直方向总是一上一下,经过平均,均值近似为0,而水平方向始终都是正的,都是朝着最优解的方向。假设\beta取0.9,那么加入动量的梯度下降法在每次迭代计算梯度时,相当于平均前10次的梯度,所以红色箭头的垂直分量相比蓝色箭头更小,而当后期快收敛时,蓝色路径波动幅度较小,红色路径通过指数加权平均,后期梯度方向几乎水平。

我们在分析蓝红路径差别时其实已经表现出了加入动量的梯度下降法相比梯度下降法的优点,显然,加入动量之后,梯度下降法走了一条更直接的路,在抵达最小值的路径上减少了摆动,速度自然比原始梯度下降更快。同时,原始梯度下降的上下波动还阻止使用较大的学习率,因为梯度下降方向在垂直方向上分量较大,一旦不小心使用了较大的学习率,就会像图中左侧紫线那样,超出轮廓,降低学习效率,相比,红线表示的梯度下降方向在水平方向上分量较大,而水平方向始终指着正确的方向,这时使用较大的学习率也可以。

我们还可以从物理学方面来理解动量梯度下降法,假设我们有一个碗,然后我们从碗顶放一个小球,使其沿着碗侧滑至碗底。在运动过程中,小球有速度和加速度,速度在加速度作用下不断累积就会产生动量。如上图标记所示,dW可以看成是加速度,V_{dw}可以看成是速度,但不是就这样让小球一直加速下去,我们给了速度和加速度一些权重,所以权重\beta也可以看作是摩擦力在起作用。

伪代码及参数设置如下图所示:

首先还是初始化V_{dw}V_{db}为0,这里V_{dw}是和W相同维度的矩阵,V_{db}是和b相同维度的向量。然后接下来的操作和我们之前讲过的一样,如上图所示,非常清晰明了。

在这个过程中,我们有两个超参数,\alpha\beta\beta实际中一般取0.9,也就是一般我们平均前10个梯度得到V_{dw}。在momentum的一些文献中有人将dW前的权重剔除,这样类似于V_{dw}扩大为1/(1-\beta )倍,为了应对这个改变,\alpha就要按比例缩小。实际应用中,这两种方法效果都不错,只是对应的\alpha的最优值不同,但是剔除dW前权重的方法不是那么intuitive,推荐大家使用使用原先的方法。注意,\beta取0.9适用于这两种方法。

对于修正偏差问题,其实在迭代次数超过10次之后,就不存在偏差这个问题了,所以这里我们可以不再考虑偏差修正的问题。

2.7 RMSprop

RMSprop算法全称是root mean square prop,和动量梯度下降法有异曲同工之妙。具体是怎样的呢?我们一起来看一下。

为了便于可视化,我们将目标函数值轮廓图画在二维平面上,这时,每一个梯度包含了垂直和水平两个方向,为了方便,我们记纵轴方向为b的梯度方向,而横轴为w的梯度方向。那RMSprop是怎么操作的呢?伪代码如上图所示。这里的\beta _{2}是为了区别momentum中的\beta

我们先根据mini-batch计算dW和db,然后代入上图中公式,注意这里与momentum不同的地方在于,梯度变成了平方(对矩阵的每一元素操作-elementwise),然后最后不同于momentum的直接将V_{dw}(即这里的S_{dw})作为梯度去更新权重,RMSprop使用梯度除以\sqrt{S_{dw}}作为新的梯度去更新权重。这样做的好处是什么呢?

之前提到,我们将横轴方向看作是W的梯度方向,将纵轴方向看作是b的梯度方向。如图所示函数呈现在纵轴上倾斜程度更大,使用梯度下降法路径如图中蓝色所示,波动较大(目标函数轮廓扁平),且在纵轴方向上的波动大于横轴方向上的波动,所以dw较小,而db较大,相比梯度下降法,RMSprop的新梯度dw/\sqrt{S_{dw}}比dw更大,这是什么意思?其实就是对于波动较小的方向,我增大它的梯度,使其下降地更快,而对于波动较大的方向,我就减少它的梯度,使其波动没那么大,这样我也可以提高学习率,提高计算效率。得出路径如图中绿线所示,和momentum方法有异曲同工之妙。

其实从本质上来看,我们可以认为RMSprop是将不同方向梯度的方差考虑进来,对于波动大的(方差大),梯度给小一点,对于波动小的,梯度给小一点,这样整个下降路径就缓和很多,也可以增大学习率提高计算效率。再解读一下算法名字含义,square表示我们在dw那里使用了平方项,mean表示S_{dw}的指数加权平均,而root表示分母\sqrt{S_{dw}}的开方,这三个地方也是算法的精髓,可谓记住了名字也就能知晓该算法的作法了。

这里要注意,因为涉及到分母,所以要保证分母不能为0,所以我们在开方内加上一个很小的常数,比如10^{-8},这是很好的编程习惯,可以减少错误发生。同时声明一下,这里用横纵轴方向表示b和w的梯度方向是为了方便起见,实际在多维情况中,比较复杂,可能纵轴表示W1、W2和W12,而横轴表示W3和W4也未可知。

这里插一个趣闻,据说RMSprop算法是hinton在Coursera上讲课的时候提出来的并不是通过论文,这个算法也是在上课后火起来的。

2.8 Adam

momentum用了梯度平均的思想,RMSprop利用了梯度方差的思想,那么将二者合起来的Adam效果是怎么的呢?

若momentum和RMSprop方法你已经了解,那么Adam对你来讲就轻而易举了,其实它就是将momentum和RMSprop的权重更新方法结合在了一起,如上图所示(上图中间yhat打印错误,此处不考虑)。

\beta _{1}为momentum超参数,用来调试梯度平均过程,\beta _{2}为RMSprop超参数,用来调试计算梯度方差过程。Adam过程需要进行偏差修正,至于为什么,我想大家可以去看Adam那篇论文去深入了解一下。最后更新权重,就是将momentum和RMSprop思想结合在一起,将修正后的值代入计算即可。

在超参数上我们的设置如下图所示:

总共有四个超参数,如上图所示。\alpha是比较需要调试的,\beta _{1}\beta _{2}我们可以不调试,就按照论文中作者给出的0.9和0.999就能达到很好的效果。\varepsilon就更不用怎么调了,保持10^{-8}就可以。你也可以调试\beta _{1}\beta _{2},但实际中,这样干的人比较少,主要调试工作在于调试\alpha

Adam算法全称为adaptive moment estimation,为什么这样叫呢?因为Adam算法结合了momentum和RMSprop的作法,包含梯度平均和梯度方差的信息,期望就是一阶矩(moment),方差就是二阶矩(moment),这两个过程分别由\beta _{1}\beta _{2}调试。

Adam算法适用范围很广,可以适用于各式的神经网络,且适用于规模很大的神经网络,是一个效果非常好的优化算法。

最后右侧老师贴出来的这个图片只是他的叫Adam的同事,和该算法没有关系。

版权声明:尊重博主原创文章,转载请注明出处https://blog.csdn.net/kkkkkiko/article/details/81382956

猜你喜欢

转载自blog.csdn.net/kkkkkiko/article/details/81382956