AutoML之NAS

前言

autoML最近非常火熱,在調參、特徵選擇等方面都有了不少的進展,與其同時,在深度網絡日益複雜化的今天,如何爲任務設計合適的網絡結構成了每位煉丹工程師的日常,而在缺乏先驗知識的情況下,調整網絡結構往往需要較長的時間和精力,如何自適應的調整網絡結構就成了一個值得研究的問題。今天主要介紹的是autoML下面的一種自適應調整網絡結構的方法: NEURAL ARCHITECTURE SEARCH (下面簡稱NAS),NAS主要作用是自適應構建網絡結構,減輕人爲調整的繁複勞動,還是值得一看的。

NAS 開篇

【論文地址:NEURAL ARCHITECTURE SEARCH WITH
REINFORCEMENT LEARNING

基本思路是通過構建一個controller來搜索行爲空間,根據行爲空間構建網絡圖,並根據網絡圖的rewards(一般是在驗證集上的指標收益等)調整控制器的參數,主要結構見下圖:在這裏插入圖片描述
上圖看上去很熟,其實就是強化學習的框架,可以把controller看做是RL裏的agent,搜索空間看做是action,子網絡看做是environment,在驗證集上的指標看作是reward,如此一比,其實就很清楚了,本質上是個RL的問題。

網絡結構

以一個卷積網絡爲例,日常我們在設計CNN的時候,一般考慮到的參數有卷積核個數、卷積核的height和width、 stride-height、stride-width,在使用NAS搜索的時候,使用RNN作爲controller,結構見下圖:在這裏插入圖片描述
每一個卷積層設計爲如下步驟:

  1. RNN接收前一層的輸出作爲當前的input,同時根據前一層的hidden_vec,生成當前cell的hidden_vec以及output
  2. output接一個softmax層,softmax類別個數爲搜索空間的個數,選擇概率最高的爲當前的action
  3. 當前cell的輸出會作爲下一個cell的輸入,不斷循環,就能依次拿到卷積核個數、卷積核的height和width、 stride-height、stride-width等參數
  4. 拿到參數後就可以構建當前的卷積layer
  5. 依次循環就可以構建一個卷積網絡
  6. 根據卷積網絡訓練,並在驗證集上拿到一個指標,也就是reward

param learning

controller的參數學習是RL裏面的policy-gradient方法,其loss是:在這裏插入圖片描述
其中mm表示探索的次數,TT表示的是一次探索設計的超參數(可以理解爲RNN的output個數),PP函數表示的是action的預估概率,RkR_k是設計的網絡在驗證集上的準確率指標。
爲了減少模型方差,後面作者改了一個新的loss:
在這裏插入圖片描述其中bb表示的是baseline的準確率

NAS 進化:ENAS

【論文地址 Efficient Neural Architecture Search via Parameter Sharing
ENAS相比NAS的主要改動在於shareing subgraph weight,比如設計一個rnn網絡,對於RNN的每一個cell單元,由N個block組成,下面以N=4舉例,其block的構建過程如下:

  1. 初始化輸入xtx_t和前一時刻隱向量ht1h_{t-1},controller的action空間爲 選擇前一個輸入以及選擇激活函數
  2. controller接收輸入,輸出「激活函數」 action概率並選一個激活函數,假設是tanh,那麼node1的輸出爲 h1=tanh(xtWx+ht1W1h)h_1 = tanh(x_tW_x + h_{t-1}*W_1^{h})
  3. controller繼續run rnn並輸出「前一個輸入」action概率並選擇一個輸入,假設是h1h_1,繼續輸出「激活函數」action概率並選擇一個激活函數,假設是Relu,那麼node2的輸出爲 h2=ReLU(h2W2,1h)h_2 = ReLU(h_2W_{2,1}^h)
  4. controller繼續run rnn並輸出「前一個輸入」action概率並選擇一個輸入,假設是h2h_2,繼續輸入「激活函數」action概率並選擇一個激活函數,假設是tanh,那麼node2的輸出爲 h2=tanh(h2W3,2h)h_2 = tanh(h_2W_{3,2}^h)
  5. controller繼續run rnn並輸出「前一個輸入」action概率並選擇一個輸入,假設是h1h_1,繼續輸入「激活函數」action概率並選擇一個激活函數,假設是tanh,那麼node2的輸出爲 h2=tanh(h1W4,1h)h_2 = tanh(h_1W_{4,1}^h)
  6. 由於h3h_3h4h_4沒有後向依賴,最終該RNN的cell隱向量輸出爲ht=(h3+h4)/2h_t = (h_3+h_4)/2

上圖的controller可用下圖表示:在這裏插入圖片描述
而RNN cell的構建過程可用下圖表示:
在這裏插入圖片描述

該RNN cell的構建有向圖可以表示爲:
在這裏插入圖片描述
注意到在構建RNN cell步驟中,Wi,jhW_{i,j}^h在不同的cell中間是共享的,這也是本paper提出的idea的核心,也就是share子圖的weight

參數學習和NAS一樣,也是基於policy gradient更新controller參數

DARTS: one-shot learning

【論文地址DARTS: DIFFERENTIABLE ARCHITECTURE SEARCH
DARTS的思路比較簡單,是將所有的子圖全部彙集在一個超圖裏一起訓練,在最後通過選擇子圖的weight來決定用哪個子圖。

  1. 假設有個圖網絡結構是這樣的:
    在這裏插入圖片描述
    問號的部分指的是不通的node直接可以有不同的operation,比如max-pooling之類的
  2. 假設operation有N的action空間,首先就是構建一個包含所有空間的超圖,如下:

在這裏插入圖片描述
3. 將每個node直接構建所有的action,使用參數對action加權:在這裏插入圖片描述
4. 然後通過梯度下降直接訓練α\alpha參數得到不同action的weight, 訓練loss如下:在這裏插入圖片描述
loss先約束求解使得loss最小的圖網絡參數ww,然後再求解在此圖參數下的α\alpha最優值,因爲上式直接求解比較麻煩,實際的訓練過程如下:在這裏插入圖片描述
主要改動是在第一步中,把先優化ww約束條件變成了先對ww根據梯度下降求一個更新值,然後利用此更新值去優化α\alpha
5. 最終訓練得到α\alpha之後,根據最大值取action,得到最終的subgraph:在這裏插入圖片描述
上圖左邊邊表示各個連接的α\alpha權重,顏色越深表示權重越大,挑出最大的權重,就得到右邊的最終子圖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章