EfficientNet 詳解

初識

本篇將為你介紹來自 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 為輸入張量,設其維度為 (這裡為了方便敘述省略了 Batch 維度),那麼整個卷積網絡 N,由 k 個卷積層組成,可以表示為:

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

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

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

其中,下標 i(從 1 到 s) 表示 stage 的序號,Fi 上標 Li 表示第 i 個 stage ,它由卷積層 Fi 重複 Li 次構成, 表示該 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

最後,求贊求關注,歡迎關注我的個人微信公眾號 [MachineLearning學習之路],CV 方向的童鞋不要錯過鴨!


分享到:


相關文章: