Batch 的选择,首先决定的是下降的方向。那么越准确的数据量,决定的梯度下降的方向就越准确,对于小的数据集来说,batch size可以选择全部数据集大小,但是对于大的数据集来说,如果batch size选择的过大,将导致运行内存不足,无法训练下去等问题。对于在线学习的数据集,我们把batch size设置为1。
Batch_size不宜选的太小,太小了容易修正方向导致不收敛,或者需要经过很大的epoch才能收敛;也没必要选的太大,太大的话首先显存受不了,其次可能会因为迭代次数的减少而造成参数修正变的缓慢。如果数据集足够充分,那么用一半(甚至少得多)的数据训练算出来的梯度与用全部数据训练出来的梯度是几乎一样的。
在一定范围内增大Batch_size有哪些好处呢?
1、 提高了内存的利用率,大矩阵乘法的并行化效率提高
2、 运行一次epoch所需要的迭代次数减少,相同数据量的数据处理速度加快。
3、 Batch_size越大下降方向越准,引起的训练震荡越小。
但是容易造成内存溢出、训练时间增加、收敛缓慢、局部最优,泛化性差等问题
Batch_size对训练效果有何影响?
1.如果Batch_Size 太小,算法将在相当多的epoch内不收敛。
2.随着 Batch_Size 增大,处理相同数据量的速度越快。达到相同精度所需要的 epoch 数量越来越多。
由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。
问题1、batchsize已经取了很小了但是仍然出现训练困难,内存不够的问题,主要有以下几种原因:
1、模型太过复杂,复杂的模型容易占用大量的内存。
2、使用nvida-smi命令来查看是否有其他占用内存的程序在运行。
3、train和test的batchsize都要改成一致的。
4、图片太大,导致无法训练下去。