1. 程式人生 > >煉丹術的終結——神經網路結構搜尋之一

煉丹術的終結——神經網路結構搜尋之一

深度學習在2010年燃起來以後,較大的革新集中出現在網路結構上。例如,在影象領域,出現了AlexNet, VGG, GoogNet, Inception系列,Res-Net,DenseNet和MobileNet等不同的卷積神經網路;在文字處理領域,出現了RNN,GRU,LSTM等不同的迴圈神經網路結構。再加上在不同的網路結構中的調參(層數,每層的單元數,卷積核的大小,卷積核的stride的大小等等)。最終使得找到一個好的神經網路結構是人力所難以得到的,因而深度學習的鬥士們親切的將深度學習稱之為“煉丹術”。

正如人類歷史中任何大量耗費人工的產業一樣,當積累到一定階段,人類的智慧就開始考慮將其自動化。調參也是一樣。於是,在網路結構這一個方向,“煉丹術士”們看到了一絲曙光。

既然“尋找最優的網路結構”這枚釘子已經備好,那麼該怎麼去找最優的結構呢?

首先,需要先定義搜尋空間,即網路結構的全集,全集確定下來才可以從全集中找到最優的。
在確定了全集之後,理論上最優網路結構已經確定,只要使用暴力的方法把每個可能的模型都跑一邊,而這顯然因為太耗時而變得不可能。所以,第二我們需要一種啟發式方法,可以幫助我們找出比較好的模型的特點,然後預測出最優的模型是什麼。

所以,接下來,我們首先解釋如何表示和生成網路結構,然後,在來看如何調整啟發式方法,使得生成的模型越來越好。

網路結構的表示

首先,我們以卷積神經網路為例(迴圈神經網路後面會講),來看看網路結構如何表示。以最簡單的只有卷積層的卷積神經網路為例。

每個卷積層的引數有5個:

  • 卷積核數目
  • 卷積核高度
  • 卷積核寬度
  • 卷積核stride高度(stride的意義是卷積在影象上劃過時的步長)
  • 卷積核stride寬度

那麼,一個N層卷積神經網路就可以用N個上述五元組來表示。

控制器

名詞解釋:在這裡,控制器就是用來進行網路搜尋的啟發式方法,能夠生成網路結構。

因為神經網路是層級結構,所以N層神經網路是以N-1層神經網路為基礎的。那麼我們可以將網路結構生成建模成一個序列問題,即按層去預測網路結構。而目前深度學習領域解決序列問題的方法是迴圈神經網路——RNN。

如下圖所示,使用RNN生成一層網路結構的五個引數。

可以看到,在RNN中,每五個輸出組成一層神經網路。而上一步的輸出是下一步的輸入,這樣保證了RNN是基於前面N-1層所有的引數資訊來預測第N層的引數。

而RNN的輸出則是softmax輸出,例如,對於卷積核高度,我們可以限定輸出值為[1,3,5,7]四個數,而RNN的輸出是這四個數上的概率分佈。

求解

對於上一節描述的RNN模型,如何求解呢?

大家知道,RNN也是用反向傳播來求解的,那麼在這個問題上,如何進行反向傳播呢?要解決這個問題,我們需要讓控制器獲得反饋。這個反饋是當然是指生成的網路的好壞程度了? 那麼又如何獲得網路結構的好壞程度呢? 這就需要我們把該網路結構訓練一遍,用得到的準確率來作為反饋。

所以,這個問題可以建模成下圖:

即需要與外界進行互動來獲取生成網路結構的準確率。用準確率來作為網路的衡量標準。那麼我們對RNN的目標函式的設定是:

即目標函式是生成的網路結構的準確率,我們需要最大化這個準確率,即公式中的R。
但是生成網路結構的準確率對於RNN來說是無法直接求導的,因為它沒有和RNN的softmax聯絡起來。那麼,如何將它們聯絡起來呢?

一個非常直觀樸素的想法就是我們希望網路結構的準確率越高,那麼控制器生成這個網路結構的概率越大。

於是就得到

R為生成網路結構的準確率,P為生成該網路結構的概率。但是因為計算資源的限制,我們無法將所有可能的網路結構通通訓練一遍(通通訓練一遍也即是暴力演算法)。因而,在這個公式下,我們使用取樣的方法來擬合。

其中,m是取樣出來的模型結構的數目,T是引數數目,上述公式計算了對於m個模型中的每一個模型,它的T個引數中每個引數的輸出概率都與生成的模型結構的準確率掛鉤。

因為準確率是都是正數,而這樣對於反向傳播的求導是不利的,因而對目標函式做了一點小小的修改:

其中,b為之前訓練的所有網路結構的exponential moving average,即按照時間前後用指數加權的平均值。

值得注意的是,本節中前三個公式的變化其實可以歸納到強化學習的框架中去。是強化學習中Policy Gradient的內容。具體的公式推導參考2

分散式求解

即使加入了控制器來啟發式的搜尋,仍然需要大量的計算。因而分散式訓練是很必須的。分散式的框架如下:

仍然是Parameter Server架構,我們複製K個控制器,它們的引數更新都回傳到parameter server來同步。對於每個控制器,生成m個網路結構並且並行的進行計算。得到準確率用來對控制器進行梯度下降計算。

對於生成的網路結構,為了節約計算,在遍歷資料集一定次數之後即停止訓練。

更復雜的卷積神經網路

剛才我們只是對只有卷積層的卷積神經網路進行了網路結構的生成,而其實卷積神經網路中海油很多其他的結構,比如非常經典的Res-Net中使用的skip-connection結構,網路中的第N層除了和第N-1層連線外還可以和更低的層進行連線。

為了使剛才描述的框架能生成更復雜的卷積神經網路,可以在控制器中添加註意力機制。

在每一層的預測值中插入一個錨點,第N層的錨點和前面N-1層的所有錨點都有一個連線,每一層的錨點有(層數-1)個輸出,分別代表前面的每一層是否該作為當前層的輸入。

在這種情況下,因為不同的層的feature map的大小是不同的,當不同的層拼接到一起時,會有尺寸不相容的情況,為了解決這個問題,對較小尺寸的feature map做padding處理。同時,加上另外兩種處理:

  • 如果錨點沒有預測出任何輸入,那麼當前層使用輸入的影象作為輸入層。
  • 在網路的最後一層,對於那些沒做過輸入的層,都連線到這個最後一層。

這樣,控制器就支援了skip-connection。

當然,對於learning-rate,pooling,batchnorm層,控制器也可以稍作修改就支援。

迴圈神經網路結構生成

剛才所講的都是生成卷積神經網路,那麼對於迴圈神經網路,該如何生成呢?

正常的迴圈神經網路的每個cell有兩個輸入和一個輸出,兩個輸入為xt和ht-1,輸出為ht
因而,我們使用控制器對兩個輸入和一個輸出預測兩個東西,即兩個輸入的拼接方式,和啟用函式。

比如,如果預測兩個輸入的拼接方式為加,啟用函式為tanh,那麼就得到普通的RNN

我們可以將兩個輸入複製多份,從而可以得到不同的輸出(因為拼接方式和啟用函式會不同)。不同的輸出又可以使用兩個輸入一個輸出的這種結構進行組合,得到新的值。其中,兩個輸入複製多份的那個份數被稱之為“base N”。

在LSTM的結構中,還有另一個ct隱含變數,也可以用相同的方式加入到這種計算中來。

具體不在贅述,大家直接看論文中的圖和解釋即可.


在這裡比較有意思的是,使用迴圈神經網路來預測迴圈神經網路的結構。如果將生成好的迴圈網路結構再用作控制器,就成了自我升級和迭代了。

實驗

實驗設定

對於卷積神經網路,搜尋空間如下:

  • 卷積核高和寬:[1,3,5,7]
  • 卷積核數目:[24, 36, 48, 64]
  • 卷積核stride: [1,2,3] / [1]

對於控制器:

  • 2-layer LSTM
  • 35 hidden unit
  • Adam 優化器
  • learning_rate=0.0006
  • Parameter server=20
  • 控制器副本數目=100
  • 控制器每次生成m個結構,m=8,即800個生成的網路結構同時在訓練,同時使用800GPU。
  • 生成的網路訓練50 epoch

在train的過程中,逐步加深生成網路結構的深度,在Cifar-10上,每sample 1600次,就將深度加深2。

感覺這裡的假設其實是在比較好的淺網路上加層能更大概率的得到比較好的深網路。

對於迴圈神經網路,使用:
- base=8
- learning_rate=0.0005
- 控制器副本數目=400.
- 當10個梯度累加起來的時候才做梯度下降。
- 生成的網路結構train 35 epoches
- 只是生成了RNN的cell結構,大網路結構使用兩層結構,hidden unit數目動態調整至於medium baseline引數數目等同的狀態。
- 反饋值不再是準確率,而是c/(perplexity*perplexity), c=80.
- 其他設定類似。

卷積神經網路最終結果

在得到最後的網路結構後,再對這個結構進行其他引數如learning_rate,weigh_decay, batch_norm的grid search,得到最優結果。

迴圈神經網路結果

做了grid search後,得到最右結果。

生成的網路結構

卷積神經網路

迴圈神經網路

參考文獻

  • [1]. Zoph B, Le Q V. Neural architecture search with reinforcement learning[J]. arXiv preprint arXiv:1611.01578, 2016.