前言
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,結構見下圖:
每一個卷積層設計爲如下步驟:
- RNN接收前一層的輸出作爲當前的input,同時根據前一層的hidden_vec,生成當前cell的hidden_vec以及output
- output接一個softmax層,softmax類別個數爲搜索空間的個數,選擇概率最高的爲當前的action
- 當前cell的輸出會作爲下一個cell的輸入,不斷循環,就能依次拿到卷積核個數、卷積核的height和width、 stride-height、stride-width等參數
- 拿到參數後就可以構建當前的卷積layer
- 依次循環就可以構建一個卷積網絡
- 根據卷積網絡訓練,並在驗證集上拿到一個指標,也就是reward
param learning
controller的參數學習是RL裏面的policy-gradient方法,其loss是:
其中表示探索的次數,表示的是一次探索設計的超參數(可以理解爲RNN的output個數),函數表示的是action的預估概率,是設計的網絡在驗證集上的準確率指標。
爲了減少模型方差,後面作者改了一個新的loss:
其中表示的是baseline的準確率
NAS 進化:ENAS
【論文地址 Efficient Neural Architecture Search via Parameter Sharing 】
ENAS相比NAS的主要改動在於shareing subgraph weight,比如設計一個rnn網絡,對於RNN的每一個cell單元,由N個block組成,下面以N=4舉例,其block的構建過程如下:
- 初始化輸入和前一時刻隱向量,controller的action空間爲 選擇前一個輸入以及選擇激活函數
- controller接收輸入,輸出「激活函數」 action概率並選一個激活函數,假設是tanh,那麼node1的輸出爲
- controller繼續run rnn並輸出「前一個輸入」action概率並選擇一個輸入,假設是,繼續輸出「激活函數」action概率並選擇一個激活函數,假設是Relu,那麼node2的輸出爲
- controller繼續run rnn並輸出「前一個輸入」action概率並選擇一個輸入,假設是,繼續輸入「激活函數」action概率並選擇一個激活函數,假設是tanh,那麼node2的輸出爲
- controller繼續run rnn並輸出「前一個輸入」action概率並選擇一個輸入,假設是,繼續輸入「激活函數」action概率並選擇一個激活函數,假設是tanh,那麼node2的輸出爲
- 由於和沒有後向依賴,最終該RNN的cell隱向量輸出爲
上圖的controller可用下圖表示:
而RNN cell的構建過程可用下圖表示:
該RNN cell的構建有向圖可以表示爲:
注意到在構建RNN cell步驟中,在不同的cell中間是共享的,這也是本paper提出的idea的核心,也就是share子圖的weight
參數學習和NAS一樣,也是基於policy gradient更新controller參數
DARTS: one-shot learning
【論文地址DARTS: DIFFERENTIABLE ARCHITECTURE SEARCH 】
DARTS的思路比較簡單,是將所有的子圖全部彙集在一個超圖裏一起訓練,在最後通過選擇子圖的weight來決定用哪個子圖。
- 假設有個圖網絡結構是這樣的:
問號的部分指的是不通的node直接可以有不同的operation,比如max-pooling之類的 - 假設operation有N的action空間,首先就是構建一個包含所有空間的超圖,如下:
3. 將每個node直接構建所有的action,使用參數對action加權:
4. 然後通過梯度下降直接訓練參數得到不同action的weight, 訓練loss如下:
loss先約束求解使得loss最小的圖網絡參數,然後再求解在此圖參數下的最優值,因爲上式直接求解比較麻煩,實際的訓練過程如下:
主要改動是在第一步中,把先優化約束條件變成了先對根據梯度下降求一個更新值,然後利用此更新值去優化
5. 最終訓練得到之後,根據最大值取action,得到最終的subgraph:
上圖左邊邊表示各個連接的權重,顏色越深表示權重越大,挑出最大的權重,就得到右邊的最終子圖。