《Bag of Tricks for Image Classification with Convolutional Neural Networks》论文阅读笔记

  论文地址:Bag of Tricks for Image Classification with Convolutional Neural Networks

一、简介

  这篇文章旨在对当下深度学习方面不同网络不同测tricks对最终在ImageNet上的性能上的影响进行对比。当前使用的是ResNet-50网络,当然会对不同的网络进行对比,但是不同的tricks会使用相同的网络进行ResNet-50。下图为最终的网络结果:
在这里插入图片描述

二、实验设置

  为了控制变量,能够更有效地看到不同tricks的具体效用,因此有必要设置一些baseline进行对比试验。

1、Baseline

1)、Baseline设置

  训练采用的基本算法如下,就是普通的批量随机梯度下降算法:
在这里插入图片描述
  实验采用的基本模型为ResNet,在实验中会按如下方式一步步添加tricks:

    1. 随机采样图像并将其解码为[0,255]中的32位浮点原始像素值;
    1. 随机裁剪长宽比以[3/4,4/3]随机采样的矩形区域,以[8%,100%]随机采样的区域,然后将裁剪的区域调整为224 x 224的正方形图像;
    1. 以0.5的概率水平翻转;
    1. 比例色相,饱和度和亮度,其系数均由[0.6,1.4]统一得出;
    1. 加上从正态分布N(0,0.1)采样的系数的PCA噪声;
    1. 通过分别减去123.68、116.779、103.939并除以58.393、57.12、57.375来标准化RGB通道。

  验证期间,将每张图片的较短边缘调整为256个像素,同时保持其宽高比。接下来,我们裁剪中心的224 x 224区域并标准化类似于训练的RGB通道。验证期间,我们不会执行任何随机扩充。
  卷积层和完全连接层的权重均使用Xavier算法[6]进行初始化。特别是,我们将参数设置为从[aa][-a,a]均匀得出的随机值,其中a=6/din+douta=\sqrt{6 /(d_{in} + d_{out})}。此处d_{in}和d_{out}分别是输入和输出通道的大小。所有bias都初始化为0。对于批归一化层,γ向量初始化为1,β向量初始化为0。
  Nesterov加速梯度(NAG)下降[20]用于训练。每个模型在8个Nvidia V100 GPU上进行了120个epoch的训练,batch size为256。学习率被初始化为0.1,并在第30、60和90个epoch除以10。

2)、Baseline实验结果

  ResNet-50,Inception-V3,MobileNet在ImageNet上的结果如下图:
在这里插入图片描述

2、加速训练的方式

1)、大批量训练

  通常认为打的batch size会导致单词训练时间过长,网络性能下降等缺陷,但是小批量会导致local bathc的数据分布和原始数据差距过大而影响性能,因此这里提到的方式是为了在单机上保证网络的性能的同时提高batch size。

线性缩放学习率

  在小批量SGD中,梯度下降是一个随机过程,因为在每个批次中都是随机选择示例。增加批次大小不会改变随机梯度的期望,但会减小其方差。换句话说,大批量可以减少梯度中的噪声,因此我们可以提高学习率,从而沿着梯度方向的相反方向获得更大的进展。对于ResNet-50训练,根据批次大小线性增加学习率是有效的。baseline批量大小256选择0.1作为初始学习率,然后当更改为更大的批量bb时,我们会将初始学习率提高到0.1×b/2560.1×b / 256

学习率warmup

  在训练开始时,所有参数通常都是随机值,因此远离最终解。使用太大的学习率可能会导致数值不稳定。在warmp-up方法中,在开始时使用小的学习率,然后在训练过程稳定时切换回初始学习率。warmup将学习率从0线性增加到初始学习率。换句话说,假设将使用前m个批次(例如5个数据epoch)进行预热,并且初始学习速率为ηη,则在第i批次,1im1≤i≤m,我们将学习速率设为iη/miη/ m

部分γ置0

  ResNet网络由多个残差块组成,每个块由几个卷积层组成。给定输入xx,假定block(x)是该块中最后一层的输出,则此剩余块将输出x+blockxx + block(x)。注意,块的最后一层可以是批归一化(BN)层。BN层首先标准化其输入,用x^\hat{x}表示,然后执行比例变换γx^+βγ\hat{x} +β。γ和β都是可学习的参数,其元素分别初始化为1s和0s。在零γ初始化试探法中,对位于残差块末尾的所有BN层初始化γ= 0。因此,所有残差块仅返回其输入,模拟了具有较少层数且在初始阶段更易于训练的网络。

无bias衰减

  权重衰减通常应用于所有可学习的参数,包括权重和偏差。等同于对所有参数应用L2正则化,以将其值逼近0。但是有文章表示建议仅对权重应用正则化,以避免过拟合。无偏差衰减试探法遵循此建议,它仅将权重衰减应用于卷积层和完全连接层中的权重。其他参数,包括BN层中的bias以及γ和β,均未调整。
  注意,LARS提供了分层的自适应学习率,据报道对于非常大的批处理大小(超过16K)有效。虽然在文中,限于适用於单机培训的方法,但在这种情况下,不超过2K的批量通常会带来良好的系统效率。

2)、低精度训练

  神经网络通常以32位浮点(FP32)精度进行训练。也就是说,所有数字都以FP32格式存储,算术运算的输入和输出也都是FP32数字。但是,新硬件可能具有用于较低精度数据类型的增强型算术逻辑单元。例如,先前提到的Nvidia V100在FP32中提供14 TFLOPS,但在FP16中提供100 TFLOPS。如表3所示,从V100上的FP32切换到FP16后,总体训练速度提高了2到3倍。
  尽管有性能上的好处,但降低的精度会导致范围变窄,从而使结果更可能超出范围,进而干扰训练进度。Micikevicius等,提出将所有参数和激活存储在FP16中,并使用FP16计算梯度。同时,所有参数在FP32中都有一个副本,用于参数更新。另外,将标量乘以损耗以更好地将梯度范围对准FP16也是一种可行的解决方案。

3)、实验结果

  加速之后性能上并未下降但是速度上基本上是原来的2-3倍。
在这里插入图片描述
在这里插入图片描述

三、模型调整

  模型调整是对网络体系结构的微小调整,例如更改特定卷积层的跨度。这种调整通常几乎不会改变计算的复杂性,但对模型准确性的影响却不可忽略。在本节中,将以ResNet为例研究模型调整的效果。

1、ResNet网络架构

  ResNet的网络结构如下所示,网络的机构不做过多的说明结构很明显主要是四个stage组成,每个stage第一个是一个下采样的残差块,后面紧跟多个残差。:
在这里插入图片描述

2、ResNet网络调整

在这里插入图片描述

1)、ResNet-B

  ResNet-B更改了ResNet的下采样块。路径A中的卷积忽略了输入特征图的四分之三,因为它使用的内核大小为1×1,步幅为2。ResNet-B切换路径A中前两个卷积的步幅大小,如图所示,因此不会忽略任何信息。由于第二次卷积的核大小为3×3,因此路径A的输出形状保持不变

2)、ResNet-C

  此调整最初是在Inception-v2中提出的,实际上应该是VGG。观察发现,卷积的计算成本是核宽度或高度的平方。7×7卷积比3×3卷积贵5.4倍。因此,此调整用三个保守的3×3卷积代替了输入主干中的7×7卷积,如图2b所示,第一个和第二个卷积的输出通道为32,步幅为2,最后一个为2卷积使用64输出通道。

3)、ResNet-D

  受ResNet-B的启发,我们注意到下采样块路径B中的1×1卷积也忽略了3/4个输入特征图,想对其进行修改,因此不会忽略任何信息。根据经验,发现在卷积之前添加一个跨度为2的2×2平均池化层(其跨度更改为1)在实践中效果很好,并且对计算成本的影响很小。

3、实验结果

在这里插入图片描述

四、训练细化

1、Cosine Learning Rate Decay

  一个简化的版本通过遵循余弦函数将学习率从初始值降低到0。假设批次总数为T(忽略预热阶段),则在批次t处,学习率ηt计算为:
ηt=12(1+cos(tπT))η \eta_t=\frac{1}{2}(1+cos(\frac{t\pi}{T}))\eta
  η\eta为原始学习率。使用cosine学习率衰减的效果如下图:
在这里插入图片描述

2、Label Smoothing

  通常分类任务中,都是将网络的输出经过全连接层之后使用softmax将输出变成概率。假设该图像的真实标签为yy,则可以将i=yi = y的真概率分布构造为pi=1p_i = 1,否则将其构造为0。在训练期间,最小化负交叉熵损失以更新模型参数,以使这两个概率分布彼此相似。特别是,通过构造pp的方式,一个(p,q)=logpy=zy+log(i=1Kexp(zi))\ell(p,q)=-logp_y=-z_y+log(\sum_{i=1}^{K}exp(z_i))。最优解是使得zy=infz_y^{*}=inf足够小。换句话说,它鼓励输出得分显着独特,这可能导致过度拟合。最初提出标签平滑的思想是训练Inception-v2,它将真实概率的构造更改为
qi={1ϵ,i=y,ϵ/(K1),otherwise q_i=\left\{\begin{array}{ll}1-\epsilon,如果 i=y,\\ \epsilon /(K-1), otherwise\end{array}\right.
  其中ϵ\epsilon是一个很小的数那么现在优化的目标就变成:
zi={log((K1)(1ϵ)/ϵ),i=y,α,otherwise z_i^{*}=\left\{\begin{array}{ll}log((K-1)(1-\epsilon)/\epsilon),如果 i=y,\\ \alpha, otherwise\end{array}\right.
  其中α可以是任意实数。这鼓励从全连接层层中有限输出,并且可以更好地推广。
当ε= 0时,间隙log((K1)(1ϵ)/ϵ)log((K-1)(1-\epsilon)/\epsilon)为∞,并且随着ε的增加,间隙减小。具体来说,当ε=K1/Kε=(K − 1)/ K时,所有最佳ziz_i^{*}都相同。下图显示了给定ImageNet数据集的K = 1000时,间隙随着我们移动ε的变化。
在这里插入图片描述

3、Knowledge Distillation

  我们使用教师模型来帮助训练当前模型,即学生模型。教师模型通常是具有较高准确性的预训练模型,因此,通过模仿,学生模型可以提高自己的准确性,同时保持模型复杂性不变。一个示例是使用ResNet-152作为教师模型来帮助培训ResNet-50。
在训练过程中,我们增加了蒸馏损失,以惩罚教师模型和学习者模型的softmax输出之间的差异。给定输入,假设p是真实的概率分布,z和r分别是学生模型和教师模型的最后一个完全连接层的输出。请记住,之前我们使用负交叉熵损失‘(psoftmax(z))(p,softmax(z))来测量p和z之间的差,这里我们再次使用相同的损失进行蒸馏。因此,损失更改为
(p,softmax(z))+T2(softmax(rT),softmax(zT)) \ell(p,softmax(z))+T^2\ell(softmax(\frac{r}{T}),softmax(\frac{z}{T}))
  其中T是使hypermax输出更加平滑的温度超参数,因此可以从老师的预测中提取标签分配的知识。

4、Mixup Training

  在Mixup中将两个样本(xi,yi)(xj,yj)(x_i,y_i)和(x_j,y_j)合并为一个新的类别:
x^=λxi+(1λ)xjy^=λyi+(1λ)yj \begin{aligned} \hat{x}=\lambda x_i+(1-\lambda)x_j \\ \hat{y}=\lambda y_i+(1-\lambda)y_j \end{aligned}
  λ[0,1]\lambda \in [0,1]是一个随机的beta分布的数字,训练期间只使用(x^,y^)(\hat{x}, \hat{y})

5、实验结果

  训练期间设置ϵ=0.1,T=20\epsilon=0.1,T=20,mixup中使用分布为Beta(0.2,0.2),分别在不同任务上进行测试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章