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

目录

摘要

1.大纲

2.Baseline

2.1训练预处理

2.2测试预处理

3.改进点

3.1 训练速度

3.1.1 batch size调整

3.2 网络结构

3.2.1 模型调整​

 3.3 训练过程优化

 3.3.1 Cosine Learning Rate Decay

3.3.2 Label Smoothing

3.2.3 知识蒸馏(Knowledge Distillation)

3.2.4 混合训练(Mixup Train)

3.2.5 实验结果


摘要

很多的深度学习算法并未开源,即便有开源,也只开源了推理代码,而没有开源训练代码。因为网络的训练存在很多的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个点。所以学习该论文中的训练技巧是很有必要的。
 

1.大纲

(1)数据预处理;

(2)网络结构

(3)优化目标,也即损失函数

(4)训练过程控制

也可细分为如下几个部分:

①训练基本过程(baseline training procedure ):包括训练集和测试集的数据增广、参数初始化、优化方法、学习率调整策略。
②高效训练(efficient training):包括大批量训练、低精度训练等。
模型调整(model tweak):比较三种ResNet变体的优劣。
③训练改进(training refinement):包括Cosine Learning rate decaying、Label smoothing、knowledge distillation、mixup training。
④图像分类模型与迁移学习:讲了图像分类模型准确率的提高有助于迁移至其他领域,如目标检测、语义分割。
 

2.Baseline

本文将ResNet作为Baseline,并执行以下步骤:

2.1训练预处理

①随机采样一个图像。裁剪成224X224的尺寸,水平翻转概率为0.5,调整色调、饱和度和亮度,系数均匀地来自[0.6,1.4]。

②加入从正态分布N(0、0.1)采样的系数的PCA噪声

2.2测试预处理

①Xavier Initialization
使用Xavier 算法进行卷积层和全连接层的参数初始化。

Xavier初始化的paper:Understanding the difficulty of training deep feedforward neural networks

具体来说,就是公式

论文笔记-Bag of Tricks for Image Classification with Convolutional Neural Networks_第1张图片

https://blog.csdn.net/shuzfan/article/details/51338178 xavier
每一层的参数都从上式范围内随机均匀抽取,其中 nj 是 第j层的输入通道数

②训练时使用Nesterov Accelerated Gradient(NAG)作为优化器。

https://www.cnblogs.com/guoyaohua/p/8542554.html

③Baseline指mxnet团队复现的结果,Reference指模型作者给出的结果,后面的tricks是对Baseline所做的修改 。

论文笔记-Bag of Tricks for Image Classification with Convolutional Neural Networks_第2张图片

作者评估了三个cnn:ResNet-50,inceptionV3,和MobileNet。inception-v3,我们将输入图像的大小调整为299x299。使用ISLVRC2012[23]数据集,该数据集有130万张图像用于训练和1000个类。验证精度如表2所示。可以看出,我们的ResNet-50结果略优于参考结果,而我们的基线inception-V3和MobileNet的准确性略低。

3.改进点

3.1 训练速度


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

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

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

那么怎么在获得大batch带来的红利,同时避免这些缺点呢?

显然,缺点2可以通过使用更大显存的机器来解决,缺点1呢。

作者分析了同大batch和低精度训练相关的技术,它们能够在不降低精度的前提下,提高模型的训练速度。下面是四种对该问题的解决方案:

3.1.1 batch size调整

(1)Linear scaling learning rate

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

(2)Learning rate warmup

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

(3)Zero γ \gammaγ

ResNet的每个block的最后一层都有BN层,BN层首先标准化输入,记为x,然后进行尺度变换γx+β。其中,x和γ都是可以学习的参数,通常分别初始为0和1。

这种策略的好处:将所有residual blocks中的最后一个batch norm层的γ​\gamma​γ​和β​\beta​β​参数设置为0,也即residual block的输出和输入相等,这样就相当于在训练的初始阶段减少了网络的层数,易于训练。

(4)No bias decay

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

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

3.2 网络结构

一般来讲,神经网络的训练是使用32位float类型(FP32)的,所有的数据和参数都用32位浮点来存储和计算。

近年来,新的计算设备提供了低精度的16位float类型(FP16)的计算能力,于是就有了拿FP16来进行计算的方式。

总的来说呢,用更低的精度进行神经网络的训练,有好处有坏处:

好处:训练速度上升;
坏处:精度降低,数值的范围变窄了,计算结果容易溢出。
解决方案:在整个训练过程中,用FP16来存储参数、计算梯度,同时留一个32位精度的参数的备份,用于更新参数。

还有一种实用的方案是计算损失函数时,乘以一个数(尺度),将梯度的范围更好地对齐到FP16上。

3.2.1 模型调整
论文笔记-Bag of Tricks for Image Classification with Convolutional Neural Networks_第3张图片

论文笔记-Bag of Tricks for Image Classification with Convolutional Neural Networks_第4张图片

三种调整的ResNet变体

论文笔记-Bag of Tricks for Image Classification with Convolutional Neural Networks_第5张图片

右侧(a)图修改了Down sampling模块,也即修改Path A中池化的顺序。原有的residual block的下采样部分,使用了kernel=1x1和stride=2,忽略掉了3/4的信息,所以改进为kernel=3x3和stride=2

(b)图在(a)的基础之上,进一步修改input stem模块,

(c)图在(b)的基础之上,进一步修改Down sampling模块。

 

设计初衷: 将下采样操作放到非1 × 1 卷积层。1 × 1卷积层等价于对输入feature maps沿着channel维度做加权求和,因此设置stride为2会导致丢失3/4的特征信息。对于3 × 3​的卷积层,设置stride为2不会丢失特征信息

论文笔记-Bag of Tricks for Image Classification with Convolutional Neural Networks_第6张图片
显然,当卷积的kernel size为3时,输出神经元1、2、3分别包含了输入神经元123、234、345的信息,如果进而设置stride为2,那么输出神经元仅仅为1和3,已经包含了输入的5个神经元的信息,也即当前卷积层没有丢失特征信息。

 在这里插入图片描述

 3.3 训练过程优化

 3.3.1 Cosine Learning Rate Decay

学习率从0增大到初始学习率的过程,被称作warmup阶段,随后的学习率下降阶段则有多种方案,resnet官方代码使用的是stair decay方案,作者对比了cosine decay方案的效果差异,如下图,

用的Learning Rate Decay是Step Decay,即每隔N个Epoch,learning rate乘上一个固定decay系数。

论文笔记-Bag of Tricks for Image Classification with Convolutional Neural Networks_第7张图片

基于作者在论文中给出的实验结果,cosine decay相对于stair decay方案提升了0.75个百分点

3.3.2 Label Smoothing

在分类问题中,我们的最后一层一般是全连接层,然后对应标签的one-hot编码,即把对应类别的值编码为1,其他为0。这种编码方式和通过降低交叉熵损失来调整参数的方式结合起来,会有一些问题。这种方式会鼓励模型对不同类别的输出分数差异非常大,或者说,模型过分相信它的判断。但是,对于一个由多人标注的数据集,不同人标注的准则可能不同,每个人的标注也可能会有一些错误。模型对标签的过分相信会导致过拟合。

标签平滑(Label-smoothing regularization,LSR)是应对该问题的有效方法之一,它的具体思想是降低我们对于标签的信任,例如我们可以将损失的目标值从1稍微降到0.9,或者将从0稍微升到0.1。标签平滑最早在inception-v2[4]中被提出,它将真实的概率改造为

论文笔记-Bag of Tricks for Image Classification with Convolutional Neural Networks_第8张图片

 

所以Label Smoothing就是一种抑制过拟合的手段。

其中,ε是一个小的常数,K是类别的数目,y是图片的真正的标签,i代表第i个类别,q_i是图片为第i类的概率。

总的来说,LSR是一种通过在标签y中加入噪声,实现对模型约束,降低模型过拟合程度的一种正则化方法。

3.2.3 知识蒸馏(Knowledge Distillation)

知识蒸馏是指用一个准确率较高的复杂的预训练模型(teacher model)来训练一个结构较为简单的模型(student model),来提升student model的准确率。尽可能压榨teacher model来训练student model,好处既能获取复杂模型的预测能力,又能简化网络结构提高推理速度。

训练时,使用蒸馏损失(distillation loss)来对teacher model和student model的输出差异进行惩罚,辅助学习。

对于给定的输入,假设p为真实的概率分布,z和r分别为student model和teacher model的最后一层全连接层的输出。使用交叉熵Cross Entropy来计算损失,因此整个训练的损失函数为:

 其中T是一个超参数,用来平滑整个Loss的。

3.2.4 混合训练(Mixup Train)

Mixup是一种新的数据增强的方法。Mixup training,就是每次取出2张图片,然后将它们线性组合,得到新的图片,以此来作为新的训练样本,进行网络的训练,如下公式,其中x代表图像数据,y代表标签,则得到的新的xhat, yhat。:

论文笔记-Bag of Tricks for Image Classification with Convolutional Neural Networks_第9张图片

其中,λ是从Beta(α, α)随机采样的数,在[0,1]之间。在训练过程中,仅使用(xhat, yhat)。

Mixup方法主要增强了训练样本之间的线性表达,增强网络的泛化能力,不过mixup方法需要较长的时间才能收敛得比较好。

3.2.5 实验结果

论文笔记-Bag of Tricks for Image Classification with Convolutional Neural Networks_第10张图片

其中,w/o代表with/without,从表中数据可见,对于ResNet-50-D网络结构,使用Knowledge Distillation策略能将Top-1精度从79.15%进一步提升到79.29%,而该策略对Inception-V3和MobileNet网络结构起反作用。原因是“教师网络”为ResNet-152,和ResNet-50-D具有相似的基础block,两者的预测分布也是相似的。

你可能感兴趣的:(可视化,医学图像处理,眼底图像处理,深度学习,神经网络,分类)