分类的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张图片来计算梯度更新网络参数的权重,
算法中有一些超参可以调整。
训练过程
- 将图像变成float32,且每个像素在[0, 255]之间。
- 随机的剪切图像,剪切的比例在[3/4,4/3],然后区域选择是在[8%, 100%],然后将resize成224 x 224
- 水平平移,0.5的概率。
- 平均采样[0.6, 1.4], 从色调、饱和度、亮度。
- 加入pca噪音,从标准分布N(0, 0.1)中随机采样。
- 标准化RGB channel,均值[123.68, 116.779, 103.939],方差[58.393, 57.12, 57.375 ]。
在验证阶段,将短边变成256像素,之后进行center crop, 变成224 x 224。的区域,并且和训练阶段一样进行RGB channel标准化。
卷积和全连接的权重初始化使用的是Xavier算法,
- 设置参数随机均值采样从[-a, a] 其中a满足
其中d_in, d_out表示输入输出的channel数量。
- 所有的偏执项 都设成0
- 每个bn层,r用1初始化,beta用0初始化。
使用NAG下降训练的时候,120epochs, batch_size=256。学习率初始化0.1
经过[30, 60, 90]步长减小10倍。
使用不同网络训练的结果如下
效率训练
目前有一些效率提升的方法,就是降低数字的精度,同事使用更大的batch。这样不会损失模型的准确率。有些相关技术甚至能够提升准确率以及训练速度。
大batch 训练
- 大batch 训练
一般来说相同epoch的情况下大batch的验证准确率是要比小batch的差的。下一步介绍了四种机制,帮助增加一台机器训练时的batch大小。
- 线性规模学习率
由于大的batch_size,噪音较少,所以可以使用大的学习率。比如文中试验使用0.1作为初始化学习率。Batch_size=256,但是当batch_size > 256的时候,使用学习率为0.1*b/256
- 学习率的warmup机制,开始使用较小的学习率,当训练稳定之后又转回初始学习率。比如有些warmup策略是从0线性的增加学习率到初始学习率。假设使用前m个batchsize进行warmup,初始学习率是a, 那么在batch i 将会使用ia/m。
- r 零初始化。
BN一般有两个参数,如下
其中r表示标准差的倒数1,beta=0,均值/标准差,对每个残差block的最后的BN层初始化r = 0。
- No bias decay, 权重衰减既包括权重,也包括偏执项。只对权重参数进行正则化防止过拟合,对BN层两个参数以及偏执不进行正则化。
这里的大batch的量在成千上万级别的。
低数据精度学习
将float32变成float16,那么就会有一个更狭窄的范围,容易超出这个范围从而破坏训练的过程。有一个新的训练方法,使用float16计算梯度,使用float32更新权重。
综合使用大batch 的适用机制其结果是有所提升的
分别使用大batch机制
模型调整
模型调整是对网络结构的一个微小调整,比如改变特殊卷积层的stride, 接下来以ResNet为基础进行研究。
ResNet结构
ResNet包含一个输入结构,4个stage,一个输出层,ResNet-50表示使用了50层卷积,ResNet-151使用151卷积
ResNet 调整
介绍两种调整ResNet-B, ResNet-c 最后自己给出一个新的ResNet-D.
ResNet-B
这一部分主要是改变下采样的block中下采样所在层。
左边原始的,右边为ResNet-B的
ResNet-C
左边是原始的,右边是改进后的。
在B的基础上,进行改进加入了AvgPool。
训练细化
在这一阶段,给出四个训练trick,这些tricks 能够增加模型准确率。
Cos 学习率衰减
在训练阶段学习率的适应是非常有用的,经过warm up之后,然后初始化学习率,稳定的减少学习率。一般的衰减策略,就是指数化衰减。其中包含step decay,经过30个epochs,进行学习率衰减。
当学习率的衰减满足下面公式的时候,那么就认为这是一个cos衰减。
假设总的batches数量是T的时候,所以当batch=t的时候学习率如上式子所提出的一样。
Cos 衰减其实和step衰减差别并不大。
Label smooth
标签平滑公式如下,这里的标签指的是真实的标签
其中E是一个小的常数。但是之后的标签平滑表现如下
经过改进之后优化alpha是一个任意真是的数字,文中给出一个epsilon=0.1,K=1000
知识蒸馏
知识蒸馏,使用一个教师模型帮助训练当前的模型,当前模型被称为学生模型,教师模型是预训练的具有高的准确率的模型。学生模型能够提升准确率,当模型复杂度不改变的时候,比如使用ResNet-152作为一个教师模型训练ResNet50网络。
在训练阶段,增加了一个蒸馏loss,来惩罚从teacher模型与学生模型输出的不同。假设p是真实的模型,z 和 r分别是学生模型以及教师模型输出的结果,最后的蒸馏loss如下
其中T表示一个超参,这个超参的目的使得输出平滑。
混合训练
和部分2.1描述的数据增强一样,这里介绍另一个数据增强的方法mixup,每次随机抽两个实例(xi, yi),(xj, yj)。对两个数据做线性插值
其中lamta属于[0, 1]在mixup 训练中,我们只是用新的实例(x^, y^)进行训练。