【论文笔记】CNN图像分类Tricks合集

paper:Bag of Tricks for Image Classification with Convolutional Neural Networks
author: Tong He, Zhi Zhang, Hang Zhang, Zhongyue Zhang, Junyuan Xie, Mu Li (Amazon Web Services)
code:https://github.com/dmlc/gluon-cv

1. Introduction

自2012年AlexNet的问世以来,深度神经网络已经成为了图像分类领域的主流方法,很多新的结构被提出,例如VGG,NiN,Inception,ResNet,DenseNet,NasNet等。同时我们看到了模型精度的稳步提升,比如在ImageNet上top1的validation acc已经从AlexNet的62.5%提升到了NASNet-A的82.7%。
不过这些精度的提升不单单是因为模型结构的改进。训练过程的改进,包括损失函数的改变、数据预处理和优化方法也发挥了重要作用。 在过去几年中已经提出了大量这样的改进,但是受到的关注相对较少。在文献中,大多数只是作为实现细节简要提及,而其他只能在源代码中找到。
本文将验证不同的训练过程优化和模型结构优化的tricks对提升精度的影响。其中很多tricks都是很微小的改进,例如调整某一个卷积层的stride,或调整学习率等。但总的来说,这些小的改变累加起来会达到一个很大的提升。论文将在不同的网络结构和数据集上评估这些tricks,并报告它们对最终模型精度的影响。
文章中的实证评估表明,一些特定的技巧可以显著提高模型的准确度,将它们组合在一起可以进一步提高模型的精度。在应用所有技巧之后,如表1所示,ResNet- 50在ImageNet上的top-1验证准确率从75.3%提高到79.29%,这一结果超越了其他更新和改进的网络架构,如SE-ResNeXt-50。此外,文章将提出的方法推广到其他网络(Inception V3[1]和MobileNet[11])和数据集(Place365[32]),以及其他应用领域(如目标检测和语义分割)中,同样可以带来良好的性能。
【论文笔记】CNN图像分类Tricks合集_第1张图片

2. 训练过程

2.1 Baseline训练过程

通常训练一个神经网络会采用mini-batch SGD,如Algorithm 1所示。每个iter随机采样b张图片计算梯度然后更新网络参数。
【论文笔记】CNN图像分类Tricks合集_第2张图片
关于超参和各函数有很多种实现方式,我们首先明确在我们的baseline中是如何实现的。
我们按照广泛使用的ResNet的实现作为baseline,训练过程主要分为以下六个步骤:

  1. 随机采样一张图片,将其解码成 32 位的原始像素浮点值,每一个像素值的取值范围为 [0, 255]。
  2. 随机以 [3/4, 4/3] 为长宽比、[8%, 100%] 为面积比,裁减矩形区域,然后再缩放为 224*224 的方图。
  3. 以 0.5 的概率随机水平翻转图像。3.以 0.5 的概率随机水平翻转图像。
  4. 从均匀分布 [0.6, 1.4] 中采样系数,用于缩放hue, saturation, and brightness等。
  5. 从正态分布 N \mathcal{N} N(0, 0.1) 中采样系数,用于添加 PCA 噪声。
  6. 图像归一化,RGB通道分别减去(123.68, 116.779, 103.939)再除以(58.393, 57.12, 57.375)。

验证阶段将每张图片的短边resize到256,保持其长宽比,然后在其中心位置裁剪224*224的区域,并做归一化(同训练)。在验证阶段没有做任何随机数据增强。
conv和fc层的参数都通过Xavier进行初始化,参数随机采样自均匀分布[-a,a],其中a= 6 / ( d i n + d o u t ) \sqrt{6/(d_{in}+d_{out})} 6/(din+dout) ,这里 d i n d_{in} din d o u t d_{out} dout分别表示输入输出channel的维度。所有bias初始化为0。对于bn层, γ \gamma γ初始化为全1, β \beta β初始化为全0。
训练时采用Nesterov Accelerated Gradient(NAG)。每个模型训练120个epoch,使用8 V100训练,batchsize=256。初始lr=0.1,lr_steps=[30,60,90],分别下降为1/10。

2.2 实验结果

我们训练了3个模型:ResNet-50,Inception-V3和MobileNet。所用数据集是ILSVRC2012,包含1000类的130万训练图片。baseline的训练效果如表2所示,ResNet-50比reference稍好,Inception-V3和MobileNet比reference稍差因为训练过程不同。
【论文笔记】CNN图像分类Tricks合集_第3张图片

3. 高效训练

3.1 大批量训练

对于凸优化问题,随着批量的增加,收敛速度会降低。也就是说,在相同的epoch数目下,用大的batchsize训练一个模型,比用小的batchsize训练模型的validation acc要低。
因此有很多工作致力于解决这个问题:

线性缩放学习率: 在mini-batch SGD中,梯度下降是一个随机的过程,因为每个batch中的样本是随机采样得到的。增加batchsize由于样本数增多了,会使得随机性有所降低,即较大的batchsize会减少梯度的噪声,这时可以通过增大学习率来加快收敛。按照[9],初始学习率设为0.1,batchsize=256,如果我们使用更大的batchsize b,则将初始学习率调整为0.1*b/256。

学习率预热: 初始使用较小的学习率,然后在训练过程变得稳定时换回初始学习率。按照[7],使用渐进的warmup策略,假设我们使用m个batch(e.g. 5 epochs)进行预热,初始学习率为 η \eta η,则在第i个batch所使用的学习率为 i ∗ η / m i*\eta/m iη/m

Zero γ \gamma γ 一个ResNet网络包含好多个residual blocks。每个block包括几个卷积层。给定输入x,假设block(x)为该block最后一层的输出,则整个residual block最终输出x+block(x)。注意,block的最后一层可以是BN层。BN层的操作为首先标准化其输入x得到 x ^ \hat{x} x^,然后做尺度变换 γ x ^ + β \gamma\hat{x}+\beta γx^+β,通常初始化为 γ = 1 , β = 0 \gamma=1,\beta=0 γ=1β=0在 zero γ \gamma γ的方法中,我们对所有处于residual block最后的BN 层初始化 γ = 0 \gamma=0 γ=0。这样所有的residual block初始时的输出等于输入,这相当于网络拥有更少的层,在初始阶段更容易训练。

No bias decay: weight decay作用于所有可学参数(包括权重和bias),相当于对所有参数做了L2正则化,使其趋近于0防止模型过拟合。但按照[14]建议,weight decay只作用于权重项即可避免过拟合。No bias decay方法仅将权重衰减应用在卷积层和全连接层的权重上,其它如bias,BN 中的 γ \gamma γ β \beta β等都不进行衰减。

3.2 低精度训练

神经网络通常使用32bit浮点数进行训练,即所有的数字都以FP32进行报错,所有OP的输入输出也都是FP32。然而,新的硬件可能对较低精度的数据类型具有更好的运算能力,例如V100对于FP32只能提供14TFLOPS,而对于FP16可以提供100TFLOPS,如表3所示在V100上将FP32换成FP16可使训练速度提升2-3倍。
尽管具备速度优势,降低精度使得取值范围变窄,因此更有可能出现超出取值范围的情况从而扰乱训练进度。[19]中提出将所有参数存储成FP16并用FP16进行梯度计算,同时所有参数也有一份拷贝在FP32上用于参数的更新。另外,loss乘上一个标量使其和梯度的FP16范围更加对齐也是一种解决方案。

3.3 实验结果

如表3所示,ResNet-50 的baseline(batchsize=256,FP32)训练时间为13.3min/epoch,而采用batchsize=1024, FP16训练时间为4.4min/epoch,并且top-1 acc还有0.5%的提升。
【论文笔记】CNN图像分类Tricks合集_第4张图片
上述各tricks的ablation study如表4所示。从batchsize=256到batchsize=1024,仅仅使用线性缩放学习率,会导致精度有0.7%的下降,加上其他的几个tricks能够弥补这个精度差。
【论文笔记】CNN图像分类Tricks合集_第5张图片

4. 模型变体

本文中的模型变体是指对网络结构进行微小的改变,例如改变某个卷积层的stride等。这种改变基本不影响训练的复杂度,但可以对模型的精度有不可忽视的提升。本文主要以ResNet结构为基础进行变形。

4.1 ResNet结构

ResNet网络由一个输入主干(input stem)、四个stage和一个最终输出层组成,如图 1 所示。输入主干包括一个7×7卷积层,输出通道为64,stride=2,接着是 3×3 max pooling层,stride=2。这一输入主干将输入宽度和高度减小 4 倍,通道数增加到64。
从stage 2 开始,每个阶段从一个downsample block开始,然后是几个residual block。在downsample block中,存在路径 A 和路径 B。路径 A由三个卷积组成,其卷积核大小分别为 1×1、3×3 和 1×1。第一个卷积strde=2,以将输入长度和宽度减半,最后一个卷积的输出通道比前两个大 4 倍,称为bottleneck结构。路径 B 使用stride=2 的 1×1 卷积将输入形状变换为路径 A 的输出形状,这样我们可以对两个路径的输出求和以获得downsample block的输出。residual block类似于downsample block,除了仅使用stride=1的卷积。
我们可以改变每个stage中residual block的数量以获得不同的 ResNet 模型,例如 ResNet-50 和 ResNet-152,其中的数字表示网络中卷积层的数量。
【论文笔记】CNN图像分类Tricks合集_第6张图片

4.2 ResNet变体

我们首先回顾两个已有的流行的ResNet的变体,记为ResNet-B和ResNet-C。在此基础上我们提出一个新的变体ResNet-D。
ResNet-B。这个版本一开始出现在Torch的实现里。它改变了ResNet的downsample block。在原始的ResNet的downsample模块中,路径A使用1×1卷积stride=2,使得输入feature map一下子就丢失了3/4。ResNet-B于是改变了一下stride=2的卷积的位置,将其放在第二个卷积上,这样没有信息被丢失。
ResNet-C。这种变形首先由Inception-v2提出,然后在很多其他模型如SENet,PSPNet,DeepLabV3,ShuffleNetV2等中被使用。由于卷积的计算量和kernel的长宽是二次的关系,因此7×7的卷积计算量是3×3卷积计算量的5.4倍。ResNet-C变体在输入主干中将7×7卷积替换成3个3×3卷积,其中第1和第2个卷积输出channel数为32,stride=2,第3个卷积输出channel数为64。
ResNet-D。受ResNet-B的启发,我们发现downsample block路径B中的1×1卷积也丢失了3/4的feature map。我们希望修改它使得信息没有被丢失。我们发现在卷积层前加1个2×2 avg pooling层,stride=2,同时将卷积层的stride变为1,在实际中表现良好。
【论文笔记】CNN图像分类Tricks合集_第7张图片

4.3 实验结果

ResNet-D在主干网络上沿用ResNet-C的结构,在downsample block的路径A沿用ResNet-B的结构,同时在路径B做了改进,各个改动的acc提升如表5所示。
【论文笔记】CNN图像分类Tricks合集_第8张图片

5. 训练方法改进

5.1 余弦学习率衰减

学习率调整对于训练来说很重要,除了在3.1节提到的学习率预热的策略外,我们通常希望初始学习率的降低平滑一些。广泛使用的是指数衰减,例如He et al.[9]中每隔30个epoch学习率衰减为原来的0.1,Szegedy et al.[26]每两个epoch学习率衰减为原来的0.94。
和指数衰减不同,Loshchilov et al[18] 提出余弦退火策略,其简化版本是按照余弦函数将学习率从初始值降到 0。假设批次总数为T(忽略预热阶段),那么在批次 t,学习率 η t \eta_t ηt 计算如下:
η t = 1 2 ( 1 + c o s ( t π T ) ) η \eta_t=\frac{1}{2}(1+cos(\frac{t\pi}{T}))\eta ηt=21(1+cos(Ttπ))η

我们将这种学习率衰减的策略称为余弦衰减。
余弦衰减和指数衰减的比较如图3a,可以看出余弦衰减在开始阶段降学习率降得比较慢,然后在中间阶段接近于线性下降,最后结束阶段又慢了下来。不同于指数衰减,余弦衰减一开始降得比较慢,指数衰减可能都降为原来的1/10了余弦衰减的学习率还是很高,这有可能能够提升训练的进度。
【论文笔记】CNN图像分类Tricks合集_第9张图片

5.2 标签平滑

图像分类网络的最后一层通常是全连接层,channel数等于类别数(记为K),输出的是每个类别的置信度(对于类别i的置信度记为 z i z_i zi),这些置信度可以通过softmax将其归一化成概率值,即 q = s o f t m a x ( z ) q=softmax(z) q=softmax(z),其中每个每个类别的概率计算公式为:
q i = e x p ( z i ) ∑ j = 1 K e x p ( z j ) q_i=\frac{exp(z_i)}{ \sum_{j=1}^Kexp(z_j)} qi=j=1Kexp(zj)exp(zi)
可以看出 q i > 0 q_i>0 qi>0 ∑ j = 1 K q i = 1 \sum_{j=1}^Kq_i=1 j=1Kqi=1
另一方面,图片的真实类别记为y,真实的概率分布(记为 p i p_i pi)为:
在这里插入图片描述
训练时损失函数是交叉熵loss(注意这里原文中的公式写错了):
L ( p , q ) = − ∑ i = 1 K p i l o g ( q i ) \mathcal{L}(p,q)=-\sum\limits_{i=1}^{K}p_ilog(q_i) L(p,q)=i=1Kpilog(qi)
由于 p i p_i pi仅在 i = y i=y i=y时有值,loss可以进一步写成: L ( p , q ) = − l o g ( q y ) = − z y + l o g ( ∑ j = 1 K e x p ( z j ) ) \mathcal{L}(p,q)=-log(q_y)=-z_y+log(\sum\limits_{j=1}^Kexp(z_j)) L(p,q)=log(qy)=zy+log(j=1Kexp(zj))
则理想状态下 z y ∗ z_y^* zy=inf 且其他 z i z_i zi很小。也就是说它希望输出的置信度非常具有区分度,这可能会导致过拟合。
标签平滑的想法首先被提出用于训练 Inception-v2 [26]。它将真实概率的构造改成:
【论文笔记】CNN图像分类Tricks合集_第10张图片
其中 ϵ \epsilon ϵ是一个小的常数。这时理想的解为:
在这里插入图片描述
其中 α \alpha α可以是任意实数。这个解使得fc层的输出是有限的,更容易进行泛化。当 ϵ = 0 \epsilon=0 ϵ=0时,gap(指真实类别的预测概率和其他类别的预测概率之间的倍数) l o g ( ( K − 1 ) ( 1 − ϵ ) / ϵ ) log((K-1)(1-\epsilon)/\epsilon) log((K1)(1ϵ)/ϵ)将等于无穷,当 ϵ \epsilon ϵ增大时,gap减小。特别地当 ϵ = ( K − 1 ) / K \epsilon=(K-1)/K ϵ=(K1)/K时,所有 z i ∗ z_i^* zi的值相等。图4a显示了当我们改变 ϵ = 0 \epsilon=0 ϵ=0时gap的变化,给定K=1000。就是说在 ϵ = 0 \epsilon=0 ϵ=0时gap为正无穷, ϵ = 1 \epsilon=1 ϵ=1时(确切的值是 ϵ = ( K − 1 ) / K \epsilon=(K-1)/K ϵ=(K1)/K)gap为0。
我们比较了两个分别带标签平滑和不带标签平滑的ResNet-50-D模型的输出值,gap=输出的最大预测概率/其他预测概率的均值。图4b显示了两个模型的gap分布,带标签平滑取 ϵ = 0.1 \epsilon=0.1 ϵ=0.1,K=1000,此时gap在9.1左右。很明显带标签平滑的gap小于不带标签平滑的,并且极端值的情况变少了。
【论文笔记】CNN图像分类Tricks合集_第11张图片

5.3 知识蒸馏

在知识蒸馏[10] 中,我们使用教师模型来帮助训练当前模型(称为学生模型)。教师模型通常是具有更高准确率的预训练模型,通过模仿,学生模型能够在保持模型复杂性相同的同时提高其自身的准确率。一个例子是使用 ResNet-152 作为教师模型来帮助训练 ResNet-50。
在训练时,增加一个蒸馏loss用于惩罚学生模型和教师模型softmax输出的不一致。给定输入,假设 p p p 是groundtruth的概率分布, z z z r r r 分别是学生模型和教师模型最后一层fc层的输出,则loss变为:
在这里插入图片描述
其中T是一个温度超参,用于控制输出的softmax更平滑,这样可以帮助从教师模型的预测中蒸馏出类别分布的知识。

5.4 mixup训练

在混合训练(mixup)中,每次我们随机抽样两个样本 ( x i , y i x_i,y_i xi,yi) 和 ( x j , y j x_j,y_j xj,yj)。然后通过这两个样本的加权线性插值构建一个新的样本:
在这里插入图片描述
其中 λ \lambda λ是从Beta分布中随机采样的一个数。在混合训练中,我们只使用新的样本 ( x ^ , y ^ \hat{x}, \hat{y} x^,y^)。

5.5 实验结果

验证上述4种改进的训练方法的有效性。对于标签平滑,我们参照[26]设置 η = 0.1 \eta=0.1 η=0.1。对于知识蒸馏,设置 T = 20 T=20 T=20,另外教师模型是一个预训练的ResNet-152-D模型,使用余弦衰减和标签平滑。对于mixup,Beta分布的 α = 0.2 \alpha=0.2 α=0.2,另外将训练的eopch数从120调整到200,因为混合的数据需要更长的训练时间来收敛地更好。当结合mixup和知识蒸馏时,我们在训教师模型时也用上mixup。
我们认为这些训练方法不止对ResNet结构有效或只对ImageNet数据集有效。首先我们用这些训练方法在ImageNet上训练了ResNet-50-D,Inception-V3和MobileNet。val acc如表6所示。通过余弦衰减,标签平滑和mixup,我们对ResNet,Inception,MobileNet有稳定的提升。知识蒸馏对于ResNet效果很好,但对于Inception和MobileNet效果不好,我们认为可能的原因是教师模型和学生模型所属的模型结构不一样,因此在预测时有不同的分布,不适合进行教学。
另外我们在MIT Places365数据集上也训练了一个ResNet-50-D模型,用于证明我们的tricks可以用在别的数据集上,结果如表7。
【论文笔记】CNN图像分类Tricks合集_第12张图片

6.迁移学习

6.1 目标检测

把Faster-RCNN的VGG-19 Backbone模型替换成前面提到的各种预训练模型,其他设置保持一致。mAP在VOC2007上最终有4%的提升。
【论文笔记】CNN图像分类Tricks合集_第13张图片

6.2 语义分割

使用FCN在ADE20K数据集上进行训练和测试。余弦退火策略能够比较好地提升精度,而其他tricks效果都不好。可能的解释是语义分割预测的是像素级别,而用标签平滑,知识蒸馏和mixup有利于软化标签,模糊的像素级信息可能会更模糊,从而降低整体的像素级准确率。
【论文笔记】CNN图像分类Tricks合集_第14张图片

你可能感兴趣的:(论文笔记)