初識
本篇將為你介紹來自 google 的 EfficientNet骤公,論文提出了一種多維度混合的模型放縮方法量蕊。論文鏈接(文末有代碼):
https://arxiv.org/pdf/1905.11946.pdf?arxiv.org
作者希望找到一個可以同時兼顧速度與精度的模型放縮方法坞琴,為此,作者重新審視了前人提出的模型放縮的幾個維度:網(wǎng)絡(luò)深度、網(wǎng)絡(luò)寬度馅袁、圖像分辨率缎除,前人的文章多是放大其中的一個維度以達到更高的準確率严就,比如 ResNet-18 到 ResNet-152 是通過增加網(wǎng)絡(luò)深度的方法來提高準確率。
作者跳出了前人對放縮模型的理解器罐,從一個高度去審視這些放縮維度梢为。作者認為這三個維度之間是互相影響的并探索出了三者之間最好的組合,在此基礎(chǔ)上提出了最新的網(wǎng)絡(luò) EfficientNet轰坊,該網(wǎng)絡(luò)的表現(xiàn)如下:
圖中紅色的那條就是 EfficientNet 的曲線铸董,橫軸為模型大小,縱軸為準確率肴沫。光看這張圖你就知道 EfficientNet 有多強悍了粟害,看看那些我們熟悉的名字, Resnet颤芬,Xception悲幅,ResNeXt套鹅,可以說是被碾壓了。在準確率上汰具,EfficientNet 只比之前的 SOTA 模型 GPipe 提高了 0.1%卓鹿,為了達到這個準確率 GPipe 用了 556M 參數(shù)而 EfficientNet 只用了 66M,恐怖如斯郁副!在實際使用中這 0.1% 的準確率我們可能壓根感受不到减牺,但是速度的提升確是實打?qū)嵉模? 倍的速度提升大大提高了網(wǎng)絡(luò)的實用性以及工業(yè)落地可能。
問題抽象
下面要將這個問題用公式的方式表示出來存谎,符號會比較多拔疚,不過并不難理解。我們將整個卷積網(wǎng)絡(luò)稱為 N既荚,它的第 i 個卷積層可以看作是下面的函數(shù)映射:
為輸出張量稚失,為輸入張量,設(shè)其維度為 (這里為了方便敘述省略了 Batch 維度)恰聘,那么整個卷積網(wǎng)絡(luò) N句各,由 k 個卷積層組成,可以表示為:
實際中晴叨,通常將多個結(jié)構(gòu)相同的卷積層稱為一個 stage凿宾,例如 ResNet 可以分為 5 個 stage,每個 stage 中的卷積層結(jié)構(gòu)相同(除了第一層為降采樣層)兼蕊。以 stage 為單位可以將卷積網(wǎng)絡(luò) N 表示為:
其中初厚,下標 i(從 1 到 s) 表示 stage 的序號,表示第 i 個 stage 孙技,它由卷積層 重復 次構(gòu)成产禾, 表示該 stage 輸入 tensor 的維度。
為了減小搜索空間牵啦,作者固定了網(wǎng)絡(luò)的基本結(jié)構(gòu)亚情,而只變動上面提到的三個放縮維度,網(wǎng)絡(luò)深度(Li)哈雏,網(wǎng)絡(luò)寬度(Ci)楞件,輸入分辨率大小(Hi, Wi)。然而就算只搜索這三個維度裳瘪,搜索空間也很大履因,因此作者又加了一個限制,網(wǎng)絡(luò)的放大只能在初識網(wǎng)絡(luò)(就是后面的 EfficientNet-B0)的基礎(chǔ)上乘上常數(shù)倍率盹愚,那么我們只需要優(yōu)化那些倍率就好了,以此抽象出最終的數(shù)學模型:
其中站故,w皆怕、d毅舆、r 分別是網(wǎng)絡(luò)寬度,網(wǎng)絡(luò)高度愈腾,分辨率的倍率憋活。
實驗
上面這個問題的難點在于,三個倍率之間有內(nèi)在聯(lián)系虱黄,比如更高分辨率的圖片就需要更深的網(wǎng)絡(luò)來增大感受野捕捉特征悦即。因此作者做了兩個實驗(實際應該多得多)來驗證,第一個實驗橱乱,對三個維度固定兩個辜梳,只放大其中一個,得到結(jié)果如下:
圖中從左至右分別是只放大網(wǎng)絡(luò)寬度(width, w 為放大倍率)泳叠、網(wǎng)絡(luò)深度(depth, d 為放大倍率)作瞄、圖像分辨率(resolution, r 為放大倍率) 的結(jié)果,可以觀察到單個維度的放大最高精度只在 80 左右危纫。本次實驗作者得出一個觀點:三個維度中任一維度的放大都可以帶來精度的提升宗挥,但隨著倍率越來越大,提升卻越來越小种蝶。
于是作者做了第二個實驗契耿,嘗試在不同的 d, r 組合下變動 w,得到下圖:
從實驗結(jié)果可以看出最高精度比之前已經(jīng)有所提升螃征,且不同的組合效果還不一樣搪桂,最高可以到 82 左右。作者又得到一個觀點会傲,得到更高的精度以及效率的關(guān)鍵是平衡網(wǎng)絡(luò)寬度锅棕,網(wǎng)絡(luò)深度,圖像分辨率三個維度的放縮倍率(d, r, w)淌山。
由此裸燎,作者提出了一種混合維度放大法(compound scaling method),該方法使用一個混合系數(shù) [圖片上傳失敗...(image-70ab47-1570798285064)]
來決定三個維度的放大倍率:
其中泼疑, 均為常數(shù)(不是無限大的因為三者對應了計算量)德绿,可通過網(wǎng)格搜索獲得⊥松混合系數(shù) 可以人工調(diào)節(jié)移稳。考慮到如果網(wǎng)絡(luò)深度翻番那么對應計算量會翻番会油,而網(wǎng)絡(luò)寬度或者圖像分辨率翻番對應計算量會翻 4 番个粱,即卷積操作的計算量(FLOPS) 與 成正比,因此上圖中的約束條件中有兩個平方項翻翩。在該約束條件下都许,指定混合系數(shù) 之后稻薇,網(wǎng)絡(luò)的計算量大概會是之前的 倍。
網(wǎng)絡(luò)結(jié)構(gòu)
網(wǎng)絡(luò)結(jié)構(gòu)作者主要借鑒了 MnasNet胶征,采取了同時優(yōu)化精度(ACC)以及計算量(FLOPS)的方法塞椎,由此產(chǎn)生了初代 EfficientNet-B0,其結(jié)構(gòu)如下圖:
有了初代的網(wǎng)絡(luò)結(jié)構(gòu)之后睛低,放大就分為下面兩步:
- 第一步案狠,首先固定 為 1,即設(shè)定計算量為原來的 2 倍钱雷,在這樣一個小模型上做網(wǎng)格搜索(grid search)骂铁,得到了最佳系數(shù)為 。
- 第二步急波,固定 从铲,使用不同的混合系數(shù) 來放大初代網(wǎng)絡(luò)得到 EfficientNet-B1 ~ EfficientNet-B7。
作者選擇只在小模型上進行網(wǎng)絡(luò)搜索澄暮,大大減少了計算量名段。因為在大模型上進行網(wǎng)格搜索的成本實在是太高了。
網(wǎng)絡(luò)表現(xiàn)
跟其他網(wǎng)絡(luò)的對比:
作者還用該方法放大了常用網(wǎng)絡(luò) MobileNets和 ResNets泣懊,在計算量相當?shù)那闆r下都得到了比之前更高的精度伸辟。這一部分概括起來就是我比你快,還比你準馍刮。
總結(jié)
論文提出的新網(wǎng)絡(luò)兼顧了速度和精度信夫,非常實用,可以作為通用的 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
最后,求贊求關(guān)注匈辱,歡迎關(guān)注我的微信公眾號[MachineLearning學習之路] 振湾,深度學習 & CV 方向的童鞋不要錯過!亡脸!