论文解读-Bag of Tricks for Image Classification with Convolutional Neural Networks


计算机视觉包含了很多研究方向,目前发展比较成熟的是识别和检测任务。一个不争的事实是,很多的深度学习算法并未开源,即便有开源,也只开源了推理代码,而没有开源训练代码,比如这两天雷军亲自在微博宣传的超分辨重建算法FALSR。因为网络的训练存在很多的Tricks,往往很难复现论文中的效果,所以不开源训练代码就有点不厚道了哈。

”Bag of Tricks for Image Classification with Convolutional Neural Networks“,由Amazon的李沐团队出品,将mobilenet_v1_224的精度提升到了73.28%。笔者记得以前使用tensorflow官方代码,从0开始训练该网络,Top1精度也只有70.4%,距离官方的70.9%还差0.5个点。所以学习该论文中的训练技巧是很有必要的。

这篇论文中的干货挺多的,很多的技术细节笔者之前是不知道的,为了将其中的策略应用于其他的cv任务,精度论文还是很有必要的,以下是笔者对论文的理解,希望也能对各位cv爱好者有所帮助。

1 动机

分类算法有好的效果,可以从以下几个方面做优化,(1)数据预处理;(2)网络结构;(3)优化目标,也即损失函数;(4)训练过程控制,那么具体来说,哪些策略会有效呢,作者基于“单因子变量分析”的思想,在公开数据集上做了大量实验,给出了结论。

2 baseline

作者基于mxnet深度学习框架,复现了多种网络结构的效果,具体的对比指标如下,
论文解读-Bag of Tricks for Image Classification with Convolutional Neural Networks
其中,Baseline指mxnet团队复现的结果,Reference指模型作者给出的结果,后面的tricks是对Baseline所做的修改。因为论文的主要贡献在这些tricks,所以这里就不详述baseline的实现细节了。

3 改进点

3.1 训练速度

在训练网络模型时,我们的一个共识是,batch size参数尽量设置大一些,这种做法存在如下的优缺点,

优点:模型收敛后的精度相对更高;

缺点:(1)模型收敛速度慢;(2)占用更多的机器显存。

那么怎么在获得大batch带来的红利,同时避免这些缺点呢?显然,缺点2可以通过使用更大显存的机器来解决,缺点1呢,此时的救星便是Float point 16了。

作者分析了同大batch和低精度训练相关的技术,它们能够在不降低精度的前提下,提高模型的训练速度。

3.1.1 batch size调整

(1)Linear scaling learning rate

增大batch size,单batch数据中噪声的影响会更小,此时就可以使用大的学习率步长,比如ResNet-50网络,官方采用的batch size为256,初始学习率为0.1,那么当使用更大的batch size,符号表示为bb,那么可以设置初始学习率为0.1×b/2560.1\times b/256

(2)Learning rate warmup

因为模型的初始参数是随机的,所以初始学习率太大容易导致模型不收敛,表现为loss不下降。学习率热启动策略具体操作为,将实验中用的学习率参数从0逐渐增大到初始学习率大小,然后再采用常规的学习率衰减方案,逐渐增大学习率的过程被称作warmup阶段

这种策略的好处:防止训练过程中出现的instablility

(3)Zero γ\gamma

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

这种策略的好处:将所有residual blocks中的最后一个batch norm层的γ\gamma​β\beta​参数设置为0,也即residual block的输出和输入相等,可以使模型在初始阶段更容易训练

(4)No bias decay

只对卷积层和全连接层中的weight参数做正则化,不对bias参数做正则化。

这种策略的好处:防止过拟合

3.1.2 Low-precision training

通常,计算机使用64-bit或者32-bit浮点精度(FP64/FP32)做训练,英伟达的部分显卡针对FP16做了定制化优化,能够达到更快的计算速度,比如最新的显卡V100。另外,关于低精度训练相关的算法理论,可以参见笔者之前写的一篇文章。

3.1.3 实验结果

(1)单一策略的对比结果如下图,
论文解读-Bag of Tricks for Image Classification with Convolutional Neural Networks
(2)大batch和FP16的组合策略的结果如下图,
论文解读-Bag of Tricks for Image Classification with Convolutional Neural Networks
显然,使用大batch和FP16的组合策略,网络模型的训练速度更快,这里的训练速度可以用Time/Epoch来衡量。值得一提的是,对于mobilenet这一轻量级网络,Top-1结果提升了近3个点,所以,有必要使用这一策略重新训练tensorflow版本的mobilenet模型参数,从而得到具有更强表征能力的预训练模型,用于各种移动端cv任务

3.2 网络结构

3.2.1 理论

论文中选取了经典的ResNet网络作为研究对象,仅仅修改某些卷积层的stride参数,注意,这里的stride参数影响当前卷积层的输出feature map的尺寸。
论文解读-Bag of Tricks for Image Classification with Convolutional Neural Networks
如上图,左图为标准的ResNet-50网络结构,右侧(a)图修改了Down sampling模块,也即修改Path A中池化的顺序。(b)图在(a)的基础之上,进一步修改input stem模块,©图在(b)的基础之上,进一步修改Down sampling模块。

既然作者这样改进,那么设计的初衷是什么呢?

将下采样操作放到非1×11\times 1卷积层。1×11\times 1卷积层等价于对输入feature maps沿着channel维度做加权求和,因此设置stride为2会导致丢失3/4的特征信息。对于3×33\times 3​ 的卷积层,设置stride为2不会丢失特征信息,为什么呢,请参见下图,
论文解读-Bag of Tricks for Image Classification with Convolutional Neural Networks
显然,当卷积的kernel size为3时,输出神经元1、2、3分别包含了输入神经元123、234、345的信息,如果进而设置stride为2,那么输出神经元仅仅为1和3,已经包含了输入的5个神经元的信息,也即当前卷积层没有丢失特征信息。

3.2.2 实验结果

不同网络结构的结果如下表,
论文解读-Bag of Tricks for Image Classification with Convolutional Neural Networks
显然,ResNet-50-D相对于未修改前的网络结构,Top-1结果提升了近0.1个点。

3.3 训练过程优化

3.3.1 Cosine Learning Rate Decay

学习率从0增大到初始学习率的过程,被称作warmup阶段,随后的学习率下降阶段则有多种方案,resnet官方代码使用的是stair decay方案,作者对比了cosine decay方案的效果差异,如下图,
论文解读-Bag of Tricks for Image Classification with Convolutional Neural Networks
基于作者在论文中给出的实验结果,cosine decay相对于stair decay方案提升了0.75个百分点,在一些比赛中这点提升也是挺大的了。

3.3.2 Label Smoothing

Label Smoothing策略最早被提出用于训练Inception-v2网络结构,它修改ground truth的概率分布如下,
论文解读-Bag of Tricks for Image Classification with Convolutional Neural Networks
其中,ϵ\epsilon表示很小的常数,为超参数,KK​表示分类任务中目标类别的个数。

3.3.3 Knowledge Distillation

Knowledge Distillation,可以翻译成知识蒸馏,最早由Hinton在2015年提出,它包含了一个”教师网络”和一个”学生网络“。其中,“教师网络”通常采用预训练好的模型,而“学生网路”中包含了待学习的参数。记标签的真实概率分布为pp,“学生网络”的预测概率分布为zz,“教师网络”的预测概率分布为rr,优化的目标是,让“学生网络”在学习标签的真实概率分布的同时,还要学习“教师网络”的先验知识,公式表示如下,
论文解读-Bag of Tricks for Image Classification with Convolutional Neural Networks
其中,前者表示学习标签的真实概率分布,后者表示学习“教师网络”的先验知识,TT​为超参数。

为什么学习的目标是这样子呢?

标签的真实概率分布提供了hard label,准确率高但是信息熵很低,而“教师网络”提供了soft label,准确率相对较低但是信息熵高。这里的信息熵怎么理解呢,比如一副马的图片,可以想象的到它看上去也有点像牛,而hard label给的标签是[1, 0],soft label给的标签是[0.7, 0.3],显然,soft label提供了类别之间的关联,提供的信息量更大,有助于模型在学习时增强类间区分度,hard label和soft label结合等价于在学习真实标签的同时,补充类间信息

3.3.4 Mixup Training

这属于数据增强的一种手段,大家可能跟笔者一样,最常用的是翻转、小角度旋转等操作,mixup指从训练集中随机选取两个样本(xi,yi)(x_{i}, y_{i})​(xj,yj)(x_{j}, y_{j})​,然后构造新的样本(x^,y^)(\hat{x}, \hat{y})​,定义如下,
论文解读-Bag of Tricks for Image Classification with Convolutional Neural Networks
其中,λ[0,1]\lambda\in [0, 1]为随机数,且服从Beta(α,α)Beta(\alpha, \alpha)分布。在训练的过程中,只使用新构造的样本(x^,y^)(\hat{x}, \hat{y})​

3.3.5 实验结果

不同训练策略的效果如下表,
论文解读-Bag of Tricks for Image Classification with Convolutional Neural Networks
其中,w/o代表with/without,从表中数据可见,对于ResNet-50-D网络结构,使用Knowledge Distillation策略能将Top-1精度从79.15%进一步提升到79.29%,而该策略对Inception-V3和MobileNet网络结构起反作用,作者认为,原因是“教师网络”为ResNet-152,和ResNet-50-D具有相似的基础block,两者的预测分布也是相似的。

这里给笔者一些启发,比如想在几乎不损失精度的前提下,对mobilent_v1_224网络做剪枝,可以同时选择resnet-152和mobilenet_v1_224作为“教师网络”,人工定义的小网络作为“学生网略”,按照上面的经验,使用mobilenet_v1_224的“教师网略”优于resnet-152的“教师网略”。顺便多说一下,对mobilenet做剪枝,当前效果最好的是Yihui He提出的基于强化学习的方法,不过并未开源,连Tencent的Pocket Flow框架都未复现出其效果,所以可以换一种思路,使用知识蒸馏而不是通道剪枝。

4 总结

(1)本文的实验非常详实,在以后的识别和检测任务中,可以借鉴这些经验知识,辅助模型的调优;

(2)尽管论文中的模型都已经开源,但是是基于mxnet框架的,可以在mobilenet的tensorflow代码中,引入这些策略,重新训练该模型,从而得到具有更强表达能力的特征提取器,应用于移动端的多种cv任务。



5 参考资料

https://arxiv.org/abs/1812.01187