深度学习中batch_size设置大小在神经网络训练中的影响
深度学习中batch_size设置大小在神经网络训练中的影响
1.首先介绍Batch Normalization(BN/批标准化)的概念
传统的神经网络,只是在将样本x输入输入层之前对x进行标准化处理,以降低样本间的差异性。BN是在此基础上,不仅仅只对输入层的输入数据x进行标准化,还对每个隐藏层的输入进行标准化
那什么是标准化呢?
标准化使得不同的特征具有相同的尺度(Scale)经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:
x’=(x-u)/&,其中μ为所有样本数据的均值,&为所有样本数据的标准差
需要说明的事并不是任何问题都必须事先把原始数据进行规范化 , 也就是数据规范化这一步并不是必须要做的 , 要具体问题具体看待。比如视频人体行为识别就不需要标准化,他的数据格式都是一样的
- Covariate Shift问题
Convariate shift是BN论文作者提出来的概念,指的是具有不同分布的输入值对深度网络学习的影响。当神经网络的输入值的分布不同是,我们可以理解为输入特征值的scale差异较大,与权重进行矩阵相乘后,会产生一些偏离较大地差异值;而深度学习网络需要通过训练不断更新完善,那么差异值产生的些许变化都会深深影响后层,偏离越大表现越为明显;因此,对于反向传播来说,这些现象都会导致梯度发散,从而需要更多的训练步骤来抵消scale不同带来的影响,也就是说,这种分布不一致将减缓训练速度。
而BN的作用就是将这些输入值进行标准化,降低scale的差异至同一个范围内。这样做的好处在于一方面提高梯度的收敛程度,加快模型的训练速度;另一方面使得每一层可以尽量面对同一特征分布的输入值,减少了变化带来的不确定性,也降低了对后层网路的影响,各层网路变得相对独立,缓解了训练中的梯度消失问题。
(因此总结起来,BN的作用主要有)
3. BN的作用
缓解DNN训练中的梯度消失问题
加快模型的训练速度
(1) 不考虑bn的情况下,batch size的大小影响完成每个epoch所需要的时间,根本原因还是CPU,GPU算力。
对于一个大小为N的训练集,其中假设mini-batch大小为b(就是有几个batch),那么每个epoch所需的迭代次数(正向+反向)为N/b(一个batch的大小为N/b),即迭代batch_size次, 因此完成每个epoch所需的时间大致也随着迭代次数的增加而增加
epochs:所有输入数据单次前向和反向传递一次是一个epoch;
interations(迭代次数):每一次迭代都是一个batch的数据进行一次权重更新,每次权重更新需要batch_size个数据进行前向传播得到损失函数,再反向传播更新参数
mini-batch太小(把训练数据划分了几个batch),即batch_size太大,相邻mini-batch间的差异相对过大,那么相邻两次迭代的梯度震荡情况会比较严重,不利于收敛; mini-batch越大,相邻mini-batch间的差异相对越小,虽然梯度震荡情况会比较小,一定程度上利于模型收敛,但如果b极端大,相邻mini-batch间的差异过小,相邻两个mini-batch的梯度没有区别了,整个训练过程就是沿着一个方向蹭蹭蹭往下走,很容易陷入到局部最小值出不来
(2)(存疑,只是突发奇想)如果硬件资源允许,想要追求训练速度使用超大batch,可以采用一次正向+多次反向的方法,避免模型陷入局部最小值。即使用超大epoch做正向传播,在反向传播的时候,分批次做多次反向转播,比如将一个batch size为64的batch,一次正向传播得到结果,instance级别求loss(先不平均),得到64个loss结果;反向传播的过程中,分四次进行反向传播,每次取16个instance的loss求平均,然后进行反向传播,这样可以做到在节约一定的训练时间,利用起硬件资源的优势的情况下,避免模型训练陷入局部最小值。
反向的过程取决于模型的复杂度,与batchsize的大小关系不大,而正向则同时取决于模型的复杂度和batch size的大小。而本次实验中反向的过程要比正向的过程时间消耗大得多,所以batch size的大小对完成每个iter所需的耗时影响不大。
完成每个epoch运算的所需的全部时间主要卡在:1. load数据的时间,2. 每个epoch的iter数量。 因此对于每个epoch,不管是纯计算时间还是全部时间,大体上还是大batch能够更节约时间一点,但随着batch增大,iter次数减小,完成每个epoch的时间更取决于加载数据所需的时间,此时也不见得大batch能带来多少的速度增益了
对于较小的batch,要设置小lr的原因之一,避免异常值对结果造成的扰巨大扰动,防止损失loss产生爆炸,而对于较大的batch,要设置大一点的lr的原因则是大batch每次迭代的梯度方向相对固定,大lr可以加速其收敛过程。