前言:深度学习中最基本的思想为梯度下降,反向传播减小误差优化参数。
而在使用训练数据优化参数的时候有两种方法:
1)Batch gradient descent:每次迭代(完成一次前向和反向运算)会计算训练数据集中所有的样本,在深度学习中训练样本数量通常达十万、百万甚至更多,这样一次迭代遍历所有的样本显然很慢。
2)Stochastic gradient descent:每次迭代只使用训练集中的一个样本,即一次前向仅使用1个样本计算损失函数,然后计算梯度更新参数,这种方式虽然一次迭代速度很快,但是每次仅使用1个样本计算损失函数,容易受单个样本的质量好坏干扰,较难找到优化的最优点。
3)mini-batch gradient decent(小批量梯度下降):这种方式介于上面两种方法之间,一次迭代使用小批量的数据,既能够防止一次迭代仅有1个样本带来的收敛性较差的问题,同时,每次迭代只是用了小批量样本,不会像Batch gradient descent那样单次迭代耗时过长。
PS:现在的深度学习优化中都是采用的mini-batch gradient decent的方式,而一次batch_size的大小受显卡内存的限制,下面介绍batchsize、epoch和iteration的含义。
1)batchsize:一个迭代批次样本数量的大小。即每次迭代使用的样本数量;
2)iteration:1个iteration是指一次迭代过程,即上面的一个批次batchsize的样本完成前向和反向的整个过程;
3)epoch:1个epoch是指训练集中的全部样本都训练了一次,训练集中所有的样本都被迭代了一次就是完成了一个epoch,通常将的几个epoch就是指训练集中的所有样本被迭代了几次。
例如:训练集32万个样本,而batchsize设置的为32,那么完成一个epoch需要迭代10000轮。
batchsize的大小对训练的影响:
1)不同batchsize下梯度的平滑程度:
下面展示的为不同batchsize大小在前1000个迭代中loss的变化情况:(说明:图像参考自微信公众号:Jerry的算法和NLP。作者:陈志远)
结论:batchsize越大,loss越平滑,这也应证上面一次迭代只使用1个样本较难收敛的情况,在最优点处易出现震荡。
2)设置不同batchsize大小时,一个epoch的耗时。
Epoch Time:是指一个epoch所需的所有时间,包括加载数据和计算的时间,
Epoch Computation Time:是指除去了加载数据所需的时间。
Iter Computation Time:指一次迭代需要的时间。
结论:
①:可以看出,不同batchsize下,一次迭代的耗时差别不大,这时因为一次迭代中主要的耗时是反向传播(相对于反向传播,前向仅计算输出,耗时占比很少,而反向需要计算梯度等,耗时占比很大),而反向传播的耗时取决于模型的复杂度,跟batchsize大小无关。
②:batchsize越小,一次epoch的耗时越长,是因为当batchsize小时,完成一次epoch需要的迭代次数较多,耗时也就越长。
③:前向传播的耗时取决于batchsize大小和网络复杂度;反向传播耗时仅取决于网络的复杂度,与batchsize关系不大。因为前向传播需要将每个样本进行一次前向运算,前向运算次数=batchsize数量,而反向传播中已经计算到了每个样本的loss,只需要反向求导即可,所以此时只取决于网络复杂度,与batchsize无关。
收敛速度
在衡量不同batch size的优劣这一点上,我选用衡量不同batch size在同样参数下的收敛速度快慢的方法。
下表中可以看出,在minst数据集上,从整体时间消耗上来看(考虑了加载数据所需的时间),同样的参数策略下 (lr = 0.02, momentum=0.5 ),要模型收敛到accuracy在98左右,batchsize在 6 - 60 这个量级能够花费最少的时间,而batchsize为1的时候,收敛不到98;batchsize过大的时候,因为模型收敛快慢取决于梯度方向和更新次数,所以大batch尽管梯度方向更为稳定,但要达到98的accuracy所需的更新次数并没有量级上的减少,所以也就需要花费更多的时间,当然这种情况下可以配合一些调参策略比如warmup LR,衰减LR等等之类的在一定程度上进行解决(这个先暂且按下不表),但也不会有本质上的改善。
不过单纯从计算时间上来看,大batch还是可以很明显地节约所需的计算时间的,原因前面讲过了,主要因为本次实验中纯计算时间中,反向占的时间比重远大于正向。
文章后半部分参考自:微信公众号:Jerry的算法和NLP