Bag of Tricks for Image Classification with Convolutional Neural Networks论文笔记
简介
目前,在图像分类领域取得诸多进展的原因之一在于对训练过程进行优化与创新。值得注意的是,在众多研究文献中,许多优化措施往往仅以简短说明或作为附带代码片段提及,并非系统性阐述。本文巧妙地整合了这些辅助手段,并将基于ResNet-50模型的基础网络性能从原先的75.3%成功提升至79.29%(这一指标的具体数值可在GluonCV平台的相关资源中查找到详细复现材料)。由此可见,在深度学习框架如MXNet框架的支持下(如GitHub项目链接所示),研究人员不仅可以快速实现基础模型架构(如ResNet系列),还可以分享实用技术心得以供同行参考与借鉴
从作者对ResNet-50进行训练后的效果来看,在表格中展示了当前广泛使用的几种分类网络的效果。最后一行数据则展现了作者在ResNet-50基础上加入多种训练优化后取得的效果,并与原论文中的结果进行了对比分析,在top-1准确率方面实现了显著提升(从75.3%提高至79.29%)。

为了进行对比实验的第一步工作就是建立一个基准模型作为参考标准。这个基准模型的具体构建包括:数据预处理的具体步骤及其执行顺序;网络层的参数初始化方法;迭代过程中的具体次数设置;以及动态调整策略的学习率变化方案。
0,255
Baseline训练过程
在训练阶段的操作如下:
(1)将原始像素值从【0, 255
在测试阶段将图像的较短边调整至长度为256,并使其保持原长宽比不变。随后从中截取一个大小为119\times119的正方形 crops,并通过类似于训练阶段的数据预处理方法对RGB通道进行归一化处理,避免实施任何额外的数据增强操作。
这张图表展示了研究者基于基准方案复现了三个典型分类网络的结果。结果显示该方案的效果与原文相差不大。此基准方案将成为后续实验的重要对比基准。

在介绍完基准模型之后,在这篇论文的重点便是阐述如何进行优化:整篇论文将重点放在加速模型训练上:详细阐述了三种提升模型效果的方法:分别是加快模型训练速度、优化网络结构以及通过训练调优来提高性能。
一、加快模型训练部分:
一部分内容涉及增大批量处理规模;另一部分则使用16位浮点运算进行训练
采用更大的批量大小可以在一定程度上加速模型的训练进程。然而,在大多数情况下仅通过增加批量大小并不能取得显著的效果。以下是一些可能的解决方法:
1.提高学习速率 Large-batch训练, 因此由于更大的 batch size 计算出的数据梯度更加贴近整体数据集, 即使其方差有所降低. 当更新方向更为精准后, 学习速率同样应当相应地增大. 具体而言, 如果初始学习率为 0.1,batch_size 为 256, 我们的 batch_size 定义为 b, 那么学习率为 0.1 \times \frac{b}{256}.
通过一个小的学习率先期进行几个epoch的训练,Learning rate warmup(学习率热身)。由于网络参数初始值随机化,若一开始就采用较大的学习率可能导致数值不稳定问题,这正是warmup设计的主要原因。当训练过程基本稳定后,就可以继续使用预设初始学习率来进行后续训练了。作者在实现 warmup 过程中采用了线性递增策略,具体来说,在整个 warmup 阶段总共包含 m 批数据(其中 m 对应 5 个 epoch)。例如,假设 warmup 阶段起始学习率为 0,那么在第 i 所使用的 batch 的学习率为 i×L/m。
3.对于每个残差块中的最后一个BN层而言, 我们知道在BN层中使用\gamma和\beta参数来进行标准化后的线性变换, 这相当于将标准化后的输入乘以\gamma并加上\beta, 通常情况下会将这些\gamma参数初始化为1值, 作者的观点是这样的设置有助于提升模型训练的效果.
4.不对bias参数执行weight decay操作,No bias decay weight decay主要的作用就是通过对网络层的参数(包括weight和bias)做约束(L2正则化会使得网络层的参数更加平滑)达到减少模型过拟合的效果。在"14分钟训练imagenet"提出的策略是weight decay只用于卷积层和FC的weights,biases和BN层的和都不用。
因为本文提出的是限制在单机上训练的方法,所以batch_size不会超过2k。
从数值计算的角度出发,在低精度计算中使用16位浮点型来进行参数优化是一种有效的加速策略
那么两者在优化效果方面有何不同?表3显示,在采用更大batch size以及16位浮点型的训练过程中取得了显著的效果。从实验结果来看,在与原始方法相比时训练速度得到了明显提升,并且在性能上也有所提升,并且在MobileNet模型上的表现尤为突出。

详细对比实验可以参考Table4.

二、优化网络结构部分:
微调网络架构时通常不会显著影响计算复杂度。然而这可能对模型性能产生不容小觑的影响。
以ResNet为例进行优化分析,则能清晰展示其模块化设计。如图1所示为ResNet网络结构图,在该架构中包含一个input stem模块、四个stage模块以及一个output模块;每个module内部的具体组件安排也体现在表格中(第二列);而每个残差块(third column)则展示了其核心组件设计细节。整体而言这一图表设计非常直观明了

对于residual block的改进部分,在图2中有所体现,请注意以下三点:首先,在蓝色区域对算法进行了优化;其次,在红色区域增加了新的参数设置;最后,在绿色区域引入了动态权重机制。
主要改进措施是对每个stage中的带有downsampling功能的残差块中的downsampling操作进行了优化。具体而言,我们将初始阶段的第一个1×1卷积层替换成第二个3×3卷积层来实现downsampling功能。这样会导致仅有约¼的特征点参与计算,而将其下采样操作放置在随后的3×3卷积层中则能有效减少这一损失,因为即使设置stride=2,较大的卷积核也能充分覆盖特征图上的大部分区域。
ResNet-C 的改进之处在于将 Figure1 中 input stem 部分的一个 7×7 卷积层替换成三个连续应用的 3×3 卷积层结构。其中前两个支路输出通道数均为 32(Branch1 和 Branch2),而第三个支路则提升至64(Branch3)。这种设计参考了 Inception v2 的理念,在于虽然较大尺寸的卷积核相比较小尺寸增加了较多计算负担(Branch1 和 Branch2 每一层都带来了额外运算开销),但值得注意的是,在 ResNet-C 的设计中虽然采用了三个连续的小尺寸卷积替代原先的大尺寸单次卷积结构这一策略看似增大了运算负担(Branch1 和 Branch2 的总运算开销与原始方案相当),但其实在 ResNet-C 中虽然采用了三个连续的小尺寸卷积替代原先的大尺寸单次卷积结构这一策略看似增大了运算负担(Branch1 和 Branch2 的总运算开销与原始方案相当),但其实在 ResNet-C 中虽然采用了三个连续的小尺寸卷积替代原先的大尺寸单次卷积结构这一策略看似增大了运算负担(Branch1 和 Branch2 的总运算开销与原始方案相当)。
3.ResNet-D主要改进之处在于将残差块中的下采样分支从 stride 为 2 的 1×1 卷积层转换成 stride 为 1 的卷积,并在前部加入一个池化层用于下采样。具体而言, 尽管如此, 池化的操作也会丢弃一些数据, 但通过特定操作(如平均值计算)进行筛选从而保留了更多有用信息, 相较于 stride 设置为 2 的情况更加高效合理

经过对网络结构进行改进后的效果评估结果如Table5所示,请问您是否可以看出,在提升效果方面的情况仍然较为显著?

该实验建立在第三部分的设定基础上,并采用FP16精度进行训练。相较于原始ResNet-50模型,在测试集上的Top-1准确率提升了约1%左右。然而,在实际应用中发现其运行速度较之前版本减少了约3%。
三、模型训练调优部分
这部分作者提到了4个调优技巧:
1、余弦退火法(Cosine Learning Rate Decay), 在这一部分实验结果对比中可参考图3所示的内容分布情况:其中(a)展示了余弦退火法与步阶退火法的示意图;步阶退火法是一种较为常见的学习率退化策略(即每隔指定epoch才会进行一次学习率调整)。而图3(b)则具体比较了这两种退火策略在实际应用中的效果表现。
此外可知的是,在首次提出该方法于2016年之后其简化形式是从初始学习速率降至零。

其中T是总batch数,t是当前batch索引,\eta是初始学习率

观察上图可知,在最初的阶段, 采用余弦衰减策略的学习率逐渐降低; 随后在中间时段呈现近似直线趋势; 最终再次趋于平稳状态. (然而在测试集上的最终准确率对比中发现, 在应用余弦衰减策略时并未展现出显著的优势, 并且训练过程中的收敛速度也未能得到明显提升?)
2、采用Label Smoothing(标签平滑)技术进行处理,
这部分主要是将原来常用的one-hot类型标签进行软化处理,
通过这种方式,在计算损失值时能够一定程度地减少过拟合。
从交叉熵损失函数的角度来看,
只有当真实标签对应的类别概率才会对损失值产生帮助作用,
因此label smoothing实际上等同于降低了真实类别概率在损失计算中的权重,
同时提升了其他类别预测概率对最终损失函数的影响。
这样一来,
真实类别概率与其他各类别的预测概率均值之间的差距(倍数)就会有所下降,
具体效果如图所示。
此外,
根据 softmax 公式:
q = \frac{e^{z_i}}{\sum_{k=1}^{K} e^{z_k}}
其中 K 代表标签总数目,
z_i 表示预测类别的分数值。

负交叉熵损失公式,其中p_{i}为真实概率分布,当对了为1,不对为0。

标签平滑的思路来自2015年提出的Inception-v2。它将构造的真实分布改为

其中\varepsilon为一个很小的常量。现在优化解变为

其中\alpha为任意实数。这鼓励FC层为有限输出,从而泛化的更好.

从上图可以看出标签平滑的分布中心更接近理论值同时其极值更少.
3、知识蒸馏(Knowledge-based蒸馏),这属于模型加速压缩领域中的一个重要分支。它指的是通过将一个性能更优的teacher模型训练优化另一个student模型,在不改变student模型结构的前提下提升其性能。研究者采用了ResNet-152作为teacher模型,并选用ResNet-50作为student模型。具体实现方法是:通过向ResNet网络后附加蒸馏损失函数来实现。该损失函数用于衡量teacher和student输出之间的差异程度,并将其整合到整体损失函数中以优化学习过程。

注
4、采用Mixup Training(混合训练),mixup本质上是一种数据增强技术。通过使用mixup训练方法,每次操作都会涉及两个输入样本(xi, yi)和(xj, yj)。将这两张图像按照λ的比例进行加权平均后生成一个新的样本(x, y),然后利用这个新样本进行训练。需要注意的是,在这种情况下训练模型时需要使用更多的epoch数。式子中的λ是一个超参数,在[0,1]范围内取值。

其中\lambda \in [ 0,1 ]来源于\operatorname { Beta } ( \alpha , \alpha )的概率分布函数中的随机数。在混合训练过程中仅采用新样本。
最后作者进一步展示了这些优化点不仅在分类算法中表现出色,在其他图像任务中也同样具有显著效果;例如,在目标检测领域取得的显著成果表明,在ImageNet数据集上最优的图像分类算法也在VOC数据集上取得了令人瞩目的成绩;此外,在语义分割任务方面同样展现出了迁移学习的效果。
深入解析优秀论文
