为啥训练的时候要分batch

从梯度下降开始谈起:

  梯度下降的每一轮迭代下,要计算所有数据的损失函数值,然后计算每个参数的偏导数,来求出目前的梯度方向。但是在计算损失函数的过程中,需要把每个数据点都计算出来,有的时候,数据可能有几百万甚至更多,这个时候可能迭代速度就会明显下降下来了。所有这个时候有了一种 mini-batch gradient descent 小批量梯度下降,把数据分成一个一个的batch,然后每计算一个batch,就更新一次梯度,也就是说现在梯度下降中,每次迭代不是计算全部数据的损失函数,而是一个batch的损失函数。这样可以加快训练的速度,还有模型收敛的速度。因为以前要把所有数据都过一遍模型才能得到更新,现在模型的更新更频繁了。

而且另外一个好处就是,也更容易实现并行计算,两台服务器拿不同的两个batch可以分别计算梯度,这个就是为什么要使用batch的原因。

Stochastic Gradient Desent(SGD)--随机梯度下降,这种就是小批量梯度下降的特例,就是batch size = 1时,每次只随机采样一个数据点,但是这样很不稳定。PyTorch里的SGDOptimizer 应该指的是mini-batch gradient descent,然后就是关于batch的一些其他信息,一般batch是64的倍数或者因子(就是32,18之类的)。这是因为使用GPU的时候,把batch size 设置长64的倍数,对于底层硬件可以更快的计算。

batch size : batch size 也不是随便取的,它的大小会影响模型训练的结果。如果Batch size太小,比如极端情况下,取1,那么每个batch的梯度会很不一样,导致模型训练过程震荡很严重。如果batch size 太大了,会导致每个batch中可能存在各种的数据,也就导致了每个batch之间没有太多分别,因此梯度就只朝向一个方向去了,然后陷入了局部最优解。

  一个合适的batch size,不仅要平衡计算效率,还要让每个batch的数据有一定的独特性,让模型在训练的过程中有一定的探索性,这样就不会陷入局部最优解。batch太相似,实际上指的是因为数据量太大了,两个batch数据的概率分布已经相似了。

batch参考链接:

https://zhuanlan.zhihu.com/p/86529347
 

你可能感兴趣的:(深度学习图像处理)