3.4 Batch Size
Batch Size指的是一次训练所选取的样本数。Batch Size的大小影响模型的优化程度和速度。在理解Batch Size之前,我们先区分一下Epoch、Batch和Iteration这3个概念的差异。
(1)Epoch使用训练集的全部数据对模型进行一次完整训练,被称为“一代训练”。
(2)Batch使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新,这一小部分样本被称为“一批数据”。
(3)Iteration是使用一个Batch数据对模型进行一次参数更新的过程,被称为“一次训练”。
3.4.1 为什么需要Batch Size
在没有使用Batch Size时,网络在训练时会一次性把所有的数据输入网络中,计算得到的梯度方向更为准确,但与此同时,计算得到不同的梯度值差别巨大,难以使用一个全局的学习率,并且对于内存来说是非常大的挑战,会引起内存的爆炸。
3.4.2 如何选择Batch Size值
Batch Size的选择,会影响梯度下降的方向。
如果数据集比较小,那么可以采用全数据集的形式,好处如下。
(1)由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的梯度方向。
(2)由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。
对于更大的数据集,假如采用全数据集的形式,坏处如下。
(1)由于内存的限制,随着数据集的海量增长,一次性载入所有的数据变得越来越不可行。
(2)如果以弹性反向传播(Rprop)的方式迭代,会由于各个Batch Size之间的采样差异性,各次梯度修正值相互抵消,无法修正。这才有了后来均方根反向传播(RMSprop)的妥协方案。
下面是深度学习关于Batch Size值的选择的一些建议:假如每次只训练一个样本,即Batch Size=1。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元、非线性网络,在局部依然近似一个抛物面。此时,每次修正以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛的效果。
既然Batch Size为全数据集或Batch Size=1都各有缺点,可不可以选择一个适中的Batch Size值呢?
此时,可采用批梯度下降法(Mini-batches Learning)。因为如果数据集足够充分,那么用一半(甚至少得多)的数据训练算出来的梯度与用全部数据训练出来的梯度是几乎一样的。
3.4.3 调节Batch Size对训练效果的影响
当Batch Size太小时,模型表现效果极其糟糕,误差飙升。随着Batch Size不断增大,处理相同数据量的速度变快,但是达到相同精度所需要的Epoch数量变多。
由于上述两种因素的矛盾,当Batch Size增大到某个值时,会达到时间上的最优。最终收敛精度会陷入不同的局部极值,因此当Batch Size增大到一定程度时,会达到最终收敛精度上的最优。
3.4.4 在合理范围内增大Batch Size的好处
在合理范围内增大Batch Size有以下几个好处。
(1)内存利用率提高,大矩阵乘法的并行化效率提高。
(2)跑完一次Epoch所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
(3)在一定范围内,一般来说Batch Size越大,其确定的下降方向越准,引起的训练震荡越小。
3.4.5 盲目增大Batch Size的坏处
在合理范围内增大Batch Size有好处,但不能盲目增大,原因如下。
(1)内存利用率得到提高,但是内存容量可能撑不住。
(2)跑完一次Epoch所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
(3)Batch Size增大到一定程度,其确定的下降方向已经基本不再变化。