首先,batch_size(批尺寸)是机器学习中一个重要参数,涉及诸多矛盾,下面逐一展开。
为什么要有Batch_Size这个参数
Batch的选择,首先决定了下降的方向。如果数据集比较小,完全可以采用全数据集(Full Batch Learning)的形式,这样做至少有两点好处:1、由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在方向。2、由于不同权重的梯度值差别巨大,因此选择一个全局的学习率很困难。Full Batch Learning 可以使用Rprop只基于梯度符号并且针对性单独更新各权值。
对于更大的数据集,以上2个好处又变成了2个坏处:1、随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行;2、随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。
既然Full Batch Learning并不适合大数据集,那么走向另一个极端会怎样?
所谓另一个极端,就是每次只训练一个样本,即Batch_Size = 1。这就是在线学习(Online Learning)。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元、非线性网络,在局部依然是近似抛物面。使用在线学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为攻。难以达到收敛。
那么可不可以选择一个适中的Batch_Size值呢?
当然可以,这就是批梯度下降法(Mini-batches Learning)。因为如果数据集足够充分,那么用一半(甚至少的多)的数据训练算出来的梯度与用全部数据训练出来的梯度几乎是一样的。
在合理范围内,增大Batch_Size有何好处?
内存利用率提高了,大矩阵乘法的并行化效率提高。
跑完一次epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
在一定范围内,一般来说Batch_Size越大,其确定的下降方向越准,引起训练震荡越小。
盲目增大Batch_Size有何坏处?
内存利用率提高了,但是内存容量可能撑不住了。
跑完一次epoch(全数据集)所需的迭代次数减少,要达到相同的精度,其花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
Batch_Size增大到一定程度,其准确定的下降方向已经基本不再变化。
网友评论