batch size 训练时间_如何有效使用大batch训练?

大batch训练在深度学习中带来速度提升和并行度优化,但可能导致拟合问题和优化挑战。通过线性缩放学习率、学习率预热、初始化BN层γ为0和不衰减偏置等技巧,可以缓解这些问题。同时,针对多卡BN同步,可以通过聚合每个GPU的梯度和统计信息来实现。大batch训练的关键在于适当调整学习率策略,以保持模型精度。
摘要由CSDN通过智能技术生成

参考资料:

  • 参考1: Accurate, Large Minibatch SGD: training imagenet in 1 hour
  • 参考2: Imagenet training in minutes
  • 参考3: Don't decay the learning rate, increase the batch size
  • 参考4: Bag of tricks for Image Classification with Convolutional Neural Networks
  • 参考5: MegDet: A Large Mini-Batch Object Detector
  • 参考6: Width of Minima Reached by Stochastic Gradient Descent is Influenced by Learning Rate to Batch Size Ratio
  • 参考7: One weird trick for parallelizing convolutional neural networks

使用大batch有哪些优势?(即小batch的劣势)

  • 训练速度快, 提高并行度
  • 针对检测任务, 大batch正负样本更均衡
  • 可以有效更新BN层参数(网络使用BN的情况下)
  • 精度更高(后续会进一步解释)

使用大batch有哪些劣势?

  • 存在拟合问题, batch size越大, 拟合程度更低 -> 精度会低(一个可能原因是大batch训练, 不加任何trick, 会难以收敛, 只能调低learning rate, 但是降低learning rate后, 会导致精度变低)
  • 存在优化问题
  • 如何调整学习率?
  • 多卡BN如何同步?

如何解决大batch训练带来的问题?

参考4提出了以下方法:
  • linear scaling learning rate: 增大batch size虽然不能改变随机梯度的期望,但是可以降低它的方差 -> 降低了噪声的梯度 -> 因此可以使用一个更大的学习率, 随着batch size增大, 线性提高learning rate, ex: lr=0.1, batch_size=256 -> batch_size=b, lr=0.1xb/256
  • learning rate warmup: 训练初始阶段, 使用一个大的lr会导致数值不稳定(针对分类任务, 网络权值都是随机值, 检测任务一般使用finetune, 数值相对稳定), 在一开始训练时,使用一个小的lr, 当训练稳定后, 逐步恢复到initial lr(恢复方式也比较多, 有线性增大等方式)
  • zero γ: 针对residual block中有BN的情况, 对于residual block中最后1个conv的BN层, 将 γ参数初始化为0, 在网络刚开始训练阶段, 所有的residual block只会返回inputs -> 相当于减少了网络的层数, 在初始阶段更容易训练
  • no bias decay: 首先针对conv + BN的情况, conv可以不设bias(此bias会在BN过程中被消掉), 论文Training imagenet in four minutes(此论文我没有看, 就不分析了哈)推荐只在conv weights, FC weights使用正则化, 其它参数包括bias, BN层中的gamma, beta都不使用正则化

我们重点讨论学习率如何调整

  1. 大家一般都有这样的默认, 调大batch size就要增大学习率, 这是为什么呢?

在比较大batch和小batch时,一般默认都是相同epoch去比较,这样大batch训练iteration次数会更少, 此时如果学习率不做任何调整, 大batch训练更少iteration, 导致拟合程度较低, 精度也会低, 因此需要对学习率做调整, 一个大batch包含样本更多, 避免了小batch包含极端样本的情况, 方差更小, 意味着使用大batch计算下来的梯度方向更可信, 因此可以使用一个更大的learning rate
2. 增大学习率有哪些方法(针对sgd优化方法)?
a. lr = base_lr * sqrt(k)
b. lr = base_lr * k在梯度相等的假设下, batch size为N, lr为0.1, 当增大batch size为3 x N, 这一个大batch需要走完之前3个小batch的step, lr为3 x 0.1, 此处借用下参考5的一句话:

Since one step in large mini-batch N should match the effectiveness of k accumulative steps in small mini-batch N

在梯度方差相等的假设下, 也可以得出这样的结论
mini-batch N梯度方差:

709fc871d28cb205232a31d370f26c96.png

mini-batch

梯度方差:

960163f7e3b73aa7051c1394e28694bf.png

large mini-batch

梯度方差和k个small mini-batch N梯度方差相等:

0317f42359a527c94b6013e7118f0326.png

将上面公式化简得到:

多卡BN同步

34009e650266aa61a38bdfcf5b2d197a.png

从上图可以看出, 先计算每个GPU设备上的Sum值, 得到S1, S2... Sn, 再进行求平均得到当前batch size(单卡上batch size x GPUs)的mean value, 计算方差类似, 最后再将

,
传播到每个GPU上, 具体实现大家可以参考pytorch synced BN
自己做的实验分析(doing)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值