速度與精度的結合 - EfficientNet 詳解

AIBigbull2050發表於2019-10-12


  2019-10-11 22:47:53

初識

本篇將為你介紹來自 google 的 EfficientNet,論文提出了一種 多維度混合的模型放縮方法。論文連結(文末有程式碼):

https://arxiv.org/pdf/1905.11946.pdf

作者希望找到一個可以同時兼顧 速度與精度的模型放縮方法,為此,作者重新審視了前人提出的模型放縮的幾個維度: 網路深度、網路寬度、影像解析度,前人的文章多是放大其中的一個維度以達到更高的準確率,比如 ResNet-18 到 ResNet-152 是通過增加網路深度的方法來提高準確率。

作者跳出了前人對放縮模型的理解,從一個高度去審視這些放縮維度。作者認為這三個維度之間是互相影響的並探索出了三者之間最好的組合,在此基礎上提出了最新的網路 EfficientNet,該網路的表現如下:

速度與精度的結合 - EfficientNet 詳解

圖中紅色的那條就是 EfficientNet 的曲線,橫軸為模型大小,縱軸為準確率。光看這張圖你就知道 EfficientNet 有多強悍了,看看那些我們熟悉的名字, Resnet,Xception,ResNeXt,可以說是被碾壓了。在準確率上,EfficientNet 只比之前的 SOTA 模型 GPipe 提高了 0.1%,為了達到這個準確率 GPipe 用了 556M 引數而 EfficientNet 只用了 66M,恐怖如斯!在實際使用中這 0.1% 的準確率我們可能壓根感受不到,但是速度的提升確是實打實的,8 倍的速度提升大大提高了網路的實用性以及工業落地可能。

問題抽象

下面要將這個問題用公式的方式表示出來,符號會比較多,不過並不難理解。我們將整個卷積網路稱為 N,它的第 i 個卷積層可以看作是下面的函式對映:

速度與精度的結合 - EfficientNet 詳解

Yi 為輸出張量,Xi 為輸入張量,設其維度為 <Hi, Wi, Ci> (這裡為了方便敘述省略了 Batch 維度),那麼整個卷積網路 N,由 k 個卷積層組成,可以表示為:

速度與精度的結合 - EfficientNet 詳解

實際中,通常將多個結構相同的卷積層稱為一個 stage,例如 ResNet 可以分為 5 個 stage,每個 stage 中的卷積層結構相同(除了第一層為降取樣層)。以 stage 為單位可以將卷積網路 N 表示為:

速度與精度的結合 - EfficientNet 詳解

其中,下標 i(從 1 到 s) 表示 stage 的序號,Fi 上標 Li 表示第 i 個 stage ,它由卷積層 Fi 重複 Li 次構成,<Hi, Wi, Ci> 表示該 stage 輸入 tensor 的維度。

為了減小搜尋空間,作者固定了網路的基本結構,而只變動上面提到的三個放縮維度,網路深度(Li),網路寬度(Ci),輸入解析度大小(Hi, Wi)。然而就算只搜尋這三個維度,搜尋空間也很大,因此作者又加了一個限制,網路的放大隻能在初識網路(就是後面的 EfficientNet-B0)的基礎上乘上常數倍率,那麼我們只需要優化那些倍率就好了,以此抽象出最終的數學模型:

速度與精度的結合 - EfficientNet 詳解

其中,w、d、r 分別是網路寬度,網路高度,解析度的倍率。

實驗

上面這個問題的難點在於,三個倍率之間有內在聯絡,比如更高解析度的圖片就需要更深的網路來增大感受野捕捉特徵。因此作者做了兩個實驗(實際應該多得多)來驗證,第一個實驗,對三個維度固定兩個,只放大其中一個,得到結果如下:

速度與精度的結合 - EfficientNet 詳解

圖中從左至右分別是隻放大網路寬度(width, w 為放大倍率)、網路深度(depth, d 為放大倍率)、影像解析度(resolution, r 為放大倍率) 的結果,可以觀察到單個維度的放大最高精度只在 80 左右。本次實驗作者得出一個觀點:三 個維度中任一維度的放大都可以帶來精度的提升,但隨著倍率越來越大,提升卻越來越小

於是作者做了第二個實驗,嘗試在不同的 d, r 組合下變動 w,得到下圖:

速度與精度的結合 - EfficientNet 詳解

從實驗結果可以看出最高精度比之前已經有所提升,且不同的組合效果還不一樣,最高可以到 82 左右。作者又得到一個觀點, 得到更高的精度以及效率的關鍵是平衡網路寬度,網路深度,影像解析度三個維度的放縮倍率(d, r, w)。

由此,作者提出了一種混合維度放大 法(compound scaling method),該方法使用一個混合係數 phi (頭條上面字元打不出來,就是下面圖片中的那個) 來決定三個維度的放大倍率:

速度與精度的結合 - EfficientNet 詳解

其中, alpha, beta, gamma 均為常數(不是無限大的因為三者對應了計算量),可通過網格搜尋獲得。混合係數 phi 可以人工調節。考慮到如果網路深度翻番那麼對應計算量會翻番,而網路寬度或者影像解析度翻番對應計算量會翻 4 番,即卷積操作的計算量(FLOPS) 與

速度與精度的結合 - EfficientNet 詳解

成正比,因此上圖中的約束條件中有兩個平方項。在該約束條件下,指定混合係數 phi 之後,網路的計算量大概會是之前的 2^phi 倍。

網路結構

網路結構作者主要借鑑了 MnasNet,採取了同時優化精度(ACC)以及計算量(FLOPS)的方法,由此產生了初代 EfficientNet-B0,其結構如下圖:

速度與精度的結合 - EfficientNet 詳解

有了初代的網路結構之後,放大就分為下面兩步:

  • 第一步,首先固定 phi 為 1,即設定計算量為原來的 2 倍,在這樣一個小模型上做網格搜尋(grid search),得到了最佳係數為
速度與精度的結合 - EfficientNet 詳解

  • 第二步,固定上面的三個倍率,使用不同的混合係數 phi 來放大初代網路得到 EfficientNet-B1 ~ EfficientNet-B7。

作者選擇只在小模型上進行網路搜尋,大大減少了計算量。因為在大模型上進行網格搜尋的成本實在是太高了。

網路表現

跟其他網路的對比:

速度與精度的結合 - EfficientNet 詳解

作者還用該方法放大了常用網路 MobileNets和 ResNets,在計算量相當的情況下都得到了比之前更高的精度。這一部分概括起來就是我比你快,還比你準。

總結

論文提出的新網路兼顧了速度和精度,非常實用,可以作為通用的 baseline,能換的就換上吧。

程式碼

pytorch:https://github.com/lukemelas/EfficientNet-PyTorch

tensorflow: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet

keras: https://github.com/qubvel/efficientnet



https://www.toutiao.com/a6746557278591123972/



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946223/viewspace-2659785/,如需轉載,請註明出處,否則將追究法律責任。

相關文章