代码笔记4 一个batch-size中的数据是怎么在神经网络中计算的
1 问题产生
今天突然被问到了这个问题。在做神经网络训练中根据训练计算的方式等等,有epoch,batch,iteration的区别。epoch代表对所有训练集进行一次迭代的过程,batch代表输入网络数据一次的数据量大小,iteration代表一次迭代(也可以指进行一次梯度下降的过程)。可能有些人会觉得奇怪,batch和iteration的区别在哪里呢,一般来说一个batch不就会进行一次梯度下降吗。因为有梯度累加(Gradient Accumulation)[1]这个概念存在,这是为了我们这些没那么大显存显卡的人准备的trick哈哈哈。为了通过梯度累加的方式增加batch-size的大小,在每一次反向传播计算完梯度后并不马上进行梯度下降,也不对梯度图进行归零,而是直接进行下一个batch的梯度计算。将几次batch的梯度累加后,再进行梯度下降。举一个例子,一个有1000张图的数据集,batch-size为8,gradient -accumulation累加次数为4.当我们通过一次次的梯度下降完成对1000张图的遍历后,我们称之为一个epoch。当我们将一个batch-size大小的数据传递进网络时,这个过程被称为输入一个batch。我那个是我们通过累计4次batch的梯度后,乘以学习率进行梯度下降后,这个过程被称为一个iteration。
但是一个batch内的数据是如何在网络里传递的呢?我们的网络都是根据一张图所涉及的,一个batch数据的处理是并行的还是串行的呢。如果是并行,那显然需要加载多个重复的模型,这样对显存的要求显然太高了,我们平时训练也不会因为稍微调大一点batch-size就增大很多显存。如果是串行,那这个过程就类似于梯度累加了,为何不直接用梯度累加呢,而且通过这样的方式,如何去进行BatchNormalization的操作呢?
2 一种解释
神经网络的每一层,会一次性算完这N张图。[2]我觉得这个是有道理的,这样也不会影响BatchNormalization的计算。至于究竟是怎么样,以后再探究。
References
[1]https://www.cnblogs.com/sddai/p/14598018.html
[2]https://www.zhihu.com/question/362913743/answer/958443460