EfficientNet 論文學習

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準確率。但是,人們一直沒有很好地理解網絡縮放的過程。最常用的網絡縮放的方式就是通過深度或寬度。另一個不常見但越來越受歡迎的方式就是通過圖像的分辨率。在以前的工作中,一般都是縮放其中的某一個維度 — 深度、寬度、圖像大小。儘管也可以任意地縮放兩個或三個維度,但是任意縮放需要繁瑣的人工調參,通常準確率和效率不會最優。

在這裏插入圖片描述

作者想要研究並重新思考卷積網絡的縮放。特別地,作者研究了一個核心問題:縮放網絡時,是否存在一個原則方法來指導我們,以取得更高的準確率和效率?作者通過試驗證明,平衡網絡的深度、寬度、分辨率非常重要,而且我們只需一個常數比例來縮放它們,就可以實現這種平衡。基於此發現,作者提出了一個簡單但有效的複合縮放方法。與傳統的方式不同,它們任意地縮放這些 factors,而本文方法是統一地縮放網絡的深度、寬度和分辨率,通過一組固定的縮放係數。比如,我們想要使用2N2^N倍的計算資源,那麼我們可以簡單地增加網絡深度 αN\alpha^N倍,寬度βN\beta^N倍,圖像大小γN\gamma^N倍,其中α,β,γ\alpha,\beta,\gamma是常數係數,在原來的小模型上通過網格搜索來找到。圖2 展示了本文縮放方法和傳統方法的差異。

在這裏插入圖片描述

複合縮放方法是講的通的,因爲如果輸入圖像更大,網絡就需要更多的層來增加感受野,需要更多的通道來獲取更多的細粒度信息。實際上之前的理論研究與試驗結果都證明了,網絡的深度和寬度之間存在着某種關係,但是本文是第一個量化了三個維度之間的關係的。

作者證明該縮放方法對於 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 縮放維度

在這裏插入圖片描述
第二個問題就是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

作者通過實驗發現,各個縮放維度之間並不互相獨立。對於高分辨率的圖像,我們應該增加網絡的深度,這樣更大的感受野所獲取的特徵就能涵蓋圖像中更多的像素點。因此如果分辨率較高時,我們應當增加網絡的深度,目的是獲得更多的細粒度特徵。這就表明,我們需要協調、平衡各個縮放維度,而不是單一地縮放某一個維度。在這裏插入圖片描述

爲了驗證該想法,作者在不同的網絡深度和分辨率情況下,對比了寬度增加的效果,如圖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 優化。

在這裏插入圖片描述

從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

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章