图片分类模型调参技巧

  |  

摘要: 2018 年左右,图片分类模型调参技巧论文学习笔记

【对数据分析、人工智能、金融科技、风控服务感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:潮汐朝夕
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


Bag of Tricks 论文

这是一篇 2018 年的论文,介绍了当年图片分类模型的各种调参技巧。文中基于前几年训练过程优化的大量论文,总结用于提升网络性能的技巧。

总览

  • 训练基本过程:训练集和测试集的增广;参数初始化;优化方法;学习率调整策略。
  • 高效训练:大批量训练,低精度训练
  • 模型调整:比较了 3 种 ResNet 变体
  • 训练改进:余弦学习率衰减;Label 平滑;知识蒸馏;混合训练分类
  • 迁移学习:检测;语义分割

训练流程

Baseline:一篇网页文章《Training and Investingating Residual Nets》,ResNet 的 PyTorch 实现。

预处理:训练和测试的增广

训练

  • 随机采样一张,像素取值 [0, 255],解码为 fp32
  • 随机剪裁矩形,长宽比在 [3/4, 4/3] 随机取,剪裁面积在 [8%, 100%] 随机,然后将剪裁区域 Resize 为 224x224
  • 以 0.5 概率随机水平 flip
  • 缩放色调 hue,饱和度 Satuation,亮度 Brightness,范围 [0.6, 1.4] 随机
  • 以正态分布 N(0, 0.1) 采样参数用于加 PCA 噪声
  • 归一化 RGB 通道,减 [123.68, 116.779, 103.939],除以 [58.393, 57.12, 57.375],注意顺序

测试

  • 保持长宽比,短边 resize 为 256
  • 在图片中心剪裁出 224x224
  • 与训练时同样归一化 RGB 通道

参数初始化

对于卷积和全连接,都用 Xavier:

其中 $n_{j}$ 为第 j 层的输入通道数。所有偏执置为 0。

对于 BN,$\gamma$ vector 置为 1,$\beta$ vector 置为 0。

优化方法

用 NAG 代替 SGD,参考 1983 年的文章《A Method for Solving convex programming problem with convergence rate $O(\frac{1}{k^{2}})$》。

batch size = 256。

120 epoch。

30, 60, 90 处以 0.1 降学习率。

高效训练

(1) 大 Batch (数据量大,显存大)

大 Batch 可能减慢训练过程,对于凸优化,收敛速度随 batchsize 上升而下降。

即:训同样的 epoch,大 Batch size 会降低验证集准确率,参考《Don’t decay Learning Rate, Increase the Batch size》。

学习率线性扩大

Batch size 增加并没改变随机梯度的期望,但减少了随机梯度的方差,即 Batch size 的增加,减小了梯度中的噪声,因此可以加大学习率。

例如对于 lr = 0.6,batch size = 256,随着 Batch size 改变,lr 应该为 0.5 * 6 / 256,参考《Accurate, large minibatch SGD: Training ImageNet in 1 hour》。

学习率预热

lr 变大后,容易导致数值不稳定。

先用小 lr 训,等训练过程稳定后,换回初始 lr。

也有从较小 lr 线性变为初始 lr 的方法。例如:

用 m 个 batch 用于预热,初始 $lr = \eta$,预热阶段,第 i 个 batch,学习率为 $i \times \eta / m$。

Zero $\gamma$

ResNet 每个Block 最后一层都有 BN。

BN 首选标准化输入 $\hat{x} \rightarrow \gamma \hat{x} + \beta$,其中 $\beta$ 和 $\gamma$ 可以学。

将所有 BN 的 $\gamma$ 初始化为 0,相当于训练初始减少层数。

No Bias decay

只对卷积和全连接做 wight decay,而不去正则化 Bias 和 BN。参考《Highly Scalable deep leaning training system with mexed-precision: Training ImageNet in for minutes》

LARS: 给每一层增加一个自适应学习率,对于大 Batch (16K)有效,本文介绍的方法在小于 2K 有效。

(2) 低精度训练

一般参数和数据均为 fp32。如果有新的计算设备,提供 fp16 的计算能力,可以得到训练速度提高的好处。但是也有坏处:数值范围窄了,计算结果容易溢出。

有一种解法是训练中用 fp16 存参数用于计算梯度,同时留一个 fp32 的备份,用于更新参数。参考 2017 年论文《Mixed Precision Training》。

灵位计算 loss 时,乘以一个尺度,将梯度范围更好地对齐到 fp16。

模型调整 (ResNet 变体)

ResNet-B

原有的 Residual Block 的下采样部分 用的 conv1x1, stride=2,忽略 3/4 的信息。改进为 conv3x3, stride=2。

ResNet-C

conv 操作时,kernel size 与计算耗时是平方关系,因此将输入的 7x7 改为 3 个 3x3,来自于 Inception-v2,在 SENet、PSPNet、DeepLab-v3,ShuffleNet-v2 中也有。

ResNet-D

原因与 ResNet-B 相似,改进为 conv1x1, stride=1,在前面加一个 2x2 stride=2 的 avgpool。

训练改进

余弦学习率衰减

Step Decay 的不好,衰减时,跳跃变化大,带来较大冲量 momentum,引起训练不稳定。

Cosine Decay:

论文中说 step 的 lr 较小时,cosine 的 lr 仍较大,因此能加速。

但文中图标显示 step 的 lr 降了之后,Acc 就上来了,而 Cosine 还在呢个量级,因此速度比 step 慢了。

但是大家都推崇余弦学习率,实践中需要自己尝试。

参考 2016 年的《SGDR: Stochastic gredient desent with Restarts》。

Label 平滑

Label 平滑是抑制过拟合的手段。因为分类标签为 One-Hot,而网络输出则不是,这就造成了不必要的 loss,导致过拟合。

办法是计算 loss 的时候修改 GroundTruth 分布:

思路最早来自 Inception-v2,参考《Rethinking the Inception》。

知识蒸馏

p 是真是分布,z, r 为教师和学生网络最后 FC 的输出:

参考《Distilling the knowledge in a Neural Network》。

混合训练(Mix up)

数据增广办法:随机取两个,线性加权插值构造新样本:

参考《Beyond empirical risk minimization》。

迁移学习

作为其他任务的 Backbone。

检测

参考 2015 《Faster RCNN》和 2018《Detectron》。

语义分割

参考《Fully Convolutional Network for Semantic》


Share