Bag of Tricks for Convolutional Neural Networks

https://zhuanlan.zhihu.com/p/51870052

刚刚看了Bag of Tricks for Image Classification with Convolutional Neural Networks,一篇干货满满的文章,同时也可以认为是GluonCV 0.3: 超越经典的说明书,通过这个说明书,我们也拥有了超越经典的工具箱。

我们都知道trick在CNNs中的重要性,但是很少有文章详细讲解他们使用的trick,更少有文章对比各个trick对最后效果影响,这篇文章把CNNs里几种重要的trick做了详细对比,可以认为是一篇在CNNs中使用trick的cookbook。

这篇文章虽然题目是“for Image Classification”,但是这里面提到的trick和结论,我认为也适用于其他计算机视觉任务,比如目标检测、语义分割、实例分割等等,特别地,我专门看了GluonCV里Yolov3的实现,里面有使用label smoothing和mixup。

这篇文章的trick有五个方面:model architecture, data augmentation, loss function, learning rate schedule,optimization。总结一句话就是,网络input stem和downsample模块、mixup、label smoothing、cosine learning rate decay、lr warmup、zero γ对网络影响都不小

model architecture

这一部分主要讨论ResNet-50结构的一些微调,包括input stem和downsample module的细微改变。ResNet-50原始结构,和基于原始结构的一些微调如下图所示。

原始ResNet-50

ResNet-50网络结构的几个变体

结果对比如下:

网络结构微调的对比

可以看出,这些小修改对计算量的影响很小,但是对最后的accuracy提升效果不小。我在设计目标检测网络的时候,也有类似的结论。多说一句,ResNet-50-C这种修改,虽然对计算量影响不大,不过根据我的经验,对速度的影响应该会比较大。

data augmentation

mixup对模型提升较大,具体对比如下。

mixup对模型效果影响

data augmentation对模型效果影响蛮大的,不说mixup,单说resize的范围就能对模型效果有着不小的影响,有时候好好调调data augmentation里的参数,带来的效果提升比对网络结构的改进要还要大。数据和模型是一个硬币的两面,虽然改进数据没有改进模型听起来高大上,而且也更脏,但是我认为对数据的理解才是一个算法工程师的核心竞争力

loss function

label smoothing对模型效果影响如下。

label smoothing对模型效果的影响

optimization

optimization涉及到lr warmup、zero γ、no bias decay、cosine decay。前三者对效果影响如下图所示,可以看出lr warmup和zero γ比较重要。

lr warmup、zero γ、no bias decay对模型效果的影响

cosine learning rate decay中对模型效果影响见下图,对比的是step learning rate decay。

cosine learning rate decay对模型效果影响

一个有意思的细节

文章对比了自己复现的baseline和reference模型效果,具体如下。可以看出复现的basline和reference在三个模型结构下各有优劣,差距在0.5%到1%之间。我最近在用Yolov2和Yolov3,也有类似的经历,各个深度学习框架之间本身会有一些细微的差别,自己实现的代码,也可能带来一些细微差别,这些差别可能都细小到我们注意不到,然而最后却能对模型效果带来一个点左右的影响。

1. 基本pipeline

1.1 预处理(训练)

a) Random sample image

b) 随机剪裁原图,面积比是[0.08, 1.00], 长宽比是[3/4, 4/3], 最终缩放到224*224

c) 以0.5概率水平翻转

d) Scale 色相、饱和度、亮度

e) 添加PCA噪声

f) 归一化均值、方差

1.2 预处理(测试)

a) 缩放图像较短边到256

b) 在图像中心剪裁出224*224大小图像

c) 归一化

1.3 权重初始化

Xavier algorithm 初始化所有卷积层、全连层。

1.4 优化器

NAG

可以从实验结果看到,resnet-50结果略好

2. 一些有效的训练方法(提高训练速度)

2.1 Large-batch training。

观察表明:比较大的batch size 会造成模型在验证集的精度下降(模型收敛?)。为了解决这的问题可以选择一个一个较大的初始学习率(0.1)

a) Learning rate warm-up。在训练的开始阶段,参数都是随机的,使用大的学习率在会时训练不稳定。所以可以在训练的前 m 个batch线性增加学习率至初始学习率(0.1)

b) Zero gamma. Res-net 是由residual block 组成。 每个block 由pathA和pathB组成。 假设pathA 中含有BN层, 所以把gamma初始化0可以在模型训练的初始降低模型复杂度。

c) No bias decay, 只对全卷积核、全连接层做 regularization(据说可以避免过拟合)

2.2 low-precision training

相比32位浮点数训练,使用16位浮点数训练可以带来两到三倍训练速度提升。 这里的做法是用16位存储参数和计算梯度, 用32位更新梯度。最后在loss上乘了一个常数。

所有trick加到一块的performance最后都略好与baseline, 但是从每个trick的叠加试验来看, No bias decay 其实是造成精度下降的。

3. ResNet 结构优化

初始Resnet block

这里的优化是PathA的大小为1步长为2的卷积核会丢失信息,所以步长改成1。PathB也有这个问题, 改成平均池化加步长为1的卷积。 同时,初始输入中的7*7卷积改成了3个3*3卷积。如下,在轻微的计算量提升的基础上验证集精度提升约0.9

优化结构

4. 训练优化

4.1 Cosine learning rate decay

相比于step decay 的方式, 不用手动去设置decay step. 可以有一个相对平滑的学习率下降曲线的同时, 学习率在开始时缓慢下降,在中段线性下降, 最后又是缓慢下降。

4.2 Label smoothing

在经过softmax操作和交叉熵计算后,目标函数最优解变成了具体类别对应的输出无限大,其他神经元输出尽可能小,这样会带来潜在的过拟合(arXiv上的cross entropy公式写错了)。所以可以选择可以修改标签的概率分布为1-keci

4.3 knowledge Distillation

在训练较小的模型时(数据量大可能不太好收敛?),所以可以使用一个较大的模型作为teacher model 用来指导小模型的训练,具体做法时把两个模型的输出层的差作为loss的一部分,teacher model 一般是预训练好的。

4.4 Mixup training

对图像和标签之间同时做融合(fusion),但是这会要求更长的训练时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值