BatchSize是非常重要的超参数,它不仅影响训练速度,也影响模型精度。本篇来讨论如何选择BatchSize。
BatchSize是否越大越好?
BatchSize一般指同时代入训练模型的实例个数,最直接的经验是如果GPU显存不大,又设置较大的BatchSize时直接报错“cuda runtime error(2): out of memory”。
是不是只要机器性能允许,就要设置尽可能大的Batch size呢?同时训练多个实例比逐个代入单个实例训练速度又能提高多少?
下图为使用不同的batchSize,在LeNet上训练mnist数据的效果,使用的框架为Theano。
可以看到,使用较大的batchSize的确可以提速,但是batchSize大到一定程度后,效果并不十分明显。
从图中可以看到如果将所有数据全部代入一次迭代(左图),则在训练集上的代价函数下降比较平滑,如果切分成多个Batch,代价函数不一定是下降的。这是由于每一个Batch中数据的难度不同,造成了代价函数忽大忽小。
如何选择batch大小?
两种极端的情况是BatchSize大小为1,每次只训练一个实例,或者BatchSize大小等于所有训练集数据大小,即每次训练所有数据。但更多的时候BatchSize设置在二者之间。
batchSize较小时,抖动大,训练过程有很大运气的成份,可能某个实例将模型带偏了,防止被模型被带偏的方法是使用较小的学习率