摘要

神經網路在多個領域都取得了不錯的成績,但是神經網路的合理設計卻是比較困難的。在本篇論文中,作者使用 遞歸網路去省城神經網路的模型描述,並且使用 增強學習訓練RNN,以使得生成得到的模型在驗證集上取得最大的準確率。

CIFAR-10數據集上,基於本文提出的方法生成的模型在測試集上得到結果優於目前人類設計的所有模型。測試集誤差率為3.65%,比之前使用相似結構的最先進的模型結構還有低0.09%,速度快1.05倍。

Penn Treebank數據集上,根據本文演算法得到的模型能夠生成一個新穎的 recurrent cell,其要比廣泛使用的 LSTM cell或者其他基線方法表現更好。在 Penn Treebank測試集上取得62.4的perplexity,比之前的最好方法還有優秀3.6perplexity。這個 recurrent cell也可以轉移到PTB的字元語言建模任務中,實現1.214的perplexity。

1.介紹

深度神經網路在許多具有挑戰性的任務重都取得了不俗的成績。在這成績背後涉及到的技術則是從特徵設計遷移到的結構設計,例如從SIFT、HOG(特徵設計)到AlexNet、VGGNet、GoogleNet、ResNet等(結構設計)。

各種優秀的網路結構使得多種任務處理起來簡單不少,但是設計網路結構仍然需要大量的專業知識並且需要耗費大量時間。

為瞭解決上述問題,本文提出 Neural Architecture Search,以期望找到合適的網路結構。大致原理圖如下:

RNN作為一個 controller去生成模型的描述符,然後根據描述符得到模型,進而得到該模型在數據集上的準確度。接著將該準確度作為 獎勵信號(reward signal)對controller進行更新。如此不斷迭代找到合適的網路結構。

2.相關工作

超參數優化在機器學習中是個重要的研究話題,也被廣泛使用。但是,該方法很難去生成一個長度可變的參數配置,即靈活性不高。雖然 貝葉斯優化可以搜索得到非固定長度的結構,但是與本文提出方法相比在通用性和可變性上都稍遜一籌。

現代神經進化演算法雖然可以很靈活的生成模型,但是在大規模數據上實用性不高。

program synthesis and inductive programming的思想是searching a program from examples,Neural Architecture Search與其有一些相似的地方。

與本文方法相關的方法還有 meta-learning使用一個神經網路去學慣用於其他網路的梯度下降更新(Andrychowicz et al., 2016)、以及 使用增強學習去找到用於其他網路的更新策略(Li & Malik, 2016)

3.方法

本節將從下面3個方面介紹所提出的方法:

1.介紹遞歸網路如何通過使用policy gradient method最大化生成框架的準確率2.介紹幾個改善方法,如skip connection(增加複雜度)、parameter server(加速訓練)等

3.介紹如何生成遞歸

3.1 Generate Model Descriptions With A Controller Recurrent Neural Network

用於生成模型描述的RNN結構如下,所生成的超參數是一系列的 token

在實驗中,如果層數超過一定數量,生成模型就會被停止。這種情況下,或者在收斂時,所生成模型在測試集上得到的準確率會被記錄下來。

3.2 Training With Reinforcement

RNN的參數用θcθc表示。controller所預測的一系列tokens記為一系列的actions,即a1:Ta1:T,這些tokens是為了子網路(Child network)設計結構。子網路在驗證集上得到的準確率用RR表示,該準確率作為 reward signal,並且會用到增強學習來訓練controller。

通過求解最大化reward找到最優的結構,reward表達式如下:

J(θc)=EP(a1:T;θc)[R]J(θc)=EP(a1:T;θc)[R]

因為獎勵信號RR是不可微分的,所以我們需要一個策略梯度方法來迭代更新θcθc。在本文中,使用到來自 Williams (1992) 的增強學習規則:

?θcJ(θc)=∑t=1TEP(a1:T;θc)[?θclogP(at|a(t?1):1;θc)R]?θcJ(θc)=∑t=1TEP(a1:T;θc)[?θclogP(at|a(t?1):1;θc)R]

根據經驗上式約等於:

1m∑k=1m∑t=1T?θclogP(at|a(t?1):1;θc)Rk1m∑k=1m∑t=1T?θclogP(at|a(t?1):1;θc)Rk

其中mm是controller在一個batch中採樣得到的結構的數量,TT是controller用於預測和設計神經網路結構的超參數的數量。

RkRk表示第k個網路結構在驗證集上的準確度。

上述的更新演算法是對梯度的無偏估計,但是有很高的方差。為了降低方差,文中使用如下基線函數:

1m∑k=1m∑t=1T?θclogP(at|a(t?1):1;θc)(Rk?b)1m∑k=1m∑t=1T?θclogP(at|a(t?1):1;θc)(Rk?b)

只要bb不依懶於當前的action,那麼其仍是無偏梯度估計,且bb是前面的結構準確率的 指數平均數指標(Exponential Moving Average, EMA)

EMA(Exponential Moving Average)是指數平均數指標,它也是一種趨向類指標,指數平均數指標是以指數式遞減加權的移動平均。

其公式為:EMA_{today}=α * Price_{today} + ( 1 - α ) * EMA_{yesterday};其中,α為平滑指數,一般取作2/(N+1)。

Accelerate Training with Parallelism and Asynchronous Updates 使用並行演算法和非同步更新來加速訓練

每一次用於更新controller的參數θcθc的梯度都對應於一個子網路訓練達到收斂。但是因為子網路眾多,且每次訓練收斂耗時長,所以使用 分散式訓練和非同步參數更新的方法來加速controller的學習速度。

訓練模型如上圖所示,一共有SS個 Parameter Server用於存儲 KK個 Controller Replica的共享參數。然後每個 Controller Replica 生成mm個並行訓練的自網路。

controller會根據mm個子網路結構在收斂時得到的結果收集得到梯度值,然後為了更新所有 Controller Replica,會把梯度值傳遞給 Parameter Server

在本文中,當訓練迭代次數超過一定次數則認為子網路收斂。

3.3 Increase Architecture Complexity With Skip Connections And Other Layer Types

3.1節中的示意圖為了方便說明,所以其中的網路結構較為簡單。本節則會介紹一種方法能夠使得controller生成的網路結構假如 skip connections(如ResNet結構) 或者 branching layers(層分叉,如GoogleNet結構)

為實現準確預測connections,本文採用了 (Neelakantan et al., 2015) 中的基於注意力機制的set-selection type attention方法。

在NN層,根據sigmoid函數判斷與其前面的N?1N?1個層是否相連。sigmoid函數如下:

P(Layerjisaninputtolayeri)=sigmoid(vTtanh(Wprev?hj+Wcurr?hi))P(Layerjisaninputtolayeri)=sigmoid(vTtanh(Wprev?hj+Wcurr?hi))

上式中hjhj表示controller在第jj層的隱藏狀態(jj的大小是從0到N?1N?1)。

下面介紹如何應對有的層可能沒有輸入或輸出的情況:

1.如果沒有輸入,那麼原始圖像作為輸入

2.在最後一層,將所有還沒有connected層的輸出concatenate起來作為輸入。3.如果需要concatenated的輸入層有不同的size,那麼小一點的層通過補0來保證一樣大小

3.4 GENERATE RECURRENT CELL ARCHITECTURES

下圖展示了生成遞歸單元結構的具體細節。

由圖可知採用了樹結構來描述網路結構,這樣也便於遍歷每個節點。

每棵樹由兩個葉子節點(用0,1表示)和一個中間節點(用2表示)組成。

4. 實驗與結果

具體的實驗結果可查閱原論文 NEURAL ARCHITECTURE SEARCH WITH REINFORCEMENT LEARNING

5.讀後感

【The First Step-by-Step Guide for Implementing Neural Architecture Search with Reinforcement Learning Using TensorFlow】這篇文章很詳細的給出了如何實現NASnet的方法以及源代碼,通過閱讀代碼能更好地理解本論文的思路。

NAS在生成網路的時候之前需要固定網路的結構,或者是說需要固定網路的層數。

以生成CNN網路為例,代碼中默認最大層數參數max_layers=2,當然也可以人為修改。

而controller其實就是一個RNN網路,其輸出數據表示某一層中各個節點的參數,各個參數是按順序輸出的。例如代碼中是按照 [cnn_filter_size,cnn_num_filters,max_pool_ksize,cnn_dropout_rates] 輸出的(貌似並沒有實現skip-connection)。

偽代碼:

state = np.array([[10.0, 128.0, 1.0, 1.0]*max_layers], dtype=np.float32) # 初始化state
for episode in range(MAX_EPISODES):
action = RLnet.get_action(state) # 增強學習網路根據當前狀態獲取下一步的動作,其中是使用原論文所給的NAScell來對動作進行預測的。
reward, pre_accuracy = net_manager.get_reward(action) # 根據生成的動作得到對應的網路,然後將該網路在訓練集上訓練至收斂,再將收斂後的網路在驗證集上運行得到準確度,根據一定的準則將準確度轉化為reward。
reward = update(reward) # 更新reward
state = update(action) # 根據action更新state,在例子中是state=action[0]

從上面的偽代碼可以看出每次採樣得到的模型都需要在訓練集上訓練到收斂,然後再根據在驗證集上得到的reward更新。所以NAS其本質是在離散搜索空間進行搜索,而且網路拓撲結構是固定的,並且訓練時間較長,不過思路比較簡單好懂。

MARSGGBO?原創

論文筆記系列-Neural Architecture Search With Reinforcement Learning

推薦閱讀:

相關文章