1.Mini-batch梯度下降法
机器学习的应用是高度依赖经验的过程,伴随着大量迭代的过程,你需要训练诸多模型,才能找到合适的那一个。优化算法能够帮助你快速训练模型。
深度学习没有在大数据领域发挥最大的效果,现在很容易去获取大数据集,但在大数据集基础上训练速度很慢,需要使用快速的优化算法,大大提高个人和团队的效率。
之前介绍过,向量化能有效地同时对m个例子进行计算,允许同时去处理整个训练集,而不需要不断for循环很缓慢去计算。即是把训练样本放入一个大矩阵中X=[…],把标签也放入一个大矩阵Y=[…]。
向量化能够相对较快的去处理所有的m个样本,但是m很大的话,处理速度仍然缓慢。比如有500万个样本,你需要处理完500万个样本后才能进行下一步梯度下降。
我们可以先向量化处理部分样本,到下一步梯度下降再向量化处理另外部分样本,这样梯度下降算法收敛速度就会很快。
把训练集分割成小一点的训练集,这些子集就是mini-batch。假设每个子集大小是1000个样本,则=[…]为第一个子集,= […]为第二个子集等,维数为(,1000);标签也类似分割,=[…],=[…],维数为(1,1000)。
统一符号:表示第i个样本,表示第l层的z值,表示第t个mini-batch。
如图6.2,mini-batch完整过程为:
假设5000万样本,每个mini-batch为1000,总迭代数为50,
for in range(0,50):
for j in range(0,5000):
步骤1:是向量化梯度下降
步骤2:是计算成本函数
步骤3:是反向计算
其实,mini-batch比batch多了for j in range(0,5000):这一步而已,每一次迭代batch就一次梯度下降,而mini-batch有5000次梯度下降。
2.理解Mini-batch梯度下降法
在batch中,每次梯度下降都对应全部训练集,成本函数值肯定是伴随着迭代逐渐减少,如果出现增大那么算法肯定有问题,比如设置学习率过大。而在mini-batch中,每次梯度下降不是对应全部训练集,每个子集都不一样从而计算出的成本函数结果会不同,即会产生噪声,成本函数值会出现忽高忽低,波动下降,但总体走势是向下的。
如图6.4,先说两个极端,
当mini-batch尺寸为m时,那么mini-batch就变成batch,梯度下降线路基本是顺滑往前的(蓝色);
当mini-batch尺寸为1时,每个样本就是一个子集,这样会有很大噪声(可以减少学习率减少噪声),梯度下降线路就会曲曲折折很难收敛(紫色),这样做就失去了向量化带来的加速,效率过于低下;
在实践中应该选择不大不小的mini-batch尺寸,这样既可以得到向量化的加速,还不用每次迭代都计算全部训练集。
关于mini-batch尺寸的选择:
如果训练集很小(<2000样本),就直接使用batch梯度下降;对于大的训练集则根据计算机内存选择mini-batch尺寸64()、128()、256()、512()。
3.指数加权平均
还有几种可以加快训练模型的优化方法,在这之前,先介绍下指数加权平均(统计学中叫指数加权移动平均)。
加权移动平均就是根据同一个移动段内不同时间的数据对预测值的影响程度,分别给予不同的权数,然后再进行平均移动以预测未来值。
加权移动平均不像简单移动平均法那样,在计算平均值时对移动期内的数据同等看待,而是根据愈是近期数据对预测值影响愈大这一特点,不同地对待移动期内的各个数据。对近期数据给予较大的权数,对较远的数据给予较小的权数。
指数加权移动平均类似加权移动平均,不过在指数加权移动平均的计算方法中,包括的不是一段数据,而是所有历史数据,对全部历史价格数据分配了逐步减少的权重。每一个数据的权重都对后来的一个数据的权重按照指数形式递减,因此,这种方法就得到了所谓指数加权移动平均的名称。
如图6.5,设=0,则第一天指数加权平均为=0.9 +0.1,第二天指数加权平均为=0.9+0.1 …第t天指数加权平均为=0.9+0.1,0.9和0.1是人为设定的权值,连线,,…,就是伦敦的一年的温度趋势(红线),可通过该趋势预测明年温度变化。
如图6.5,把上面的权值0.9用β表示,则=β-1+(1-β),约等于最近1/(1-β)天的温度指数加权平均值,
当β=0.9时,约等于最近10天的温度平均值,趋势线为红色;
当β=0.98时,约等于最近50天的温度平均值,趋势线为绿色,此时的趋势线比较缓和平滑,但会右移,出现一定延迟;
当β=0.5时,约等于最近2天的温度平均值,趋势线为黄色,此时趋势线波动非常大,算的平均值很可能出现异常值,但该趋势线能更快适应温度变化。
β是非常重要的参数,往往中间某个值效果更好,比如β=0.9时的红线相对更好平均了温度。
4.理解指数加权平均
如图6.7,设β=0.9,展开指数加权平均=0.1 + 0.1*0.9+0.1*(0.9)2+…,可以看出权重成指数级递减,约等于<1/e即最近1/(1-β)天指数加权平均。
比如当β=0.9,≈1/e,约等于最近10天1/(1-β)=10 指数加权平均;
当β=0.98,≈1/e,约等于最近50天1/(1-β)=50 指数加权平均。
如图6.7,在实际应用中,计算指数加权平均步骤为:先设定=0,然后计算,,,…,只占一行代码节约内存运算快,当然结果没有算数平均那么精准,但是从计算和内存效率来说这是个很好的方法。
5.指数加权平均的偏差修正
为了使指数加权平均计算结果更加精确,我们需要加入偏差修正。如图6.9,实际上当β=0.98时得到的不是绿线,而是紫线,起点偏低。为了得到绿线,应使/(1-),t越小对影响越大,t越大对影响越小,最终得到的是绿线。
6.动量(Momentum)梯度下降
有一种方法叫动量梯度下降,收敛速度快于一般梯度下降。该方法一句话说明就是:先计算梯度的指数加权平均数,并利用该指数加权平均数更新权重。
如图6.10,假设红点是最低点,无论是batch还是mini-batch,下降过程中都是像蓝线一样不断摆动,从而无法使用过大学习率。而动量梯度下降能都很大程度减少摆动,收敛路线为红线,动量梯度下降过程为:
先计算出dw、db,
然后计算指数加权平均=β-(1-β)dw,=β-(1-β)db,
最后w=w-α,b=b-α。
其他步骤和一般梯度下降一样,梯度下降过程中每一步不再是独立的,而是受前面梯度的制约,
在纵轴(摆动方向)通过指数加权平均后接近零,
而在横轴(收敛方向)由于dw、db总是和横轴方向一致,所以通过指数加权平均后依旧很大,相当于给横轴方向增加了动量,从而快速地收敛。
在实际应用中,可以不使用指数加权平均的偏差修正,因为经过十次左右的指数加权平均后,计算的结果就会恢复正常值。
7.RMSprop
还有一种方法叫RMSprop,全称是root mean square prop,也可以加速梯度下降。
RMSprop梯度下降过程为:
先计算出dw、db,
然后计算平方项指数加权平均=β-(1-β),=β-(1-β),平方是为了避免出现负数,只是为了增大或减小α,不改变正负,
最后w=w-(α/√(+ε))*dw,b=b-(α/√(+ε))*db,为防止、为零,一般会加上值为的ε,
其他步骤和一般梯度下降一样,从α/√(+ε)、α/√(+ε)可以看出,RMSprop梯度下降原理是梯度大则让学习率小,梯度小则让学习率大,从而让收敛过程的摆动减小。
8.Adam优化算法
Adam优化算法是由Momentum和RMSprop结合而成,适合各种类型神经网络,是圈内普遍认可的优化算法。
Adam梯度下降过程为:
先初始化=0,=0,=0,=0,
接着计算出dw,db,
接着计算=-(1-)dw,=-(1-)db,
=-(1-),=-(1-),
接着偏差修正=/(1-),=/(1-),
=/(1-),=/(1-),
最后w=w-(α/√(+ε))*,b=b-(α/√(+ε))*。
上面过程涉及到的超参数有:
学习率α,需要不断尝试不同值找到最适合的值;
Momentum的β1,一般设置为0.9,
RMSProp的β2,一般设置为0.999,
ε就无所谓了,给个即可。
9.学习率衰减
加快学习还有一个办法就是,随着时间慢慢减少学习率,称之为学习率衰减。
如图6.13,如果学习率一直不变并且一直很大,那么神经网络就会在最低点附近大步跨越很难收敛到最低点,如图中蓝线;正确做法是一开始设置较大学习率,然后慢慢减小,那么久很容易找到最低点,如图中绿线。
对于学习率衰减的方法可以使用公式α=(1 / (1 + decay-rate * epoch-num)) * 。其中decay-rate是衰减率,epoch-num是迭代代数,是一开始设定的学习率。
还有其他学习率衰减方法,比如让学习率呈指数下降的α=*;比如某常数除于代数的平方根α= (K /√epoch-num) * ,或者某常数除于mini-batch的次数t的平方根α= (K /√t) * ;比如学习率离散下降;比如手动调整学习率,训练过程中每隔段时间就手动调整一次学习率。
10.局部最优的问题
如图6.16左图所示,在深度学习初期,总会担心算法会有局部最优问题,算法会在困在某个局部最优,而无法到达全局最优。
实际上这种情况是不用担心的,在高维空间上比如有20000个参数,那么形成局部最低点的情况是每个参数的图像都是U形状,即可能性是,这显然微乎其微。大多数遇到的是鞍点,即该点有参数是U形状,有的是∩形状。
鞍点是不会导致局部最优问题的,当算法走到鞍点时,会朝∩形状方向走。鞍点也不会使学习变慢,因为会有Adam等优化算法在平缓阶段加速前进。