『Bag of Tricks for Image Classification with Convolutional Neural Networks』论文笔记

一 为什么读这篇

doodle比赛刚结束,蛙神推荐的,论文在arxiv上才挂出来,第二天蛙神就分享了,佩服其信息获取能力。正如题目讲的,一包tricks,读这篇相当于读综述,学习一下图像分类问题里的技巧讨论。

二 截止阅读时这篇论文的引用次数

2018.12.9 0次。毕竟12月4号才出的

三 相关背景介绍

几个作者全部都是来自AWS的华人,其他几人不算很有名,不过最后一个作者是大名鼎鼎的百度少帅李沐。应该会安利不少MXNet。

四 关键词

Tricks

Large-batch

Linear scaling learning rate(线性缩放学习率)

Learning rate warmup(学习率热身)

FP32 FP16

Cosine Learning Rate Decay(余弦学习率衰减)

Label Smoothing(标签平滑)

Knowledge Distillation(知识蒸馏)

Mixup Training(混合训练)

五 论文的主要贡献

正如论文题目所说,提供一包tricks用于提升效果。模型架构很重要,但是训练技巧也不容忽视。

六 详细解读

1 介绍

(摘要)当前许多图像分类的研究可归功于训练过程的改进,例如改进数据增强和优化方法。然而在文献中,许多改进仅仅在实现细节中有简短的描述或在源码中才会出现。本文通过模型简化测试(ablation study)试验了一系列这些改进并评估他们对最终模型准确率的影响。通过联合这些改进策略,能够显著的改善不同的CNN模型。用这些策略把原始ResNet-50在ImageNet上的准确率从75.3%提升到79.29%。。

在ImageNet上的top-1准确率从62.5%(AlexNet)提升到82.7%(NASNet-A)。然而改进不单单来自模型架构,训练过程中的改进也扮演了很重要的角色,例如损失函数,数据预处理,优化方法等。这些方法受到的注意相对少些。通过本文的实验说明模型准确率的提升不仅仅是由计算复杂度的改变带来的。

此处安利GluonCV

cnn_tricks-table1.png

2 训练过程(baseline)

cnn_tricks-alg1.png

2.1 Baseline训练过程

torch的做法来实现ResNet作为baseline。训练和测试阶段的预处理流水线是不同的,在训练阶段,采用如下做法:

https://github.com/dmlc/gluon-cv/blob/master/scripts/classification/imagenet/train_imagenet.py#L152

1 随机采样图像,将其从[0,255]原始像素值解码为32位浮点数。

2 随机裁剪纵横比在[3/4, 4/3]之间,面积在[8%, 100%]之间的矩形区域,然后将裁剪区域调整为224x224的方形图像。

3 用0.5的概率做水平翻转。

4 从[0.6, 1.4]之间均匀采样系数来缩放色调,饱和度,亮度。

5 增加PCA噪声,系数为正态分布N(0, 0.1)中的采样。

6 归一化RGB通道。分别减123.68, 116.779, 103.939,然后除58.393, 57.12, 57.375

测试阶段,调整图像的短边为256,同时保留其纵横比。之后从中间裁剪出224x224,用训练阶段的方式归一化RGB通道,不做其他数据增强。

卷积和FC层用Xavier的方式初始化。偏置都初始化为0。对于BN层,\gamma向量初始化为1,\beta向量初始化为0。

用NAG(Nesterov Accelerated Gradient)做梯度下降。每个模型训练120个epoch,batch_size为256,在8卡的V100上。学习率初始为0.1,在30th, 60th, 90th epoch的时候分别除10。

2.2 实验结果

cnn_tricks-table2.png

3 更有效的训练

当前由于硬件的发展可以用更大的batch,更低的数值精度来训练。一些技术甚至能同时提高准确率和训练速度。

3.1 Large-batch 训练

对于同样个数的epoch,大的batch_size效果不如小的batch_size。可以用以下启发式方法来解决这个问题。

Linear scaling learning rate(线性缩放学习率)

增加batch_size并不能改变样本选择的随机性,但是能减小方差,也就是说更大的batch_size能够减少梯度的噪声。如果初始学习率为0.1,batch_size为256,我们的batch_size定义为b,那么学习率可以增加为0.1 * b/256

Learning rate warmup(学习率热身)

训练刚开始时所有参数都是随机值,离最终方案还很远。使用太大的学习率也许会导致数值不稳定。用热身策略,可以在刚开始用小的学习率当训练稳定后再切换为初始学习率。"1小时训练imagenet"提出的策略是从0开始线性增加学习率直到初始学习率。

假设用前m个(如5个epoch)batch用于热身,初始学习率定义为\eta,那么每个batch i, 1 \leq i \leq m,将学习率设置为i\eta/m

Zero \gamma

ResNet的残差块的最后一层为BN时,BN层首先标准化其输入,定义为\hat {x},然后执行缩放变换\gamma \hat { x } + \beta。当令\gamma=0时,缩小了网络的层数,因此在初始阶段更容易训练。(???)

No bias decay

在"14分钟训练imagenet"提出的策略是weight decay只用于卷积层和FC的weights,biases和BN层的\gamma\beta都不用。

因为本文提出的是限制在单机上训练的方法,所以batch_size不会超过2k。

3.2 Low-precision 训练

通常神经网络都是用32位浮点型(FP32)精度训练,也就是说存储和运算都是用FP32。然而当前的新硬件支持更低精度的数据类型。比如V100用FP32能提供14TFLOPS,但是用FP16能提供100TFLOPS。。。表3说明FP16比FP32有2到3倍的加速。不过准确率提升不是因为FP16。

cnn_tricks-table3.png

尽管有性能上的提升,减少精度也有可能因为其数值范围的缩小导致训练出错。mixed precision方法用于解决这个问题。存储所有的参数和激活用FP16,并用FP16计算梯度,同时存储所有参数的FP32用于参数更新。另外实践上,也经常乘一个标量给loss用于更好的对齐梯度为FP16。

3.3 实验结果

见表3和表4。不过加上No bias decay,明显是效果下降了,不知道为什么没提及这点。

cnn_tricks-table4.png

4 模型调整

对网络架构的轻微调整通常不会改变计算复杂性,但可能对模型精度产生不可忽视的影响

4.1 ResNet架构

cnn_tricks-fig1.png

参考原作的图

resnet-table1.png

4.2 ResNet调整

ResNet-B

改的是图1的Down sampling部分。该调整最早在torch的实现中出现,后来也被1hour,se-net,resnext采用。修改点是ResNet的下采样块。如图,因为原作使用1x1,stride=2的卷积导致path A忽略了3/4的输入特征图,所以把stride=2往后挪到3x3的卷积。蓝色的地方是做了修改的。

cnn_tricks-fig2.png
ResNet-C

改的是图1的Input stem部分。该调整最早由Inception-v2提出,后来也在SENet,PSPNet,DeepLabV3和ShuffleNetV2中使用。观察结果是卷积的计算成本是内核宽度或高度的二次方。7x7卷积比3x3卷积代价高5.4倍(49/9)。所做的修改是把7x7卷积用3个3x3卷积代替。前两个输出通道为32,第三个输出通道为64。

ResNet-D

这是由本文提出的。受ResNet-B的启发,发现下采样块中path B的1x1卷积也忽略了3/4的特征图,所以改它。在1x1卷积前加一个2x2的avgpool,stride=2,原来1x1卷积的stride从2改为1。这样的修改效果不错且只影响一点计算代价。

4.3 实验结果

cnn_tricks-table5.png

实验是基于第三部分的设置,即batch_size为1024,用FP16。相比原始ResNet-50,最后的ResNet-D提升了接近1%。不过在实践中,发现比原来慢3%。(差0.5G就慢这么多。。)

5 训练改进

5.1 Cosine Learning Rate Decay(余弦学习率衰减)

学习率的调整对训练至关重要。在用warmup策略后,通常会稳步降低初始学习率的值。被广泛使用的是指数衰减学习率。ResNet中用的是每30个epoch降低0.1,我们称之为『step decay』。Inception中用的是每2个epoch降低0.94。

余弦退火策略是2016年提出来的,简化版本是把学习率从初始值降低到0。
\eta _ { t } = \frac { 1 } { 2 } \left( 1 + \cos \left( \frac { t \pi } { T } \right) \right) \eta
其中T是总batch数,t是当前batch索引,\eta是初始学习率。

cnn_tricks-fig3.png

从上图可以看出,起初余弦衰减的学习率缓慢下降,在中间部分几乎是线性下降,在最后又缓慢下降。(不过从最后的准确率来看,余弦衰减似乎并无优势,也没有加速收敛?)

5.2 Label Smoothing(标签平滑)

softmax公式,其中K为标签个数,z_{i}为预测类别i的分数,q为softmax操作的输出。
q _ { i } = \frac { \exp \left( z _ { i } \right) } { \sum _ { j = 1 } ^ { K } \exp \left( z _ { j } \right) }
负交叉熵损失公式,其中p_{i}为真实概率分布,当对了为1,不对为0。(原文这里的公式好像写错了,p和q的地方放反了)
\ell ( p , q ) = - \sum _ { i = 1 } ^ { K } q _ { i } \log p _ { i }
训练期间,通过最小化该损失来更新模型参数从而让两个概率分布彼此近似。特别地,说一下如何构造p,我们知道\ell ( p , q ) = - \log p _ { y } = - z _ { y } + \log \left( \sum _ { i = 1 } ^ { K } \exp \left( z _ { i } \right) \right)。优化解是z _ { y } ^ { * } = inf,同时保持其他值很小。换句话说,这样做也鼓励输出的分数有显著区别,从而可能导致过拟合(通过softmax学到的模型太自信了)。

标签平滑的思路来自2015年提出的Inception-v2。它将构造的真实分布改为
q _ { i } = \left\{ \begin{array} { l l } { 1 - \varepsilon } & { \text { if } i = y } \\ { \varepsilon / ( K - 1 ) } & { \text { otherwise } } \end{array} \right.
其中\varepsilon为一个很小的常量。现在优化解变为
z _ { i } ^ { * } = \left\{ \begin{array} { l l } { \log ( ( K - 1 ) ( 1 - \varepsilon ) / \varepsilon ) + \alpha } & { \text { if } i = y } \\ { \alpha } & { \text { otherwise } } \end{array} \right.
其中\alpha为任意实数。这鼓励FC层为有限输出,从而泛化的更好。

cnn_tricks-fig4.png

从上图可以看出标签平滑的分布中心更接近理论值同时其极值更少。

插播一个知乎:神经网络中的label smooth为什么没有火?

5.3 Knowledge Distillation(知识蒸馏)

Hinton在2015年提出的。用老师模型帮助当前的模型(学生模型)。老师模型通常是有很高准确率的预训练模型,通过模仿,学生模型能提升自己的准确率同时保持其模型复杂度。

在训练期间,增加一个蒸馏损失来惩罚老师模型和学生模型的softmax输出之间的差异。给定一个输入,定义p为真实概率分布,zr分别为学生模型和老师模型最后FC层的输出。

之前用损失\ell ( p , \text { softmax } ( z ) )来衡量pz之间的差异,这里使用同样的损失用于蒸馏。此时,损失改为
\ell ( p , \text { softmax } ( z ) ) + T ^ { 2 } \ell ( \operatorname { softmax } ( r / T ) , \operatorname { softmax } ( z / T ) )
其中T为一个称为温度的超参,来使softmax的输出更平滑。

5.4 Mixup Training(混合训练)

2017年提出的mixup。每次随机选两个样本对\left( x _ { i } , y _ { i } \right)\left( x _ { j } , y _ { j } \right)。然后通过权重线性插值合成一个新的样本对。
\begin{aligned} \hat { x } & = \lambda x _ { i } + ( 1 - \lambda ) x _ { j } \\ \hat { y } & = \lambda y _ { i } + ( 1 - \lambda ) y _ { j } \end{aligned}
其中\lambda \in [ 0,1 ]是取自\operatorname { Beta } ( \alpha , \alpha )分布的随机数。在mixup训练中,只用新样本。

这里有一作在知乎的回答

5.5 实验结果

设置\varepsilon = 0.1用于标签平滑,T = 20用于模型蒸馏,具体来说用加上余弦衰减和标签平滑的预训练的ResNet-152-D模型作为老师。在mixup训练中,选择\alpha = 0.2作为Beta分布,同时增加epoch个数从120到200,因为混合样本需要更久的训练才能闭合。当用mixup训练知识蒸馏时,老师模型也用mixup。

效果如预期一样在ResNet-50-D,Inception-V3,MobileNet3个模型上都有提升,但是蒸馏只在ResNet上有效,事后给出的解释是老师模型和学生不是一个家族的,因此对于预测有不一样的分布,所以反而给模型带来负面影响。。

cnn_tricks-table6.png

6 迁移学习

6.1 目标检测

把Faster-RCNN的VGG-19基模型用前面提到的各种预训练模型替换,其他设置保持一致。mAP在VOC2007上最终有4%的提升。

cnn_tricks-table8.png

6.2 语义分割

用的FCN,这里是负面效果。除了余弦退火策略显著提升效果外,其他效果都不好。给出的解释是语义分割预测的是像素级别,而用标签平滑,蒸馏和mixup有利于软化标签,模糊的像素级信息可能会模糊并降低整体的像素级准确率。

cnn_tricks-table9.png

7 总结

介绍的这些技巧对模型架构,数据预处理,损失函数和学习率调度做了轻微的修改。用ResNet-50,Inception-V3,MobileNet做实验后效果都得到了提升,而且加在一起用能明显的提升准确率。另外,迁移到目标检测和语义分割效果也有提升。

七 读后感

并不一定要拿当前最新最好的模型作为改进对象,用经典的也行。本文的分类网络用的就是ResNet-50,目标检测用的是Faster-RCNN,语义分割用的是FCN,三者都是15年的模型。

各种黑科技的作用不容小觑,累加着用总能提升,不过有的很明显,有的作用就没那么大。作为对比,mixup的效果就碉堡了,而知识蒸馏的提升则没那么明显(hinton挂一作也没用。。。)

另外,本文好像没有什么创新的地方(除了修改模型变为ResNet-D那一点),看来,实验做好,也是可以发paper的。。

八 补充

看这篇,也是讲技巧的

A disciplined approach to neural network hyper-parameters: Part 1 -- learning rate, batch size, momentum, and weight decay

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,176评论 5 469
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,190评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,232评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,953评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,879评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,177评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,626评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,295评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,436评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,365评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,414评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,096评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,685评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,771评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,987评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,438评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,032评论 2 341

推荐阅读更多精彩内容