这是一篇2020年年底挂在arxiv上的论文,主要思想很简单,就做了一件事情:采用周期性学习率迭代策略(余弦退火算法)额外再训练模型12个epoch,然后平均每个epoch训练得到的weights作为最终的模型权重。通过这样简单地一个操作,模型的准确率可以上涨~1.0AP。
论文链接:SWA Object Detection
Abstract 摘要
你想为你的目标探测器改进1.0ap而不需要任何推理成本和对探测器的任何更改吗?让我们告诉你这样一个方法。它非常简单:使用循环学习率(cyclical learning rates)训练检测器额外12个世代,然后平均这12个权重模型作为最终的检测模型。这个思想来源于[1]中提出的随机加权平均方法Stochastic Weights Averaging (SWA),用于改进深度神经网络的泛化。我们发现它在物体探测方面也非常有效。本文系统地研究了SWA在目标检测和实例分割中的应用效果。通过大量的实验,我们发现了前面提到的在目标检测中执行SWA的可行,并且在具有挑战性的COCO基准上,我们始终比各种流行的检测器(包括Mask RCNN、Faster RCNN、RetinaNet、FCOS、YOLOv3和VFNet)实现了1.0ap的改进。我们希望这项工作能使更多的目标探测研究人员了解这项技术,并帮助他们训练出更好的目标探测器。
一、Introduction 介绍
由于在深度学习方面的巨大成功,近年来目标检测取得了很大的进展。2015年,在COCO数据集上,Faster RCNN仅实现了21.9 AP,而在最新COCO排行榜上,这个数字已经提高到61.0左右。然而,我们可以看到,由于深度网络的特征表示学习能力几乎被压缩殆尽,目标检测的进化变得缓慢。根据2020 COCO+LVIS联合识别挑战赛的报告,COCO上的目标检测(instance segmentation track)性能已经达到饱和,提高目标检测性能越来越困难。尽管研究人员绞尽脑汁,试图设计出更好的探测器模块,但他们可能会发现,在未来具有挑战性的COCO基准测试中,要进一步提高性能1.0ap是很困难的。
另一方面,我们最近在研究中发现了一种非常简单但有效的增强目标探测器的方法,我们很高兴与大家分享。您只需使用循环学习率对检测器进行额外12个时期的训练,然后平均这12个检查点作为最终的检测模型。因此,您可以在具有挑战性的COCO基准上获得1.0ap的改进。由于这种技术只会占用一些训练开销,因此您不必担心任何推理开销和对检测器的任何更改。这种技术是在[1]中发展起来的,用于改进深层网络的泛化性,称为随机加权平均(SWA)。我们在目标检测的研究中尝试了它,并对它在改进我们的目标检测器VarifocalNet(VFNet)方面的有效性感到惊讶。我们发现,在目标检测方面,很少有工作采用这种技术。因此,我们对SWA在目标检测中的应用效果进行了系统的研究。由于Mask-RCNN的代表性和广泛性,我们首先选择了Mask-RCNN作为研究对象。然后,我们尝试了不同的训练策略,发现了上述在目标检测中执行SWA的可行性。通过广泛的实验,我们发现SWA可以在COCO基准上提高∼1.0ap,适用于各种目标探测器,包括Mask RCNN[8]、Faster RCNN[2]、RetinaNet[9]、FCOS[10]、YOLOv3[11]和我们的VFNet[6]。这使我们很高兴分享这一发现,并希望这项工作将有助于社区培训更好的目标探测器。
二、Related work 以往研究
简单地说,SWA是沿着SGD优化轨迹的多个检查点的平均值,具有较高的恒定学习率或周期学习率(如图1和图2)。Wi是第i个epoch上的checkpoint,在传统的SGD中,最后一个epoch Wn或者在验证集上最好的epoch Wi*通常被选择作为最后的权重模型。相比之下,SWA采用多个检查点的平均值作为最终模型(公式如下)。
为什么这个简单的方法有效?作者认为,SGD训练的模型往往收敛到最优解的边界区域(如图1中的W1),使用循环或恒定学习率调度运行SGD,可以通过SGD优化方法探索与深度神经网络对应的权重空间边界附近的多个点,如图1中的W1、W2和W3所示。然后,通过平均这些点,SWA可以找到一个更接近最优解的权重Wswa,它具有更好的泛化性。
在实际应用中,将SWA应用于目标探测器的训练有两个主要问题需要回答。首先,我们应该使用什么样的学习速率表来进行从m到n的SWA训练?使用恒定学习率还是周期性学习率?第二,我们应该平均多少个checkpoints?也就是说,我们应该为SWA训练多少个epoch?在本报告中,我们通过大量的实验来回答这些问题。
三、实验
在这一节中,我们进行了一系列的实验来研究这种效应,并找到一种将SWA应用于目标检测的合适方法。
数据集和评估指标。我们在广泛使用的MS COCO 2017数据集上进行了实验。我们在train2017 split上训练探测器,并在val2017 split上报告结果。采用标准COCO式平均精度(AP)作为评价指标。
实施和培训细节。我们的实验依赖于MMDetection。我们使用8个V100 GPU进行训练,总批量大小为16(每个GPU 2个图像)。为了方便起见,我们在这里介绍了1x和2x训练方法。1x方法表示一个模型训练了12个epoch,在第9和第12个epoch,初始学习率分别下降了10倍;2x方法表示一个模型训练了24个epoch,在第17和第23个epoch,初始学习率分别下降了10倍。(这是重点,学习率更改策略在这里体现)为简洁起见,我们还介绍了本报告中使用的目标探测器的命名规则。以MaskRCNN-R101-2x-0.02-0.0002-40.8-36.6为例进行说明。这意味着Mask RCNN的主干网络为ResNet-101,在2x方法下训练,初始学习率为0.02,结束学习率为0.0002,在COCO val2017上分别达到40.8bbox AP和36.6mask AP。
3.1 消融实验
我们选择Mask-RCNN作为我们的研究检测器,寻找在目标检测和实例分割中使用SWA的合适方法。
我们首先从MMDetection model zoo下载预先训练的模型MaskRCNN R101-2x-0.02-0.0002-40.8-36.6及其配置文件作为起点。然后我们用不同的学习率策略对模型进行24或48个阶段的训练。第一种是固定学习率计划,其中选择0.02、0.002和0.0002。请注意,这些学习率对应于在预训练模型的不同训练阶段使用的学习率。第二种策略是循环学习率计划。如图2所示,在每个循环中,学习率从一个较大的值lrmax开始,然后相对地降低到最小值lrmin,然后再次跳到最大值。请注意,学习率在每次迭代时都会降低,而不是在每个epoch时。在本研究中,我们采用余弦退火算法(cosine annealing learning),选取两组(lrmax,lrmin),即(0.01,0.0001)和(0.02,0.0002),选择1个epoch作为循环长度。最后,我们将不同数量(6、12、24和48)的新checkpoints做平均作为最终的SWA模型,并评估它们在COCO val2017上的表现。请注意,由于主干中的BN层是冻结的,因此我们不需要按照原始的SWA文件对数据执行额外的传递来计算新的统计信息。
结果见表1。如上所述,我们尝试了五种不同的训练策略,并将它们分为两组。对于固定学习率组,我们可以看到学习率对每个SGD阶段的性能有很大的影响。具体来说,在学习率为0.02的情况下,每个SGD epoch的表现都比预先训练的模型差得多,例如33.0∼34.0 bbox AP vs 40.8 bbox AP。相比之下,当学习率为0.0002时,每个SGD epoch的表现与预训练模型相当。尽管不同学习速率下每个SGD阶段所获得的性能有显著差异,但令人惊讶的是,通过平均每个训练策略下的一定数量的checkpoints而获得的SWA模型所获得的结果非常相似。我们可以看到,在表1的SWA 1-12列中,这三个SWA模型都获得了大约40.5bbox AP和36.5mask AP。然而,这些结果都不如初始模型,这表明恒定学习率策略并不能很好地工作。相比之下,周期学习率组在每个SGD阶段的学习效果更稳定,其SWA模型的学习效果更好。可以看出,学习率范围(0.02,0.0002)比范围(0.01,0.0001)表现更好,表明在训练前阶段使用的学习率已经很好地发挥了作用。仔细观察(0.02,0.0002)范围的结果,其SWA 1-12模型达到41.7bbox-AP和37.4mask-AP,分别比预先训练的模型提高了0.9bbox-AP和0.8mask-AP。此外,SWA 1-12模型的性能优于SWA 1-6模型,与SWA 1-24模型和SWA 1-48模型相当。这表明,再训练12个阶段就足以生成一个好的SWA模型,特别是在考虑计算开销和增益之间的权衡时。通过比较表1中的结果,我们可以推断出一种可行的策略,即应用SWA可以训练出更好的目标检测器。也就是说,在使用初始学习率lr ini和结束学习率lr end对目标检测器进行常规训练之后,再使用每个epoch的循环学习率(lr ini,lr end)对其进行额外12个epoch的训练,然后平均这12个checkpoints作为最终的检测模型。
基于上述观察,我们还尝试从头开始训练SWA Mask RCNN(主干网络在ImageNet上预先训练)。我们首先训练了Mask RCNN模型16个epoch,学习率为0.02,得到了模型MaskRCNN-R101-16e-0.02-0.02-33.4-30.8。然后,我们用循环学习率(0.02,0.0002)再训练12个epoch。最后,我们将这6或12个checkpoints做平均作为最终的SWA模型。如表1的最后一部分所示,我们可以看到SWA 1-12模型达到41.7 bbox AP和37.4 mask AP,这与通过训练MaskRCNN-R101-2x 0.02-0.0002-40.8-36.6获得的SWA 1-12模型相同。这表明,这种混合训练策略还可以生成更好的目标检测器,可以用来从头开始训练新的目标检测器。
3.2 实验结果
为了验证我们发现的在目标检测中执行SWA的策略的有效性,我们将其应用于具有不同主干的各种目标检测器,包括Mask RCNN、Faster RCNN、RetinaNet、FCOS、YOLOv3和我们的VFNet。结果分别见表2、表3、表4、表5、表6和表7。从这些结果中,我们可以看到,SWA与我们的训练策略将这些探测器的性能都提高了∼1.0ap,而不管它们的原始性能是高还是低。这是非常鼓舞人心的,让我们很高兴能与社区分享这一发现。Comparative qualitative examples如图3所示。通过对这些检测实例的比较,可以看出SWA在提高目标定位和分类精度的同时,减少了FP,提高了召回率。
3.3 分析
为了进一步了解SWA带来的改进来自哪里,我们分析了Mask-RCNN和FCOS的结果。根据论文《Diagnosing Error in Object Detectors》提供的实验,我们绘制了预训练模型 Mask RCNN (MaskRCNNR101-2x-0.02-0.0002-40.8-36.6) 及其SWA模型,FCOS(FCOS-R101-2x-0.01-0.0001-39.1)及其SWA模型的误差分析图。COCO API生成的图分别显示在图4和图5中。有关这些图的详细说明,请参见COCO数据集网页。简言之,每个曲线图都是一系列PR曲线,其中,随着评估参数设置变得更加宽松,每个PR曲线都保证严格高于上一条曲线,并且每条曲线下的面积对应于AP(如图例中的括号所示)。对比图4a和图4b、图4c和图4d以及图5a和图5b,我们可以推断SWA不仅提高了目标定位精度,而且提高了目标分类精度。例如,图4a显示了预先训练的Mask RCNN在IoU=0.75时实现的总体AP为44.5,但是SWA Mask RCNN将该数字提高了1.0到45.5 AP,这表明SWA提高了定位精度。同样,当忽略图例中Loc表示的定位误差时,预训练的Mask RCNN达到68.1ap,而SWA Mask RCNN达到69.0ap,这意味着SWA也提高了目标分类精度。类似的比较结果也可以在FCO中看到
掩模RCNN(MaskRCNN R101-2x-0.02-0.0002-40.8-36.6)及其SWA模型和FCOS(FCOS-R101-2x-0.01-0.0001-39.1)及其SWA模型的误差分解图。cocoapi生成的图分别显示在图4和图5中。有关这些图的详细说明,请参见COCO数据集网页[19]。简言之,每个曲线图都是一系列精确调用(PR)曲线,其中,随着评估设置变得更加宽松,每个PR曲线都保证严格高于上一条曲线,并且每条曲线下的面积对应于AP(如图例中的括号所示)。对比图4a和图4b、图4c和图4d以及图5a和图5b,我们可以推断SWA不仅提高了目标定位精度,而且提高了目标分类精度。例如,图4a显示了预先训练的掩码RCNN在IoU=0.75时实现的总体AP为44.5,但是SWA掩码RCNN将该数字提高了1.0到45.5 AP,这表明SWA提高了定位精度。同样,当忽略图例中Loc表示的定位误差时,预训练的Mask RCNN达到68.1ap,而SWA Mask RCNN达到69.0ap,这意味着SWA也提高了目标分类精度。类似的比较结果也可以在FCO中看到。
五、结论
本文系统地研究了SWA在目标检测和实例分割中的应用效果。我们发现,用循环学习率训练另外12个epoch的目标检测器,并平均这12个checkpoints作为最终模型,可以在具有挑战性的COCO基准上提高该检测器的1.0ap。我们的大量实验表明,该技术适用于各种目标探测器,包括Mask RCNN, Faster RCNN, RetinaNet, FCOS, YOLOv3 and VFNet。我们希望我们的工作能让更多的研究人员了解这个简单而有效的方法,并帮助他们培养出更好的物体探测者。
这篇论文的方法确实很不错,不过用这么大的篇幅讲了这么简单的一个trick,着实令我敬佩不已。最后总结一下,这篇论文就是用循环学习率方法额外训练12个epoch,平均一下权重就可以提升大约1.0AP。图1已经把原理描述的非常清楚了,不懂的朋友可以再去研究一下这个图。
六、Write in the end
具体怎么把这些checkpoints做平均,我去跑一下作者提供的代码之后,再来分享~
参考文献:
[1] SWA(随机权重平均) https://blog.csdn.net/leviopku/article/details/84037946
[2] https://blog.csdn.net/moxibingdao/article/details/111714185