分类的tricks

Bag of Tricks for Image Classification with Convolutional Neural Networks

 

摘要

 

本文主要介绍了一些常用的分类trick,并且使用这些trick联合起来能够提升卷积网络的验证准确率,这些trick的使用不仅仅限制在分类任务中,它在分割和检测任务中同样有效。

 

 

简介

 

随着深度网络的发展,imagenet的准确率从62.5% 增加到了82.7%, 这些提升不仅仅归功于网络结构的改变,也归功于一些简单好用的tricks。

这些tricks比较简单也不会增加很多参数。比如改变特殊卷积层中stride步长大小,使用不同的学习率策略。 研究发现一些tricks合起来使用能够更加优化模型准确率。

 

训练步骤

 

这一部分使用mini-batch加随机梯度训练一个网络,每一次iteration随机抽取b张图片来计算梯度更新网络参数的权重,

分类的tricks

 

算法中有一些超参可以调整。

训练过程

  1. 将图像变成float32,且每个像素在[0, 255]之间。
  2. 随机的剪切图像,剪切的比例在[3/4,4/3],然后区域选择是在[8%, 100%],然后将resize成224 x 224
  3. 水平平移,0.5的概率。
  4. 平均采样[0.6, 1.4], 从色调、饱和度、亮度。
  5. 加入pca噪音,从标准分布N(0, 0.1)中随机采样。
  6. 标准化RGB channel,均值[123.68, 116.779, 103.939],方差[58.393,  57.12, 57.375 ]。

在验证阶段,将短边变成256像素,之后进行center crop, 变成224 x 224。的区域,并且和训练阶段一样进行RGB channel标准化。

卷积和全连接的权重初始化使用的是Xavier算法,

  1. 设置参数随机均值采样从[-a, a] 其中a满足

分类的tricks

其中d_in, d_out表示输入输出的channel数量。

  1. 所有的偏执项 都设成0
  2. 每个bn层,r用1初始化,beta用0初始化。

 

使用NAG下降训练的时候,120epochs, batch_size=256。学习率初始化0.1

经过[30, 60, 90]步长减小10倍。

 

使用不同网络训练的结果如下

 

分类的tricks

 

效率训练

 

目前有一些效率提升的方法,就是降低数字的精度,同事使用更大的batch。这样不会损失模型的准确率。有些相关技术甚至能够提升准确率以及训练速度。

 

大batch 训练

 

  1. 大batch 训练

一般来说相同epoch的情况下大batch的验证准确率是要比小batch的差的。下一步介绍了四种机制,帮助增加一台机器训练时的batch大小。

  1. 线性规模学习率

由于大的batch_size,噪音较少,所以可以使用大的学习率。比如文中试验使用0.1作为初始化学习率。Batch_size=256,但是当batch_size > 256的时候,使用学习率为0.1*b/256

  1. 学习率的warmup机制,开始使用较小的学习率,当训练稳定之后又转回初始学习率。比如有些warmup策略是从0线性的增加学习率到初始学习率。假设使用前m个batchsize进行warmup,初始学习率是a, 那么在batch i 将会使用ia/m。
  2. r 零初始化。

BN一般有两个参数,如下

分类的tricks

其中r表示标准差的倒数1,beta=0,均值/标准差,对每个残差block的最后的BN层初始化r = 0。

  1. No bias decay, 权重衰减既包括权重,也包括偏执项。只对权重参数进行正则化防止过拟合,对BN层两个参数以及偏执不进行正则化。

这里的大batch的量在成千上万级别的。

 

低数据精度学习

 

将float32变成float16,那么就会有一个更狭窄的范围,容易超出这个范围从而破坏训练的过程。有一个新的训练方法,使用float16计算梯度,使用float32更新权重。

综合使用大batch 的适用机制其结果是有所提升的

 

分类的tricks

 

分别使用大batch机制

分类的tricks

 

模型调整

 

模型调整是对网络结构的一个微小调整,比如改变特殊卷积层的stride, 接下来以ResNet为基础进行研究。

ResNet结构

 

ResNet包含一个输入结构,4个stage,一个输出层,ResNet-50表示使用了50层卷积,ResNet-151使用151卷积

ResNet 调整

 

介绍两种调整ResNet-B, ResNet-c 最后自己给出一个新的ResNet-D.

 

ResNet-B

这一部分主要是改变下采样的block中下采样所在层。

分类的tricks    分类的tricks

左边原始的,右边为ResNet-B的

 

ResNet-C

 

 

分类的tricks 分类的tricks

左边是原始的,右边是改进后的。

分类的tricks 

在B的基础上,进行改进加入了AvgPool。

 

训练细化

 

在这一阶段,给出四个训练trick,这些tricks 能够增加模型准确率。

 

Cos 学习率衰减

 

在训练阶段学习率的适应是非常有用的,经过warm up之后,然后初始化学习率,稳定的减少学习率。一般的衰减策略,就是指数化衰减。其中包含step decay,经过30个epochs,进行学习率衰减。

当学习率的衰减满足下面公式的时候,那么就认为这是一个cos衰减。

分类的tricks

假设总的batches数量是T的时候,所以当batch=t的时候学习率如上式子所提出的一样。

Cos 衰减其实和step衰减差别并不大。

 

Label smooth

 

标签平滑公式如下,这里的标签指的是真实的标签

 

分类的tricks

其中E是一个小的常数。但是之后的标签平滑表现如下

分类的tricks

经过改进之后优化alpha是一个任意真是的数字,文中给出一个epsilon=0.1,K=1000

 

知识蒸馏

 

知识蒸馏,使用一个教师模型帮助训练当前的模型,当前模型被称为学生模型,教师模型是预训练的具有高的准确率的模型。学生模型能够提升准确率,当模型复杂度不改变的时候,比如使用ResNet-152作为一个教师模型训练ResNet50网络。

在训练阶段,增加了一个蒸馏loss,来惩罚从teacher模型与学生模型输出的不同。假设p是真实的模型,z 和 r分别是学生模型以及教师模型输出的结果,最后的蒸馏loss如下

分类的tricks

其中T表示一个超参,这个超参的目的使得输出平滑。

 

 

混合训练

 

和部分2.1描述的数据增强一样,这里介绍另一个数据增强的方法mixup,每次随机抽两个实例(xi, yi),(xj, yj)。对两个数据做线性插值

分类的tricks

其中lamta属于[0, 1]在mixup 训练中,我们只是用新的实例(x^,  y^)进行训练。