Bag of Tricks
Info
19CVPR
Abstract
图像分类研究的最新进展主要归功于训练过程的改进,如数据增强和优化方法的改变。然而这些改进大部分作为实验细节提一嘴,要么只在源代码中可见。本文通过消融研究来检验这些改进的影响。通过这些trick集合,能够显著改进各种CNN模型,同时对对象检测和语义分割带来更好的迁移学习性能。
Introduction
改进包括模型架构、损失函数、数据预处理、优化方法,这些改进提高模型精度,但几乎不改变计算复杂度。
Training Procedures/基线
2.1Baseline Training Procedure
采用Resnet作为基线
训练过程执行而验证过程不执行随机增强。
卷积层和全连接层的权值均采用Xavier算法进行初始化。
Efficient Training/训练速度
在本节中,我们将回顾在不牺牲模型精度的情况下实现低精度和大批量训练的各种技术。有些技术甚至可以提高准确性和训练速度。
3.1Large-batch training
分析
- batch数太小,而类别又比较多的时候,真的可能会导致loss函数震荡而不收敛,尤其是在你的网络比较复杂的时候。
- 随着batchsize增大,处理相同的数据量的速度越快,跑完一个epoch所需迭代次数变少
- 一定范围内,batchsize越大,其确定的下降方向就越准,不容易被noise影响,引起训练振荡就越小
- 而batchsize越大的话,显存又可能受不住,模型收敛速度可能变慢,因为每次迭代用时更长了,学习率不变的话,需要更多次迭代
- 具体的batch size的选取和训练集的样本数目相关。
- 所以实际工程最常用的就是mini-batch,GPU对2的幂次的batch可以发挥更佳的性能,因此设置成16,32,64…往往比整10、整100更优
Linear scaling learning rate
大批量的批处理减少了梯度中的噪声,所以我们可以增加学习速率,使梯度方向相反的方向取得更大的进步。增大batch size,单batch数据中噪声的影响会更小,此时就可以使用大的学习率步长。比如ResNet-50网络,官方采用的batch size为256,初始学习率为0.1,那么当使用更大的batch size,符号表示为b时,那么可以设置初始学习率为$0.1\cdot \frac{b}{256}$。
Learning rate warmup
在训练开始时,所有参数通常都是随机值,因此远离最终解。使用过大的学习率可能会导致数值不稳定。学习率热启动策略具体操作为,将实验中用的学习率参数从0逐渐增大到初始学习率大小,然后再采用常规的学习率衰减方案,逐渐增大学习率的过程被称作warmup阶段。
假设使用前m个batch来预热,初始学习率为l,那么对于第i个批次,$1\le i\le m$,学习率为$l\cdot \frac{i}{m}$
这种策略的好处:防止训练过程中出现的instablility。
Zero $\gamma$
Resnet网络结构中包含了多个residual blocks,记某个block的输入为x,那么经过残差求和后的结果为$x+block(x)$,而block的最后一层为batch norm层,batch norm层先将该层的输入数据标准化,记作$\hat{x}$ ,那么batch norm层的输出为$ \gamma \hat{x}+\beta$ ,其中,$\gamma$和$\beta$为可训练参数,因此也需要在模型训练之前做初始化,通常的做法是将它们分别初始化为1和0。Zero $\gamma$ 的做法是将它们均初始化为0。
这种策略的好处:将所有residual blocks中的最后一个batch norm层的$\gamma$和$\beta$参数设置为0,也即residual block的输出和输入相等,可以使模型在初始阶段更容易训练。
No bias decay
权值衰减通常适用于所有可学习参数,包括权值和偏差。这相当于对所有参数应用L2正则化,使它们的值趋近于0。但是为了避免过拟合,建议对权重应用正则化。bias,和BN层中的$\gamma$和$\beta$都不正则化。
3.2 Low-precision training
通常,计算机使用32-bit浮点精度(FP32)做训练,也就是说,所有的数字都以FP32格式存储,算术运算的输入和输出也是FP32数字。英伟达的部分显卡针对FP16做了定制化优化,能够达到更快的计算速度,比如最新的显卡V100。另外,关于低精度训练相关的算法理论,可以参见笔者之前写的一篇文章。
建议在FP16中存储所有参数和激活,并使用FP16来计算梯度。同时,所有参数都有一个用于参数更新的FP32的副本。此外,用一个标量与损失相乘以更好地将梯度范围对齐到FP16也是一种实用的解决方案。
3.3Experiment Results
技巧确实有用
Model Tweaks/网络结构
A model tweak is a minor adjustment to the network architecture。这样的调整通常几乎不会改变计算复杂度,但可能对模型精度有不可忽视的影响。
剩余内容见backbone中的Resnet部分。
Training Refinement/过程优化
5.1 Cosine Learning Rate Decay
广泛使用的策略是指数衰减的学习速率。何的ResNet每30个周期以0.1降低速率,我们称之为“阶跃衰减step decay”。
$η_t=\frac{1}{2}(1+cos(\frac{t\pi}{T}))η$
T为batch总数(不包括预热),t为当前批次,η为初始速率。与步长衰减相比,余弦衰减从一开始就开始衰减学习,但一直很大,直到步长衰减使lr降低了10倍,从而潜在地提高了训练进度。
5.2 Label Smoothing
$z_i$表示对class i的预测分数,则$q=softmax(z)$,即:
$$
q_i=\frac{exp(z_i)}{\sum_{j=1}^Kexp(z_j)}
$$
假设真实label为y,则可以构造真实概率分布,$p_i=1\quad if\quad i=y$,否则为0,交叉熵为:
$$
l(p,q)=-\sum_{i=1}^Kp_ilogq_i\
=-logp_y\
=-z_y+log(\sum_{i=1}^Kexp(z_i))
$$
最优解是$z_y = inf$同时保持其他值足够小。换句话说,它鼓励输出分数显著不同,这可能导致过拟合。
标签平滑改变了真实概率的构造:
$$
q_i=c(u)=\begin{cases}1-\varepsilon \quad if \quad i=y,\\varepsilon/(K-1) \quad otherwise \end{cases}
$$
$\varepsilon$是一个小常数
5.3 Knowledge Distillation
Knowledge Distillation,可以翻译成知识蒸馏,最早由Hinton在2015年提出,它包含了一个”教师网络”和一个”学生网络“。其中,“教师网络”通常采用预训练好的模型,而“学生网路”中包含了待学习的参数。记标签的真实概率分布为p ,“学生网络”的预测概率分布为z ,“教师网络”的预测概率分布为r,优化的目标是,让“学生网络”在学习标签的真实概率分布的同时,还要学习“教师网络”的先验知识,公式表示如下:
$$
l(p,softmax(z))+T^2l(softmax(\frac{r}{T}),softmax(\frac{z}{T}))
$$
其中,前者表示学习标签的真实概率分布,后者表示学习“教师网络”的先验知识,T为超参数。
为什么学习的目标是这样子呢?
标签的真实概率分布提供了hard label,准确率高但是信息熵很低,而“教师网络”提供了soft label,准确率相对较低但是信息熵高。这里的信息熵怎么理解呢,比如一副马的图片,可以想象的到它看上去也有点像牛,而hard label给的标签是[1, 0],soft label给的标签是[0.7, 0.3],显然,soft label提供了类别之间的关联,提供的信息量更大,有助于模型在学习时增强类间区分度,hard label和soft label结合等价于在学习真实标签的同时,补充类间信息。
5.4 Mixup Training
mixup的数据增强方法。每次随机抽取两个样本$(x_i,y_i)$和$x_j,y_j$,然后由这两个样本生成新样本:
$\hat{x}=\lambda x_i+(1-\lambda)x_j$ $\hat{y}=\lambda y_i+(1-\lambda)y_j$ $\lambda \in [0,1] from\quad Beta(\alpha,\alpha) $
在mixup training,只使用$(\hat{x},\hat{y})$
Tricks
https://www.zhihu.com/question/41631631
https://zhuanlan.zhihu.com/p/376068083
https://zhuanlan.zhihu.com/p/24720954
1.超参数
超参数最好沿用前人的,比如不同损失加起来的比例:$loss=\lambda_1loss_1+\lambda_2loss_2$,乱改极有可能某一个损失主导整个损失!
2.GAN
不管generator的能力如何,discriminator的loss在前期一定是快速下降的,
Adam的优化效率对于GAN来说很显著
3.模型训练出现nan
一般为梯度爆炸
4.预训练的Normailize(找这个bug找了好久~~)
对图片做了Normalize,后续生成的特征图也是基于这个Normalize的,因为算损失是利用经过预训练后的图片算损失,所以对于图像转换问题,生成的转换图片也是经过这个Normalize的,必须逆过程才能生成正常图片,如果这个时候的分割模型的预训练模型不是用的相同的均值和标准差直接那这个生成的转换图片,就会导致有一个很大的域gap,就会导致效果非常的不好!
5.损失的权重

原来损失的权重能影响到这么大
Diagram
1.Weakly Supervised Object Localization as Domain Adaption

2.t-SNE
https://blog.csdn.net/hustqb/article/details/78144384
https://zhuanlan.zhihu.com/p/81400277
3.umap