Abstract

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

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

1. Introduction

对卷积网络进行缩放,目的是取得更高的准确率。ResNet 可以用更多的层,从 ResNet-18 放大到 ResNet-200。最近GPipe 将一个baseline模型放大了4倍,在 ImageNet 上取得了 84.3%84.3\% 的top-1准确率。但是,人们一直没有很好地理解网络缩放的过程。最常用的网络缩放的方式就是通过深度或宽度。另一个不常见但越来越受欢迎的方式就是通过图像的分辨率。在以前的工作中,一般都是缩放其中的某一个维度 — 深度、宽度、图像大小。尽管也可以任意地缩放两个或三个维度,但是任意缩放需要繁琐的人工调参,通常准确率和效率不会最优。

EfficientNet 论文学习

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

EfficientNet 论文学习

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

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

2. Related Work

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

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

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

3. Compound Model Scaling

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

3.1 Problem Formulation

一个卷积层ii可以定义为一个函数:Yi=Fi(Xi)Y_i=F_i(X_i),其中FiF_i是算子,YiY_i是输出张量,XiX_i是输入张量,形状是Hi,Wi,Ci\langle H_i, W_i, C_i \rangle,其中Hi,WiH_i,W_i是空间维度,CiC_i是通道维度。卷积网络NN可以表示为一组层:N=Fk...F1F1(X1)=j=1,...,kFj(X1)N=F_k \odot ...\odot F_1 \odot F_1(X_1) = \bigodot_{j=1,...,k}F_j(X_1)。在实际应用中,卷积网络的层通常被分为多个阶段,各个阶段的网络结构类似。例如,ResNet 有5个阶段,每个阶段的层有着一样的卷积类型,除了第一层执行下采样。因此,我们将一个卷积网络定义为:

N=i=1,...,sFiLi(XHi,Wi,Ci)N=\bigodot_{i=1,...,s} F_i^{L_i}(X_{\langle H_i,W_i,C_i \rangle})

其中,FiLiF_i^{L_i}表示在第ii个阶段中,层FiF_i重复了LiL_i次,Hi,Wi,Ci\langle H_i,W_i,C_i \rangle表示第ii层输入张量XX的形状。图2(a)展示了一个代表性的卷积网络,它的空间维度逐渐收缩,但是通道维度逐渐扩大,比如输入形状最开始是224,224,3\langle 224,224,3 \rangle,最后输出的形状是7,7,512\langle 7,7,512 \rangle

一般的卷积网络设计聚焦在找到最佳的层结构FiF_i,而模型缩放则是扩大网络的长度LiL_i,宽度CiC_i和分辨率大小(Hi,Wi)(H_i, W_i),而不会改变baseline网络中预定义的FiF_i。通过将FiF_i固定住,模型缩放就简化了网络设计问题,但是探索不同的Li,Ci,Hi,WiL_i,C_i,H_i,W_i仍然有很大的空间。为了进一步缩小设计空间,作者规定所有的层必须用一个常量比例统一缩放。其目的就是在给定资源限制的情况下,最大化模型的准确率,它可以表述为一个优化问题:

maxd,w,rAccuracy(N(d,w,r))\text{max}_{d,w,r} Accuracy(N(d,w,r))
s.t.N(d,w,r)=i=1...sF^idL^i(XrH^i,rW^i,wC^i)s.t. \quad\quad N(d,w,r)=\bigodot_{i=1...s} \hat F_i^{d\cdot \hat L_i} (X_{\langle r\cdot \hat H_i, r\cdot \hat W_i, w\cdot \hat C_i \rangle})

Memory(N)target_memory\text{Memory}(N) \leq \text{target}\_\text{memory}
FLOPS(N)target_flops\text{FLOPS}(N) \leq \text{target}\_\text{flops}

其中,w,d,rw,d,r是缩放网络宽度、深度和分辨率的系数。F^i,L^i,H^i,W^i,C^i\hat F_i, \hat L_i, \hat H_i, \hat W_i, \hat C_i是baseline网络中与定义的参数。

3.2 缩放维度

EfficientNet 论文学习
第二个问题就是d,w,rd,w,r互相依赖,它们的值在不同的资源限制下不一样。因此,传统方法最多用一个维度来缩放卷积网络:

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

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

分辨率(r):输入图像分辨率越高,卷积网络就能得到更多的细粒度特征。早期卷积网络都是用224×224224\times 224大小作为输入,但后来都转用299×299299\times 299331×331331\times 331作为输入,为了实现更高的准确率。最近 GPipe 在ImageNet上取得了SOTA的准确率,它的输入分辨率是480×480480\times 480。更高的分辨率,如600×600600\times 600在目标检测中被广泛采用。图3(右)是增加网络分辨率的效果,更高的分辨率可以提升准确率,但是分辨率要是已经非常高了,准确率提升也会降低(r=1.0r=1.0表示224×224224\times 224分辨率,r=2.5r=2.5表示560×560560\times 560分辨率)。

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

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

3.3 Compound Scaling

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

为了验证该想法,作者在不同的网络深度和分辨率情况下,对比了宽度增加的效果,如图4所示。如果我们不改变深度(d=1.0d=1.0)和分辨率(r=1.0r=1.0),只增加网络的宽度ww,准确率很快就会饱和。而当深度变为d=2.0d=2.0,分辨率变为r=2.0r=2.0时,在同样的FLOPS成本下,增加宽度就可以取得更高的准确率。这些结果促成以下发现:

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

本文中,作者提出了一个复合缩放方法,使用一个复合系数ϕ\phi统一地放大网络的深度、宽度和分辨率:

depth:d=αϕ\text{depth:} d=\alpha^{\phi}
width:w=βϕ\text{width:} w=\beta^{\phi}
resolution:r=γϕ\text{resolution:} r=\gamma^{\phi}
s.t.αβ2γ22s.t.\quad \alpha \cdot \beta^2 \cdot \gamma^2 \approx 2
α1,β1,β1\alpha \geq 1, \beta\geq 1, \beta \geq 1

其中,α,β,γ\alpha,\beta,\gamma是常量,可以通过网格搜索来找。ϕ\phi是一个用户定义的系数,控制着多少额外的资源可以用于模型缩放,而α,β,γ\alpha,\beta,\gamma则代表着如何分配这些额外的资源给网络宽度、深度和分辨率。注意,一个常规网络的FLOPS与d,w2,r2d,w^2,r^2是呈比例的,也就是说深度增加一倍,FLOPS也会增加一倍,而宽度增加一倍,FLOPS会增加四倍。在卷积网络中,计算量最多的就是卷积操作,用上面的等式来缩放一个卷积网络,FLOPS就会增加约(αβ2γ2)ϕ(\alpha \cdot \beta^2 \cdot \gamma^2)^{\phi}。本文中,作者约束αβ2γ22\alpha \cdot \beta^2 \cdot \gamma^2 \approx 2,这样对于任一个新的ϕ\phi,总的FLOPS只增加约2ϕ2^{\phi}倍。

4. EfficientNet 结构

因为模型缩放并不会改变baseline模型层的算子F^i\hat F_i,baseline模型的好坏就尤为重要。作者使用现有的卷积网络来评价其缩放模型,但是为了更好地证明该缩放模型的有效性,作者设计了一个新的 baseline,叫做 EfficientNet。

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

EfficientNet 论文学习

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

  • 步骤1: 固定住ϕ=1\phi=1,假设我们有多一倍的计算资源,基于等式2和3,对α,β,γ\alpha,\beta,\gamma进行网格搜索。作者找到了EfficientNet-B0 的最优值,α=1.2,β=1.1,γ=1.15\alpha=1.2,\beta=1.1, \gamma=1.15,约束条件是αβ2γ22\alpha\cdot \beta^2\cdot \gamma^2\approx 2
  • 步骤2: 然后固定住α,β,γ\alpha,\beta, \gamma作为常量,用等式3中不同的ϕ\phi来增大baseline模型,这样得到了EfficientNet-B1 到 B7 这些模型(细节参见表2)。

注意,在一个大模型上直接搜索α,β,γ\alpha,\beta, \gamma可能会得到更好的性能,但是搜索成本也非常高。本文方法在小型baseline模型上只搜索一次(步骤1),然后对其它模型使用同样的缩放系数(步骤2)。

4. Experiments

EfficientNet 论文学习

EfficientNet 论文学习

EfficientNet 论文学习

相关文章:

  • 2021-06-10
  • 2021-06-29
  • 2021-04-24
  • 2021-05-12
  • 2021-11-16
  • 2021-08-10
猜你喜欢
  • 2021-08-29
  • 2021-12-28
  • 2021-04-11
  • 2022-12-23
  • 2021-08-22
  • 2021-05-17
相关资源
相似解决方案