机器学习应用是一个高度依赖经验并伴随着大量迭代的过程——这一句话不得不同意,经验更重要,深有体会。你需要训练诸多模型才能找到合适的那一个。深度学习没有在大数据领域发挥最大的效果,我们可以利用一个巨大的数据集来训练神经网络,而在巨大的数据集基础上训练速度很慢,因此你会发现使用快速的优化算法、使用好用的优化算法能大大提高你和团队的效率
Mini batch & gradient descent
向量化能让你有效对所有m个例子进行计算,允许你处理整个训练集而无需某个明确的公式,把训练集放到一个巨大矩阵X当中去,当m很大的时候,500万甚至5000万的时候,在对整个训练集执行梯度下降法时,必须处理整个训练集,然后才能进行一步梯度下降,然后你需要再重新处理500万个样本,才能进行下一步梯度下降法 。处理速度就会很慢。所以,你在处理完500万个样本训练之前。先让梯度下降法处理处理一部分,你的算法速度会更快。
把训练集分割为小一点的子集训练,这些子集被取名为Mini-batch,假设每个子集中只有1000个样本,那么把其中的x(1)到x(1000)取出来,称为第一个子训练集,然后再取接下来的1000个。
使用mini-batch梯度下降法,如果你作出成本函数在整个过程中的图,则并不是每次迭代都是下降的,走向朝下,但有更多的噪声,没有每次都下降不要紧,但是走势应该是向下的 。噪声产生的原因在于:也许 X{1}, Y{1} 是比较容易计算的mini-batch,因此cost会低一些,不过也许处于偶然。X{2} , Y{2}是比较难运算的mini-batch,cost会高一些,所以才会出现这些摆动。
你需要决定的变量之一是mini-batch的大小,m就是训练集的大小,极端情况下,如果mini-batch的大小等于m,其实就是batch梯度下降法,在这种极端情况下,你就有了mini-batch X{1} , Y{1},并且该mini-batch等于整个训练集,所以把mini-batch大小设为m可以得到batch梯度下降法。 另一个极端情况,假设mini-batch大小为1,就有了新的算法,叫做随机梯度下降法,每个样本都是独立的mini-batch,当你看第一个mini-batch,也就是X{1}和Y{1},如果mini-batch大小为1,它就是你的第一个训练样本。接着再看第二个mini-batch,也就是第二个训练样本,采取梯度下降步骤,然后是第三个训练样本,以此类推,一次只处理一个。 看在两种极端下成本函数的优化情况,如果这是你想要最小化的成本函数的轮廓,最小值在那里,batch梯度下降法从某处开始,相对噪声低些,幅度也大一些,你可以继续找最小值。
相反,在随机梯度下降法中,从某一点开始,我们重新选取一个起始点,每次迭代,你只对一个样本进行梯度下降,大部分时候你向着全局最小值靠近,有时候你会远离最小值,因为那个样本恰好给你指的方向不 对,因此随机梯度下降法是有很多噪声的,平均来看,它最终会靠近最小值,不过有时候也会方向错误,因为随机梯度下降法永远不会收敛,而是会一 直在最小值附近波动,但它并不会在达到最小值并停留在此。
实际上你选择的mini-batch大小在二者之间,大小在1和m之间。
相反,如果使用随机梯度下降法,如果你只要处理一个样本,那这个方法很好,这样做没有问题,通过减小学习率,噪声会被改善或有所减小,但随机梯度下降法的一大缺点是,会失去所有向量化带给你的加速,因为一次性只处理了一个训练样本,这样效率过于低下,所以实践中最好选择不大不小的mini-batch尺寸,实际上学习率达到最快。你会发现两个好处,一方面,你得到了大量向量化,如果mini-batch大小为1000个样本,你就可以对1000个样本向量化,比你一次性处理多个样本快得多。另一方面,你不需要等待整个训练集被处理完就可以开始进行后续工作,每次训练集允许我们采取5000个梯度下降步骤,所以实际上一些位于中间的mini-batch大小效果最好。
怎么选取mini-batch的大小,实际是有指导原则
- 训练集比较小
直接使用batch梯度下降法,样本集较小就没必要使用mini-batch梯度下降法,你可以快速处理整个训练集,所以使用batch梯度下降法也很好,这里的少是说小于2000个样本。 - 样本比较大
一般的mini-batch大小为64到512,考虑到电脑内存设置和使用的方式,如果mini-batch大小是2n次方,代码会运行地快一些,64就是2的6次方,以此类推,128是2的7次方,256是2的8次方,512是2的9次方。所以我经常把mini-batch大小设成2的次方。