深度学习中的Batch Size:从基础概念到最佳实践
深度学习中的Batch Size:从基础概念到最佳实践
Batch Size是深度学习训练中一个关键的超参数,它影响着模型的训练效率和最终性能。本文将深入探讨Batch Size的作用、选择方法及其对训练过程的影响,帮助读者更好地理解这一重要概念。
1. 为什么需要Batch Size?
Batch的选择,首先决定的是下降的方向。
如果数据集比较小,可采用全数据集的形式,好处是:
- 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。
- 由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。Full Batch Learning可以使用Rprop只基于梯度符号并且针对性单独更新各权值。
对于更大的数据集,假如采用全数据集的形式,坏处是:
- 随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。
- 以Rprop的方式迭代,会由于各个Batch之间的采样差异性,各次梯度修正值相互抵消,无法修正。这才有了后来RMSProp的妥协方案。
2. Batch Size值的选择
假如每次只训练一个样本,即 Batch_Size = 1。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元、非线性网络,在局部依然近似是抛物面。此时,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。
既然Batch_Size为全数据集或者Batch_Size = 1都有各自缺点,可不可以选择一个适中的Batch_Size值呢?
此时,可采用批梯度下降法(Mini-batches Learning)。因为如果数据集足够充分,那么用一半(甚至少得多)的数据训练算出来的梯度与用全部数据训练出来的梯度是几乎一样的。
3. 在合理范围内,增大Batch Size有何好处?
- 内存利用率提高了,大矩阵乘法的并行化效率提高。
- 跑完一次epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
- 在一定范围内,一般来说Batch_Size越大,其确定的下降方向越准,引起训练震荡越小。
4. 盲目增大Batch Size有何坏处?
- 内存利用率提高了,但是内存容量可能撑不住了。
- 跑完一次epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
- Batch_Size增大到一定程度,其确定的下降方向已经基本不再变化。
5. 调节Batch Size对训练效果影响到底如何?
- Batch_Size太小,模型表现效果极其糟糕(error飙升)。
- 随着Batch_Size增大,处理相同数据量的速度越快。
- 随着Batch_Size增大,达到相同精度所需要的epoch数量越来越多。
- 由于上述两种因素的矛盾,Batch_Size增大到某个时候,达到时间上的最优。
- 由于最终收敛精度会陷入不同的局部极值,因此Batch_Size增大到某些时候,达到最终收敛精度上的最优。
6. 为什么较小的批量性能更好?
Keskar 等人对小批量和大批量之间的性能差距提出了一种解释:使用小批量的训练倾向于收敛到平坦的极小化,该极小化在极小化的小邻域内仅略有变化,而大批量则收敛到尖锐的极小化,这变化很大。平面minimizers 倾向于更好地泛化,因为它们对训练集和测试集之间的变化更加鲁棒。
此外,他们发现与大批量训练相比,小批量训练可以找到距离初始权重更远的最小值。他们解释说,小批量训练可能会为训练引入足够的噪声,以退出锐化minimizers 的损失池,而是找到可能更远的平坦minimizers。
7. Batch Size的选择经验
GPU 对 2 的幂次的 batch 可以发挥更好性能,因此设置成 16、32、64、128 … 时,往往要比设置为其他倍数时表现更优。
这只是经验,没有理论依据。
参考文献
- 深度学习500问
- ON LARGE-BATCH TRAINING FOR DEEP LEARNING: GENERALIZATION GAP AND SHARP MINIMA
- Batch Size的相关问题及如何选择Batch Size的大小 - 知乎