大家好,又见面了,我是你们的朋友全栈君。
现在很多算法都用到了batch, 这里简单说下batchsize如何设置
先来介绍下epoch、iteration、batchsize 三者区别:
batchsize:批大小,在深度学习中,一般采用SGD(随机梯度下降)训练,即每次训练在训练集中取batchsize个样本训练;
iteration:1个iteration等于使用batchsize个样本训练一次
epoch:1个epoch等于使用训练集中的全部样本训练一次
为什么要设batchsize?
1. 当数据量足够大的时候可以适当的减小batch_size,由于数据量太大,内存不够。需要设置batchsize来降低每次iteration的样本量,从而降低内存占用。 (这也是为什么很多时候我们设置sequence max len变大的时候,相应的batch size就要设小一点)
2. 全量数据噪声较少,相对稳定,梯度容易收敛到局部最优,而一定的batch会带来一些噪声和扰动,在局部最优点容易跳出。
batchsize也不能无限降低,batch_size=1时为在线学习,也是标准的SGD,这样学习,如果数据量不大,noise数据存在时,模型容易被noise带偏,如果数据量足够大,noise的影响会被“冲淡”,对模型几乎不影响。
batchsize太小会有哪些危害?
1. 会导致模型无法收敛,batchsize太小会引起梯度巨大波动,导致无法收敛
增大batchsize的好处:
1. 内存的利用率提高了,大矩阵乘法的并行化效率提高。
2. 跑完一次epoch(全数据集)所需迭代次数减少,对于相同的数据量的处理速度进一步加快。
3. 一定范围内,batchsize越大,其确定的下降方向就越准,引起训练震荡越小
batchsize过大的坏处:
1. 当数据集太大时,内存撑不住。
2. (全数据集)所需迭代次数减少了,但要想达到相同的 精度,时间开销太大,参数的修正更加缓慢。
3. batchsize增大到一定的程度,其确定的下降方向已经基本不再变化。
经验之谈:
1. batch的选择,首先决定的是下降方向,如果数据集比较小,则完全可以采用全数据集的形式。
①全数据集的方向能够更好的代表样本总体,确定其极值所在。
②由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。 (这句没太看懂)
2. batch数太小,而类别又比较多的时候,真的可能会导致loss函数震荡而不收敛,尤其是在你的网络比较复杂的时候。
增大batch size能减缓梯度震荡,需要更少的迭代优化次数,收敛的更快,但是每次迭代耗时更长。 https://zhuanlan.zhihu.com/p/31558973
3. 随着batchsize增大,处理相同的数据量的速度越快。
4. 随着batchsize增大,达到相同精度所需要的epoch数量越来越多。
5. Batch_Size 增大到某个时候,达到时间上的最优。由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。
6. 过大的batchsize的结果是网络很容易收敛到一些不好的局部最优点。同样太小的batch也存在一些问题,比如训练速度很慢,训练不容易收敛等。
7. 具体的batch size的选取和训练集的样本数目相关。
8. 设置batch的同时,一定记得数据shuffle
9. 显存占用不是和batchsize简单成正比
10. 要想收敛到同一个最优点,使用整个样本集时,虽然迭代次数少,但是每次迭代的时间长,耗费的总时间是大于使用少量样本多次迭代的情况的。
实际上,工程上在使用GPU训练时,跑一个样本花的时间与跑几十个样本甚至几百个样本的时间是一样的!当然得益于GPU里面超多的核,超强的并行计算能力啦。因此,在工程实际中,从收敛速度的角度来说,小批量的样本集是最优的,也就是我们所说的mini-batch。这时的batch size往往从几十到几百不等,但一般不会超过几千。
batch的size设置的不能太大也不能太小,因此实际工程中最常用的就是mini-batch,一般size设置为几十或者几百。
11.样本量少的时候会带来很大的方差,而这个大方差恰好会导致我们在梯度下降到很差的局部最优点(只是微微凸下去的最优点)和鞍点的时候不稳定,一不小心就因为一个大噪声的到来导致炸出了局部最优点。
与之相反的,当样本量很多时,方差很小,对梯度的估计要准确和稳定的多,因此反而在差劲的局部最优点和鞍点时反而容易自信的呆着不走了,从而导致神经网络收敛到很差的点上,跟出了bug一样的差劲。
12. 对于二阶优化算法,减小batch换来的收敛速度提升远不如引入大量噪声导致的性能下降,因此在使用二阶优化算法时,往往要采用大batch哦。此时往往batch设置成几千甚至一两万才能发挥出最佳性能。
13.GPU对2的幂次的batch可以发挥更佳的性能,因此设置成16、32、64、128…时往往要比设置为整10、整100的倍数时表现更优
参考链接:
https://blog.csdn.net/zqx951102/article/details/88918948
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127776.html原文链接:https://javaforall.cn