【转载】Rethinking ImageNet Pre-training 论文笔记

本文转自:https://blog.csdn.net/u014380165/article/details/84557356
相关链接:
知乎-如何评价何恺明等 arxiv 新作 Rethinking ImageNet Pre-training?

论文:Rethinking ImageNet Pre-training
论文链接:https://arxiv.org/abs/1811.08883

Kaiming He这篇文章以计算机视觉中的目标检测、实例分割和人体关键点检测领域为例,思考预训练模型是否真的那么重要,最后基于实验结果得出结论:基于随机初始化的网络参数(train from scratch)训练模型的效果并不比基于ImageNet数据集的预训练模型效果差。具体而言主要有以下几个发现:
1、采用基于ImageNet的预训练模型参数可以加快模型的收敛速度,尤其是在训练初期,而基于随机初始化网络结构参数训练模型时在采用合适的归一化方式且迭代足够多的次数后也能够达到相同的效果,可以参考Figure1的结果。在Figure1中作者以训练Mask-RCNN算法为例,采用组归一化(group normalization,缩写为GN,参考博客:Group Normalization算法笔记)训练不同参数初始化的网络并对比效果,可以看出模型在训练初期的收敛速度存在较大差异,但是在训练迭代次数足够多时,随机初始化网络结构参数能够达到采用预训练模型参数相同的效果。
图1
这里要强调一下选择合适的归一化算法对从头开始训练检测算法的重要性,忽略归一化方式的选择容易产生目标检测算法难以在随机初始化网络结构参数的情况下训练的错觉。目前BN(batch normalization)是图像分类算法中最常用的归一化层,当在目标检测任务中使用基于ImageNet的预训练模型,因为相比之下目标检测任务的输入图像更大、网络结构更加复杂等原因,因此目标检测任务的batch size参数比图像分类任务要小(尤其是Faster RCNN这种two stage类型的检测算法),而BN层的计算在batch size较小时受batch size参数影响较大,batch size越小,参数的统计信息越不可靠(可以参考group normalization那篇文章,另外这里讨论的是单卡计算BN层参数,不包括跨卡的BN层参数计算),因此如果直接fine tune模型,效果会受到一定影响,不过可以在fine tune的时候固定BN层的参数,这样就避免了BN层的影响。但是如果采用随机方式初始化网络参数,因为没有预训练模型的BN参数,这就使得BN层在一定程度上限制了从随机初始化开始训练检测模型的效果,因此作者做了2个重要实验,一个是采用GN(group normalization)代替BN层,因为GN层的参数计算不依赖batch size的大小,因此就不存在参数计算不准确的问题。另一个是采用跨卡的BN层(synchronized batch normalization),跨卡BN层是传统BN层的优化版,表示BN层参数的计算是基于多个GPU的批次数据进行的,举个例子,假设某个检测模型的单卡batch size设置为8,那么传统的BN层在计算参数时不管你的训练GPU有多少块,都是基于8个样本来计算的;而跨卡BN层的参数计算和训练的GPU数量相关,假设有4块GPU,那么BN层的参数就基于4*8=32个样本计算,这样计算得到的数值相比基于8个样本要可靠得多。作者发现不管是采用GN层还是跨卡的BN层替换原有的BN层,都能成功训练基于随机初始化网络参数的检测网络。Figure4是采用跨卡BN时的模型收敛曲线,可以和FIgure1(采用GN层)的模型收敛曲线对比,效果基本是差不多的。
图4
补充一下Figure1和Figure4中曲线跳跃的含义,常规的Mask-RCNN算法使用预训练模型参数进行初始化,然后fine tune 90k次得到结果。而Figure1或Figure4中的5次跳跃分别表示迭代次数是90k的2倍、3倍、4倍、5倍、6倍时模型第一次修改学习率(倒数第60k次迭代)的效果跳跃,因此实际上Figure1或Figur4是将5张收敛曲线合并在一起的情况。其次,在每次跳跃后,曲线在平缓上升阶段还有1次明显的上升,那是第2次改变学习率(倒数第20k次迭代)时模型效果的提升。举个例子,比如迭代次数是90k的2倍时(一共迭代180k)的这条收敛曲线,曲线在第120k(倒数第60k)时学习率缩小为原来的1/10,因此效果有个明显的上升,然后在第160k(倒数第20k)是学习率再次缩小为当前值得1/10时,效果上还有一个上升。另外4条迭代次数分别是270k、360k、450k、540k的曲线也是同理。

Table1是2种参数初始化方式的训练效果在具体指标上的对比,可以看出基于预训练模型参数训练的Mask RCNN在迭代次数达到原来6倍时,在效果上和基于随机初始化网络参数进行训练的模型差不多。
表1
2、采用基于ImageNet的预训练模型参数训练得到的模型泛化能力不如基于随机初始化网络结构训练得到的模型,前者更容易出现过拟合,因此需要选择合适的超参数训练模型,从而尽可能减少过拟合风险(前提是数据量足够大,比如10K以上的COCO数据集)。这部分的实验参考Figure7,在Figure7中一共有3个图表,在左边和中间图表中,训练数据集采用原来COCO训练数据集1/3左右的数据,右边图表的训练数据集采用原来COCO训练数据集1/10左右的数据。
在左边图表中,除了减少了训练数据量,其他模型训练相关的超参数都不变,可以看出在学习率变化时模型效果出现了下降,说明出现了过拟合,此时超参数需要重新选择。
中间图表和左边图表的不同点在于基于预训练模型参数进行初始化训练时,超参数做了修改,降低其出现过拟合的风险,而基于随机初始化参数进行训练的模型超参数也采用修改后的超参数,可以看出2种初始化在模型的最终收敛情况上基本差不多。
右边图表除了数据量和左边图表不一样外,其他都一样,同样可以看到2种初始化在模型的最终收敛情况上基本差不多。
图7
这部分有一个实验比较有意思,那么就是数据足够少时的情况是否这两种初始化方式结果还是类似?答案是否定的。一方面作者采用1K的COCO训练数据进行训练,发现损失函数如下所示:
图8
在损失函数上没有什么问题,随机初始化方式在迭代足够次数后其损失值甚至比采用预训练模型还要低,但是在测试AP指标时发现随机初始化方式的AP仅有3.4,远小于采用预训练模型的9.9AP。同时在Pascal VOC数据集(训练数据15K左右,但是每张图像的检测框和类别数较少)上的训练结果也类似,随机初始化方式仅有77,6的mAP,而采用预训练模型可以达到82.7mAP。作者在文中也解释了出现这种现象的原因是检测框数量和类别数较少,此时出现这种基于初始化方式训练的模型效果难以达到基于预训练模型训练的模型效果的可能性较大。一直以来我们使用预训练模型的原因就是为了避免模型在小数据集上训练过拟合,因此这篇文章的研究结果并不否定预训练模型的这个效果,只不过受迁移数据集的量级、类别数等影响而已

3、当迁移任务的目标对空间位置信息比较敏感时(比如目标检测、人体关键点检测任务),采用基于ImageNet的预训练模型并不会有太大的帮助。训练目标存在差异的话,在算法优化的后期是容易存在瓶颈的,而且这个瓶颈必须要通过最小化差异来解决。以目标检测领域为例,采用基于ImageNet数据集的预训练模型是比较常用的做法,但是图像分类的目标和目标检测的目标还是存在一些差别的,比如前者在乎的是图像中有没有某类别的物体,而后者还需要输出物体的具体位置,这也是最近几年目标检测领域的部分论文研究采用随机初始化网络结构(比如ICCV2017的DSOD、ECCV2018的DetNet和CornerNet)的原因,不过这几篇文章在特征提取网络设计上做了一定的改进,换句话说就是设计更加贴合目标检测任务的特征提取网络,而Kaiming He的这篇文章研究的是网络结构相同的情况下,采用预训练模型参数初始化与随机初始化的差异。

猜你喜欢

转载自blog.csdn.net/mooneve/article/details/84581671
今日推荐