本文首先分析了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=1∑NVar(∂wt∂l(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^=k⋅N, 可以得到以下表达式
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(r⋅t=1∑k(∇lNt(x,w))=r2⋅k⋅Var(∇lN(x,w))≈r^2Var(∇lN^(x,w))
如此一来,只要 r ^ = k ⋅ r \hat{r} = k \cdot r r^=k⋅r,上述等式就可以成立了。这就从另外一个角度解释了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=1∑mL(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=1∑mg(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=1∑mg(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))
=m21⋅m⋅Var(g(xi,yi))=m1⋅Var(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))
m1⋅Var(m⋅lr⋅g(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
k⋅N个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 < 1 L lr < \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
<
k
∑
x
∈
B
j
∇
l
(
x
,
w
t
+
j
)
w_{t+k} = w_t - \eta \cdot \frac{1}{n} \sum_{j<k} \sum_{x \in B_j} \nabla l(x, w_{t+j})
wt+k=wt−η⋅n1j<k∑x∈Bj∑∇l(x,wt+j)
w
^
t
+
1
=
w
t
−
η
^
1
k
⋅
n
∑
j
<
k
∑
x
∈
B
j
∇
l
(
x
,
w
t
)
\hat {w}_{t+1} = w_t - \hat{\eta} \frac{1}{k \cdot n} \sum_{j < k} \sum_{x \in B_j} \nabla l(x, w_t)
w^t+1=wt−η^k⋅n1j<k∑x∈Bj∑∇l(x,wt)
由此可以看到baseline(batch size 为 B B B)和large batch (batch size 为 k ⋅ B k \cdot B k⋅B的更新公式。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
后记:本博客作为博主读论文系列。