batch size,学习率(learning rate),and training time

batch size,学习率(learning rate),and training time

1.batch size和leaning rate的关系

现在深度学习中的绝大多数算法采用梯度下降法来进行训练,并且通过选择学习率来控制下降的步长,在梯度下降法中学习率和batch size的选择直接影响了下降的步长,即步长与batch size成反比,与学习率成正比,因此这两个参数直接影响了模型的参数更新,他们是影响模型性能收敛的最佳参数。

(1)大的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

(2)大的batch size导致模型泛化能力下降。

在一定范围内增大batch size对模型利大于弊,当batch size大于一定值时,模型的泛化能力和性能会下降,大的batchsize收敛到sharp minimum,而小的batchsize收敛到flat minimum,后者具有更好的泛化能力。两者的区别就在于变化的趋势,一个快一个慢,造成这个现象的主要原因是小的batchsize带来的噪声有助于逃离sharp minimum。

batch size,学习率(learning rate),and training time_第1张图片

(3)学习率和batch size的关系

通常当我们增加batchsize为原来的N倍时,要保证经过同样的样本后更新的权重相等,按照线性缩放规则,学习率应该增加为原来的N倍。但是如果要保证权重的方差不变,则学习率应该增加为原来的sqrt(N)倍,目前这两种策略都被研究过,使用前者的明显居多。 对此实际上是有三个建议:

(1)如果增加了学习率,那么batch size最好也跟着增加,这样收敛更稳定。

(2)尽量使用大的学习率,因为很多研究都表明更大的学习率有利于提高泛化能力。如果真的要衰减,可以尝试其他办法,比如增加batch size,学习率对模型的收敛影响真的很大,慎重调整。

(3)在使用单机多卡的分布式训练的条件下,batch size和学习率要随显卡数量倍增。

reference

(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

 

 

你可能感兴趣的:(深度学习与pytorch,人工智能,深度学习,机器学习)