1.Mini-batch梯度下降法
神经网络训练过程是对所有m个样本(batch),通过向量化方式计算且同时进行的。如果m很大,例如百万数量级,训练速度往往会很慢,因为每次迭代都要对所有样本进行进行求和运算和矩阵运算。我们将这种梯度下降算法称为Batch Gradient Descent。
为了解决这一问题,可以把m个训练样本分成若干个子集,称为mini-batches,这样每个子集包含的数据量就小了,例如只有1000,然后每次在单一子集上进行神经网络训练,速度就会大大提高。这种梯度下降算法叫做Mini-batch Gradient Descent。
假设总的训练样本个数m=5000000,其维度为,将其分成5000个子集,每个mini-batch含有1000个样本。我们将每个mini-batch记为
,其维度为(1,1000),且t=1,2,⋯,5000。
神经网络中几类字母的上标含义:
:第i个样本
:神经网络第层网络的线性输出
:第t组mini-batch
Mini-batches Gradient Descent的实现过程是先将总的训练样本分成T个子集(mini-batches),然后对每个mini-batch进行神经网络训练,包括Forward Propagation,Compute Cost Function,Backward Propagation,循环至T个mini-batch都训练完毕。
for t=1,...,T{
Forward Propagation
ComputeCostFunction
BackwardPropagation
W:=W−α⋅dW
b:=b−α⋅db
}
经过T次循环之后,所有m个训练样本都进行了梯度下降计算。这个过程,称之为经历了一个epoch。对于Batch Gradient Descent而言,一个epoch只进行一次梯度下降算法;而Mini-Batches Gradient Descent,一个epoch会进行T次梯度下降算法。
对于Mini-Batches Gradient Descent,可以进行多次epoch训练。而且,每次epoch,最好是将总体训练数据重新打乱、重新分成T组mini-batches,这样有利于训练出最佳的神经网络模型。
2.理解Mini-batch梯度下降法
对于一般的神经网络模型,使用Batch gradient descent,随着迭代次数增加,cost是不断减小的。然而,使用Mini-batch gradient descent,随着在不同的mini-batch上迭代训练,其cost不是单调下降,而是出现振荡。但整体的趋势是下降的,最终也能得到较低的cost值。
之所以出现细微振荡的原因是不同的mini-batch之间是有差异的。例如可能第一个子集是好的子集,而第二个子集
包含了一些噪声noise。出现细微振荡是正常的。
如何选择每个mini-batch的大小,即包含的样本个数呢?有两个极端:如果mini-batch size=m,即为Batch gradient descent,只包含一个子集为;如果mini-batch size=1,即为Stachastic gradient descent,每个样本就是一个子集
,共有m个子集。
比较一下Batch gradient descent和Stachastic gradient descent的梯度下降曲线。蓝色的线代表Batch gradient descent,紫色的线代表Stachastic gradient descent。Batch gradient descent会比较平稳地接近全局最小值,但是因为使用了所有m个样本,每次前进的速度有些慢。随机梯度下降每次前进速度很快,但是路线曲折,有较大的振荡,不会收敛,最终会在最小值附近来回波动,难以真正达到最小值处。虽然可以通过降低学习率来减少噪声,但在数值处理上不能使用向量化的方法来提高运算速度。
实际使用中,mini-batch size不能设置得太大(Batch gradient descent),也不能设置得太小(Stachastic gradient descent)。这样,相当于结合了Batch gradient descent和Stachastic gradient descent各自的优点,既能使用向量化优化算法,又能叫快速地找到最小值。mini-batch gradient descent的梯度下降曲线如下图绿色所示,每次前进速度较快,且振荡较小,基本能接近全局最小值。
一般来说,如果总体样本数量m不太大时,例如,建议直接使用Batch梯度下降法。如果总体样本数量m很大时,建议将样本分成许多mini-batches。推荐常用的mini-batch size为64,128,256,512。这些都是2的幂。之所以这样设置的原因是计算机存储数据一般是2的幂,这样设置可以提高运算速度。mini-batch的大小要符合CPU/GPU的内存。尝试多个不同的mini-batch的大小,找到里面最合适的那个。
3.指数加权平均
指数加权平均(一种滑动平均算法),其一般形式为:
值决定了指数加权平均的天数,
近似表示为:
(平均了
天的温度)
值越大,则指数加权平均的天数越多,平均后的趋势线就越平缓,但是同时也会向右平移。
公式是怎么来的?准确来说,指数加权平均算法跟之前所有天的数值都有关系,根据之前的推导公式就能看出。但是指数是衰减的,一般认为衰减到
就可以忽略不计了。因此,根据之前的推导公式,我们只要证明
即可。
令,则
。即证明转化为:
显然,当N>>0时,上述等式是近似成立的。
4.理解指数加权平均
指数加权平均公式的一般形式:
是原始数据值,
是类似指数曲线,从右向左,呈指数下降的。
的值就是这两个子式的点乘,将原始数据值与衰减指数点乘,相当于做了指数衰减,离得越近,影响越大,离得越远,影响越小,衰减越厉害。
实际应用中,为了减少内存的使用,我们可以使用这样的语句来实现指数加权平均算法:
Vθ=0
Repeat {
Get next θt
Vθ:=βVθ+(1−β)θt
}
5.指数加权平均的修正
开始时设置 ,初始值会相对小一些,直到后面受前面的影响渐渐变小,才趋于正常。
修正这种问题的方法是进行偏移校正,即在每次计算完后,对
进行下式处理:
。在刚开始的时候,t比较小,
,这样就将
修正得更大一些,效果是把开始部分向上提升一些。随着t增大,
,
基本不变。
机器学习中,偏移校正并不是必须的。因为,在迭代一次次数后(t较大),受初始值影响微乎其微。所以,一般可以忽略初始迭代过程,等到一定迭代之后再取值,这样就不需要进行偏移校正了。
6.动量梯度下降法
动量梯度下降算法的速度要比传统的梯度下降算法快很多。做法是在每次训练时,对梯度进行指数加权平均处理,然后用得到的梯度值更新权重W和常数项b。
原始的梯度下降算法如上图蓝色折线所示。在梯度下降过程中,梯度下降的振荡较大,尤其对于W、b之间数值范围差别较大的情况。此时每一点处的梯度只与当前方向有关,产生类似折线的效果,前进缓慢。并且不能使用较大的学习率,否则会超出函数范围,只能选择较小的学习率。如果对梯度进行指数加权平均,这样使当前梯度不仅与当前方向有关,还与之前的方向有关,这样处理让梯度前进方向更加平滑,减少振荡,能够更快地到达最小值处。
权重W和常数项b的指数加权平均表达式如下:
动量梯度下降算法的过程如下:
从动量的角度来看,以权重W为例,可以成速度V,
可以看成是加速度a。指数加权平均实际上是计算当前的速度,当前速度由之前的速度和现在的加速度共同影响。而
,又能限制
速度过大。也就是说,当前的速度是渐变的,而不是瞬变的,是动量的过程。这保证了梯度下降的平稳性和准确性,减少振荡,较快地达到最小值处。
初始时,令。一般设置
,即指数加权平均前10次迭代的数据,实际应用效果较好。
另外,关于偏移校正,可以不使用。因为经过10次迭代后,随着滑动平均的过程,偏移情况会逐渐消失。
补充一下,在其它文献资料中,动量梯度下降还有另外一种写法:
即消去了系数(1−β)。这样简化了表达式,但是学习因子α相当于变成了,表示α也受β的影响。从效果上来说,这种写法也是可以的,但是不够直观,且调参涉及到α,不够方便。所以,实际应用中,推荐第一种动量梯度下降的表达式。
7.RMSprop
RMSprop是另外一种加速梯度下降速度的算法。每次迭代训练过程中,其权重W和常数项b的更新表达式为:
RMSprop算法的原理如下,令水平方向为W的方向,垂直方向为b的方向。
梯度下降(蓝色折线)在垂直方向(b)上振荡较大,在水平方向(W)上振荡较小,表示在b方向上梯度较大,即较大,而在W方向上梯度较小,即
较小。因此,上述表达式中
较大,而
较小。在更新W和b的表达式中,变化值
较大,而
较小。也就使得W变化得多一些,b变化得少一些。即加快了W方向的速度,减小了b方向的速度,减小振荡,实现快速梯度下降算法,其梯度下降过程如绿色折线所示。总的来说,就是如果哪个方向振荡大,就减小该方向的更新速度,从而减小振荡。
还有一点需要注意的是为了避免RMSprop算法中分母为零,通常可以在分母增加一个极小的常数:
其中,,或者其它较小值。
8.Adam优化算法
Adam算法结合了动量梯度下降算法和RMSprop算法的优点,使得神经网络训练速度大大提高,且适用于多种网络结构。其算法流程为:
Adam算法包含了几个超参数,需要多个值调试一下,选择合适的值;
通常设置为0.9;
通常设置为0.999;
通常设置为
,一般只调试
。
9.学习率衰减
减小学习因子也能有效提高神经网络训练速度,这种方法被称为learning rate decay。
Learning rate decay就是随着迭代次数增加,学习因子逐渐减小。下图中,蓝色折线表示使用恒定的学习因子
,由于每次训练
相同,步进长度不变,在接近最优值处的振荡也大,在最优值附近较大范围内振荡,与最优值距离就比较远。绿色折线表示使用不断减小的
,随着训练次数增加,
逐渐减小,步进长度减小,使得能够在最优值处较小范围内微弱振荡,不断逼近最优值。相比较恒定的
来说,learning rate decay更接近最优值。
Learning rate decay中对可由下列公式得到:
其中,decay_rate是参数(可调),epoch是训练代数。随着epoch增加,会不断变小。
除了上面计算的公式之外,还有其它可供选择的计算公式:
(指数衰减)
其中,k为可调参数,t为mini-batch number。
除此之外,还可以设置为关于t的离散值,随着t增加,
呈阶梯式减小。当然,也可以根据训练情况灵活调整当前的
值,即手动衰减,但会比较耗时间,只适用于模型数量小的时候。但学习率衰减不是优先用来优化算法的。
10.局部最优的问题
在使用梯度下降算法不断减小成本时,可能会得到局部最优解(local optima)而不是全局最优解(global optima)。之前我们对局部最优解的理解是形如碗状的凹槽,如下图左边所示。但是在神经网络中,local optima的概念发生了变化。准确地来说,大部分梯度为零的“最优点”并不是这些凹槽处,而是形如右边所示的马鞍状,称为saddle point。也就是说,梯度为零并不能保证都是convex(极小值),也有可能是concave(极大值)。特别是在神经网络中参数很多的情况下,所有参数梯度为零的点很可能都是右边所示的马鞍状的saddle point,而不是左边那样的local optimum。
类似马鞍状的plateaus(平稳段)会降低神经网络学习速度。Plateaus是梯度接近于零的平缓区域,如下图所示。在plateaus上梯度很小,前进缓慢,到达saddle point需要很长时间。到达saddle point后,由于随机扰动,梯度一般能够沿着图中绿色箭头,离开saddle point,继续前进,只是在plateaus上花费了太多时间。
总的来说,关于local optima,有两点总结:
-
只要选择合理的强大的神经网络,一般不太可能陷入local optima
-
Plateaus可能会使梯度下降变慢,降低学习速度
动量梯度下降,RMSprop,Adam算法都能有效解决plateaus下降过慢的问题,大大提高神经网络的学习速度。