精挑细选,分享真知灼见!关注数字化企业头条号
在训练神经网络模型的时候需要使用到优化算法,最终我们都是通过求解代价函数的最优化问题来求解模型的参数。有的时候,训练一个神经网络模型可能需要几百上千台机器同时训练几个月,通过使用优化算法可以节省训练的时间加快模型的收敛。本篇文章主要介绍一下常用的优化算法
梯度下降算法
指数加权平均算法
动量梯度下降
RMSprop算法
Adam优化算法
常用的优化算法在面试的时候也会经常被问到。
一、梯度下降算法
在训练模型之前会先定义一个代价函数,然后通过不停的迭代训练数据利用梯度下降算法来减少每次迭代的误差,从而使得代价函数最小化。梯度下降算法主要包括三种,随机梯度下降、batch梯度下降、mini-batch梯度下降。最常用的是mini-batch梯度下降算法。
随机梯度下降
随机梯度下降算法是指在训练模型的时候,每次迭代只从训练数据中随机抽取一个数据来计算梯度更新模型的参数。随机梯度下降算法永远无法收敛,容易受到噪声的干扰,训练时间长,代价函数最终会围绕全局最小值或者局部极小值震荡。
batch梯度下降
batch梯度下降算法是指在训练模型的时候,每次迭代时使用所有的训练数据来计算梯度更新模型的参数。batch梯度下降算法适用于小数据集的训练,对于大数据集(大于2000)不太适应,因为每次训练的时候都要使用所有的训练数据,会导致需要消耗大量的内存,增加电脑的计算量,计算时间长。batch梯度下降不容易受到噪声数据的干扰,在迭代的时候能够保证向全局最小值或局部极小值的方向进行收敛。
mini-batch梯度下降
mini-batch梯度下降算法是指在训练模型的时候,每次迭代时会使用一个mini-batch数据来计算梯度更新模型的参数,这个mini-batch通常取64、128、256、512,通常采用2^n作为一个mini-batch,符合电脑的内存结构在一定程度上可以加快计算机的计算速度,从而减少训练的时间。mini-batch梯度下降算法是最常用的梯度下降算法,mini-batch对计算机的内存要求不高,收敛速度相对较快,在迭代的时候不能保证每次迭代都像全局最小值进行收敛,但是整体的趋势是向全局最小值进行收敛的。当mini-batch取1时,就变成了随机梯度下降算法,当mini-batch的大小为整个训练数据集的大小时就变成了batch梯度下降。
二、指数加权平均值
指数加权平均值,也被称为移动平均值,从名字可以看出来它其实也是一种求平均值的算法,在后面介绍动量、RMSProp和Adam的时候都需要用到它。
上图中,横轴表示的是天数,纵轴表示的是温度。通过上图可以发现,其中红色曲线的β betaβ为0.9,黄色曲线的β betaβ小于0.9,绿色曲线的β betaβ大于0.9,当β betaβ越来越大时,指数加权平均值曲线会慢慢的向右移动,反映温度的变化会延时,曲线会越来平滑。
指数加权平均算法相对于直接求平均值算法的优势在于,指数加权平均值只需要极小的空间就可以计算出近似平均值,而直接使用平均值算法需要保存以前所有的数据,相对而言指数加权平均值的计算出来平均值的精度没有那么高,它是牺牲了一定的精度来换取空间和速度的。由于它在空间上具有极大的优势,所以应用范围还是很广泛。
三、动量梯度下降算法
动量梯度下降算法在梯度下降算法的基础上做了一些优化,梯度下降算法的收敛如下图所示
其中黑点表示的是起点,红点表示的是终点。通过梯度下降算法不停的迭代,慢慢的从黑点移动到红点的位置,通过上图可以发现黑点的移动轨迹在y方向上一直存在上下波动,而这个对于黑点移动到红点的位置没有任何的帮助,反而是在浪费时间,因为我们更希望减少这种不必要的计算,加速x轴方向上的移动步伐,如下图所示
而上图正是动量梯度下降算法所追求的效果,那么它到底是如何实现的呢?
上式中α alphaα表示学习率,通过上式可以发现,动量梯度下降算法在更新参数的时候并不是直接使用的梯度,它还利用到以前的梯度,具体到多少,与β betaβ的大小有关,β betaβ越大使用到以前的梯度越多,β betaβ越小使用到以前的梯度越小。
因为在y轴方向上梯度是有正有负的,所以均值就近似为0,即在y轴方向上不会有太大的变化。而x轴方向上的梯度都是一致的,所以能够为x轴方向上提供动量加速更新。由于动量梯度下降算法,在更新参数的时候不仅使用到了当前的梯度还使用到了以前梯度的均值作为动量,当陷入到局部极小值(梯度接近于0),在更新的时候动量梯度下降算法还可以利用以前梯度的均值来跳出局部极小值,而梯度下降算法只会陷入到局部极小值。在使用动量梯度下降算法的时候β betaβ通常可以取0.9。
四、RMSprop算法
RMSprop算法全称root mean square prop,RMSprop算法的思想和Moment算法的思想是一致的都是通过减少在y轴方向上的抖动,加大x轴方向上的移动步长。而在实现上略有不同,Moment主要是利用累积以前的梯度来实现加速,而RMSprop算法的思想是利用梯度下降算法在y轴方向上的梯度比较大,而在x轴方向上的梯度相对较小。在进行参数更新的时候,让y轴方向上的梯度除以一个大的数,这样y轴更新的幅度就小。而x轴方向上的梯度除以一个小的数,这样x轴更新的幅度就大。从而实现了,减小了y轴方向上的更新步长,增大了x轴方向上的更新步长,使得算法能够更快的收敛。更新公式如下:
五、Adam算法
Adam算法全称Adaptive Moment Estimation,主要是结合了Moment算法和RMSprop算法。公式如下:
六、总结
最后我们用两张图来比较一下算法的表现,这张图表示的是在同样的等高线的情况下各个算法的收敛情况
下面这张图表示的是不同算法在遇到鞍点时的表现
转载自:csdn博客 修炼之路