赞
踩
现在深度学习中的绝大多数算法采用梯度下降法来进行训练,并且通过选择学习率来控制下降的步长,在梯度下降法中学习率和batch size的选择直接影响了下降的步长,即步长与batch size成反比,与学习率成正比,因此这两个参数直接影响了模型的参数更新,他们是影响模型性能收敛的最佳参数。
在显卡显存足够的情况下,使用较大的batch size能够在数据集数量一定的条件下batch数目减小,训练时间自然就降低了。选择大的batch size能够使得模型在正向传播过程中batch norm对均值和方差的计算更为准确,batch size过小,相邻的batch size之间的差异越大,那么相邻两次迭代的梯度震荡情况会比较严重,不利于收敛;batch size越大,相邻mini-batch间的差异相对越小,虽然梯度震荡情况会比较小,一定程度上利于模型收敛,提高模型训练的稳定性。但如果batch size极端大,相邻mini-batch间的差异过小,相邻两个mini-batch的梯度没有区别了,整个训练过程就是沿着一个方向蹭蹭蹭往下走,很容易陷入到局部最小值出不来。在显存不够的情况下(使用pytorch),可以采用梯度不清零的方法,即将梯度进行累积间接增加batch size,提升模型的稳定性。
-
-
- for i,(images,target) in enumerate(train_loader):
- # 1. input output
- images = images.cuda(non_blocking=True)
- target = torch.from_numpy(np.array(target)).float().cuda(non_blocking=True)
- outputs = model(images)
- loss = criterion(outputs,target)
-
- # 2.1 loss regularization
- loss = loss/accumulation_steps
- # 2.2 back propagation
- loss.backward()
- # 3. update parameters of net
- if((i+1)%accumulation_steps)==0:
- # optimizer the net
- optimizer.step() # update parameters of net
- optimizer.zero_grad() # reset gradient
在一定范围内增大batch size对模型利大于弊,当batch size大于一定值时,模型的泛化能力和性能会下降,大的batchsize收敛到sharp minimum,而小的batchsize收敛到flat minimum,后者具有更好的泛化能力。两者的区别就在于变化的趋势,一个快一个慢,造成这个现象的主要原因是小的batchsize带来的噪声有助于逃离sharp minimum。
通常当我们增加batchsize为原来的N倍时,要保证经过同样的样本后更新的权重相等,按照线性缩放规则,学习率应该增加为原来的N倍。但是如果要保证权重的方差不变,则学习率应该增加为原来的sqrt(N)倍,目前这两种策略都被研究过,使用前者的明显居多。 对此实际上是有三个建议:
(1)如果增加了学习率,那么batch size最好也跟着增加,这样收敛更稳定。
(2)尽量使用大的学习率,因为很多研究都表明更大的学习率有利于提高泛化能力。如果真的要衰减,可以尝试其他办法,比如增加batch size,学习率对模型的收敛影响真的很大,慎重调整。
(3)在使用单机多卡的分布式训练的条件下,batch size和学习率要随显卡数量倍增。
(1)【AI不惑境】学习率和batchsize如何影响模型的性能?链接:https://zhuanlan.zhihu.com/p/64864995
(2)深度学习 | Batch Size大小对训练过程的影响 链接:https://zhuanlan.zhihu.com/p/86529347
(3)PyTorch中在反向传播前为什么要手动将梯度清零?链接:https://www.zhihu.com/question/303070254/answer/573037166
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。