Pytorch實現代碼:https://github.com/MenghaoGuo/AutoDeeplab
創新點
cell-level and network-level search
以往的NAS算法都側重於搜索cell的結構,即當搜索得到一種cell結構后只是簡單地將固定數量的cell按鏈式結構連接起來組成最終的網絡模型。AutoDeeplab則將如何cell的連接方式也納入了搜索空間中,進一步擴大了網絡結構的范圍。
dense image prediction
之前的大多數NAS算法都是基於image level的分類,例如DARTS,ENAS等都是在CIFAR10和ImageNet上做的實驗,AutoDeeplab則是成功地將NAS應用到了目標檢測和圖像分割任務上。
算法
Cell level search space
cell level的結構搜索方式參考的是DARTS,細節可參閱論文筆記系列-DARTS: Differentiable Architecture Search。
搜索空間主要由如下8個operation組成:
- 3 × 3 max pooling
- 3 × 3 average pooling
- 3 × 3 atrous conv with rate 2
- 5 × 5 atrous conv with rate 2
- 3 × 3 depthwise-separable conv
- 5 × 5 depthwise-separable conv
- skip connection
- no connection (zero)
一個cell的示意圖如下(為方便說明每個子節點之間只有三種operation,不同顏色的連線代表不同操作),0表示第一個子節點,它會接收前兩層的cell的輸出作為輸入;
下面我們先以1-2為例看節點之間的計算方式:
1子節點表示為\(H^l_1\),1到2子節點之間的操作可以表示為:
\(\overline{O}_{1 \rightarrow 2}(H^l_1)=\sum_{k=1}^3\alpha^k_{1 \rightarrow 2} O^k(H^l_1)\)
其中\(\alpha^k\)表示第k個operation的概率,上圖中一共有三種操作,所以最終的操作應該是三種操作的加權值,另外三個操作的和應該為1,所以通常需要使用softmax操作來實現。更一般化的表達方式如下:
有了操作的表達式后,那么每個子節點的表達方式也就是對多個輸入節點作加權求和,如下:
Network-level search space
上圖左邊畫的是network-level,橫向表示layer,縱向表示圖像分辨率(2表示原圖是特征圖的2倍,其他同理)。
-
灰色小圓圈表示固定的stem層,可以理解為固定的預處理層,即原圖會首先經過一些列操作后得到縮小4倍的特征圖,然后會在該特征圖上進行模型結構搜索。
-
藍色小圓圈表示候選節點,每個節點都可以是一個cell結構
-
灰色箭頭表示每個cell節點數據可能的流動方向,可以看到一個節點最多可能有三種流動方向,即分辨率增大一倍,保持不變和減小一倍。這樣做的目的是避免分辨率變化太大而導致信息量丟失過多。例如如果從4直接連接到32,這個畫面太美不敢看,所以人為設定了前面的限制(雖然沒有實驗證明這樣不可以,但是憑直覺這樣貌似不可以,如果錢和設備像和谷歌一樣多也還是可以試一試的)
右邊剛開始看的時候還以為就只是介紹了cell結構,但是結合代碼后發現有個地方稍微有些不同,這個其實在后面的論文中也有介紹,但是當時沒注意看,即每個節點的表達式如下:
其中
上面的公式乍看會很懵,我們慢慢看:
- 首先\(\beta\)表示某條路徑的概率,例如\(\beta^l_{s \rightarrow s}\)表示下圖中的紅色箭頭路徑的概率,其他同理。
- \(\text{Cell}(^{s} H^{l-1},^{s} H^{l-2}; \alpha)\)表示輸入節點為下圖中的兩個紅色節點,\(\alpha\)表示cell的內部結構