2.6 动量梯度下降法
这种算法运行速度总是快于标准的梯度下降算法,基本思想是计算梯度的指数加权平均数并利用该梯度来更新你的权重;
假设你要优化一个下图的成本函数,红点是最小值,假设从一点开始进行梯度下降法,如果进行梯度下降法的第一次迭代,无论是batch还是mini-batch,可能都会指向椭圆的另一边:
然后在椭圆的另一边执行第二次梯度下降,可能又回到原来这边:
然后如此反复走下去,慢慢摆动到最小点,这需要许多计算步骤,或者说需要很多次梯度下降,因为这种上下摆动减慢了梯度下降法的速度;而且限制了你使用较大的学习率,因为如果使用较大的学习率,你有可能会偏离函数的范围,如紫线所示,为了避免摆动过大,你只用用较小的学习率;
所以,从另一个角度说,你希望在图中纵轴上的学习能够慢一点,减少摆动,但是在横轴上你想要加快学习;
Momentum的公式:
这样就能够减缓梯度下降的幅度:例如,在上几个导数中,计算了这些:
如果平均了这些梯度,你会发现这些纵轴上的摆动平均值接近于0,这很符合你所希望的在纵轴上学习放慢一些,平均过程中正负数相互抵消;但在横轴方向上,所有的微分都指向横轴方向,因此横轴方向上的平均值仍然很大,所以用算法迭代几次以后,会发现Momentum最终使纵向摆动变小,横轴方向运动更快,如图中红线所示:
Momentum利用物理的比喻性解释:
如果你想要最小化一个碗状函数:
那么你可以将这些微分项想象为他们为从山顶上往下滚的一个球提供了加速度,而这些项就像速度,那么想象你有一个碗,你拿着一个球,微分提供了加速度,此时球正在往山下滚,球因为加速度越滚越快,而由于,所以表现出一些摩擦力,所以球不会无限加速下去,不像梯度下降法一样每一步都独立于之前的步骤,现在你的球向下滚,可以加速并获得动量;
如何具体计算?
有两个超参数,控制着指数加权平均数,并且最常用的值是,就像之前平均了十天的温度,现在就平均了前十次迭代的速度,是很好的鲁棒值,不过也可以做一些超参数研究,有关于偏差修正,如:代替,实际上人们一般不做偏差修正,因为10次迭代以后,移动平均就已经超过了初始阶段,不再是一个具有偏差的预测;
注意具有相同的维度,具有相同的维度;
如果查阅专业资料发现公式中的被删除了,这只是让缩小了倍,即:
然后把视作新的;
因此,如果要用梯度下降更新参数时,要随发生相应变化,会影响到学习率的最佳值,这种方法效果也不错,缺点是不自然,如果最后要调整,那么就会影响到;
2.7 RMSprop
假设横轴代表,纵轴代表,实际上可能会有或其他重要参数,但为了便于理解就将它们称为,所以你想要减缓方向的学习,同时加快(至少不减缓)方向的学习;
RMSprop的公式:
注意是指对整个变量的平方;
RMSprop的原理:
我们想让横轴即方向学习快一些,让纵轴即方向的摆动减小一些;
所以我们希望能够相对小一些,以在中除以一个小一些的数,而能相对大一些,在中除以一个大一些的数,这样就可以减缓纵轴上的变化;
并且微分要比大,利用平方将差距进一步扩大;
所以就能除以一个较大的数,减缓了步子,进而减缓纵轴上的摆动;
而除以一个较小的数,增大了步子,进而增大了横轴上的学习速度;
也许改成,会更好理解,相当于给学习率作调整;
最后,就像“波动越大,惩罚越大”,“将归一化了,快的放慢,慢的加快”,实现了减缓纵轴摆动的同时加速了梯度下降的速度,结果如图中绿线所示:
其他影响:
你可以使用一个更大的学习率加快学习,而不会在纵轴上偏离函数的范围;
实际中你会处于参数的高维空间,所以要消除摆动的垂直维度实际上是的组合,而水平维度可能是等;所以上述的只是方便说明,实际中的是一个高维度的参数向量,但直觉是在你要消除摆动的维度中,你最终要计算一个更大的和值,也就是类似这样的一个平方和微分的加权平均值,所以最后去掉了那些有摆动的方向;
总之,要用到微分的平方,再对开平方根;
RMSprop的细节:
为了不与Momentum中的参数混淆,将其写为;
为了不让趋于零或等于零造成分母错误或得到一个特别大的值,所以为了让数值稳定,给分母加上一项,一般是一个不错的选择;
2.8 Adam优化算法
历史上很多人提出了优化算法,并很好地解决了一些问题,但随后这些优化算法被指出,并不能一般化,并不适用于多种神经网络;时间一长,深度学习圈子里的人开始多少有些质疑全新的优化算法,很多人觉得Momentum梯度下降法很好用,很难想出更好的优化算法,所以RMSprop以及Adam算法就是少有的两种经受住人们考验的算法,已经被证明适用于不同的深度学习结构;Adam算法基本上就是将Momentum和RMSprop两种算法结合在一起;
参数分别来自于Momentum算法和RMSprop算法;
在使用Adam算法时一般要进行偏差修正;
Adam算法的参数:
超参数学习率非常重要,需要经常调试,你可以尝试一系列的值然后看看哪个有效;
的默认值是0.9,的默认值是0.999,业内人士很少调整两个参数;
的默认值是,并不需要去设置它,因为它不会影响算法的表现;
用来计算,所以叫第一矩;用来计算,所以叫第二矩;
老吴的基友,和Adam并没有任何关系(doge
2.9 学习率衰减
加快算法的一个办法就是随时间慢慢地减小学习率,也就是学习率衰减,看一个例子:
假如你要用mini-batch,并且mini-batch size并不大,可能是64或128,迭代过程中会有噪音,下降的方向大致是朝向最小值,但并不会精确地收敛,所以最后算法会在最小值附近摆动:
这其实是因为学习率是固定值,同时不同的mini-batch中会有噪音;
但如果慢慢减小学习率,初期时比较大,学习相对比较快,但随着变小,步伐也会慢慢变小,最终你的曲线会在最小值附件的一小块区域内摆动,而不是像之前在训练过程中大幅度地在最小值附近摆动;
所以学习率衰减的本质是学习初期你可以承受较大的步伐,但开始收敛时小的学习率能让你的步伐变小一些;
所以可以将学习率设置为:
也就是衰减率是一个要调整的超参数,是初始学习率,也是超参数之一;
假设,,则计算如下:
此外,还有一些学习率公式,比如:
(指数衰减)
有时人们也用离散下降的学习率,即某个步骤有某个学习率,下一个步骤学习率减少了一般,一会后又减少了一半……
(t是指mini-batch中第t个子集)
人们有时还会选择手动衰减,一小时一小时日复一日地手动调整参数,只有在模型数量小的时候才有用;
有很多超参数可以调优,但学习率衰减并不是率先要尝试的点,有其他更加重要的;
2.10 局部最优的问题
深度学习早期,人们总是担忧算法会困在极差的局部最优,如今我们对局部最优的理解也产生了改变;下面是一个人们曾经常常在脑海里想象的局部最优:
也许我们想要优化的参数称之为,曲面高度就是损失函数的值,图中似乎各处都存在局部最优,梯度下降法或某个算法可能会困在一个局部最优中,而不会抵达全局最优;如果你要作图计算一个数字,比如这两个维度,那么就比较容易出现这种有多个不同局部最优的图,而这些低维的图曾经影响了我们的理解,却并不准确;
事实上,当你要创建一个神经网络,通常梯度为零的点并不是这个图中的局部最优点,以马鞍面来举例,实际上,成本函数的零梯度点通常是鞍点;
但是,一个具有高维度空间的函数如果梯度为0,那么在每个方向上它可能是凹函数,也可能是凸函数,比如你在一个20000维度空间中,如果你想要得到一个局部最优解,那么它要求函数在这个解处的20000个方向中都必须是凹函数(注意国外的凹凸函数定义和考研的凹凸函数定义刚好是反过来的),发生的概率非常的小,也许是;更多的情况是一些方向上的曲线是凹函数,另一些方向上则是凸函数,也就是说你在高维空间中极大概率碰见的是鞍点而不是局部最优;
我们从深度学习历史中学习到的一点经验:
我们对低维度空间的大部分直觉并不能应用到高维度空间中去或者适用于其他算法;
那么新的问题是什么?
结论是:平稳段会减缓学习;平稳段指的是一块区域,这区域中导数长时间接近于0;比如处于蓝点时,梯度会从平面从上往下降,而且由于梯度等于或接近于0,平面很水平,得花上很多时间才能慢慢地抵达平稳段比较低的红点,然后因为左右的随机扰动,你的算法便可以走出平稳段;
总结:
(1)如果你在训练一个较大的神经网络,通常不太可能困在极差的局部最优中,因为存在大量参数并且成本函数被定义在高维度的空间中;
(2)平稳段会使学习变得缓慢,这也是优化算法如Momentum、RMSprop、Adam能够加速学习算法的地方,可以帮你加快走出平稳段;