改善深层神经网络:超参数调试、正则化以及优化——优化算法(2-2)
1.Mini-batch梯度下降法
对于m个数据样本,在训练神经网络的时候,最常用的是向量化,如:(维数) ,但是当样本足够大的时候,例如5w,虽然向量化了,在back propagation的时候,必须先求得l层的梯度后才能进行l-1层的梯度,这样子速度就挺慢了,这就需要将X划分成很小的子集进行分别梯度下降,这些子集被取名为Mini-batch。如下公式:
输入权重:
输出:
如果算1000个元素为一个Mini_batch,那么总数为5w,则一共有50组,分别命名为
X: (本来这个是用{}表示的,但是软件问题,用[ ])
Y:
Mini-batch的数量t组成了**X[t]**和**Y[t]**包含相应的输入输出,对应的维数分别为, ,尽管把整一个数据集进行了分块,但是需要遍历这些Mini_batch,一共有50000/1000=50,则需要遍历50次。
上述图片中,for i in range(50) 指的是当你将大的数据集划分成很多小组 ()的时候,对这些mini-batch进行逐个forward propagation 和 back propagation。
对于batch梯度下降法而言,遍历一次
2.理解mini-batch
batch梯度下降法和mini梯度下降法的下降曲线如下:
mini_batch 的方法之所以会比较抖,主要是因为在一代训练中,不断的用较少的样本来对W和b进行优化,每次都会向局部最小值上走,导致比较震荡,但是总体的趋势还是不变的。
在极端情况下,如果mini-batch集合的元素等于m,所以把mini-batch大小设为m就可以得到batch梯度下降法。在另一种极端情况下,假设mini-batch大小为1,就有了新的算法,叫做随机梯度下降法,每个样本都是独立的mini-batch,( ) 则为第一个训练集样本,如下所示,bacth比较按照正常的状态下降,而Mini-batch则会向着相应的局部最小值下降,永不不会收敛,而是在最小值附近波动。
当样本过大的时候:把所有的样本放在同一个矩阵,会导致迭代速度变慢。但是如果mini-batch所选的尺寸太小,如果单单只选择1的话,就是失去了向量化的意义,所以要选择合适的mini-batch尺寸。
如何选择mini-batch的尺寸呢?
1.如果训练集太小,直接使用batch梯度下降法(样本数<2000)
2.样本数目太大的话,一般的mini-batch大小为64到512,考虑到电脑的内存问题,如果是2的n次方会快些,如64,128,256,512
3.指数加权平均(指数加权平均数)
指数加权平均的关键函数:
(这里加权平均我们使用的是V_t)
---------------------------------------------------------------------------------
理解指数加权平均
例子,当 =0.9 时:
. . .
展开则有:
对于上面的公式,可以如下图来理解,图一为温度数据,图二为指数衰减函数,公式为 ,上面公式即为俩个图对应天数的数据的乘积的和。
上式中,所有前面的系数相加起来为1或者接近于1,称之为偏差修正。
总体来说存在,,在我们的例子中, ,即 (0.36左右),只关注了过去10天的天气。
为什么这么说只关注了10天的天气呢?
这是因为,当其权重小于原来的1/e 后,就认为小于原来1/e后面的数据已经不重要了,这点很重要。
------------------------------------------------------------------------------------
当 ,该指数加权平均只关注了(1/(1-0.9))=10天的温度,而当 ,则该指数加权平均关注了(1/(1-0.98))=50 天的温度,曲线变化如下(红色表示0.9的,绿色表示0.98的):
0.98这个曲线,波动更小,更加平坦,缺点是曲线进一步右移,因为关注的天数升高了,同时也要平均更多的值。平均更多的值,指数加权平均在温度变化的时候,适应地更缓慢一些,毕竟0.98的时候,只是给了0.02给当天温度。
如果 ,那么变化曲线如下黄色部分所示,能够更好的适应温度变化:
-------------------------------------------------------------------
理解修正偏差:
在我们执行指数加权平均的公式时,当 =0.98时,我们得到的不是图中的绿色曲线,而是下图的紫色曲线,起点较低:
原因是当计算初始化加权平均的时候,由于初始化v0=0,所以在前期的时候计算出来的v都比正常值要小很多。
使用偏差修正:
修正系数为:
假如1天的温度为40度,,那么本来v1=0.980+0.0240=8(差距很大),如果是加了修正系数,那么就变为v1=v1/(1-0.98)=40(刚好等于)。
对于v2也是,如果不加修正效果,假设 =35,不加修正效果为:
=1.484,如果加了修正系数,则乘以1/(1-0.98*0.98),结果为37.47(结果与35接近)
当t越大时,修正系数越接近1。
4.动量梯度下降法(Momentum)
动量梯度下降的基本思想就是计算梯度的指数加权平均数,并利用该梯度来更新权重。
在我们优化Cost function的时候,以下图所示的函数图为例:
在利用梯度下降法来最小化该函数的时候,每一次迭代所更新的代价函数如图蓝色线所示在上下波动,减缓了梯度下降的速度,而且我们只能使用一个较小的学习率迭代。因为怕跑出了函数。
但是我们希望函数(如上所示),在纵向波动小点,在横向波动大点,这样子能快点到达最小点但是又不会超出函数值,如红色线所示。
常用值为0.9,比较好的鲁棒数。表示的是之前的梯度下降的值,然后 表示的是当前算出来的,所以现在的每一步迭代其实是跟之前的值是有关的。
在我们进行动量梯度下降算法的时候,由于使用了指数加权平均的方法。原来在纵轴方向上的上下波动,经过平均以后,接近于0,纵轴上的波动变得非常的小。但是横轴因为所有平均值都很小,所以平均值也很大。
算法的本质解释:
将Cost function想象为一个碗状,想象从顶部往下滚球,其中:
微分项:dw,db为球提供的加速度;
动量项:vdw,vdb相当于速度
小球在向下滚动的过程中,因为加速度的存在使得速度会变快,但是由于 的存在,其值小于1,可认为是摩擦力,所以球不会无限加速下去。
5.RMSprop(Root Mean Square Prop)
跟上面说的差不多,梯度在纵轴和横轴的波动都挺大的,假设b为纵轴,w为横轴,我们需要的是减缓b的学习,同时加快(至少不是减缓)w的学习率,关键函数如下:
(后面对dw平方是针对整个符号而言的)
到后面更新部分:
(dw是当前计算出来的梯度)
为了避免接近于0,我们需要保证数值能稳定一些,在分母加一个很小很小的 , 是一个不错的选择。
所以,我们需要的是可以小一点, 可以稍微大点,这样子在迭代过程中可以适当的减少纵轴的变化(这里的纵轴b和横轴w只是为了方便展示而已)。
进行RMSprop后,得到的曲线如下(绿色曲线为采用了RMSprop后的变化趋势):
6.Adam(Adaptive Moment Estimation)优化算法
Adam算法就是将RMSprop算法和Momentum算法给结合起来,先假设
1.
在第t次迭代中,我们使用的是mini_batch
2.然后计算Momentum:
这里我们更新了超参数
3.接着计算RMSprop
这里我们更新了超参数
4.一般使用Adam算法的时候,需要采用修正偏差
对Momentum进行参数调整:
对于RMSprop进行参数调整:
则有 :
对于上面的超参数(Hyperameters):
学习率 ,要不断的调整。
至于超参数 ,缺省值为0.9,(dW)
对于超参数 ,缺省值为0.999 ( )
关于的选择大概为
7.学习率衰减(Learning rate decay)
为什么要计算学习率衰减?
假设使用的是mini_batch梯度下降法,在迭代过程中会有噪音,可以迭代,但是会使得迭代到最后在最小点附近波动。
但是如果我们使用学习率衰减,逐渐减小学习率 ,在算法开始的时候,学习速率还是相对较快,能够相对快速的向最小值点的方向下降。但是随着" 的减小,下降的步伐也会逐渐变小,最终会在最小值附近的一块最小的区域里波动,如图中绿色线所示:
我们可以这样定义学习率: (其中 为初始学习率,epochnum表示的是遍历数据集的次数。
也有其他公式如:
其他:
其中,当我们有10000个样本,每个min_batch 有1000个样本,则我们有10个min_batch,当我们历遍一次样本集,即历遍10次min_batch,epochnum+1。
8.局部最优问题
如上图左图所示,在低维的情况下,我们可能经常得到局部最优值,但是如果我们在高维的时候,很少会碰到局部极小值,更多的是鞍点。
在高纬度的情况下:
1.几乎不可能陷入局部最小点。
2.处于鞍点的停滞区会减缓学习过程,利用如Adam等算法进行改善。