目录
摘要
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)数据预处理;
(2)网络结构
(3)优化目标,也即损失函数
(4)训练过程控制
也可细分为如下几个部分:
①训练基本过程(baseline training procedure ):包括训练集和测试集的数据增广、参数初始化、优化方法、学习率调整策略。
②高效训练(efficient training):包括大批量训练、低精度训练等。
模型调整(model tweak):比较三种ResNet变体的优劣。
③训练改进(training refinement):包括Cosine Learning rate decaying、Label smoothing、knowledge distillation、mixup training。
④图像分类模型与迁移学习:讲了图像分类模型准确率的提高有助于迁移至其他领域,如目标检测、语义分割。
本文将ResNet作为Baseline,并执行以下步骤:
①随机采样一个图像。裁剪成224X224的尺寸,水平翻转概率为0.5,调整色调、饱和度和亮度,系数均匀地来自[0.6,1.4]。
②加入从正态分布N(0、0.1)采样的系数的PCA噪声
①Xavier Initialization
使用Xavier 算法进行卷积层和全连接层的参数初始化。
Xavier初始化的paper:Understanding the difficulty of training deep feedforward neural networks
具体来说,就是公式
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所做的修改 。
作者评估了三个cnn:ResNet-50,inceptionV3,和MobileNet。inception-v3,我们将输入图像的大小调整为299x299。使用ISLVRC2012[23]数据集,该数据集有130万张图像用于训练和1000个类。验证精度如表2所示。可以看出,我们的ResNet-50结果略优于参考结果,而我们的基线inception-V3和MobileNet的准确性略低。
在训练网络模型时,我们的一个共识是,batch size参数尽量设置大一些,这种做法存在如下的优缺点
优点:模型收敛后的精度相对更高;
缺点:(1)模型收敛速度慢;(2)占用更多的机器显存。
那么怎么在获得大batch带来的红利,同时避免这些缺点呢?
显然,缺点2可以通过使用更大显存的机器来解决,缺点1呢。
作者分析了同大batch和低精度训练相关的技术,它们能够在不降低精度的前提下,提高模型的训练速度。下面是四种对该问题的解决方案:
(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参数做正则化。
这种策略的好处:防止过拟合
一般来讲,神经网络的训练是使用32位float类型(FP32)的,所有的数据和参数都用32位浮点来存储和计算。
近年来,新的计算设备提供了低精度的16位float类型(FP16)的计算能力,于是就有了拿FP16来进行计算的方式。
总的来说呢,用更低的精度进行神经网络的训练,有好处有坏处:
好处:训练速度上升;
坏处:精度降低,数值的范围变窄了,计算结果容易溢出。
解决方案:在整个训练过程中,用FP16来存储参数、计算梯度,同时留一个32位精度的参数的备份,用于更新参数。
还有一种实用的方案是计算损失函数时,乘以一个数(尺度),将梯度的范围更好地对齐到FP16上。
三种调整的ResNet变体
右侧(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不会丢失特征信息
显然,当卷积的kernel size为3时,输出神经元1、2、3分别包含了输入神经元123、234、345的信息,如果进而设置stride为2,那么输出神经元仅仅为1和3,已经包含了输入的5个神经元的信息,也即当前卷积层没有丢失特征信息。
学习率从0增大到初始学习率的过程,被称作warmup阶段,随后的学习率下降阶段则有多种方案,resnet官方代码使用的是stair decay方案,作者对比了cosine decay方案的效果差异,如下图,
用的Learning Rate Decay是Step Decay,即每隔N个Epoch,learning rate乘上一个固定decay系数。
基于作者在论文中给出的实验结果,cosine decay相对于stair decay方案提升了0.75个百分点
在分类问题中,我们的最后一层一般是全连接层,然后对应标签的one-hot编码,即把对应类别的值编码为1,其他为0。这种编码方式和通过降低交叉熵损失来调整参数的方式结合起来,会有一些问题。这种方式会鼓励模型对不同类别的输出分数差异非常大,或者说,模型过分相信它的判断。但是,对于一个由多人标注的数据集,不同人标注的准则可能不同,每个人的标注也可能会有一些错误。模型对标签的过分相信会导致过拟合。
标签平滑(Label-smoothing regularization,LSR)是应对该问题的有效方法之一,它的具体思想是降低我们对于标签的信任,例如我们可以将损失的目标值从1稍微降到0.9,或者将从0稍微升到0.1。标签平滑最早在inception-v2[4]中被提出,它将真实的概率改造为
所以Label Smoothing就是一种抑制过拟合的手段。
其中,ε是一个小的常数,K是类别的数目,y是图片的真正的标签,i代表第i个类别,q_i是图片为第i类的概率。
总的来说,LSR是一种通过在标签y中加入噪声,实现对模型约束,降低模型过拟合程度的一种正则化方法。
知识蒸馏是指用一个准确率较高的复杂的预训练模型(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的。
Mixup是一种新的数据增强的方法。Mixup training,就是每次取出2张图片,然后将它们线性组合,得到新的图片,以此来作为新的训练样本,进行网络的训练,如下公式,其中x代表图像数据,y代表标签,则得到的新的xhat, yhat。:
其中,λ是从Beta(α, α)随机采样的数,在[0,1]之间。在训练过程中,仅使用(xhat, yhat)。
Mixup方法主要增强了训练样本之间的线性表达,增强网络的泛化能力,不过mixup方法需要较长的时间才能收敛得比较好。
其中,w/o代表with/without,从表中数据可见,对于ResNet-50-D网络结构,使用Knowledge Distillation策略能将Top-1精度从79.15%进一步提升到79.29%,而该策略对Inception-V3和MobileNet网络结构起反作用。原因是“教师网络”为ResNet-152,和ResNet-50-D具有相似的基础block,两者的预测分布也是相似的。