论文:Rethinking ImageNet Pre-training
这篇paper因为其想法比较具有颠覆性(还有作者是Kaiming He大佬),刚放出来就引发了大量的讨论。通常来说,对于绝大部分CV问题的惯常做法就是,不管三七二十一,先在ImageNet预训练一下,然后针对具体的问题fine-tuing。在这里,作者发现,从零开始训练,不用fine-tuing效果也和使用预训练一样。那就引发了一个思考?为什么需要去ImageNet预训练?
作者使用从零初始化,依然可以得到和COCO2017冠军的结果,且结果十分鲁棒性。即便是在以下三种情况下:
- 使用10%的训练数据
- 使用更深,更宽的网络(依旧没有过拟合,依旧很鲁棒)
- 在多种任务下,多种评价指标下
先看一张作者实验结果对比图:
从图中可以看出:
- 迭代次数足够多的时候(达到
次的时候),随机初始化与预训练结果一样
- 图中的精度曲线分叉表示使用/不使用学习率衰减
- 使用预训练收敛更快。
总结起来,其实就是,使用预训练可以加快收敛,但是精度不会上升。其实也没有媒体吹得那么神。在这一行越久,就越发现,在深度学习领域,没有什么事是绝对的。一个结论可以被反复推翻,归根结底,还是因为神经网络的模型参数太多,可解释性太差。作者得到的这个结论,也是完全有可能和自己工作中的实际结论出现偏差的。
作者的比较方法
为了公平的比较使用预先训练和随机初始化的结果,作者采用的模型没有针对随机初始化进行特定的网络结构设计。除了以下两点不同:
- 随机初始化模型使用了Group Normalization,因为Batch Normalization在batch size太小的时候效果不好。对于检测问题,由于图片太大,使得batch size上不去,因此用Group Normalization比较合适。而对于预训练模型,由于分类问题的图片比较小,batch size可以比较大,那么BN算出来的
就靠谱很多,因此直接用BN就可以了。
- 随机初始化模型训练时间更久,因为预训练模型没有算上预训练的时间,所以直接比是不公平的。
对于第一点,作者为了保证实验结果的合理性,对于随机初始化模型也使用BN,并结合多GPU训练(增大batch size)实现了随机初始化训练。此外,作者发现即便不使用归一化,通过选择初始化方式,依旧可以实现随机初始化训练,并且结果比肩预训练。
实验
整片文章思想就是如上面所说,接下来就是大量的对比实验以验证论述。
使用10%的数据进行随机初始化训练
可以看出,即便是少量数据,依旧结果不差。验证了作者的第一条结论
使用更深,更宽的网络
这里使用的模型是Mask RCNN,backbone分别是ResNet101, ResNeXt152。后者参数是前者的四倍。实际实验发现,即使使用更深,更宽的网络,结果不仅没有过拟合,精度还上升了。这里验证了作者的第二条结论。第三天结论验证方式类似,不再赘述。
总结
- 预训练可以加快收敛,没别的用处。
- 实际工程中,还是可以使用预训练,收敛快,省事
- 本文的实验设计非常严密,基本上考虑到了每一个疑问点。值得借鉴。
- 对于许多“可能是”理论,要多思考,多问几个为什么。尤其是对于深度学习这种“黑盒子”,换个实验条件,结论可能就相反。这篇paper的结论也是如此,不能奉为圣旨