mini_batch梯度下降法

一.概述

向量化能够让你有效地对所有m个样本进行计算,允许你处理整个训练集,而无需某个明确的公式。所以我们要把训练样本放大巨大的矩阵X当中去,X= \lbrack x^{(1)}\ x^{(2)}\ x^{(3)}\ldots\ldots x^{(m)}\rbrack,Y也是如此,Y= \lbrack y^{(1)}\ y^{(2)}\ y^{(3)}\ldots \ldots y^{(m)}\rbrack,所以X的维数是,(n_{x},m)Y的维数是(1,m),向量化能够让你相对较快地处理所有m个样本。如果m很大的话,处理速度仍然缓慢。比如说,如果m是500万或5000万或者更大的一个数,在对整个训练集执行梯度下降法时,你要做的是,你必须处理整个训练集,然后才能进行一步梯度下降法,然后你需要再重新处理500万个训练样本,才能进行下一步梯度下降法。所以如果你在处理完整个500万个样本的训练集之前,先让梯度下降法处理一部分,你的算法速度会更快,准确地说,这是你可以做的一些事情。

你可以把训练集分割为小一点的子集训练,这些子集被取名为mini-batch,假设每一个子集中只有1000个样本,那么把其中的x^{(1)}x^{(1000)}取出来,将其称为第一个子训练集,也叫做mini-batch,然后你再取出接下来的1000个样本,从x^{(1001)}x^{(2000)},然后再取1000个样本,以此类推。

接下来我要说一个新的符号,把x^{(1)}$到$x^{(1000)}称为X^{​{1}}x^{(1001)}x^{(2000)}称为X^{​{2}},如果你的训练样本一共有500万个,每个mini-batch都有1000个样本,也就是说,你有5000个mini-batch,因为5000乘以1000就是5000万。

梯度下降过程 

mini-batch下降过程 

mini-batch实现步骤:

1.确定mini-batch size,一般有32、64、128等,按自己的数据集而定,确定mini-batch_num=m/mini-batch_num + 1;
2.在分组之前将原数据集顺序打乱,随机打乱;
3.分组,将打乱后的数据集分组;
4.将分好后的mini-batch组放进迭代循环中,每次循环都做mini-batch_num次梯度下降。

 

 mini_batch梯度下降法_第1张图片

 使用batch梯度下降法,一次遍历训练集只能让你做一个梯度下降,使用mini-batch梯度下降法,一次遍历训练集,能让你做5000个梯度下降。当然正常来说你想要多次遍历训练集,还需要为另一个while循环设置另一个for循环。所以你可以一直处理遍历训练集,直到最后你能收敛到一个合适的精度。

二.理解

mini_batch梯度下降法_第2张图片

使用batch梯度下降法时,每次迭代你都需要历遍整个训练集,可以预期每次迭代成本都会下降,所以如果成本函数J是迭代次数的一个函数,它应该会随着每次迭代而减少,如果J在某次迭代中增加了,那肯定出了问题,也许你的学习率太大。

使用mini-batch梯度下降法,如果你作出成本函数在整个过程中的图,则并不是每次迭代都是下降的,特别是在每次迭代中,你要处理的是X^{​{t}}Y^{​{ t}},如果要作出成本函数Y^{​{ t}}的图,而J^{​{t}}只和X^{​{ t}},Y^{​{t}}Y^{​{ t}}有关,也就是每次迭代下你都在训练不同的样本集或者说训练不同的mini-batch,如果你要作出成本函数J的图,你很可能会看到这样的结果,走向朝下,但有更多的噪声,所以如果你作出J^{​{t}}的图,因为在训练mini-batch梯度下降法时,会经过多代,你可能会看到这样的曲线。没有每次迭代都下降是不要紧的,但走势应该向下,噪声产生的原因在于也许X^{​{ t}},Y^{​{t}}Y^{​{ t}}是比较容易计算的mini-batch,因此成本会低一些。不过也许出于偶然,X^{​{ t}},Y^{​{t}}Y^{​{ t}}是比较难运算的mini-batch,或许你需要一些残缺的样本,这样一来,成本会更高一些,所以才会出现这些摆动,因为你是在运行mini-batch梯度下降法作出成本函数图。

batch_size

 
m 梯度下降(batch gradient descent)
1 随机梯度下降(Stochastic gradient descent)
<1batch_size 小批量梯度下降(mini-batch gradient descent)

1.如果mini-batch的大小等于m,其实就是batch梯度下降法,在这种极端情况下,你就有了mini-batch X^{​{1}}Y^{​{ 1}},并且该mini-batch等于整个训练集,所以把mini-batch大小设为m可以得到batch梯度下降法。 

2.假设mini-batch大小为1,就有了新的算法,叫做随机梯度下降法,每个样本都是独立的mini-batch,当你看第一个mini-batch,也就是X^{​{1}}Y^{​{ 1}},如果mini-batch大小为1,它就是你的第一个训练样本,这就是你的第一个训练样本。接着再看第二个mini-batch,也就是第二个训练样本,采取梯度下降步骤,然后是第三个训练样本,以此类推,一次只处理一个。

看在两种极端下成本函数的优化情况,如果这是你想要最小化的成本函数的轮廓,最小值在那里,batch梯度下降法从某处开始,相对噪声低些,幅度也大一些,你可以继续找最小值。

相反,在随机梯度下降法中,从某一点开始,我们重新选取一个起始点,每次迭代,你只对一个样本进行梯度下降,大部分时候你向着全局最小值靠近,有时候你会远离最小值,因为那个样本恰好和你指的方向不对,因此随机梯度下降法是有很多噪声的,平均来看,它最终会靠近最小值,不过有时候也会方向错误,因为随机梯度下降法永远不会收敛,而是会一直在最小值附近波动,但它并不会在达到最小值并停留在此。

实际上你选择的mini-batch大小在二者之间,大小在1和m之间,而1太小了,m太大了,原因在于如果使用batch梯度下降法,mini-batch的大小为m,每个迭代需要处理大量训练样本,该算法的主要弊端在于特别是在训练样本数量巨大的时候,单次迭代耗时太长。如果训练样本不大,batch梯度下降法运行地很好。

 相反,如果使用随机梯度下降法,如果你只要处理一个样本,那这个方法很好,这样做没有问题,通过减小学习率,噪声会被改善或有所减小,但随机梯度下降法的一大缺点是,你会失去所有向量化带给你的加速,因为一次性只处理了一个训练样本,这样效率过于低下,所以实践中最好选择不大不小的mini-batch尺寸,实际上学习率达到最快。你会发现两个好处,一方面,你得到了大量向量化,如果mini-batch大小为1000个样本,你就可以对1000个样本向量化,比你一次性处理多个样本快得多。另一方面,你不需要等待整个训练集被处理完就可以开始进行后续工作,每次训练集允许我们采取5000个梯度下降步骤,所以实际上一些位于中间的mini-batch大小效果最好。

mini-batch梯度下降法,我们从这里开始,一次迭代这样做,两次,三次,四次,它不会总朝向最小值靠近,但它比随机梯度下降要更持续地靠近最小值的方向,它也不一定在很小的范围内收敛或者波动,如果出现这个问题,可以慢慢减少学习率。

三.batch_size的选取原则

m batch_size
<2000 batch_size=m,即采用batch梯度下降法
>2000 batch_size=64,128,256,512          mini-batch梯度下降法

最后需要注意的是你的mini-batch要确保符合CPU/GPU内存,这取决于你的应用方向以及训练集的大小。如果你处理的mini-batchCPU/GPU内存不相符,不管你用什么方法处理数据,你会注意到算法的表现急转直下变得惨不忍睹。

你可能感兴趣的:(deep,learning)