batch 概念:训练时候一批一批的进行正向推导和反向传播。一批计算一次loss框架
mini batch:不去计算这个batch下全部的iter,仅计算一部分iter的loss平均值代替全部的。学习
如下来源:知乎orm
做者:陈志远资源
(1) 不考虑bn的状况下,batch size的大小决定了深度学习训练过程当中的完成每一个epoch所需的时间和每次迭代(iteration)之间梯度的平滑程度。(感谢评论区的韩飞同窗提醒,batchsize只能说影响完成每一个epoch所须要的时间,决定也算不上吧。根本缘由仍是CPU,GPU算力吧。瓶颈若是在CPU,例如随机数据加强,batch size越大有时候计算的越慢。)深度学习
对于一个大小为N的训练集,若是每一个epoch中mini-batch的采样方法采用最常规的N个样本每一个都采样一次,设mini-batch大小为b,那么每一个epoch所需的迭代次数(正向+反向)为 , 所以完成每一个epoch所需的时间大体也随着迭代次数的增长而增长。it
因为目前主流深度学习框架处理mini-batch的反向传播时,默认都是先将每一个mini-batch中每一个instance获得的loss平均化以后再反求梯度,也就是说每次反向传播的梯度是对mini-batch中每一个instance的梯度平均以后的结果,因此b的大小决定了相邻迭代之间的梯度平滑程度,b过小,相邻mini-batch间的差别相对过大,那么相邻两次迭代的梯度震荡状况会比较严重,不利于收敛;b越大,相邻mini-batch间的差别相对越小,虽然梯度震荡状况会比较小,必定程度上利于模型收敛,但若是b极端大,相邻mini-batch间的差别太小,相邻两个mini-batch的梯度没有区别了,整个训练过程就是沿着一个方向蹭蹭蹭往下走,很容易陷入到局部最小值出不来。io
总结下来:batch size太小,花费时间多,同时梯度震荡严重,不利于收敛;batch size过大,不一样batch的梯度方向没有任何变化,容易陷入局部极小值。form
(2)(存疑,只是突发奇想)若是硬件资源容许,想要追求训练速度使用超大batch,能够采用一次正向+屡次反向的方法,避免模型陷入局部最小值。即便用超大epoch作正向传播,在反向传播的时候,分批次作屡次反向转播,好比将一个batch size为64的batch,一次正向传播获得结果,instance级别求loss(先不平均),获得64个loss结果;反向传播的过程当中,分四次进行反向传播,每次取16个instance的loss求平均,而后进行反向传播,这样能够作到在节约必定的训练时间,利用起硬件资源的优点的状况下,避免模型训练陷入局部最小值。随机数
较小的batchsize,要设置小lr的缘由之一,避免异常值对结果形成的扰巨大扰动。而对于较大的batchsize,要设置大一点的lr的缘由则是大batch每次迭代的梯度方向相对固定,大lr能够加速其收敛过程。硬件