論文筆記系列-Auto-DeepLab:Hierarchical Neural Architecture Search for Semantic Image Segmentation


Pytorch實現代碼:https://github.com/MenghaoGuo/AutoDeeplab

創新點

以往的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的輸出作為輸入;

image.png

下面我們先以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操作來實現。更一般化的表達方式如下:

\[\begin{array}{l}{\qquad \overline{O}_{j \rightarrow i}\left(H_{j}^{l}\right)=\sum_{O^{k} \in \mathcal{O}} \alpha_{j \rightarrow i}^{k} O^{k}\left(H_{j}^{l}\right)} \\ {\text { where }} {\qquad \begin{aligned} \sum_{k=1}^{|\mathcal{O}|} \alpha_{j \rightarrow i}^{k}=1 & \,\,\,\, \forall i, j \\ \alpha_{j \rightarrow i}^{k} \geq 0 & \,\,\,\, \forall i, j, k \end{aligned}}\end{array} \]

有了操作的表達式后,那么每個子節點的表達方式也就是對多個輸入節點作加權求和,如下:

\[H_{i}^{l}=\sum_{H_{j}^{l} \in \mathcal{I}_{i}^{l}} O_{j \rightarrow i}\left(H_{j}^{l}\right) \]

Network-level search space

上圖左邊畫的是network-level,橫向表示layer,縱向表示圖像分辨率(2表示原圖是特征圖的2倍,其他同理)。

  • 灰色小圓圈表示固定的stem層,可以理解為固定的預處理層,即原圖會首先經過一些列操作后得到縮小4倍的特征圖,然后會在該特征圖上進行模型結構搜索。

  • 藍色小圓圈表示候選節點,每個節點都可以是一個cell結構

  • 灰色箭頭表示每個cell節點數據可能的流動方向,可以看到一個節點最多可能有三種流動方向,即分辨率增大一倍,保持不變和減小一倍。這樣做的目的是避免分辨率變化太大而導致信息量丟失過多。例如如果從4直接連接到32,這個畫面太美不敢看,所以人為設定了前面的限制(雖然沒有實驗證明這樣不可以,但是憑直覺這樣貌似不可以,如果錢和設備像和谷歌一樣多也還是可以試一試的)

右邊剛開始看的時候還以為就只是介紹了cell結構,但是結合代碼后發現有個地方稍微有些不同,這個其實在后面的論文中也有介紹,但是當時沒注意看,即每個節點的表達式如下:

\[\begin{aligned}^{s} H^{l}=& \beta_{\frac{\varepsilon}{2} \rightarrow s}^{l} \operatorname{Cell}\left(^{\frac{s}{2}} H^{l-1},^{s} H^{l-2} ; \alpha\right) \\ &+\beta_{s \rightarrow s}^{l} \operatorname{Cell}\left(^{s} H^{l-1},^{s} H^{l-2} ; \alpha\right) \\ &+\beta_{2 s \rightarrow s}^{l} \operatorname{Cell}\left(^{2 s} H^{l-1},^{s} H^{l-2} ; \alpha\right) \end{aligned} \]

其中

\[\begin{array}{ll}{\beta_{s \rightarrow \frac{s}{2}}^{l}+\beta_{s \rightarrow s}^{l}+\beta_{s \rightarrow 2 s}^{l}=1} & {\forall s, l} \\ {\beta_{s \rightarrow \frac{s}{2}}^{l} \geq 0 \quad \beta_{s \rightarrow s}^{l} \geq 0} & {\beta_{s \rightarrow 2 s}^{l} \geq 0 \quad \forall s, l}\end{array} \]

上面的公式乍看會很懵,我們慢慢看:

  • 首先\(\beta\)表示某條路徑的概率,例如\(\beta^l_{s \rightarrow s}\)表示下圖中的紅色箭頭路徑的概率,其他同理。
  • \(\text{Cell}(^{s} H^{l-1},^{s} H^{l-2}; \alpha)\)表示輸入節點為下圖中的兩個紅色節點,\(\alpha\)表示cell的內部結構

image.png



MARSGGBO原創





2018-10-29




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM