[paper] Bags of Tricks for Image Classification with Convolutional Neural Networks

介绍

论文地址:https://arxiv.org/abs/1812.01187

这篇文章主要介绍了一些在训练神经网络中可以提高准确率的tricks。随着深度学习的发展,不断有新的网络结构被提出,例如VGG, NiN, Inception, Resnet, DenseNet, NASNet等。伴随着新的网络结构的诞生,分类准确率也在不断上升。但是,损失函数的改变,数据预处理和优化方法对于准确率的提升也是至关重要的,但是这些方法论文中却没有深入解释,这篇论文就是测试了不同的trick的效果,将关注点从 网络结构中移开,关注其他方面。

[paper] Bags of Tricks for Image Classification with Convolutional Neural Networks_第1张图片

上图为以ResNet50为基础,在此结构进行改进所取得的结果,可以看出,Resnet50 + trick取得了很好的效果。

训练

在训练过程,我们执行一下步骤:

  • 随机取一张图片,并且将其编码为32bit的float类型,其值在[0, 255]
  • 随机crop一个矩形框,矩形框的长宽比在[3/4, 4/3]之间,并且要求面积在原来[8%,100%]。resize crop的区域到224*224大小。
  • 50%的概率水平翻转
  • 给色调,饱和度,亮度一个系数,范围[0.6, 1.4]
  • 用系数加PCA噪音,系数服从正太分布N(0, 0.1)
  • RGB三个通道分别减去123.68,116.779,103.939然后除以58.393,57.12,57.375

在验证阶段

  • 我们resize每个图片的最短边到256pixels,并保持其原有长宽比
  • 在中心crop224*224,并且像训练那样正规化RGB通道
  • 在验证阶段,不用随机数据增强的方式

卷积和全连接层权重的初始化使用Xavier算法。超参数的值随机取自[-a,a],a=$\sqrt{6/(d_{in}+d_{out})}\mathit{}}$。在这里$d_{in} \ d_{out}$ 是输入和输出的channel size。所有偏置项设为0。对于batch normalization,$\gamma$向量为1,$\beta$向量为0。

训练使用Nesterov Accelerated Gradient梯度下降算法。每个模型训练120epoch使用8个Nvidia V100 gpu,batch size为256。学习率初始化为0.1,30epoch, 60epoch, 90epoch分别除以10

效果:

  • 在resnet50上,效果比原网络效果好
  • 在inception v3和mobilenet上比原来差些

[paper] Bags of Tricks for Image Classification with Convolutional Neural Networks_第2张图片

高效的训练

大batch 训练

训练用大batch size相比训练用小batch size在验证集上表现差。

1. 如果一定要用大的batch size,那么同时学习率也需要做对应的调整。因为在mini-batch SGD中,由于每个batch里样本的选择是随机的,因此梯度下降是个随机的过程。增加batch size不能改变随机梯度,而是会减少梯度的变化。换句话说,大batch size会减少梯度噪音,因为我们可以对应增加学习率。

举例:如果我们初始学习率为0.1,batch size为256,当我想用一个更大的batch size为b,我们需要将学习率改变到:0.1*b / 256

2. 在训练的开始,所有参数都是随机的并且显然这些参数的值远离最终的结果。所以开始就使用一个大的学习率很可能导致大量不稳定。我们在开始时先使用一个小的学习率,在学习过程中缓慢增加学习率,当训练稳定时转到一个初始化学习率。

3. 让$\gamma$为0。ResNet网络包含多个残差模块,每个模块包含许多卷积。给定输入x,block(x)为block的输出,则残差模块的输出为block(x)+x。一个block的最后一层应该是一个batch normalization层。BN层首先标准化输入,然后调整尺度和偏移量:$\gamma x+\beta$。其中$\gamma \ \beta$都是需要学习的参数,在初始化的时候$\gamma$初始化为1,而$\beta$初始化为0。而我们的方式是让$\gamma$初始化为0s,这样做会让残差模块只返回他们的输入,模仿层数较少的网络,而这在初始阶段很容易训练。

4. 无偏置衰减。权重衰减通常被应用在所有需要学习的参数上,包括权重和偏置。它等同于对所有参数用一个L2正则化,而这回让它们都朝着0方向移动。然后,当时的论文中推荐L2正则化只应用在权重上来防止过拟合。无偏置衰减就是用了上述思路,将正则化只是应用在卷积和全连接的权重上,其余的参数,如\bg_white \fn_phv $\gamma, \beta$不需要正则化。

低精度训练

神经网路的训练通常使用float32精度,这句话的意思是:所有数据都使用float32来储存,输入、输出和参数都是float32。然而,新的硬件资源具有增强的算数logit单元,可用于较低精度的数据类型。例如,在v100中,使用float16是float32训练速度的2到3倍。

 

尽管具有性能优势,但精度降低使得结果更有可能超出范围,从而影响训练进度。 Micikevicius等。 建议在FP16中存储所有参数和激活,并使用FP16计算梯度。同时,所有参数在FP32中都有一个副本用于参数更新。此外,将标量乘以损耗以更好地将梯度范围与FP16对齐也是一种实用的解决方案。

模型调整(Model Tweaks)

模型调整是对网络阶段的小规模调整,像改变某卷积层的步长等。这样的调整几乎不会改变模型的复杂度,但是却可能对最后的准确率有可观的影响。这一节我们使用resnet作为立足,探究如何对模型调整。

ResNet结构

ResNet的详细介绍可以详见:Deep Residual Learning for Image Recogntion这篇论文。下面简单叙述一下,Resnet由输入层,4个连续的stage和最后一个输出层。

[paper] Bags of Tricks for Image Classification with Convolutional Neural Networks_第3张图片

输入层包括一个7*7的卷积,输出通道为64,stride为2,之后连接一个3*3的max pooling层,stride也为2。经过这两个步骤,此时的宽,高为输入时的1/4,channel为64。

从con2_x开始,每个阶段用一个下采样开始,然后接一系列残差模块,在下采样模块,有A,B两条路径。路径A有三个卷积,kernel分别为1*1,3*3,1*1。第一个卷积步长为2,最终的channel是输入channel的4倍。这样会导致一个瓶颈结构(bottleneck structure)。路径B使用一个1*1的卷积,步长为2,来让A,B路径的输出尺度相同。

残差模块和下采样模块类似,除了使用stride为1。

[paper] Bags of Tricks for Image Classification with Convolutional Neural Networks_第4张图片

ResNet Tweaks

下面作者介绍了两个通用的Resnet 改进方案,ResNet-B,ResNet-C。然后作者提出了一个新的改进方案ResNet-D。

[paper] Bags of Tricks for Image Classification with Convolutional Neural Networks_第5张图片

RestNet-B

ResNet-B改变了ResNet的下采样模块。Path A中的前两个stride大小改变了。这样做可以先提取信息,然后再加大步长,减少信息的损失。

ResNet-C

Inception-v2提出了ResNet-C,将输入之后的7*7卷积换成2个3*3卷积串联。

ResNet-D

受到ResNet-B的启发,作者认为下采样Path B使用1*1的卷积stride为2也会忽略3/4的信息,我们应该尽量减少信息的损失。作者将Path B改为2*2的平均池化加上1*1的卷积,这在实际中效果很好,并且只是轻微改变计算量。

实验结果

作者使用上述提到的三种方法进行实验,使用batch size为1024,精度为float16,结果如下:

[paper] Bags of Tricks for Image Classification with Convolutional Neural Networks_第6张图片

  • 从结果可以看出ResNet-B相比与ResNet在下采样部分保留了更多信息,从而让准确率提高0.5%。
  • 使用两个3*3卷积串联代替7*7卷积得到了0.2%的提升。
  • ResNet-D又提升了0.3%。总计,ResNet50-D相比ResNet-50提高了1%。

从另外一个角度看,这四个模型有相同的模型尺寸,ResNet-D有最大的计算量,但是实际上,它只是比Resnet-50慢3%。

训练改进(Training Refinement)

在这节,作者提到了4种训练改进的方法来提高模型的准确率。

余弦学习率下降

学习率的调整对于整个训练来说十分重要。在之前的方法里,提及到线性降低学习率。

余弦学习率下降的公式为:

$\eta_t= 1/2(1+cos(t\pi/T))\eta$

其中$\eta $是初始学习率,T是总batch数量,t是当前batch数。所以$\eta_t \in [0,1]$,且从1到0单调下降。

[paper] Bags of Tricks for Image Classification with Convolutional Neural Networks_第7张图片

由图可以看出,余弦学习率下降在开始下降很缓慢,在中期几乎变为线性减少,在后期又变成下降很缓慢。

标签平滑(label smoothing)

https://juejin.im/post/5a29fd4051882534af25dc92

觉得上述文章写的挺好的,总体感觉标签平滑对于二分类问题就是,如果一张图label为1,那么标签平滑就是让label变为1-\varepsilon;如果label为0,那么标签平滑就是让label变为\varepsilon。对于多分类问题,公式如下:

[paper] Bags of Tricks for Image Classification with Convolutional Neural Networks_第8张图片

Knowledge Distillation

在knowledge distillation中,我们使用teacher model来帮助训练当前的模型,当前的模型成为student model。teacher model通常是一个预训练模型有着更高的准确率。student model能在保持自己模型复杂度的同时提高自己的准确率。一个例子是:使用ResNet-152作为teacher model,来帮助训练ResNet-50。

在训练过程中,我们对于teacher model和learner model softmax结果不同进行惩罚。给定一个输入,假设p是真实分类的预测概率,z和r是student model 和 teacher model全连接层的输出,正常的化我们使用交叉熵损失:l(p,softmax(z))。此时,损失函数为:,T是超参数,使softmax输出更加平滑,从而从teacher的预测中提取label分布的知识。

混合训练

混合训练也是图像增强方法的一种。在混合训练中,我们随机取两个样本(x_i,y_i)(x_j,y_j),然后我们通过这两个例子的加权线性插值形成一个新的例子:

[paper] Bags of Tricks for Image Classification with Convolutional Neural Networks_第9张图片

其中\lambda \in [0,1],是一个随机数,在混合训练中,我们仅仅使用新的样本。

实验结果

 

 

 

 

你可能感兴趣的:(计算机视觉,paper,图像处理)