Searching for MobileNet V3
琦玉老師 和 龍捲(阿姨)小姐姐 告訴我一個道理——畫風越簡單,實力越強悍;
這篇論文只有四個詞,我只能說:不!簡!單!
(一)論文地址:
(二)核心思想:
- 使用了兩個黑科技:NAS 和 NetAdapt 互補搜索技術,其中 NAS 負責搜索網絡的模塊化結構,NetAdapt 負責微調每一層的 channel 數,從而在延遲和準確性中達到一個平衡;
- 提出了一個對於移動設備更適用的非線性函數 ;
- 提出了 和 兩個新的高效率網絡;
- 提出了一個新的高效分割(指像素級操作,如語義分割)的解碼器();
(三)Platform-Aware NAS for Block-wise Search:
3.1 MobileNetV3-Large:
對於有較大計算能力的平臺,作者提出了 MobileNetV3-Large,並使用了跟 MnanNet-A1 相似的基於 RNN 控制器和分解分層搜索空間的 NAS 搜索方法;
3.1 MobileNetV3-Small:
對於有計算能力受限制的平臺,作者提出了 MobileNetV3-Small;
這裏作者發現,原先的優化方法並不適用於小的網絡,因此作者提出了改進方法;
用於近似帕累托最優解的多目標獎勵函數定義如下:
其中 是第 個模型的索引, 是模型的準確率, 是模型的延遲, 是目標延遲;
作者在這裏將權重因數 改成了 ,最後得到了一個期望的種子模型(initial seed model);
(四)NetAdapt for Layer-wise Search:
第二個黑科技就是 NetAdapt 搜索方法,用於微調上一步生成的種子模型;
NetAdapt 的基本方法是循環迭代以下步驟:
- 生成一系列建議模型(proposals),每個建議模型代表了一種結構改進,滿足延遲至少比上一步的模型減小了 ,其中 , 是種子模型的延遲;
- 對於每一個建議模型,使用上一步的預訓練模型,刪除並隨機初始化改進後丟失的權重,繼續訓練 步來粗略估計建議模型的準確率,其中 ;
- 根據某種度量,選取最合適的建議模型,直到達到了目標延遲 ;
作者將度量方法改進爲最小化(原文是最大化,感覺是筆誤):
其中建議模型的提取方法爲:
- 減小 Expansion Layer 的大小;
- 同時減小 BottleNeck 模塊中的前後殘差項的 channel 數;
(五)Efficient Mobile Building Blocks:
作者在 BottleNet 的結構中加入了SE結構,並且放在了depthwise filter之後;
由於SE結構會消耗一定的計算時間,所以作者在含有SE的結構中,將 Expansion Layer 的 channel 數變爲原來的1/4;
其中 SE 模塊首先對卷積得到的特徵圖進行 Squeeze 操作,得到特徵圖每個 channel 上的全局特徵,然後對全局特徵進行 Excitation 操作,學習各個 channel 間的關係,從而得到不同channel的權重,最後乘以原來的特徵圖得到最終的帶有權重的特徵;
(六)Redesigning Expensive Layers:
作者在研究時發現,網絡開頭和結尾處的模塊比較耗費計算能力,因此作者提出了改進這些模塊的優化方法,從而在保證準確度不變的情況下減小延遲;
6.1 Last Stage:
在這裏作者刪掉了 Average pooling 前的一個逆瓶頸模塊(包含三個層,用於提取高維特徵),並在 Average pooling 之後加上了一個 1×1 卷積提取高維特徵;
這樣使用 Average pooling 將大小爲 7×7 的特徵圖降維到 1×1 大小,再用 1×1 卷積提取特徵,就減小了 7×7=49 倍的計算量,並且整體上減小了 11% 的運算時間;
6.2 Initial Set of Filters:
之前的 MobileNet 模型開頭使用的都是 32 組 3×3 大小的卷積核並使用 ReLU 或者 swish 函數作爲激活函數;
作者在這裏提出,可以使用 h-switch 函數作爲激勵函數,從而刪掉多餘的卷積核,使得初始的卷積核組數從 32 下降到了 16;
(7)hard switch 函數:
之前有論文提出,可以使用 函數替代 ReLU 函數,並且能夠提升準確率;
其中 switch 函數定義爲:
,其中 ;
由於 sigmaoid 函數比較複雜,在嵌入式設備和移動設備計算消耗較大,作者提出了兩個解決辦法:
7.1 h-swish 函數:
將 swish 中的 sigmoid 函數替換爲一個線性函數,將其稱爲 h-swish:
-
7.2 going deeper:
作者發現 swish 函數的作用主要是在網絡的較深層實現的,因此只需要在網絡的第一層和後半段使用 h-swish 函數;
(八)網絡結構:
8.1 MobileNetV3-Large:
8.2 MobileNetV3-Small:
(九)訓練細節:
使用了 Tensorflow 的 RMSPropOptimizer 優化器,並附加 0.9 的動量項;
初始化學習率爲 0.1,batch 大小爲 4096(每個 GPU 128);
每 3 個 epoch 學習率衰減 0.01;
使用了 0.8 的 dropout 和 1e-5 的 weight decay;
(十)實驗結果: