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


摘要

神經網絡在多個領域都取得了不錯的成績,但是神經網絡的合理設計卻是比較困難的。在本篇論文中,作者使用 遞歸網絡去省城神經網絡的模型描述,並且使用 增強學習訓練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\)表示。controller所預測的一系列tokens記為一系列的actions,即\(a_{1:T}\),這些tokens是為了子網絡(Child network)設計結構。子網絡在驗證集上得到的准確率用\(R\)表示,該准確率作為 reward signal,並且會用到增強學習來訓練controller。

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

\[J(θ_c)=E_{P(a_{1:T;θ_c})}[R] \]

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

\[\nabla_{θ_c}J(θ_c)=\sum_{t=1}^{T}E_{P(a_{1:T;θ_c})}[\nabla_{θ_c}logP(a_t|a_{(t-1):1};θ_c)R] \]

根據經驗上式約等於:

\[\frac{1}{m} \sum_{k=1}^{m} \sum_{t=1}^{T} \nabla_{θ_c}logP(a_t|a_{(t-1):1};θ_c)R_k \]

其中\(m\)是controller在一個batch中采樣得到的結構的數量,\(T\)是controller用於預測和設計神經網絡結構的超參數的數量。

\(R_k\)表示第k個網絡結構在驗證集上的准確度。

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

\[\frac{1}{m} \sum_{k=1}^{m} \sum_{t=1}^{T} \nabla_{θ_c}logP(a_t|a_{(t-1):1};θ_c)(R_k-b) \]

只要\(b\)不依懶於當前的action,那么其仍是無偏梯度估計,且\(b\)是前面的結構准確率的 指數平均數指標(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\)的梯度都對應於一個子網絡訓練達到收斂。但是因為子網絡眾多,且每次訓練收斂耗時長,所以使用 分布式訓練和異步參數更新的方法來加速controller的學習速度。

訓練模型如上圖所示,一共有\(S\)Parameter Server用於存儲 \(K\)Controller Replica的共享參數。然后每個 Controller Replica 生成\(m\)個並行訓練的自網絡。

controller會根據\(m\)個子網絡結構在收斂時得到的結果收集得到梯度值,然后為了更新所有 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方法。

\(N\)層,根據sigmoid函數判斷與其前面的\(N-1\)個層是否相連。sigmoid函數如下:

\[P(Layer\,j\,is\,an\,input\,to\,layer\,i)=sigmoid(v^T tanh(W_{prev}*h_j+W_{curr}*h_i)) \]

上式中\(h_j\)表示controller在第\(j\)層的隱藏狀態(\(j\)的大小是從0到\(N-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原創





2018-7-21




免責聲明!

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



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