速度與精度的結合 - EfficientNet 詳解
來自 google 的 EfficientNet,論文提出了一種多維度混合的模型放縮方法。論文鏈接(文末有代碼):
https://arxiv.org/pdf/1905.11946.pdfarxiv.org
作者希望找到一個可以同時兼顧速度與精度的模型放縮方法,為此,作者重新審視了前人提出的模型放縮的幾個維度:網絡深度、網絡寬度、圖像分辨率,前人的文章多是放大其中的一個維度以達到更高的准確率,比如 ResNet-18 到 ResNet-152 是通過增加網絡深度的方法來提高准確率。
作者跳出了前人對放縮模型的理解,從一個高度去審視這些放縮維度。作者認為這三個維度之間是互相影響的並探索出了三者之間最好的組合,在此基礎上提出了最新的網絡 EfficientNet,該網絡的表現如下:

圖中紅色的那條就是 EfficientNet 的曲線,橫軸為模型大小,縱軸為准確率。光看這張圖你就知道 EfficientNet 有多強悍了,看看那些我們熟悉的名字, Resnet,Xception,ResNeXt,可以說是被碾壓了。在准確率上,EfficientNet 只比之前的 SOTA 模型 GPipe 提高了 0.1%,為了達到這個准確率 GPipe 用了 556M 參數而 EfficientNet 只用了 66M,恐怖如斯!在實際使用中這 0.1% 的准確率我們可能壓根感受不到,但是速度的提升確是實打實的,8 倍的速度提升大大提高了網絡的實用性以及工業落地可能。
問題抽象
下面要將這個問題用公式的方式表示出來,符號會比較多,不過並不難理解。我們將整個卷積網絡稱為 N,它的第 i 個卷積層可以看作是下面的函數映射:
為輸出張量,
為輸入張量,設其維度為
(這里為了方便敘述省略了 Batch 維度),那么整個卷積網絡 N,由 k 個卷積層組成,可以表示為:
實際中,通常將多個結構相同的卷積層稱為一個 stage,例如 ResNet 可以分為 5 個 stage,每個 stage 中的卷積層結構相同(除了第一層為降采樣層)。以 stage 為單位可以將卷積網絡 N 表示為:

其中,下標 i(從 1 到 s) 表示 stage 的序號,表示第 i 個 stage ,它由卷積層
重復
次構成,
表示該 stage 輸入 tensor 的維度。
為了減小搜索空間,作者固定了網絡的基本結構,而只變動上面提到的三個放縮維度,網絡深度(Li),網絡寬度(Ci),輸入分辨率大小(Hi, Wi)。然而就算只搜索這三個維度,搜索空間也很大,因此作者又加了一個限制,網絡的放大只能在初識網絡(就是后面的 EfficientNet-B0)的基礎上乘上常數倍率,那么我們只需要優化那些倍率就好了,以此抽象出最終的數學模型:

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

圖中從左至右分別是只放大網絡寬度(width, w 為放大倍率)、網絡深度(depth, d 為放大倍率)、圖像分辨率(resolution, r 為放大倍率) 的結果,可以觀察到單個維度的放大最高精度只在 80 左右。本次實驗作者得出一個觀點:三個維度中任一維度的放大都可以帶來精度的提升,但隨着倍率越來越大,提升卻越來越小。
於是作者做了第二個實驗,嘗試在不同的 d, r 組合下變動 w,得到下圖:

從實驗結果可以看出最高精度比之前已經有所提升,且不同的組合效果還不一樣,最高可以到 82 左右。作者又得到一個觀點,得到更高的精度以及效率的關鍵是平衡網絡寬度,網絡深度,圖像分辨率三個維度的放縮倍率(d, r, w)。
由此,作者提出了一種混合維度放大法(compound scaling method),該方法使用一個混合系數 [圖片上傳失敗...(image-70ab47-1570798285064)]
來決定三個維度的放大倍率:

其中, 均為常數(不是無限大的因為三者對應了計算量),可通過網格搜索獲得。混合系數
可以人工調節。考慮到如果網絡深度翻番那么對應計算量會翻番,而網絡寬度或者圖像分辨率翻番對應計算量會翻 4 番,即卷積操作的計算量(FLOPS) 與
成正比,因此上圖中的約束條件中有兩個平方項。在該約束條件下,指定混合系數
之后,網絡的計算量大概會是之前的
倍。
網絡結構
網絡結構作者主要借鑒了 MnasNet,采取了同時優化精度(ACC)以及計算量(FLOPS)的方法,由此產生了初代 EfficientNet-B0,其結構如下圖:

有了初代的網絡結構之后,放大就分為下面兩步:
- 第一步,首先固定
為 1,即設定計算量為原來的 2 倍,在這樣一個小模型上做網格搜索(grid search),得到了最佳系數為
。
- 第二步,固定
,使用不同的混合系數
來放大初代網絡得到 EfficientNet-B1 ~ EfficientNet-B7。
作者選擇只在小模型上進行網絡搜索,大大減少了計算量。因為在大模型上進行網格搜索的成本實在是太高了。
網絡表現
跟其他網絡的對比:

作者還用該方法放大了常用網絡 MobileNets和 ResNets,在計算量相當的情況下都得到了比之前更高的精度。這一部分概括起來就是我比你快,還比你准。
總結
論文提出的新網絡兼顧了速度和精度,非常實用,可以作為通用的 baseline,能換的就換上吧。
代碼
pytorch:https://github.com/lukemelas/EfficientNet-PyTorch
tensorflow:https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet