Bag of Tricks for Image Classification with Convolutional Neural Networks
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bag of Tricks for Image Classification with Convolutional Neural Networks相关的知识,希望对你有一定的参考价值。
参考技术A 自己很早就看到过这篇论文了,论文中的工作和我的一个项目也是有很多共通之处,但是自己实力不够也没有想法去把它们全部总结下来,只能在此膜拜一下大佬。自从2012年AlexNet在图像分类任务上大放异彩后,深度卷积神经网络已经成为图像分类任务上最有效的方法,在ImageNet上的准确率也从62.5%提升至82.7%。然而这些提升不仅仅是网络结构上的改进,还有很多训练策略上的改进,如损失函数、数据预处理、优化方法等,但是这些改进的关注度却非常低,有些重要的tricks甚至只能在源码中找到。本论文总结了一个技巧大礼包,通过和baseline对比,评估这些技巧的有效性。同样的,关于这些技巧的结论也适用于其他计算机视觉任务,比如目标检测、语义分割、实例分割等等。
baseline的训练方法主要是参考Resnet的训练过程。
近些年来,硬件(GPU)上发展迅速,所以在权衡性能上的选择也发生了改变。现在在训练时会去选择使用低数值精度和更大的batch size。
对于同样个数的epoch,大的batch_size效果不如小的batch_size。可以用以下启发式方法来解决这个问题
通常神经网络都是用32位浮点型(FP32)精度训练,也就是说所有参数的存储和运算都是用FP32。然而当前的新硬件支持更低精度的数据类型。比如V100用FP32能提供14TFLOPS,但是用FP16能提供100TFLOPS。在V100上从FP32切换到FP16后,整体训练速度加快了2到3倍。(本人不太了解混合精度训练,论文里也只是简单提了几句,大概看了一下百度的那篇混合精度论文,有误的话请指正)
尽管使用FP16可以大大加快训练速度,但是有些梯度在FP16范围之外,如果用FP16进行更新,梯度都会是0,无法正常训练。所以这里主要有两个方法:
模型调整是对网络体系结构的微小调整,例如改变特定卷积层的步幅。这种调整通常几乎不会改变计算复杂性,但可能对模型精度产生不可忽略的影响。在本节中,我们将使用ResNet作为示例来研究模型调整的影响。
ResNet由一个输入主干,后续的四个阶段和一个输出层组成。
ResNet有两个流行的调整,在这里我们分别成为ResNet-B和ResNet-C,我们也提出了一个新的模型调整,ResNet-D。
使用第三节提到的BS=1024,精度为FP16的ResNet50进行实验。ResNet50和ResNet50-D的浮点数计算成本差异在15%内,在训练过程中,ResNet50-D仅仅只慢了3%,精度提升了1%。我自己也大概计算了一下将用3个3x3替代一个7x7增加的FLOPs。(不包含bias,BN,ReLu等计算)
本节进一步介绍提高模型精度的四种训练策略的改进。
在训练过程中,学习率是一个至关重要的参数,在使用warm up后,我们通常会随着训练进程,逐步降低学习率。广泛使用的策略是学习率指数衰减。在ResNet中是每30轮降低0.1,称之为step decay;在Inception中是每两轮降低0.94。另一种策略是2016年提出的学习率余弦衰减。简化版本是通过余弦函数将学习速率从初始值降低到0。
从上图可以看出,起初余弦衰减的学习率缓慢下降,在中间部分几乎是线性下降,在最后又缓慢下降。(但是似乎准确率没有提升,而且也没有加速收敛,只是验证准确率曲线更加平滑)
图像分类网络的最后一层通常是全连接层。由 表示 类的预测得分,可以通过 算子对这些得分进行归一化得到预测概率。总共有 类, 类的概率 可以通过以下公式计算:
另外,如果图像的真实标签是 ,我们可以得到分布 :
负交叉熵计算(论文中此处公式有误):
通过训练,使得 两个分布越来越接近。损失计算也可以转换为下式:
所以最优解是 ,同时保持其他值很小。换句话说,这样做也鼓励输出的分数有显著区别,从而可能导致过拟合(通过softmax学到的模型太自信了)。
标签平滑的想法首先被提出用于训练Inception-v2,它改变了真实概率 的分布:
其中 是一个常数,所以最后的解为:
其中 可以是任意实数。这样可以调整全连接层的输出,得到更好的泛化能力。
在知识蒸馏中,我们使用教师模型来帮助训练当前模型,这被称为学生模型。教师模型通常是具有更高准确度的预训练模型,因此通过模仿,学生模型能够在保持模型复杂性相同的同时提高其自身的准确性。一个例子是使用ResNet-152作为教师模型来帮助培训ResNet-50。
在训练期间,我们添加蒸馏损失来惩罚教师模型的Softmax出书和学生模型之间的差异。给定输入,假设 是真实概率分布,并且 分别是学生模型和教师模型最后全连接层的输出。我们之前是使用负交叉熵损失 来衡量 之间的差异。加上只是蒸馏后,其损失函数变为:
2017年提出的mixup。每次随机选两个样本作为一个样本对 ,然后通过这一个样本对,生成一个新的样本:
这里作者没有提及采用mix up后损失函数计算方法的改变,我补充一下:
知乎的讨论---如何评价mixup: BEYOND EMPIRICAL RISK MINIMIZATION?
我们设置 用于标签平滑,使用 用于知识蒸馏,对于ResNet152-D模型,同时使用余弦学习率衰减和标签平滑作为教师网络。在mix up 中,我们在Beta分布中选择 ,并且将训练轮数由120增加到200,因为mix up要求使用更多的轮数才能够更好的收敛。当我们同时使用mix up 和知识蒸馏时,教师网络也会使用mix up进行训练。
知识蒸馏在ResNet上运行良好,但是它在Inception-V3和MobileNet上运行不佳。我们的解释是,教师模型不是来自学生的同一个家庭,因此在预测中有不同的分布,并对模型带来负面影响。
迁移学习是图像分类模型的一个主要用途,我们在选择了两个重要的计算机视觉任务:物体检测和语义分割,通过改变基本模型来评估他们的性能。
我们分别使用VOC 2007 trainval和VOC 2012 trainval的联合集进行培训,并使用VOC 2007测试进行评估。我们在这个数据集上训练了Faster-RCNN,其中包括来自Detectron的改进,例如线性warm up 和 long training schedul。将Faster-RCNN的基础网络替换,保持其他设置相同,因此收益仅来自于模型。ImageNet上精度为79.29%的最佳基础模型在VOC上的最佳mAP为81.33%,优于标准模型4%
我们使用完全卷积网络FCN在ADE20K 数据集上训练模型,在Stage3和Stage4中使用扩张卷积。与我们在物体检测上的结果相矛盾,余弦学习速率表有效地提高了FCN性能,而其他改进则没有效果。对该现象的潜在解释是语义分割在像素级别中预测。虽然使用标签平滑,蒸馏和mix up 的模型有利于软化标签,但模糊的像素级信息可能会降低精度。
在本文中,我们调查了十几个技巧,以训练深度卷积神经网络,以提高模型的准确性。这些技巧为模型架构,数据预处理,损失函数和学习速率进行了微小的修改。我们在ResNet-50,Inception-V3和MobileNet上的实证结果表明,这些技巧可以始终如一地提高模型精度。更令人兴奋的是,将所有这些堆叠在一起可以显着提高准确性。此外,这些改进的预训练模型在转移学习中显示出强大的优势,这改善了对象检测和语义分割。我们相信,这种优势可以扩展到更广泛的领域。
作者总结了一大堆技巧,并且对于这些技巧都做了足够的实验,可以将其作为一本指导手册,帮助自己在以后训练网络的过程中少踩坑。其中每一个tricks在本文中也只是简单交代,想要了解更多的细节还需要去找相关论文继续深入。
Bag of Tricks for Image Classification
以上是关于Bag of Tricks for Image Classification with Convolutional Neural Networks的主要内容,如果未能解决你的问题,请参考以下文章
训练技巧详解含有部分代码Bag of Tricks for Image Classification with Convolutional Neural Networks
Bag of Tricks for Image Classification with Convolutional Neural Networks
文本分类Bag of Tricks for Efficient Text Classification
论文阅读:《Bag of Tricks for Efficient Text Classification》
目标检测tricks:Bag of Freebies for Training Object Detection Neural Networks