优化算法
目录
1 Mini-batch梯度下降
2 理解Mini-batch梯度下降法
3 指数加权平均值
4 了解指数加权平均数
5 指数加权平均数的偏差校正
6 Momentum梯度下降法
7 RMSprop
8 Adam优化算法
09 学习率衰减
10 局部最优化问题
1 Mini-batch梯度下降
如果对整个训练数据集进行训练,采用梯度下降法的训练速度会很慢。你可以将训练集拆分成很小的训练集,即小批量训练集(Mini-batch)。
这个算法每次只处理一个小批量样例.
假设我们有500万条训练样本,也就是我们有5000个训练子集,每个子集1000个训练样本,在训练集上运行小批量梯度下降算法时候,每个子集都要运行一遍。
for t=1,2,...,5000:
前向传播:
............
计算代价函数:
反向传播计算
的梯度,更新权重
上述的称为训练集的一次遍历,使用批梯度下降法的一次遍历训练集只能让你做一次梯度下降,而使用Mini-batch梯度下降法,一次遍历训练集嫩能够让你做5000次(对于本例)梯度下降。你想要多轮遍历训练集,你可以在上面的for循环外,再增加一个循环,直到最后你能收敛到一个合适的值。
2 理解Mini-batch梯度下降法
在批量梯度下降算法中,每一次迭代你都要遍历整个训练集,并希望代价函数的值随着迭代次数的增加而不断减少;如果代价函数的值在某次迭代中增加了,则说明出现了错误,也许是学习率太大了。
使用Mini-batch梯度下降法,如果你做出代价函数在整个过程中的图,你会发现并不是每次迭代都是下降的,特别是在每次迭代过程中,因为你是对不同的训练集进行迭代。
你需要决定的变量之一是Mini-batch的大小,假设训练集的大小为m。极端情况下,如果Mini-batch的大小等于m,此时就是batch梯度下降法;如果Mini-batch的大小=1,此时就是随机梯度下降法,每个样本都是独立的Mini-batch。
batch梯度下降从某一点处开始,相对噪声低一些,幅度也大一些;而在随机梯度下降算法中,每次只对一个样本进行迭代,有时向着全局最小值靠近,有时由于这组数据不好会往错误方向移动,远离最小值,因此随机梯度下降有很多噪声。一般来说,它会沿着正确方向靠近最小值,而且随机梯度下降不会收敛到某个最小值,而是在最小值附近波动。
如果使用batch梯度下降法,Mini-batch的大小为m,每次迭代需要大量训练样本,该算法的主要弊端是:在训练样本数量巨大的时候,单次迭代耗时太长;如果训练样本不大,batch梯度下降法能很好地运行。如果使用随机梯度下降法,如果你只要处理一个样本,那这个方法很好,通过减小学习率,噪声会被减小,但是随机梯度下降算法的缺点是:失去了使用向量化加速运算的机会。
通常,我们选择的Mini-batch大小在1和m之间,让Mini-batch大小既不太大也不太小,这样你的训练才能最快,既可以使用向量的方式运算;也可以不用等待整个训练集都遍历完一遍再运行梯度下降法,虽然并不能保证总是到达最小值,但是相比随机梯度下降,它总是朝着最小值的方向移动,而且不会总在最小值附近摆动。
训练集小(≤2000),就使用batch梯度下降算法;对于大的训练集,一般选64到512作为Mini-batch的大小。
确保Mini-batch的训练集是可以放进CPU/GPU内存。
3 指数加权平均值
以伦敦某年的每日气温作为例子,把每日气温的数据画出来,得到下面的图:
这些数据看起来有噪声,如果你想要计算数据的趋势,你可以这样做:
先令,之后每一天先用0.9乘以之前的v值再加上0.1乘以当天的气温。
,第二天仍然使用加权平均,即
;
。
如果这样计算,并把结果用红色画出来,你就会得到一个滑动平均的图,称为每日温度的指数加权平均。
通用公式:,对于这个公式,你可以认为
近似于
天的温度平均。举例来说,当
时,你可以认为这是前十天的气温平均值。
当时,这时计算
,这相当于粗略计算了前50天的气温平均值,如果你把它画出来,就会得到绿色的线。
有几点需要注意的是:当值很大时,你得到的曲线就会更平滑,因为你对更多天数的气温做了平均处理,因此曲线波动更小、更加平滑;另一方面,这个曲线会右移,因为你在一个更大的窗口内计算平均气温,这个指数加权平均在温度变化时,适应的更加缓慢,这就造成了一定的延迟,使得之前的值具有更大的权重,而当前值的权重非常小。
当,这就是只对两天进行平均,如果画出来,就会得到黄色的线。由于仅仅平均两天的温度,即只在很小的窗口内计算平均,得到的结果就会有很多噪声,更容易受到异常值的影响,但它可以更快的适应温度的变化。
使用公式: 可以实现指数加权平均,在统计学中,它被称为指数加权移动平均。通过调整
值,可以得到不同的效果。
4 了解指数加权平均数
在这里假设,我们来了解下
是如何计算每日气温的。
以t减小的的方式写出v值的计算:
............
以此类推,将这些项全部相乘就可以得到:
左图是t从1到100时,所对应的天的气温,右图是构建的一个指数衰减函数,也就是0.1,0.1*0.9,
,计算
是通过把两个函数对应的元素相乘,然后求和。
所有的系数相加为1或者逼近1,涉及下面要讲的偏差修正。
最后你也许会问,到底需要平均多少天的温度。实际上有,从而
。这个含义是:10天后,权重下降到当日权重的
,权重可以忽略不计 。
5 指数加权平均数的偏差校正
把代入
,实际得到的是紫色曲线而不是绿色曲线。 你会发现,紫色曲线的起点非常低。
当计算移动平均值的时候,初始化,
,如果第一天的气温是40华氏度,那么
,因此得到的值会小很多,所以第一天的气温预估不准确。
,计算后
的值要远小于
和
,所以
不能很好的预估前2天的气温。
有一种方法能很好的预估:用代替
.当t=2时,
。因此第二天的气温估计值
。当t值变大,
的值将趋向于0,即偏差修正值对运算基本没有影响。
6 Momentum梯度下降法
有一种算法叫做动量(Momentum),或者叫做动量梯度下降法,它总是会比标准的梯度下降法更快。动量梯度下降法的算法思想是:计算梯度的指数加权平均,然后使用这个梯度来更新权重。
例如:如果你要优化代价函数,函数形状如图,红色点代表最小值的位置,你从某一点开始梯度下降法,你会发现梯度下降法需要计算很多步骤,慢慢摆动到最小值。这种上下波动减慢了梯度下降法的速度,你就无法使用更大的学习率。如果你要用较大的学习率,结果可能会偏离函数的范围。
另一个看待问题的角度是:在纵轴上,你希望学习的慢一些,因为不想要上下的来回摆动;在横轴上,你希望加快学习,能快速找到最小点。
使用Momentum梯度下降法你需要做的是:在t次迭代的过程中,你需要计算dw,db,然后计算,也就是计算w导数的滑动平均值;
;然后更新权重
,
。经过这样的操作,可以让梯度下降的每一步变得平滑。
举例来说,假设你计算的前几个导数是的,如果平均这些梯度,你会发现纵轴上的平均值趋近于0,所以在纵轴方向上,你希望放慢一点;但是在横轴方向上,所有导数指向横轴方向,因此横轴方向的平均值仍然很大。用算法进行几次迭代后,你会发现Momentum梯度下降法在纵轴方向的摆动变小了,横轴方向运动速度更快(下图红色线)。因次算法走了一条更加直接的路径,在抵达最小值的路径上减少了摆动。
对动量有种直观的理解:如果你想最小化一个碗状函数 ,你可以把导数项dw和db看成是一个球下坡时的加速度,把动量项看成是球的速度。球在加速度的作用下越滚越快,
看成是摩擦力,让球不至于一直无限加速下去。不像梯度下降法,每一步都独立于之前的步骤。
7 RMSprop
RMSprop全称均方根传递(Root Mean Square Prop),它也可以加速梯度下降。
我们继续以下面为例进行探讨:纵轴代表参数b,横轴代表参数w。
如果你想减缓纵轴方向,同时加快横轴方向的学习,RMSprop算法可以实现这一点。在第t次迭代中,该算法会照常计算当前Mini-batch的导数dw和db,,同样的
;接下来更新参数
,
例子中的(横轴)w方向,我们希望学习速度快;垂直(b)方向,我们希望减缓纵轴上的摆动。对于和
这两项,我们希望
相对较小,因此我们除以一个较小的数;而希望
较大,我们要除以一个较大的数字,这样就可以减缓纵轴上的变化。如果你看一下导数,你会发现垂直方向上的导数要比水平方向上的导数更大。
较大,
也会较大;相比之下,
会较小,
会小一些,结果就是纵轴上的更新量除以一个较大的数,减弱摆动;水平方向的更新量除以一个较小的数,加快收敛。你可以使用更大的学习率,不用担心在垂直方向上发散。
直观理解就是:在你要消除摆动的维度中,你会计算得到一个更大的和值,即导数平方的加权平均,所以最后你去掉了那些有摆动的方向。
为了保证的分母不会趋于0,确保数值稳定,在实际操练过程中,要在分母加上一个很小的
值,一般是
RMSprop和Momentum一样,可以消除梯度下降中的摆动,并允许你使用一个更大的学习率,从而加快你的算法学习速度。
8 Adam优化算法
Adam优化算法将Momentum和RMSprop结合在一起。
我们看看如何使用Adam优化算法:
首先初始化;
在第t次迭代过程中,你要用当前的Mini-batch计算dw和db;
计算Momentum指数加权平均数:,
;
更新RMSprop中的参数:,
一般使用Adam算法时候,要计算v的偏差修正,,
;s也需要计算偏差修正:
,
;
更新权重:;
这个算法中有很多的超参数,学习率很重要,也需要经常调试。通常我们会将
的默认值设置为0.9;超参数
一般设置为0.99;
值一般为
09 学习率衰减
有一种让学习算法运行更快的方法就是慢慢减少学习率,我们称之为学习率衰减。
当你使用适量的小样本进行Mini-batch梯度下降法时,也许一个批次只有64或128个样本,当你迭代时会有噪声,它会逐步向最小点靠近,但不会完全收敛到最小点,你的算法最后会在最小值点附近浮动,这是因为你的学习率取了固定值,不同的Mini-batch中有噪声。
如果慢慢减少学习率的话,在训练初期时,学习率还是比较大,学习速度相对快;但随着
变小,你的步伐也会变慢变小,最后你的曲线会在最小值附近的一小块区域内摆动。
慢慢减小学习率的本质在于:在学习初期你可以采用大得多的步长,但开始收敛的时候,小一些的学习率让你的步伐小一些。
怎么实现学习率衰减?1个epoch就是把所有的数据遍历一遍。
学习率,这里的衰减率dacayRate是另一个超参数,比如:dacayRate=1,
Epoch | |
1 | 0.1 |
2 | 0.067 |
3 | 0.05 |
4 | 0.04 |
......... | ......... |
随着epoch增加,学习率会衰减,你可以尝试不同的衰减率dacayRate、
除了这个学习率衰减的公式外,人们还会有用一些其他的方式,例如指数衰减:学习率;又比如:
;
10 局部最优化问题
在深度学习的早期时候,人们常常担心优化算法会陷入糟糕的局部最优中,但随着深度学习理论的发展,我们对局部最优的理解也在改变。
当人们想到局部最优的时候,他们脑海中浮现出来的往往是这样的图,也许你想优化一些参数。在图中似乎各处都分布着局部最优,梯度下降或者某个算法可能困在一个局部最优中,而不会抵达全局最优。
如果你画的是一张二维的图,确实容易像这样有很多局部最优,而人们的直觉往往被这些低维图像所引导,但是这种直觉上的感受并不准确。如果你是在训练一个神经网络,代价函数中大部分梯度为零的点,实际上并不是局部最优,而是鞍点。
从经验上说,对于一个高维度空间的函数,如果梯度为0,则在每一个方向上,它可能是凸函数或者是凹函数
。如果你在两万维空间中,那么想要得到局部最优,所有的两万个方向都需要是
的,这发生的概率很小,也许是
,你更有可能遇到有些方向的曲线是
,有些方向的曲线是
,因此在高维度空间,你更有可能遇到鞍点,而不会遇到局部最优点。
如果局部最优不是问题,那么问题是什么?真正会降低学习速度的实际上是停滞区,停滞区指的是导数长时间接近于0的一段区域。假设现在在曲面上的一点,那么梯度下降法会沿着这个曲面向下移动,然而因为梯度为零或者接近于零,曲面很平,你会花费很长的时间缓慢地在停滞区找到这个点,然后因为左侧或者右侧的随机扰动,你的算法终于能够离开这个停滞区。
所以说,实际上不太可能陷入糟糕的局部最优点,只要你训练的是一个较大的神经网络,有很多参数,代价函数J定义在一个相对高维的空间上;其次,停滞区也是一个问题,他会让学习过程变得相当慢。