欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深度学习中batch_size设置大小在神经网络训练中的影响

程序员文章站 2022-06-13 10:03:38
...

深度学习中batch_size设置大小在神经网络训练中的影响

1.首先介绍Batch Normalization(BN/批标准化)的概念
传统的神经网络,只是在将样本x输入输入层之前对x进行标准化处理,以降低样本间的差异性。BN是在此基础上,不仅仅只对输入层的输入数据x进行标准化,还对每个隐藏层的输入进行标准化
那什么是标准化呢?
标准化使得不同的特征具有相同的尺度(Scale)经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:
x’=(x-u)/&,其中μ为所有样本数据的均值,&为所有样本数据的标准差
需要说明的事并不是任何问题都必须事先把原始数据进行规范化 , 也就是数据规范化这一步并不是必须要做的 , 要具体问题具体看待。比如视频人体行为识别就不需要标准化,他的数据格式都是一样的

  1. 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可以加速其收敛过程。