url: https://arxiv.org/abs/1812.01187
year: 2018

文中介绍了训练网络的一些 tricks, 通过组合训练过程的trick,来提高模型性能和泛化能力,以及迁移学习的性能。总的来说,这篇文章是一篇实用性极强的文章,也是需要亲自调试才能明白其好处的文章。

baseline

baseline training:

  1. 随机采样一幅图像,解码为32位浮点数类型,像素值取值为【0,255】
  2. 随机裁剪图像,裁剪的参数是长宽比【3/4,4/3】,随机采样面积【8%,100%】。然后缩放到【224,224】
  3. 以0.5的概率随机水平翻转图像
  4. 缩放色调,饱和度,明亮度,缩放系数从【0.6,1.4】中均匀采样。
  5. 从正态分布中采样一个系数用于加pca噪声
  6. 归一化RGB值,分别减去【123.68,116.779,103.939】,除以【58.393,57.12,57.375】

baseline validation:

  1. 保证长宽比的同时将短边缩放到256,
  2. 从中心部分裁剪224*224的图像
  3. 归一化RGB值,参数和训练保持一致

Efficient Training

Large-batch training

文中指出,直接使用大的batch size可能会减缓训练过程的速度,因为对于凸优化问题,收敛的速率会随着batch size增大而降低。与此同时,在训练同样的epoches的前提下,用一个更大的batch size训练会导致模型验证集准确率的降低。

[摘自深度学习花树]
就统计而言, 我们可以将机器学习问题看成利用已有数据去预测数据的真实分布过程的, 我们期望模型学习到的分布接近于数据的真实分布. 在训练模型时候, 我们一般迭代的采样 m 个的样本送入模型来估计数据的真实分布.

就服从高斯分布的样本而言, m 个样本均值的标准差是 \(\frac{\sigma} {m}\),其中 \(\sigma\) 是样本值真实分布的标准差。分母 \(\sqrt{m}\) 表明使用更多样本来估计梯度的方法的回报是低于线性的。 举例如下,一个基于 100 个样本,另一个基于 10000 个样本。 后者需要的计算量是前者的 100 倍,但却只降低了 10 倍的均值标准差。

许多工作用来启发式的解决这个问题。文中介绍了四种方法。

Linear scaling learning rate

梯度下降是一个随机过程,增大batch size没有改变随机梯度的期望,但是减小了它的方差。换句话说,增大学习率减小了梯度中的噪声(noise),所以,我们应该增大学习率来进行调整。例如我们在 batch size=256 的时候使用的lr为0.1,那么 batch size 为 b 的时候,学习率应调整为 \(\frac {0.1 \cdot b}{256}\).

Learning rate warmup.

在训练刚开始的时候,所有的参数都是随机值,离最终的结果偏离比较大,如果直接使用较大的lr会造成数值的不稳定(numerical instability),所以我们可以先用一个较小的lr,当训练过程稳定的时候再调回初始的学习率。假设我们前m个batches是用来warmup的,我们设置的初始lr为 \(\eta\) ,那么当 \(1\leq i\leq m\) 的时候,学习率应该被设置为 \(i\eta /m\)

Zero \(\gamma\)

Resnet每一个block最后一层使用了Batch Normalization(BN)层,BN层首先标准化其输出,记为 \(\widehat{x}\), 然后进行尺度的变换,即 \(\gamma \widehat{x}+\beta\) 。其中, \(\gamma\) 和 \(\beta\) 都是可学习的参数,分别被初始化为1和0。而zero \(\gamma\) 策略指的是,将所有残差块最后的BN层的 \(\gamma\) 参数初始化为0,就相当于减少了层数使得初始阶段更加易于训练。

No bias decay.

一般的是将weight decay应用在所有可学习的参数上,包括weights和bias。然而,更推荐的做法是,只将L2正则化项应用在weights上来避免过拟合。其他参数,包括BN层里的 \(\gamma\) 和 \(\beta\) 都是不经过正则化的。

Low-precision training

一般的NN是在32-bit浮点数上(FP32)训练的,但随着硬件中增加了对一个低精度数据类型的处理单元,对处理像FP16这样的数据具有更高的算力(FLOPS),使用这种数据类型的数据进行训练的话,容易出现的问题是结果会超出范围从而影响训练过程。有人就提出用FP16对所有的parameters和activations进行存储和梯度的计算,与此同时使用FP32对参数进行拷贝用于参数的更新。另外,在损失函数上乘以一个标量来将梯度的范围更好的对齐到FP16也是一个实用的做法。

Model Tweaks

文中第四部分是对Resnet-50模型架构的修改尝试。图1是原始的resnet,图2是经过修改的三种模型。

如图2所示,其中ResNet-B和ResNet-D模型架构修改的思想是修改特定层的strides参数,目的是为了不让11的卷积层的strides大于1,从而避免了特征的丢失。而ResNet-C的想法是使用多个小的卷积核3 3代替大的 7 * 7 的卷积核。实验结果如表5所示。

Training Refinements.

文章中第五部分是通过训练过程中的一些策略来进一步提升模型的准确率。

Cosine Learning Rate Decay

被广泛使用的策略是学习率指数下降,也有的是每30 epoches学习率减为0.1倍的.即Step Decay.还有的是每两个epoches降低为0.94倍的。顾名思义,余弦下降即,

\(\eta _{t} = \frac{1}{2}(1+cos(\frac{t\pi}{T}))\eta\)

Label Smoothing

分类问题中one-hot标签存在的问题是,encourage输出score极大限度的区分度高容易导致过拟合,无法保证模型的泛化能力。为了是模型less confident,我们对训练标签做label smoothing。

\(new\_onehot\_labels = onehot\_labels * (1 - label\_smoothing) + label\_smoothing / num\_classes\)

Knowledge Distillation

知识蒸馏的做法是用一个更复杂的teacher model来监督一个student model,目的是为了压缩一个大的网络结构到一个更为紧凑的网络并把知识保留下来。若z和r分别是student model和teacher model的输出,p是真实标签的分布,那么此时的损失函数为,

\(l(p,softmax(z))+T^{2}l(softmax(r/T),softmax(z/T))\)

其中,T是超参数代表temperature.

Mixup Training

混合训练即随即将两个样本 \((x_i,y_i)\) 和 \((x_j,y_j)\) 进行加权线性插值,其结果作为新的样本用于训练。

\[\left\{\begin{matrix} \widehat{x} = \lambda x_i +(1-\lambda )x_j \\ \widehat{y} = \lambda y_i +(1-\lambda )y_j \end{matrix}\right.
\]

其中, \(\lambda\in[0, 1]\) 是从 \(Beta(\alpha, \alpha)\) 分布中的随机值。

experiment result

thoughts

之所以称之为Tricks,我们也知道在实际应用中是否有效还得看面向不同数据集的具体的任务,需要我们耐心的尝试,才能找到一个相对最优的方案。

reference:

  1. https://zhuanlan.zhihu.com/p/53324148
  2. https://blog.csdn.net/zc199329/article/details/84967940

Bag of Tricks for Image Classification with Convolutional Neural Networks的更多相关文章

  1. Bag of Tricks for Image Classification with Convolutional Neural Networks笔记

    以下内容摘自<Bag of Tricks for Image Classification with Convolutional Neural Networks>. 1 高效训练 1.1 ...

  2. 训练技巧详解【含有部分代码】Bag of Tricks for Image Classification with Convolutional Neural Networks

    训练技巧详解[含有部分代码]Bag of Tricks for Image Classification with Convolutional Neural Networks 置顶 2018-12-1 ...

  3. Bag of Tricks for Image Classification with Convolutional Neural Networks

    这篇文章来自李沐大神团队,使用各种CNN tricks,将原始的resnet在imagenet上提升了四个点.记录一下,可以用到自己的网络上.如果图片显示不了,点击链接观看 baseline mode ...

  4. Bag of Tricks for Image Classification with Convolutional Neural Networks论文笔记

    一.高效的训练     1.Large-batch training 使用大的batch size可能会减小训练过程(收敛的慢?我之前训练的时候挺喜欢用较大的batch size),即在相同的迭代次数 ...

  5. AlexNet: ImageNet Classification with Deep Convolutional Neural Networks

    目录 激活函数 防止过拟合 增加数据 Dropout 细节 代码 AlexNet 上图是论文的网络的结构图,包括5个卷积层和3个全连接层,作者还特别强调,depth的重要性,少一层结果就会变差,所以这 ...

  6. Must Know Tips/Tricks in Deep Neural Networks

    Must Know Tips/Tricks in Deep Neural Networks (by Xiu-Shen Wei)   Deep Neural Networks, especially C ...

  7. Must Know Tips/Tricks in Deep Neural Networks (by Xiu-Shen Wei)

    http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html Deep Neural Networks, especially Conv ...

  8. 论文阅读:《Bag of Tricks for Efficient Text Classification》

    论文阅读:<Bag of Tricks for Efficient Text Classification> 2018-04-25 11:22:29 卓寿杰_SoulJoy 阅读数 954 ...

  9. [笔记]A Practical Guide to Support Vector Classi cation

    <A Practical Guide to Support Vector Classication>是一篇libSVM使用入门教程以及一些实用技巧. 1. Basic Kernels: ( ...

随机推荐

  1. Codeforces Round #604(Div. 2,

    // https://codeforces.com/contest/1265/problem/D /* 感觉像是遍历的思维构造题 有思路就很好做的 可以把该题想象成过山车或者山峰...... */ # ...

  2. JS数组去除空值

    /** * 扩展Array方法, 去除数组中空白数据 */ Array.prototype.notempty = function() { var arr = []; this.map(functio ...

  3. mysql分布式

    一,复制,对数据进行备份,实现搞可用,提高吞吐量,实现高性能. 1,主从架构 2,多主架构 3,主主从从 4,主备 (实际用得多) 二,分片/分库分表 () 1,垂直拆分 1,垂直分表 2,垂直分库 ...

  4. .NET Application,Session,Cookie,ViewState,Cache对象用法

    作用域 保存地址 生命周期Application 应用程序 服务器内存 IIS启动Session 整个站点 服务器内存 Session到时 默认20分钟Cashe 应用程序 服务器内存 应用程序的周期 ...

  5. IconFont使用注意点

    在工作中,我经常会用阿里的IconFont图标库,今天发现一个之前没怎么注意到的问题. 首先IconFont给我们提供了三种引用图标的方式 unicode引用 unicode是字体在网页端最原始的应用 ...

  6. 常用类-Excel-使用Aspose.Cells插件

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Xm ...

  7. Web前端基础(14):jQuery基础(一)

    1. jQuery概述 1.1 为什么要使用jQuery 在用js写代码时,会遇到一些问题: window.onload 事件有事件覆盖的问题,因此只能写一个事件. 代码容错性差. 浏览器兼容性问题. ...

  8. HTML中的三元表达式,灵活的使用or逻辑判断

    08.27自我总结 HTML中的三元表达式 判断内容 ? 满足返回的值 : 不满足返回的值 灵活使用or逻辑判断 比如我们某个变量为空的时候返回他另外个值 var a = msg || '没有消息'

  9. ebs oracle YTD期间费用

    select PERIOD_NAME, SEGMENT3, SEGMENT3_DESC, sum(case when SEGMENT2 = '1011' then ACCOUNTED_ACCRUAL ...

  10. ubuntu 或centos 使用Docker搭建anaconda+python基本环境

    ubuntu 16 使用Docker安装anacondaubuntu docker 安装centos docker 安装搜索可用镜像 docker search anaconda 拉取你中意的镜像 d ...