Abstract

人们通常是在固定的计算资源下设计CNN,更多的计算资源也就意味着更高的准确率。本文系统地研究了模型的缩放,提出仔细地平衡网络的深度、宽度和图像分辨率可以得到更优的性能。基于此发现,作者提出了一个新的缩放方法,通过一个简单而有效的复合系数来统一地缩放深度/宽度/分辨率的所有维度。作者证明该方法对 MobileNets 和 ResNet 的缩放是有效的。

更进一步,作者使用神经结构搜索方法设计了一个新的 baseline 网络,对其进行缩放得到多个模型,叫做 EfficientNets,相较于之前的卷积网络,它取得了更高的准确率和效率。其中 EfficientNet-B7 在ImageNet 上取得了 SOTA 的Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络的 top-1 准确率,Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_02 top-5 准确率,而推理时,该模型的大小要比现有的最优模型足足缩小了Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_03倍,速度快了Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_04倍。在 CIFAR-100上,它也取得了 Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_05 的准确率。代码位于:https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet

1. Introduction

对卷积网络进行缩放,目的是取得更高的准确率。ResNet 可以用更多的层,从 ResNet-18 放大到 ResNet-200。最近GPipe 将一个baseline模型放大了4倍,在 ImageNet 上取得了 Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_06

Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_07

作者想要研究并重新思考卷积网络的缩放。特别地,作者研究了一个核心问题:缩放网络时,是否存在一个原则方法来指导我们,以取得更高的准确率和效率?作者通过试验证明,平衡网络的深度、宽度、分辨率非常重要,而且我们只需一个常数比例来缩放它们,就可以实现这种平衡。基于此发现,作者提出了一个简单但有效的复合缩放方法。与传统的方式不同,它们任意地缩放这些 factors,而本文方法是统一地缩放网络的深度、宽度和分辨率,通过一组固定的缩放系数。比如,我们想要使用Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_08倍的计算资源,那么我们可以简单地增加网络深度 Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_09倍,宽度Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_10倍,图像大小Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_11倍,其中Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_12是常数系数,在原来的小模型上通过网格搜索来找到。图2 展示了本文缩放方法和传统方法的差异。

Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_13

复合缩放方法是讲的通的,因为如果输入图像更大,网络就需要更多的层来增加感受野,需要更多的通道来获取更多的细粒度信息。实际上之前的理论研究与试验结果都证明了,网络的深度和宽度之间存在着某种关系,但是本文是第一个量化了三个维度之间的关系的。

作者证明该缩放方法对于 MobileNets 和 ResNets 都是非常管用的。值得注意的是,模型缩放的效果高度依赖于 baseline 网络。所以作者使用神经结构搜索方法,设计了一个全新的 baseline 模型,然后对其进行缩放,得到一组模型,叫做 EfficientNets。图1 总结了其在 ImageNet 上的表现,EfficientNets 领先其他模型许多。EfficientNet-B7 超过了目前最优的模型 GPipe 的准确率,但是参数量减少了 8.4倍,速度快了6.1倍。与广泛使用的 ResNet 相比,EfficientNet-B4 将 ResNet-50 的top-1准确率从Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_14提升到了Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_15,而其FLOPS是差不多的。除了 ImageNet,EfficientNet 在其它数据集上也取得了不错的效果。

2. Related Work

卷积网络准确率:自从 AlexNet 赢了2012年 ImageNet 的比赛,卷积网络越来越大,准确率也越来越高:2014 年 ImageNet 的冠军是 GoogleNet,它有680万个参数,取得了Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_16的准确率,2017年的冠军是 SENet,它有1.45亿个参数,取得了Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_17的准确率。最近GPipe进一步将 ImageNet top-1 的准确率推高到了Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_06,使用了5.57亿个参数:它特别大,以至于必须用一个特殊设计的并行计算库才可以训练,要将网络分割开,每一部分用不同的加速器来训练。虽然这些方法都是针对 ImageNet 设计的,但是最近的研究表明它们对其他的数据集和任务也适用,比如目标检测。尽管对很多应用来说,准确率非常关键,但是通常硬件的内存有限制,因此要想得到更高的准确率,我们也要有更高的计算效率。

卷积网络计算效率:深度卷积网络通常都过度地参数化。模型压缩是常用的降低模型大小的方法,但是要牺牲一些准确率来换取效率。随着智能手机逐渐普及,我们需要设计一些适合移动端计算效率的卷积网络,如 SqueezeNets,MobileNets 和 ShuffleNets。最近,神经结构搜索方法逐渐流行起来,它通过对网络的深度、宽度和卷积核类型与大小大量地调参,实现的准确率要高于人工设计的移动端网络。但是,如何将这些技巧应用在更大的模型中仍然有待探索,它的搜索空间更广阔,调参的计算成本更高。本文中主要研究了超大模型的计算效率,超越目前最高的准确率。为了实现此目标,作者使用了模型缩放方法。

模型缩放:对于不同的资源约束,我们有许多的方法来缩放网络:ResNet 可以通过调节网络深度来缩小或放大,而WideResNet 和 MobileNet 可以通过网络的宽度来缩放。此外,更大的输入图像也有助于实现更高的准确率,但会造成FLOPS增加。尽管以前的研究表明,网络的深度和宽度对卷积网络的特征提取能力很重要,但是如何有效地缩放卷积网络,实现更高的准确率和效率仍有待探索。本文系统地研究了卷积网络在深度、宽度和分辨率三个维度的缩放。

3. Compound Model Scaling

本部分,作者阐述了缩放问题,探讨了四个不同的方法,并提出了一个全新的缩放方法。

3.1 Problem Formulation

一个卷积层Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_19可以定义为一个函数:Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_20,其中Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_21是算子,Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_22是输出张量,Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_23是输入张量,形状是Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_24,其中Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_25是空间维度,Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_26是通道维度。卷积网络Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_27可以表示为一组层:Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_28。在实际应用中,卷积网络的层通常被分为多个阶段,各个阶段的网络结构类似。例如,ResNet 有5个阶段,每个阶段的层有着一样的卷积类型,除了第一层执行下采样。因此,我们将一个卷积网络定义为:

Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_29

其中,Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_30表示在第Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_19个阶段中,层Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_21重复了Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_33次,Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_34表示第Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_19层输入张量Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_36的形状。图2(a)展示了一个代表性的卷积网络,它的空间维度逐渐收缩,但是通道维度逐渐扩大,比如输入形状最开始是Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_37,最后输出的形状是Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_38

一般的卷积网络设计聚焦在找到最佳的层结构Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_21,而模型缩放则是扩大网络的长度Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_33,宽度Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_26和分辨率大小Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_42,而不会改变baseline网络中预定义的Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_21。通过将Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_21固定住,模型缩放就简化了网络设计问题,但是探索不同的Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_45仍然有很大的空间。为了进一步缩小设计空间,作者规定所有的层必须用一个常量比例统一缩放。其目的就是在给定资源限制的情况下,最大化模型的准确率,它可以表述为一个优化问题:

Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_46
Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_47

Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_48
Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_49

其中,Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_50是缩放网络宽度、深度和分辨率的系数。Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_51是baseline网络中与定义的参数。

3.2 缩放维度

Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_52


第二个问题就是Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_53互相依赖,它们的值在不同的资源限制下不一样。因此,传统方法最多用一个维度来缩放卷积网络:

深度(d):增加网络的深度是最常用的方法。网络越深,它越能获得更丰富更复杂的特征,在新任务上泛化能力越强。但是更深的网络训练起来也更困难,会有梯度消失的情况出现。尽管有一些技巧可以用来缓解这个问题,如短路连接、批归一化等,但是模型的准确率提升就减少了:例如,ResNet-1000 虽然层数更多,但是它的准确率却和ResNet-101差不多。图3(中间)是一个试验,它用不同的深度系数Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_54来放大baseline模型,但是可以看到准确率提升逐渐降低。

宽度(w):对于小模型来说,增加网络的宽度也是一个常用的技巧。较宽的网络更容易获得细粒度特征,也更容易训练。但是,特别宽而又特别浅的模型在获取高层级特征方面是有困难的。图3(左)显示,随着网络越来越宽,Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_55越来越大,准确率很快就饱和了。

分辨率(r):输入图像分辨率越高,卷积网络就能得到更多的细粒度特征。早期卷积网络都是用Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_56大小作为输入,但后来都转用Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_57Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_58作为输入,为了实现更高的准确率。最近 GPipe 在ImageNet上取得了SOTA的准确率,它的输入分辨率是Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_59。更高的分辨率,如Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_60在目标检测中被广泛采用。图3(右)是增加网络分辨率的效果,更高的分辨率可以提升准确率,但是分辨率要是已经非常高了,准确率提升也会降低(Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_61表示Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_56分辨率,Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_63表示Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_64分辨率)。

经过上述分析,作者发现:

Observation 1:缩放任一个维度可以提升准确率,但是随着模型增大,准确率提升逐渐降低。

3.3 Compound Scaling

作者通过实验发现,各个缩放维度之间并不互相独立。对于高分辨率的图像,我们应该增加网络的深度,这样更大的感受野所获取的特征就能涵盖图像中更多的像素点。因此如果分辨率较高时,我们应当增加网络的深度,目的是获得更多的细粒度特征。这就表明,我们需要协调、平衡各个缩放维度,而不是单一地缩放某一个维度。

Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_65

为了验证该想法,作者在不同的网络深度和分辨率情况下,对比了宽度增加的效果,如图4所示。如果我们不改变深度(Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_66)和分辨率(Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_61),只增加网络的宽度Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_55,准确率很快就会饱和。而当深度变为Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_69,分辨率变为Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_70时,在同样的FLOPS成本下,增加宽度就可以取得更高的准确率。这些结果促成以下发现:

Observation 2:为了实现更高的准确率和计算效率,平衡所有的维度(宽度、深度、分辨率)是非常关键的。实际上, 之前已经有一些工作在尝试任意地平衡网络的宽度和深度了,但是他们的调参过程非常繁琐。

本文中,作者提出了一个复合缩放方法,使用一个复合系数Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_71统一地放大网络的深度、宽度和分辨率:

Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_72
Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_73
Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_74
Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_75
Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_76

其中,Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_12是常量,可以通过网格搜索来找。Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_71是一个用户定义的系数,控制着多少额外的资源可以用于模型缩放,而Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_12则代表着如何分配这些额外的资源给网络宽度、深度和分辨率。注意,一个常规网络的FLOPS与Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_80是呈比例的,也就是说深度增加一倍,FLOPS也会增加一倍,而宽度增加一倍,FLOPS会增加四倍。在卷积网络中,计算量最多的就是卷积操作,用上面的等式来缩放一个卷积网络,FLOPS就会增加约Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_81。本文中,作者约束Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_82,这样对于任一个新的Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_71,总的FLOPS只增加约Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_84倍。

4. EfficientNet 结构

因为模型缩放并不会改变baseline模型层的算子Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_85,baseline模型的好坏就尤为重要。作者使用现有的卷积网络来评价其缩放模型,但是为了更好地证明该缩放模型的有效性,作者设计了一个新的 baseline,叫做 EfficientNet。

作者使用一个多目标神经结构搜索方法来设计该baseline模型,同时优化准确率和FLOPS。作者使用了(和Tan 等人2019年论文中)一样的搜索空间,将Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_86作为优化目标,其中Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_87Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_88表示模型m的准确率和FLOPS,Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_89是目标FLOPS,Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_90是一个用于平衡准确率和FLOPS的超参数。作者在这里只优化FLOPS,而没有优化 latency,因为本文不是针对某一个硬件设备。作者搜索到了一个非常高效的网络,将其称作EfficientNet-B0,与MnasNet类似,除了EfficientNet-B0要稍微大一些,因为它的FLOPS目标更大一些(本文FLOPS目标为4亿次)。表1显示了EfficientNet-B0的结构,它主要的构建模块是 mobile inverted bottleneck MBConv,作者也加入了 Squeeze-and-excitation 优化。

Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_91

从baseline模型 EfficientNet-B0开始,作者通过如下两步来进行复合缩放操作:

  • 步骤1: 固定住Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_92,假设我们有多一倍的计算资源,基于等式2和3,对Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_93进行网格搜索。作者找到了EfficientNet-B0 的最优值,Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_94,约束条件是Resnet 准确率怎么提升 resnet和mobilenet准确率_Resnet 准确率怎么提升_95
  • 步骤2: 然后固定住Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_96作为常量,用等式3中不同的Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_97来增大baseline模型,这样得到了EfficientNet-B1 到 B7 这些模型(细节参见表2)。

注意,在一个大模型上直接搜索Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_98可能会得到更好的性能,但是搜索成本也非常高。本文方法在小型baseline模型上只搜索一次(步骤1),然后对其它模型使用同样的缩放系数(步骤2)。

4. Experiments

Resnet 准确率怎么提升 resnet和mobilenet准确率_缩放_99

Resnet 准确率怎么提升 resnet和mobilenet准确率_ci_100

Resnet 准确率怎么提升 resnet和mobilenet准确率_卷积网络_101