ICML19 - 最强backbone?《EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks》

原文地址

原文

论文阅读方法

三遍论文法

初识

网络的设计通常要考虑输入分辨率、深度、宽度等因素,更好地平衡各因素会带来更高的性能收益。在之前的工作中,网络设计大多只考虑到某个单一尺度,并且很多工作都基于大量的人为设计,从而只能达到一个次优解(sub-optimal)。
在这里插入图片描述

因此,本文的第一个工作就是统一研究深度、宽度、分辨率对网络设计过程中性能性能的影响,并采用统一的系数进行缩放控制(compound scaling method)。这也就意味着,当某个维度增加或者减少时,其他维度也要进行相同的变化。

这是因为作者认为,当你网络输入分辨率增加时,需要添加更多的层去增加感受野,同时也需要增大通道维度,去捕获更细粒度的特征模式。

此外,这种方法虽然能在现有模型上提升性能,但它比较依赖于baseline方法。因此作者并不满足,从而采用了NAS(神经网络结构搜索)的方法构造一个强大的Baseline模型:EfficientNet-b0,并在此基础上应用compound scaling,得到一系列的EfficientNet模型,在Imagenet上的准确率和计算效率上都碾压了当时的所有模型,贴张图感受一下。

在这里插入图片描述

相知

直接介绍核心技术和部分实验

Compound Model Scaling

问题定义

作者首先回顾了目前网络设计的套路,总结为以下的公式:

在这里插入图片描述
其中, F i F_i Fi就表示第i个阶段的block结构, H i , W i , C i H_i,W_i,C_i Hi,Wi,Ci分别代表在当前阶段中特征图的尺寸, L i L_i Li就表示阶段i重复了多少次block,一共有s个阶段。

想象一下ResNet的网络架构,就比较容易理解公式的意义了。

之前的网络设计注重模块化的设计,也就是对 F i F_i Fi的设计,比如ResNet中的Basic BlockBottleneck Block。而本文的重点不是去设计模块,是想探究网络的深度L、宽度W、分辨率的缩放策略H、W,从而提升模型性能。

但分别考虑每个阶段的变化,这个搜索空间无疑太大了,因此作者对整个模型采用一种统一的缩放策略,转化为一个优化问题,如下:

在这里插入图片描述
其中,d,w,r表示对宽度、深度、分辨率的缩放系数。

观察结论

定义好了问题,作者依据现有工作以及实验,观察得出两个结论:
① 单独对某个维度进行增大确实能提升性能,但模型越大,性能提升变得越有限(区域饱和);
② 同时对所有维度进行增大,性能更好,但不同的缩放尺度带来的性能差异较大,也意味着在scaling时需要平衡好各维度。

对于第2点,通过字面意思可能比较难理解,参考下图。每个颜色表示不同的深度和分辨率设置下的网络,每一点表示不同的网络宽度。可以发现,不同的尺度设置,效果不同(需要平衡好各系数间的缩放权重)。
在这里插入图片描述
compound scaling method
基于上述的观察,作者定义了一个复合系数Φ对所有维度进行统一的尺度缩放:

在这里插入图片描述
其中α,β,λ分别表示深度、宽度、分辨率的系数,通过网格搜索得到最优解。Φ是一个超参数,控制各维度scaling的尺度。作者限制搜索空间为 α ⋅ β 2 ⋅ λ 2 ≈ 2 α·β^2·λ^2≈2 αβ2λ22,这是因为卷积神经网络的计算复杂度(FLOPs)与 α , β 2 , λ 2 α,β^2,λ^2 α,β2,λ2成正比,从而也可以通过 2 Φ 2^Φ 2Φ来估计baseline经过scaling之后计算复杂度的变化情况。

EfficientNet

因为提出的compound scaling策略并没有改变网络结构,所以性能会依赖于baseline架构。为了进一步提升性能,作者采用NAS进行网络结构搜索,其搜索方法以及搜索空间等设置与MnasNet一致,从而得到baseline:EfficientNet-B0

在这里插入图片描述

关于NAS的更多细节参照MnasNet文章,主要采用的是考虑准确率与计算效率的多目标优化,利用强化学习进行网络结构搜索。

其中MBConv模块的具体结构文章没有详细介绍,主要就是Invert Residual Module + skip connection + SE Module,可以参考该文章:EfficentNet详解之MBConvBlock

确定了Baseline模型,作者应用上之前提到的compound scaling策略,变化得到不同的模型。主要分为以下两步:

  • step1:固定Φ为1,通过网格搜索确定各维度的系数α=1.2,β=1.1,λ=1.15
  • step2:固定α,β,λ,通过变化Φ,得到EfficientNetB1-B7一系列网络。

论文中并没有详细给出B1-B7的网络结构,通过查看pytorch代码得到各网络结构,如下(分别表示宽度、深度、分辨率以及dropout概率的系数):
在这里插入图片描述
部分实验
① 将compound scaling策略用于ResNet与MobileNet上的结果
在这里插入图片描述
可以看到compound scaling在增加同等计算复杂度的情况下效果最好。

② EfficientNet家族与各大模型的比较(相同的计算复杂度成都放在一起比较)的结果

在这里插入图片描述
可以说是在精度和计算效率上,碾压各模型了。

回顾

EfficientNet这篇文章主要有两点工作,第一个就是compound scaling,第二个就是创建了EfficientNet家族。这两个工作其实普通人都不好做,都涉及到搜索,也这就意味需要投入大量的显卡资源。

EfficientNet确实快、效果好,吹它的话就不多说了。但其泛化性能还真不好说,因为整个模型结构是针对特定数据集搜出来的最有解,但这并不意味在所有视觉数据集上都能达到最优解。

当然No Free Lunch,你不能期望它胜任所有任务。作为普通调参侠,能够在现有的框架中方便地调入EfficientNet预训练模型已经很知足了。并且博主通过比赛也发现,其效果确实要优于绝大多数ResNet系列的模型(除了ResNest)。

但要说碾压ResNet是不公平的,因为相隔几年,视觉领域关于模型的训练策略甚至显卡资源都进步了太多太多。但这种工作对于推动计算机视觉在工业场景中的落地是非常有意义的,给定特定的目标和任务,自动得到一个最优的模型,即避免了认为设计导致的次优解,也避免了大量的人力投入(毕竟这年代AI研究员薪资可不低)。

总之EfficientNet是一个很优秀的工作,这种工作虽然咱们普通人follow不了,但总得有大佬去开拓。而且目前也很容易获取开源代码和预训练模型,不失为项目和比赛的一个好选择。

代码

如果是用TensorFlow框架,应该是通过tf.keras就能直接调用了。Pytorch的话我推荐一个我用过的库EfficientNet-Pytorch,非常方便。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值