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


论文地址: 戳我

1. baseline

1.1 baseline template

在这里插入图片描述
在这里插入图片描述

1.2 Training preprocessing pipelines

在training阶段会一步一步执行如下预处理:
在这里插入图片描述
在这里插入图片描述

1.3 Test preprocessing pipelines

在这里插入图片描述

2. Efficient Training

2.1 Large batch training

作者先说了虽然batch可以减少计算代价但在同样的epoch下大的batch_size比小的batch_size泛化能力更差,现在很多学者提出了启发式训练来解决这个问题,作者也进行了阐述:

2.1.1 Linear scaling learning rate

增大batch_size不会改变随机梯度的期望但是会减少他的误差,换句话说随机梯度会减少梯度的噪音,所以我们可以增大学习率,沿着梯度的反方向“更大”的学习。对resnet-50在imagenet来说,有的学者提出线性伸缩学习率,即: lr0.1对batch_size256,如果现在有一个batch_size=b,那么学习率初始化可以为: 0.1 ∗ b 256 0.1 * \frac{b}{256} 0.1256b

2.1.2 Learning rate warmup.

因为网络的参数是随机初始化的,假如一开始就采用较大的学习率容易出现数值不稳定,这是使用warmup的原因。等到训练过程基本稳定了就可以使用原先设定的初始学习率进行训练了。作者在实现warmup的过程中采用线性增加的策略,举例而言,假设warmup阶段的初始学习率是0,warmup阶段共需要训练m个batch的数据(实现中m个batch共5个epoch),假设训练阶段的初始学习率是L,那么在batch i的学习率就设置为i*L/m

2.1.3 Zero γ \gamma γ

每个残差块的最后一个BN层的γ参数初始化为0,我们知道BN层的γ、β参数是用来对标准化后的输入做线性变换的,也就是γx^+β,一般γ参数都会初始化为1,作者认为初始化为0更有利于模型的训练,这样所有的block直接返回他们的输入,这样layers的数量比较少,也可以在initial stage更好的训练。

2.1.4 No bias decay.

不对bias参数执行weight decay操作,weight decay主要的作用就是通过对网络层的参数(包括weight和bias)做约束(L2正则化会使得网络层的参数更加平滑)达到减少模型过拟合的效果,同时其他参数包括 γ \gamma γ β \beta β也都不参与正则化。

2.2 Low precision training

采用低精度(16位浮点型)训练是从数值层面来做加速。一般而言现在大部分的深度学习网络的输入、网络参数、网络输出都采用32位浮点型,现在随着GPU的迭代更新(比如V100支持16为浮点型的模型训练),如果能使用16位浮点型参数进行训练,就可以大大加快模型的训练速度,这是作者加速训练最主要的措施,不过目前来看应该只有V100才能支持这样的训练。
在这里插入图片描述

2.3 results

那么这二者的优化效果如何?Table3是采用更大的batch size和16位浮点型进行训练的结果,可以看出和原来的baseline相比训练速度提升还是比较明显的,效果上也有一定提升,尤其是MobileNet。
在这里插入图片描述
详细的对比实验可以参考Table4。
在这里插入图片描述

3. Model Tweaks

这部分的优化是以ResNet为例的,Figure1是ResNet网络的结构示意图,简单而言是一个input stem结构、4个stage和1个output部分,input stem和每个stage的内容在第二列展示,每个residual block的结构在第三列展示,整体而言这个图画得非常清晰了。
在这里插入图片描述
关于residual block的改进可以参考Figure2,主要有3点。
1、ResNet-B,改进部分就是将stage中做downsample的residual block的downsample操作从第一个1x1卷积层换成第二个3x3卷积层,如果downsample操作放在stride为2的1x1卷积层,那么就会丢失较多特征信息(默认是缩减为1/4),可以理解为有3/4的特征点都没有参与计算,而将downsample操作放在3x3卷积层则能够减少这种损失,因为即便stride设置为2,但是卷积核尺寸够大,因此可以覆盖特征图上几乎所有的位置。
2、ResNet-C,改进部分就是将Figure1中input stem部分的7x7卷积层用3个3x3卷积层替换。这部分借鉴了Inception v2的思想,主要的考虑是计算量,毕竟大尺寸卷积核带来的计算量要比小尺寸卷积核多不少,不过读者如果仔细计算下会发现ResNet-C中3个3x3卷积层的计算量并不比原来的少,这也是Table5中ResNet-C的FLOPs反而增加的原因。
3、ResNet-D,改进部分是将stage部分做downsample的residual block的支路从stride为2的1x1卷积层换成stride为1的卷积层,并在前面添加一个池化层用来做downsample。这部分我个人理解是虽然池化层也会丢失信息,但至少是经过选择(比如这里是均值操作)后再丢失冗余信息,相比stride设置为2的1*1卷积层要好一些。
在这里插入图片描述

最终关于网络结构改进的效果如Table5所示,可以看出在效果提升方面还是比较明显的。
在这里插入图片描述

4. Training Refinements

4.1 Cosine Learning Rate Decay

一般exponential decay是最常用的,KaiMing He的step decay也比较常用,这里介绍的是Cosine Learning Rate Decay,他的公式如下:
在这里插入图片描述
与step decay的对比图如下:
在这里插入图片描述
可以发现:cosine decay一开始下降的很慢,中间下降的很快,几乎是线性的,最后又开始缓慢下降,最后学习率变到0,值得注意的是这个对于分割网络的性能提升很大。

4.2 Laybel smoothing

这部分是将原来常用的one-hot类型标签做软化,这样在计算损失值时能够在一定程度上减少过拟合。从交叉熵损失函数可以看出,只有真实标签对应的类别概率才会对损失值计算有所帮助,因此label smoothing相当于减少真实标签的类别概率在计算损失值时的权重,同时增加其他类别的预测概率在最终损失函数中的权重。这样真实类别概率和其他类别的概率均值之间的gap(倍数)就会下降一些,还是看一下原论文,了解详细一点。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对比曲线
在这里插入图片描述

4.3 知识蒸馏(knowledge distillation)

这部分其实是模型加速压缩领域的一个重要分支,表示用一个效果更好的teacher model训练student model,使得student model在模型结构不改变的情况下提升效果。作者采用ResNet-152作为teacher model,用ResNet-50作为student model,代码上通过在ResNet网络后添加一个蒸馏损失函数实现,这个损失函数用来评价teacher model输出和student model输出的差异,因此整体的损失函数原损失函数和蒸馏损失函数的结合:
在这里插入图片描述
其中p表示真实标签,z表示student model的全连接层输出,r表示teacher model的全连接层输出,T是超参数,用来平滑softmax函数的输出。

4.4 Mixup Training

mixup其实也是一种数据增强方式,假如采用mixup训练方式,那么每次读取2张输入图像,假设用(xi,yi)和(xj,yj)表示,那么通过下面这两个式子就可以合成得到一张新的图像(x,y),然后用这张新图像进行训练,需要注意的是采用这种方式训练模型时要训更多epoch。式子中的λ是一个超参数,用来调节合成的比重,取值范围是[0,1]。
在这里插入图片描述

4.5 result

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值