关于深度学习中的batch_size
5.4.1 关于深度学习中的batch_size
举个例⼦:
例如,假设您有1050个训练样本,并且您希望设置batch_size等于100.该算法从训练数据集中获取前100个样本(从第1到第100个)并训练⽹络。接下来,它需要第⼆个100个样本(从第101到第200)并再次训练⽹络。我们可以继续执⾏此过程,直到我们通过⽹络传播所有样本。最后⼀组样本可能会出现问题。在我们的例⼦中,我们使⽤了1050,它不能被100整除,没有余数。最简单的解决⽅案是获取最终的50个样本并训练⽹络。最终⽬的:
通过⼀批⼜⼀批的样本去优化参数
使⽤批量⼤⼩的优点<所有样本的数量:
它需要更少的内存。由于您使⽤较少的样本训练⽹络,因此整体训练过程需要较少的内存。如果您⽆法将整个数据集放⼊机器的内存中,那么这⼀点尤为重要。
通常,⽹络通过⼩批量训练更快。那是因为我们在每次传播后更新权重。在我们的例⼦中,我们已经传播了11批(其中10个有100个样本,1个有50个样本),在每个批次之后我们更新了⽹络的参数。如果我们在传播过程中使⽤了所有样本,我们只会对⽹络参数进⾏1次更新。使⽤批量⼤⼩的缺点<所有样本的数量:
批次越⼩,梯度的估计就越不准确。在下图中,您可以看到⼩批量渐变(绿⾊)的⽅向与完整批次渐变(蓝⾊)的⽅向相⽐波动更⼤。
batch_size可以理解为批处理参数,它的极限值为训练集样本总数,当数据量⽐较少时,可以将batch_size值设置为全数据集(Full batchcearning)。
实际上,在深度学习中所涉及到的数据都是⽐较多的,⼀般都采⽤⼩批量数据处理原则。⼩批量训练⽹络的优点:
相对海量的的数据集和内存容量,⼩批量处理需要更少的内存就可以训练⽹络。
通常⼩批量训练⽹络速度更快,例如我们将⼀个⼤样本分成11⼩样本(每个样本100个数据),采⽤⼩批量训练⽹络时,每次传播后更新权重,就传播了11批,在每批次后我们均更新了⽹络的(权重)参数;如果在传播过程中使⽤了⼀个⼤样本,我们只会对训练⽹络的权重参数进⾏1次更新。
全数据集确定的⽅向能够更好地代表样本总体,从⽽能够更准确地朝着极值所在的⽅向;但是不同权值的梯度值差别较⼤,因此选取⼀个全局的学习率很困难。⼩批量训练⽹络的缺点:
批次越⼩,梯度的估值就越不准确,在下图中,我们可以看到,与完整批次渐变(蓝⾊)⽅向相⽐,⼩批量渐变(绿⾊)的⽅向波动更⼤。
极端特例batch_size = 1,也成为在线学习(online learning);线性神经元在均⽅误差代价函数的错误⾯是⼀个抛物⾯,横截⾯是椭圆,对于多层神经元、⾮线性⽹络,在局部依然近似是抛物⾯,使⽤online learning,每次修正⽅向以各⾃样本的梯度⽅向修正,这就造成了波动较⼤,难以达到收敛效果。如下图所⽰
stochastic(红⾊)表⽰在线学习,batch_size = 1;mini_batch(绿⾊)表⽰批梯度下降法,batch_size = 100;batch(蓝⾊)表⽰全数据集梯度下降法,batch_size = 1100;
从图上可以发现,batch_szie=1 较 batch_size=100 的波动性更⼤。
设置mini_batch⼤⼩是⼀种艺术,太⼩时可能会使学习过于随机,虽然训练速率很快,但会收敛到不可靠的模型;mini_batch过⼩时,⽹络训练需要很长时间,更重要的是它不适合记忆。
如何选择合适的batch_size值:
采⽤批梯度下降法mini batch learning时,如果数据集⾜够充分,⽤⼀半(甚⾄少的多)的数据训练算出来的梯度与全数据集训练fullbatch learning出来的梯度⼏乎⼀样。
在合理的范围内,增⼤batch_size可以提⾼内存利⽤率,⼤矩阵乘法的并⾏化效率提⾼;跑完⼀次epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进⼀步加快;在适当的范围内,batch_size越⼤,其确定的下降⽅向越准,引起训练波动越⼩。注意,当batch_size增⼤到⼀定程度,其确定的下降⽅向基本不会变化。
batch_size值增⼤到超过合理范围时,和全数据训练full batch learning就会表现出相近的症候;内存容量占有率增加,跑完⼀次epoch(全数据集)所需的迭代次数减少,达到相同的精度所耗损的时间增加,从⽽对参数的修正也就显得更加缓慢。调节 Batch_Size 对训练效果影响到底如何?
这⾥跑⼀个 LeNet 在 MNIST 数据集上的效果。MNIST 是⼀个⼿写体标准库
运⾏结果如上图所⽰,其中绝对时间做了标准化处理。运⾏结果与上⽂分析相印证:
batch_size 太⼩,算法在 200 epoches 内不收敛。随着 batch_size 增⼤,处理相同数据量的速度越快。
随着 batch_size 增⼤,达到相同精度所需要的 epoch 数量越来越多。
由于上述两种因素的⽭盾,batch_size 增⼤到某个时候,达到时间上的最优。
由于最终收敛精度会陷⼊不同的局部极值,因此batch_size 增⼤到某些时候,达到最终收敛精度上的最优。