Optimization Algorithms

神经网络和深度学习[1-2]
神经网络和深度学习[1-3]
神经网络和深度学习[1-4]
改善深层神经网络:超参数调试、正则化以及优化【2-1】
改善深层神经网络:超参数调试、正则化以及优化【2-2】
改善深层神经网络:超参数调试、正则化以及优化【2-3】
结构化机器学习项目 3
Ng的深度学习视频笔记,长期更新

2.1 Mini-batch gradient descent

本周学习的是优化算法,可以让神经网络运行更快。机器学习的应用是一个高度依赖经验的过程,伴随着大量的迭代过程,需要训练诸多模型,然后找到一个合适的,因此优化算法能够帮助机器学习快速训练模型,其中一个难点在于深度学习没有在大数据领域发挥最大的效果,我们可以在一个大的数据集上训练神经网络,但是巨大的数据集上进行训练速度很慢,使用优化算法能够大大提高团队的效率。
向量化能够让多个样本放到一个矩阵中,从而有效的进行计算,允许处理整个训练集。即X的维度是(n,m),而Y的维度是(1,m),那么如果m比较大的话,比如500万或者更大的数,在对整个训练集执行梯度下降法时,需要处理整个训练集,然后才能进行梯度下降。而如果在处理整个训练集的过程中,将处理完的前部分数据进行梯度下降,这样算法就会更快。如下图所示,将数据集每一1000个样本作为一个batch,分成,则的维度为,对应的标签集的维度为.
dl0601
该梯度下降的训练算法和之前的是一样的,如下图所示:
dl0602

2.2 Understanding mini-batch gradient descent

这里讲到了三种梯度下降的形式,先对比了批量梯度下降和mini-batch下降,批量梯度下降会计算全部的样本,可以预期每次迭代的成本函数都会下降,所以如果成本函数J是迭代次数的一个函数,它会随着每次迭代而减小,如果J在某次迭代中增加了,那肯定是出问题了,或许运行方式太大【前边[1-2]部分最后一个图就有问题(学习率为0.01),成本函数有上升的情况,这里就是因为学习率过大】。使用mini-batch梯度下降法,每次迭代成本函数并不都是下降的,因为每部分样本的随机性等因素导致(有可能第一个batch比较容易拟合的样本集,但是第二个batch就比较难拟合的样本集,比如在里面有一些残缺的样本,这样就会出现摆幅),但是整体的走势是下降的,如下图所示:
dl0603
不同的size的比较,batch梯度下降,训练全部的样本,每一次迭代时间较长,但是J总是在减小,并达到最小值;随机梯度下降,每次对一个样本训练,这样丢失了向量化带来的计算加速,J总体趋势下降,但是摆幅严重,并且无法达到全局最小值;Mini-batch梯度下降,是前两者的折中,可以快速迭代,同样无法达到全局最小值。
一般对于小于2000的样本直接使用batch梯度下降,否则使用mini-batch梯度下降,大小一般为64,128,256,512这样的数字

2.3 Exponentially weighted averages

【这一块不是特别明白,只能说是前人得经验吧】
如下面的图,显示的是London温度和时间(days)之间的关系,如果要计算其变化趋势的话,即温度的局部平均值或者移动平均值【统计学中叫做指数加权平均数】,需要用到下面的公式,其中表示的是温度,用表示平均的天数:

对上面这个式子分析:

上面拟合的值对应的曲线如下图所示,红线对应的是,黄线对应的是,绿线对应的是
dl0604

这里越高,线也就越平坦,要平均更多的值,指数加权平均公式在温度变化时,就会变化的更缓慢一些,所以会有延迟。表示给前一天的值加了太多的权重,只有0.02的权重给了当日的值,所以温度变化时,指数加权平均值变化相应的更慢一些,可以算出这里平均了50天的温度。当的时候,可以算出平均了2天的温度,如上面的黄线所示,由于平均了两天的数据,平均的数据太少,所以得到的曲线有更多的噪声,更有可能出现异常值,但是这个曲线能够更快的适应温度的变换。

2.4 Bias correction in exponentially weighted average

对于上面的式子,如果取值过大,由于需要平均的数值比较多,而最前面却没有那么多的数据,导致前期数据拟合效果差;比如取的情况,第一天的实际值是40,那么,其结果远小于实际值,而由于前一个值的比重过大,导致的结果也比较小,同样远低于实际值:

而偏差修正就可以让估计的值变得更好,对得到的作如下处理:

当t=2时,,显然让值变大了,而且随着t的增减,的值会接近于0,即当t非常大时,偏差几乎没有作用,也就是说偏差只会对前期起到作用,而这恰恰是我们需要的。在实际过程中,一般会忽略前期均值偏差的影响,也就是说大家不在乎执行偏差的修正。
实际效果如下图,之间讲到绿线是的图,实际下图中的紫线才是原始的图,而绿线是加了偏差修正后的图:
dl0605

2.5 Gradient descent with momentum

这里将前面讲到的指数加权平均数用在梯度上,即计算梯度的指数加权平均数,并利用该值去更新权重。比如,我们要优化的成本函数(cost function)如下图所示,椭圆形:
dl0606
之前讲到过归一化中的例子,但是不是所有的数据都可以转换后就变成球形的,这样就会导致梯度下降的过程如图中蓝色线所示(可以这样理解:上下,左右梯度更新不一样,上下梯度更新每次需要一个较小的值(即希望学习率小一点,因为不希望摆动),但是左右梯度更新每次却需要一个较大的值(希望加速学习));我们还不能加大学习率,如果加大学习率后,就会导致偏离函数的范围,如紫色线所示;由于上下每次梯度更新的值都是在来回波动,而左右的梯度更新都在向右趋近,所以如果用指数加权平均数后,上下梯度的更新值就会被平均接近于0(正负相互抵消,摆动变小,即纵轴放慢学习速度),左右梯度(横纵方向),所有的微分都指向右,因此平均值仍然很大。在算法迭代几次后,就会如图中红色线所示方向趋近于最小值,这样这个算法就走了一条更加直接的路径,从而缩短了训练时间。

这里用球在碗里向下滚动的例子来解释动量梯度下降:V作为球的速度,dV作为前一时间给当前时间球的加速度,是由于摩擦力导致速度衰减后的结果,也就是说指数加权平均的梯度下降算法不同于普通的梯度下降,它每一步都受前一步的影响,并加大这个影响(让球的速度越来越快【这里为什么会让球的速度越来越快呢,我的理解是这样的:从图中可以看到原始的梯度下降前期迭代幅度大,后期迭代幅度小,但是使用指数加权平均后,后期迭代是前面的平均,很显然相对之前的后期幅度而言变大了,即球的速度越来越快】)【这里又抛出一个问题,为什么前期迭代幅度大,后期迭代幅度小?我可能理解有偏差了…我觉得应该不能让横轴加快速度吧】,而普通梯度下降每一步都是独立的。
算法实现如下:
dl0607
一般,实际使用中人们也不会使用偏差修正,在有些介绍中,上图的被去掉。

2.6 RMSprop(root mean square prop)

RMSprop也可以加速梯度下降,同样用之前的图举例,为了分析,纵轴代表参数b,横轴代表参数W,我们需要减缓b方向的学习,而加速或者至少不是减少横轴方向的学习,而RMSprop可以实现这一点。如下图所示:
dl0608
来计算梯度的指数加权平均,对梯度更新的时候不同的梯度使用不同的学习率,关于求梯度的指数加权平均的时候用的原因视频中说这样能够保留微分平方的加权平均数,我的理解是和加绝对值是一个效果,这里是为了计算大小,而不是方向,只是平方后会让明显的更加明显;这里还需要明确一点,梯度值代表的是导数,也就是斜率,上图中蓝线所示的是梯度的方向,即b的斜率比较大,而就比较小,那么对应的比较小,比较大,那么对于w而言,梯度更新我们希望学习率大,除以小的值;对于b而言,梯度更新我们希望学习率很小,除以大的值。这样垂直方向就能消除大的摆动,最后的梯度线如图绿线所示。【这里有一点,为什么蓝线所示的dw比较小,db比较大,蓝线为什么这样画? 我的理解走得很慢才到最小值,说明最小值方向的梯度比较小,而其它方向的梯度比较大】
可以用一个更大的来加速学习【这里是因为我们已经将梯度归一了(即基本沿着最小路径方向),学习率变大也不会离最小路径有太大的偏离】;这里如果非常小,得到的答案就会非常大,为了确保数值稳定,实际中通常会加上一个很小的,这样就可以保证除数一定大于,也就不会得到一个很大的值。

2.7 Adam

在深度学习的历史上,很多学者提出的优化算法,很好的解决了一些问题,但随后这些算法被指出并不能一般化,并不适合于多种神经网络。这样学者们就开始质疑新的优化算法,RMSprop和Adam优化算法是少有的经受住人们考验的两种算法,适用于不同的深度学习结构。Adam算法基本上就是将RMSprop和Momentum结合在一起的。
Adam算法如下:
dl0609
前两行分别计算RMSprop和Momentum,后面两行是偏差修正,最后一行梯度更新,结合之前的讲解可以知道最后一行就是对前面两个算法的叠加。
关于算法中的参数说明:经常需要调试,一般默认为0.9,推荐为0.999,并不是很重要,不会影响算法的表现,Adam的作者建议为

2.8 Learning rate decay

dl0610
如上图所示,假设我们使用mini-batch梯度下降法,mini-batch数量不大,在迭代过程中会有噪声,图中蓝色线所示,不会精确的收敛,而是在最小值附近波动,因为我们用的是固定的值。如果我们在训练的过程中慢慢的减少学习率,在初期的学习率比较大,学习相对较快,但随着的变小,步伐也慢慢变小,如图中绿线所示,最后会在最小值附近一小块区域摆动,而不是在训练区域大幅度摆动。
可以如下设置学习率:

其中decayRate为衰减率(另外一个需要调整的超参数),epochNum为迭代次数,为初始学习率。
指数衰减:

如果觉得有帮助,给我打赏吧!