Article Analysis (AA): MegDet: A Large Mini-Batch Object Detector

7 篇文章 0 订阅
7 篇文章 0 订阅

本文首先分析了MegDet,随后对large batch size与learning rate的关系给出说明。


MegDet: A Large Mini-Batch Object Detector
作者: Chao peng, Tete Xiao, Zeming Li, Yuning Jiang, Xiangyu Zhang, Kai Jia, Gang Yu, Jian Sun

短评:以256的mini-batch,在128个GPU上,时间耗费只有4.1h,训练以ResNet-50为backbone,以FPN为检测框架的网络,mmAP得到37.1%。

摘要直译:在深度学习时代,物体检测的发展,从R-CNN, Fast R-CNN, Faster RCNN到最近的Mask R-CNN和RetinaNet,主要来自新型网络,新型框架或者设计损失函数。然而,mini-batch size,训练深度神经网络的关键因子,在物体检测上仍然没有很好的研究过。在该论文中,我们提出了一个Large Mini-Batch Object Detector (MegDet),能够在很大的mini-batch size ,甚至达到256,上进行训练。这使得我们能够高效的使用最多128个GPU来大大缩短训练时间。技术上来说,我们提议一个warmup learning rate策略和跨-GPU批归一化(Cross-GPU Batch Normalization),这些结合起来允许我们在足够少的时间(e.g.,从33小时缩短到4小时)内训练一个large mini-batch检测器,并且达到更好的精度。MegDet是作者们在COCO2017挑战赛中使用的主干网络,以此赢得检测任务的冠军。

核心分析
之前的基于CNN的检测器都使用small mini-batch size,比如 Faster R-CNN 和 R-FCN的 mini-batch size 为2; 即便是RetinaNet和Mask R-CNN,mini-batch size也仅仅是16.那么small mini-batch size有哪些缺点呢?

  • 训练时间过长。比如,在有8个 Titian XP GUPs的机器上,用mini-batch为16在COCO上训练ResNet-152,需要花费3天;
  • 不能够计算精确的统计量,比如均值和方差;
  • 正负样本不平衡。

既然如此,那就用large mini-batch size。 问题是学习率该如何调整? 多机分布式运算之后,BN所需要的均值和方差如何计算?

Large mini-batch的学习率问题:
根据Linear Scaling Rule(在第二部分陈述),当mini-batch size增大 k k k倍,学习率也同样增大 k k k倍。该理论是基于梯度等价假设,且在图像分类中已经得到证实。

但图像分类中,每个图片仅仅只有一个标签,并且 l ( x , w ) l(x, w) l(x,w)是以交叉熵计算的。而对于物体检测来说,每个图片有不同数目的box标签,这也就导致图片之间GT的分布式不一样的。考虑到两个任务之间的这种差异,假设不同的mini-batch size上梯度等价,对于物体检测来说不太靠谱。因此,就有了以下基于方差的分析。

方差等价:不同于梯度等价假设,这里作者假设在 k k k步之内,梯度的方差仍然较为相似。给定mini-batch size为 N N N,那么如果每个样本的的梯度 ∇ l ( x i , w ) \nabla l(x_i, w) l(xi,w)服从 i . i . d i.i.d i.i.d,那么在 l ( x , w ) l(x, w) l(x,w)上梯度的方差是
V a r ( ∇ l ( x , w t ) ) = 1 N 2 ∑ i = 1 N V a r ( ∂ l ( x i , w t ) ∂ w t ) Var(\nabla l(x, w_t)) = \frac{1}{N^2} \sum_{i=1}^{N} Var(\frac{\partial l(x_i, w_t)}{\partial w_t}) Var(l(x,wt))=N21i=1NVar(wtl(xi,wt))
= 1 N 2 × ( N ⋅ σ l 2 ) = 1 N σ l 2 =\frac{1}{N^2} \times (N \cdot {\sigma_l}^2) = \frac{1}{N} {\sigma_l}^2 =N21×(Nσl2)=N1σl2

同样的,对于large mini-batch N ^ = k ⋅ N \hat{N} = k \cdot N N^=kN, 可以得到以下表达式
V a r ( ∇ l N ^ ( x , w t ) ) = 1 k N σ l 2 Var(\nabla l_{\hat{N}}(x, w_t)) = \frac{1}{k N} {\sigma_l}^2 Var(lN^(x,wt))=kN1σl2
这里不是期望权重更新等价,而是保持large mini-batch N ^ \hat{N} N^的方差与 k k k步累积的small mini-batch N N N的方差等价,因此,就有
V a r ( r ⋅ ∑ t = 1 k ( ∇ l N t ( x , w ) ) = r 2 ⋅ k ⋅ V a r ( ∇ l N ( x , w ) ) ≈ r ^ 2 V a r ( ∇ l N ^ ( x , w ) ) Var(r \cdot \sum_{t=1}^{k}(\nabla l_N^t(x, w)) = r^2 \cdot k \cdot Var(\nabla l_N(x, w)) \approx \hat{r}^2 Var(\nabla l_{\hat{N}}(x, w)) Var(rt=1k(lNt(x,w))=r2kVar(lN(x,w))r^2Var(lN^(x,w))

如此一来,只要 r ^ = k ⋅ r \hat{r} = k \cdot r r^=kr,上述等式就可以成立了。这就从另外一个角度解释了linear scaling rule。

尽管最终得到的scaling rule是一样的,但variance equivalence assumption是更弱的假设,这是因为这里仅仅保持梯度的统计量等价。

Warmup Strategy:由于linear scaling rule在初始训练阶段并不适用(假设条件约束),所以,实际应用中,借用了Linear Gradual Warmup, 即起始阶段,学习率足够的小,为 r r r,之后,每次迭代都以常数速度增加学习率,直到达到 r ^ \hat{r} r^。这种策略有助于损失函数的收敛,但对于large mini-batch来说是不够的,还需要Cross-GPU Batch Normalization。

Cross-GPU Batch Normalization问题:
在FPN中,初始模型是用在ImageNet上预训练好的模型,因此在fine-tune期间batch normalization是固定的。该论文作者尝试多GPU协作下batch normalization的修整。那么是怎么做的呢?了解过CUDA编程的话,这部分还是蛮容易理解的。
不做过多的说明,看伪代码就可以了。
在这里插入图片描述
中间的同步过程是非常重要的。受限于单个GPU的显存空间,论文中提到用sub-linear memory(一种节约显存的技术),即舍弃一些网络中间层的结果来减少显存使用量[5]。

结果分析:
训练策略有两个,1)被称之为normal,在epoch 8 和 10时,学习率降低10倍;2)被称之为long,在epoch 11和14时,学习率降低10倍,在epoch 17,学习率减半,到epoch 18时,停止减半。
在这里插入图片描述以上表单2,是在没有BN的情况下的结果,mini-batch size为32时,会出现训练失败的情况;为64时,正常的warmup训练失败;为128时,学习率减半也不OK。
由此观察到的结果是:

1)、mini-batch size为32时,在保持精度的情况下,训练时间减半,几乎是线性加速。

2)、更低的学习率(对于mini-batch size为64)会显著的导致精度损失。

3)对于更大的mini-batch size和学习率,训练会更加的困难。

在这里插入图片描述

以上表单3,使用Cross-GPUs BN的结果。由此观之,

1)、随着mini-batch size的增大,精度几乎维持同样的水平,但都比baseline(mini-batch size为16)要好一点。同时更大的mini-batch size的训练周期也更短。对于mini-batch size为256,用128个GPU,在COCO上训练的实验,训练周期仅仅是4.1个小时。

2)、最好的BN大小(在多少个图片上计算BN统计(均值和方差))是32,与之相对的,2,4, 8的BN统计就不那么准确,结果较差;而为64时,精度同样出现下降(无处不在U型曲线,无处不在的trade-off)。

3)、采用long训练策略时,精度相对来说都有一定提升。


large batch size 与 learning rate的关系[1]
相比于baseline的batch size,多机同步并行等价于增大batch size,如果没有精细的设计,large batch往往收敛效果更差,

  • 那么(问题1)为什么会差?
  • 以及(问题2)如何精细设计?
    且从(1)理解SGD, mini-batch SGD和GD,及(2)large batch与learning rate的调试关系开始。

(1) 理解GD, SGD和mini-batch SGD
在机器学习优化算法中,GD是常用的一阶优化算法。GD简单的说就是在整个训练集中计算当前的梯度,根据梯度(方向确定),选定一个合适的较大的步长(根据不同的寻找方法,可以确定不同的步长)更新。GD的优点是,基于整个数据集上得到的梯度,梯度估计相对准确,更新过程也就更准确。但显著的缺点就是,当数据集过大时,计算GD的梯度过程耗费时间;另外,现代的深度学习网络的损失函数往往是非凸的,最终收敛点很容易落入局部极小值或者鞍点(根据花书,在高维空间中,鞍点出现的概率要远高于局部极小值),也就不太容易达到较好的收敛性能。

与之相对的,SGD,每次只用一个样本来计算梯度,这样做的好处是计算快,很适合在线学习数据流式到达的场景,也有一定的正则化效果,但缺点是单个样本产生的梯度估计往往不够准确,所以得采用很小的步长(学习率),而且由于现代的计算框架CPU / GPU的多线程工作,当个样本往往很难占满CPU / GPU的使用率,导致计算资源浪费。

既然用全部不太可行,用一个很浪费,那就折中,采用mini-batch,用一个mini-batch的样本来估计梯度,这相对于SGD更准确,同时又占满了CPU / GPU的计算资源,又不至于计算整个数据集。同时由于mini-batch能适当的降低梯度噪声,一定程度上缓解GD直接掉入初始点附近的局部极小值,进而导致收敛不够好。

关于增大batch size对于梯度估计准确的影响
假设batch size为m,一个mini-batch, loss为
L = 1 m ∑ i = 1 m L ( x i , y i ) L=\frac{1}{m} \sum_{i=1}^{m} L(x_i, y_i) L=m1i=1mL(xi,yi)
那么梯度为
g = 1 m ∑ i = 1 m g ( x i , y i ) g=\frac{1}{m} \sum_{i=1}^{m} g(x_i, y_i) g=m1i=1mg(xi,yi)
整个minibatch的梯度方差为
V a r ( g ) = V a r ( 1 m ∑ i = 1 m g ( x i , y i ) ) = 1 m 2 V a r ( g ( x 1 , y 1 ) + g ( x 2 , y 2 ) + … … + g ( x k , y k ) ) Var(g) = Var(\frac{1}{m} \sum_{i=1}^{m}g(x_i, y_i)) = \frac{1}{m^2} Var(g(x_1, y_1) +g(x_2,y_2) + ……+g(x_k, y_k)) Var(g)=Var(m1i=1mg(xi,yi))=m21Var(g(x1,y1)+g(x2,y2)++g(xk,yk))
= 1 m 2 ⋅ m ⋅ V a r ( g ( x i , y i ) ) = 1 m ⋅ V a r ( g ( x 1 , y 1 ) ) =\frac{1}{m^2} \cdot m \cdot Var(g(x_i,y_i)) = \frac{1}{m} \cdot Var(g(x_1,y_1)) =m21mVar(g(xi,yi))=m1Var(g(x1,y1))
由于每个样本 ( x i , y i ) (x_i, y_i) xi,yi是随机从训练集中抽取的,满足 i . i . d i.i.d i.i.d假设,因此样本梯度的方差相等,为 V a r ( g ( x 1 , y 1 ) ) Var(g(x_1, y_1)) Var(g(x1,y1))等价于SGD的梯度方差,由此可以看到,batch size增大m倍,相当于将梯度的方差减少m,因此梯度更加准确。

如果保持方差与SGD的一样,那么就相当于给定了一个方差区间容量,也就可以增大学习率,充分利用这个方差容量。将以上公式添加学习率(lr),同时利用方差的变化公式,得到以下等式
1 m ⋅ V a r ( m ⋅ l r ⋅ g ( x i , y i ) ) = V a r ( l r ^ ⋅ g ( x i , y i ) ) \frac{1}{m} \cdot Var(\sqrt{m} \cdot lr \cdot g(x_i, y_i)) = Var(\hat{lr} \cdot g(x_i, y_i)) m1Var(m lrg(xi,yi))=Var(lr^g(xi,yi))
即将学习率放大 m \sqrt{m} m 倍,以提高训练速度。这也是线性扩展规则之前,常用的增大 l r lr lr的方式。

(2) large batch 与 learning rate
分布式训练中,batch size随数据并行的worker增加而增大。假设baseline的batch size为B,learning rate 为 lr, 训练epoch为N。如果保持baseline的learning rate,一般不会得到较好的收敛速度和精度。这是因为,对于收敛速度,假设k个worker,每次用到的样本总数为kB,那么一个epoch下更新次数就减少为baseline的 1 k \frac{1}{k} k1,而每个更新的 l r lr lr不变,所以要达到baseline相同的更新次数,则需要增加epoch数,最大需要增加 k ⋅ N k \cdot N kN个epoch,因此收敛加速倍数远低于 k k k。对于收敛精度,由于增加了batch size,使得梯度估计相对更加准确,噪声减少,更容易收敛到局部极小值,类似于GD的效果。

基于以上分析,那就有增大 l r lr lr, 因为batch size变大,梯度估计更加准确,也就是方向确定的更加准确,这样增大步长也是合理的,同时也提高了收敛速度。

l r lr lr不能无限制的增大。对于高度非线性的深度神经网络的损失函数曲面,更新的 l r lr lr很大,也就是说步长很大,就很容易沿损失函数曲面的切线方向走的太远,进而大大偏离原有的损失函数曲面。因此过度的增加步长就可能走向一个错误的损失函数曲面;而选取合适的 l r lr lr,每次沿切线方向走以小步,虽然有偏差,依然能大致沿着损失函数曲面的最陡曲线下降,从而收敛到合适的局部极小值或鞍点。

根据凸收敛理论[2]得到 l r lr lr的上界,即 l r &lt; 1 L lr &lt; \frac{1}{L} lr<L1, L L L为损失函数曲面的梯度曲线的Lipschitz factor, 简单说, L L L为损失梯度变化幅度的上界。如果变化幅度越大, L L L越大,则 l r lr lr就会越小,如果变化幅度越小, L L L越小,则 l r lr lr就可以很大(带动量的自适应优化算法)。

那么如何确定large batch与learning rate的关系呢?
来看baseline和 k k k个worker的large batch的更新公式:
w t + k = w t − η ⋅ 1 n ∑ j &lt; k ∑ x ∈ B j ∇ l ( x , w t + j ) w_{t+k} = w_t - \eta \cdot \frac{1}{n} \sum_{j&lt;k} \sum_{x \in B_j} \nabla l(x, w_{t+j}) wt+k=wtηn1j<kxBjl(x,wt+j)
w ^ t + 1 = w t − η ^ 1 k ⋅ n ∑ j &lt; k ∑ x ∈ B j ∇ l ( x , w t ) \hat {w}_{t+1} = w_t - \hat{\eta} \frac{1}{k \cdot n} \sum_{j &lt; k} \sum_{x \in B_j} \nabla l(x, w_t) w^t+1=wtη^kn1j<kxBjl(x,wt)

由此可以看到baseline(batch size 为 B B B)和large batch (batch size 为 k ⋅ B k \cdot B kB的更新公式。large batch使用的数据量是baseline k k k步总计使用的数据量,而损失和梯度都按照用过的数据量去平均,因此,为了保证相同的数据量利用率,large batch的学习率应该为baseline的 k k k倍。这也是学习率的线性扩展规则,即linear scale rule。

linear scale rule有两个个约束
关于权重的约束,上式中, baseline的更新基于的权重都是前一步更新之后的权重,相当于小步走,每一步都是基于目前真实的权重做的更新,而large batch的更新,相当于大步走,即baseline的k步,如果k步之内,前后权重近似的话,那么linear scale rule问题不大,如果前后权重变化很大,就会有问题。反应的一个现象就是,模型刚开始训练阶段,权重变化很快,linear scale rule不适用,(第一部分也提到了),因为不满都约束,也就转而采用warmup,从baseline的 l r lr lr缓缓的提升 k k k倍,从而使得linear scale rule不会违背的那么明显,这也是一小时训练ImageNet的做法[3]。
关于 l r lr lr不能无限大的约束,在上面也提到了。

最后,在[4]中,当batch size变大后,得到的测试结果所能允许的 l r lr lr范围在变小,也就是说,当batch size较小时,比较容易找到一个合适的 l r lr lr达到不错的结果;而当batch size变大后,可能需要精细的寻找一个合适的 l r lr lr才能达到较好的结果。


参考文献:
[1] https://www.zhihu.com/question/64134994/answer/216895968
[2] Bottou L, Curtis F E, Nocedal J. Optimization Methods for Large-Scale Machine Learning[J]. 2016
[3] Goyal, Priya, et al. “Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour.” arXiv preprint arXiv:1706.02677 (2017)
[4] Breuel T M. The Effects of Hyperparameters on SGD Training of Neural Networks[C]., 2015
[5] https://blog.csdn.net/Julialove102123/article/details/80471403


后记:本博客作为博主读论文系列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值