epoch
当一个完整的数据集经过神经网络一次,并返回一次,这个过程称为一个epoch
为什么需要多个epoch
在深度学习中,向神经网络传递整个数据集一次是远远不够的,而需要多次在神经网络上训练。从欠拟合的状态向适当拟合靠近。当然也有可能会过拟合。也就是说不同的数据集,最适合的epoch是不同的,会受到数据集多样性的影响。
batch
当数据集很大的时候,对于每个epoch,很难把所有的数据集一次读入到内存中,这时候需要将数据集分为几次毒人,每次称为一个batch
batch size
mini-batch
批梯度下降(batch gradient decent)
这种方法每次使用整个batch计算损失,调整参数。性能相对较好,但是计算量大,速度慢。
随机梯度下降(stochastic gradient decent)
每次随机选取一个数据调整参数,计算很快,但是收敛性能不好,容易在嘴有点附近震荡。
小批量梯度下降(mini-batch gradient decent)
这里值得是一种梯度下降的方法,算是融合了上述两种方法的优点。也就是说把batch再次分为小batch,在小batch上梯度下降
batch size对训练的影响
这里还涉及到batch normalization。后续需要继续研究。
在不考虑bn的情况下,batch size的大小影响了深度学习训练过程中的完成每个epoch所需要的时间和每次迭代iteration之间梯度的平滑程度。
对于一个大小为N的训练集,如果每个epoch中mini-batch的采样方法采用最常规的N个样本每个都采样一次,设mini-batch为b,那么每个epoch所需要的迭代次数(正向+反向)为N/b次,因此完成每个epoch所需的时间大致也随着迭代次数的增加而增加。
由于目前主流深度学习框架处理mini-batch的反向传播时,默认都是先将每个mini-batch中每个instance得到的loss平均化之后再反求梯度,也就是每次反向传播的梯度是对mini-batch中每个instance的梯度平均之后的结果,所以b的大小决定了相邻迭代之间的梯度平滑程度。b太小,相邻mini-batch之间的差异相对过大,那么相邻两次迭代的梯度震荡情况会比较严重,不利于收敛;b越大,相邻mini-batch之间的差异相对越小,虽然梯度震荡情况会比较小,一定程度上利于模型收敛,但如果b极端大,相邻mini-batch之间的差异过小,相邻两个mini-batch的梯度就没有区别了,整个训练过程就是沿着一个方向蹭蹭往下走,很容易陷入到局部最小值出不来。
总结下来:batchsize过小,同时梯度震荡严重,不利于收敛;batch size过大,不同batch的梯度方向没有任何变化,容易陷入局部最小值
https://zhuanlan.zhihu.com/p/78673818
https://zhuanlan.zhihu.com/p/83626029