Bag of Tricks for Image

Bag of Tricks for Image Classification with Convolutional Neural Networks
论文链接:https://arxiv.org/pdf/1812.01187.pdf

本文由李沐大神18年12月提出,主要讨论了训练神经网络过程中的一些tricks,通过各种对比试验定量分析不同tricks对分类网络性能的贡献。论文的工作主要从三个方面着手:高效训练网络微调训练优化
这篇文章的优化点和测试主要是在图像分类领域,但论文提到的trick和结论,同样可以延申到其他计算机视觉任务,比如目标检测、语义分割、实例分割等等,具体效果需经过自己实践项目验证。

Efficient Training(高效训练)

增大batch_size

在训练网络模型时,batch size参数尽量设置大一些。batch size越大意味着基于每个batch数据计算得到的梯度更加贴近整个数据集(数学上来讲就是方差更小),因此更新方向更加准确。
但如果只增大batch_size,模型迭代相同的次数需要更长的时间,模型收敛速度将变慢。针对这个问题,作者提出了以下几个解决方案。
Linear scaling learning rate
增大batch size,梯度更新的方向更加正确,数据中噪声的影响会更小,此时就可以使用大的学习率步长。具体结论:batch size修改为原来的几倍,那么初始学习率也可以修改为原来的几倍,学习率和batch_size之间是一种线性缩放的关系

假设初始batch_size=256, lr = 0.1
更改后:
batch size = 256*5 —> lr=0.1×5=0.5
batch size = b —> lr=0.1 × b / 256

Learning rate warmup
网络的参数是随机初始化的,如果模型一开始就采用较大的学习率,模型的训练容易变得不稳定,此时可以先用一个小的学习率训几个epoch,等到训练过程基本稳定了就可以使用原先设定的初始学习率进行训练了,这就是热启动机制(warmup)。
warmup的具体实现过程一般采用线性增加的策略,举例而言,假设warmup阶段的初始学习率是0,warmup阶段共需要训练m个batch的数据,假设训练阶段的初始学习率是L,那么在batch i的学习率就设置为i*L/m。

以上两个策略引用于: Accurate, large minibatch SGD: training imagenet in 1 hour

Zero γ(BN层 γ = 0)
Resnet网络结构中包含了多个residual blocks,记某个block的输入为x,那么经过残差求和后的结果为x + block(x) ,而block的最后一层为batch norm层,batch norm层先将该层的输入数据标准化,记作x ^ ,那么batch norm层的输出为γ x ^ + β,其中,γ和β为可训练参数,因此也需要在模型训练之前做初始化,通常的做法是将它们分别初始化为1和0。Zero γ 的做法是将它们均初始化为0。此时residual block的输出和输入相等,可以使模型在初始阶段更容易训练

No bias decay
权重衰减(weight decay)广泛应用于weights 和 bias中,一定程度上减少模型过拟合的问题,bias无衰减指的是仅仅在卷积和全连接层的权重中使用权重衰减。

Low-precision training

通常,对于神经网络的训练,网络的输入、网络参数、网络输出都采用32位浮点型,随着GPU的迭代更新,英伟达的部分显卡针对FP16做了定制化优化(比如V100支持16为浮点型的模型训练),能够大大加快模型的训练速度。
参考Mixed Precision Training

实验结果
单一策略的对比结果如下图,
在这里插入图片描述
大batch和FP16的组合策略的结果如下图,
在这里插入图片描述
显然,使用大batch和FP16的组合策略,网络模型的训练速度更快,这里的训练速度可以用Time/Epoch来衡量。通过以上结果可以看出和原来的baseline相比训练速度提升还是比较明显的,效果上也有一定提升,尤其是MobileNet,Top-1结果提升了2.87。

Model Tweaks(网络微调)

网络微调通常是对网络做小的修改,如修改特定卷积层的步长。网络微调很少改变计算复杂度,但对网络性能可能会有明显影响。论文中选取了经典的ResNet网络作为研究对象,Figure1是ResNet网络的结构示意图,可以看到主要由三部分组成:

  • input stem:主要是先用一个7*7的卷积核,后接一个最大池化
  • stage2-4:每个stage最开始是先用下采样模块对输入数据维度做减半操作,注意不是直接使用池化,而是通过设置卷积stride=2实现的。下采样之后后接若干个残差模块
  • output:最后接上预测输出模块
    在这里插入图片描述
    关于residual block的改进主要有3点。
    1、ResNet-B
    改进部分:将stage中path-A做downsample的residual block的downsample操作从第一个11卷积层换成第二个33卷积层,如果downsample操作放在stride为2的11卷积层,那么就会丢失较多特征信息(默认是缩减为1/4),可以理解为有3/4的特征点都没有参与计算,而将downsample操作放在33卷积层则能够减少这种损失,虽然stride设置为2,但是卷积核尺寸够大,因此可以覆盖特征图上几乎所有的位置。
    在这里插入图片描述
    如上图,当卷积的kernel size为3时,输出神经元1、2、3分别包含了输入神经元123、234、345的信息,如果进而设置stride为2,那么输出神经元仅仅为1和3,已经包含了输入的5个神经元的信息,也即当前卷积层没有丢失特征信息。
    1*1的卷积,最好不用于stride=2降低特征图尺寸用

2、ResNet-C
改进部分:将Figure1中input stem部分的77卷积层用3个33卷积层替换。这部分借鉴了Inception v2的思想,主要的考虑是计算量,一般情况下大尺寸卷积核带来的计算量要比小尺寸卷积核多。不过读者如果仔细计算下会发现ResNet-C中3个3*3卷积层的计算量并不比原来的少,这也是Table5中ResNet-C的FLOPs反而增加的原因。

3、ResNet-D
改进部分: 在ResNet-B的改动基础上将stage部分做downsample的residual block的支路从stride为2的11卷积层换成stride为1的卷积层,并在前面添加一个池化层用来做downsample。这部分我个人理解是虽然池化层也会丢失信息,但至少是经过选择(比如这里是均值操作)后再丢失冗余信息,相比stride设置为2的11卷积层要好一些。
加粗样式
实验结果
在这里插入图片描述

训练优化

Cosine Learning Rate Decay

学习率从0增大到初始学习率的过程,被称作warmup阶段,随后的学习率下降阶段则有多种方案,resnet官方代码使用的是step decay方案,作者采用了cosine decay方案。总批次数为T,初始化学习率为η ,在第t批时的学习率ηt为:
在这里插入图片描述
这部分的实验结果对比可以参考Figure3,其中(a)是cosine decay和step decay的示意图,step decay是目前比较常用的学习率衰减方式,表示训练到指定epoch时才衰减学习率。(b)是2种学习率衰减策略在效果上的对比。
在这里插入图片描述
基于作者在论文中给出的实验结果,cosine decay相对于stair decay方案提升了0.75个百分点。

Label Smoothing

Label Smoothing策略最早被提出用于训练Inception-v2网络结构。通常分类任务中每张图片的标签是one hot形式的,也就是说一个向量在其对应类别索引上设置为1,其他位置为0,形如[0,0,0,1,0,0]。label smoothing就是将类别分布变得平滑一点,它修改ground truth的概率分布如下
在这里插入图片描述
其中qi就代表某一类的ground truth,例如如果i=y,那么其最终真实值就是1−ε,其它位置设置为ε/(K−1),而不再是。这里的ε是一个很小的常数。

通过label smoothing,将原来常用的one-hot类型标签做软化,这样在计算损失值时能够在一定程度上减少过拟合。从交叉熵损失函数可以看出,只有真实标签对应的类别概率才会对损失值计算有所帮助,因此label smoothing相当于减少真实标签的类别概率在计算损失值时的权重,同时增加其他类别的预测概率在最终损失函数中的权重。这样真实类别概率和其他类别的概率均值之间的gap(倍数)就会下降一些,如下图所示。
在这里插入图片描述

Knowledge Distillation

Knowledge Distillation(知识蒸馏)包含了一个”教师网络”和一个”学生网络“。其中,“教师网络”通常采用预训练好的大模型,而“学生网路”中包含了待学习的参数,教师网络辅助和引导学生网络的学习。
标签的真实概率分布提供了hard label,如[1, 0],准确率高但是信息熵很低,而“教师网络”提供了soft label【即大模型的预测结果如[0.7, 0.3]】,准确率相对较低但是信息熵高。这里的信息熵怎么理解呢,比如一副马的图片,可以想象的到它看上去也有点像牛,而hard label给的标签是[1, 0],soft label给的标签是[0.7, 0.3],显然,soft label提供了类别之间的关联,提供的信息量更大【这副图片是马,而且马和牛长的很像】,有助于模型在学习时增强类间区分度,hard label和soft label结合等价于在学习真实标签的同时,补充类间信息。我们的优化目标是,让“学生网络”在学习标签的真实概率分布的同时,还要学习“教师网络”的先验知识,公式表示如下:
在这里插入图片描述
其中,前者表示学习标签的真实概率分布,后者表示学习“教师网络”的先验知识,T​​为超参数。

Mixup Training

这属于数据增强的一种手段,mixup指从训练集中随机选取两个样本 (x_i,y_i) 和 (x_j,y_j)。然后我们通过这两个样本的加权线性插值构建一个新的样本( x ^ , y ^ ),训练只在新样本中训练
在这里插入图片描述
其中,λ∈[0,1]为随机数,训练时只使用新构造的样本( x ^ , y ^ )​。
在这里插入图片描述

实验结果

在这里插入图片描述
其中,w/o代表with/without,从表中数据可见,对于ResNet-50-D网络结构,使用Knowledge Distillation策略能将Top-1精度从79.15%进一步提升到79.29%,而该策略对Inception-V3和MobileNet网络结构起反作用,作者认为,原因是“教师网络”为ResNet-152,和ResNet-50-D具有相似的基础block,两者的预测分布也是相似的。

猜你喜欢

转载自blog.csdn.net/qq_44804542/article/details/117220918