CNN超引數優化和視覺化技巧詳解

weixin_34259232發表於2017-09-21

https://zhuanlan.zhihu.com/p/27905191

在深度學習中,有許多不同的深度網路結構,包括卷積神經網路(CNN或convnet)、長短期記憶網路(LSTM)和生成對抗網路(GAN)等。

在計算機視覺領域,對卷積神經網路(簡稱為CNN)的研究和應用都取得了顯著的成果。CNN網路最初的誕生收到了動物視覺神經機制的啟發,目前已成功用於機器視覺等領域中。

技術部落格Towards Data Science最近釋出了一篇文章,作者Suki Lau。文章討論了在卷積神經網路中,該如何調整超引數以及視覺化卷積層。

為什麼用卷積神經網路?

首先,我們想要計算機具有什麼能力呢?

當我們看到一隻貓跳上窗臺或在沙發上睡覺時,我們的潛意識會認出它是一隻貓。

我們希望計算機也能完成這項任務,即將影象輸入後,找出其獨有的特徵,最終輸出該影象的類別資訊。

卷積神經網路可以完成這項任務。

何為卷積神經網路?

先談定義,卷積神經網路是一種特殊的神經網路,其中至少包含一個卷積層。在典型的CNN網路結構中,輸入一張影象,經由一系列卷積層、非線性啟用層、池化層和全連線層後,可輸出相應的類別標籤。

卷積神經網路的特別之處在於加入了卷積層。

在經典的神經網路中,整張圖片會被傳入網路中來訓練各網路層權值。當輸入為簡單居中的影象時,如Mnist手寫數字圖,網路識別效果較優,但是當輸入變為更為複雜多變的影象時,如跳上窗戶的小貓,此時網路識別效果不佳甚至無法辨識。

加入更多隱含層學習輸入影象的抽象特徵,可能會有所幫助,但是這樣會增加神經元的數目,大大增加訓練所需的計算資源和佔用過多的記憶體,這是不切實際的。

而CNN識別目標的過程,是先尋找諸如邊緣、線段和曲線等相關低階特徵,然後使用多個卷積層來構建更多抽象的高階特徵。

在卷積層的學習過程中,CNN網路通過共享多個卷積核(或特徵檢測器)的權值,來學習每張圖片的區域性資訊,並用於構建抽象特徵圖譜。卷積核共享特性大大降低了訓練網路所需的引數量。

由於經過訓練的檢測器可以通過卷積層重複用來組合地檢測圖片中的抽象特徵,因此卷積神經網路更適用於複雜的影象識別任務。

超引數調整

在深度神經網路中,調整超引數組合並非易事,因為訓練深層神經網路十分耗時,且需要配置多個引數。

接下來,我們簡單列舉幾個影響CNN網路的關鍵超引數。

學習率

學習率是指在優化演算法中更新網路權重的幅度大小。

學習率可以是恆定的、逐漸降低的、基於動量的或者是自適應的,採用哪種學習率取決於所選擇優化演算法的型別,如SGD、Adam、Adagrad、AdaDelta或RMSProp等演算法。

優化策略這方面的內容可參閱量子位之前編譯過的“一文看懂各種神經網路優化演算法:從梯度下降到Adam方法”。

迭代次數

迭代次數是指整個訓練集輸入到神經網路進行訓練的次數。當測試錯誤率和訓練錯誤率相差較小時,可認為當前的迭代次數是合適的,否則需繼續增大迭代次數,或調整網路結構。

批次大小

在卷積神經網路的學習過程中,小批次會表現得更好,選取範圍一般位於區間[16,128]內。

還需要注意的是,CNN網路對批次大小的調整十分敏感。

啟用函式

啟用函式具有非線性,理論上可以使模型擬合出任何函式。通常情況下,rectifier函式在CNN網路中的效果較好。當然,可以根據實際任務,選擇其他型別的啟用函式,如Sigmoid和Tanh等等。

隱含層的數目和單元數

增加隱含層數目以加深網路深度,會在一定程度上改善網路效能,但是當測試錯誤率不再下降時,就需要尋求其他的改良方法。增加隱含層數目也帶來一個問題,即提高了訓練該網路的計算成本。

當網路的單元數設定過少時,可能會導致欠擬合,而單元數設定過多時,只要採取合適的正則化方式,就不會產生不良影響。

權重初始化

在網路中,通常會使用小隨機數來初始化各網路層的權重,以防止產生不活躍的神經元,但是設定過小的隨機數可能生成零梯度網路。一般來說,均勻分佈方法效果較好。

Dropout方法

作為一種常用的正則化方式,加入Dropout層可以減弱深層神經網路的過擬合效應。該方法會按照所設定的概率引數,在每次訓練中隨機地不啟用一定比例的神經單元。該引數的預設值為0.5。

手動調整超引數是十分費時也不切實際。接下來介紹兩種搜尋最優超引數的常用方法。

網格搜尋和隨機搜尋

網格搜尋是通過窮舉法列出不同的引數組合,確定效能最優的結構。隨機搜尋是從具有特定分佈的引數空間中抽取出一定數量的候選組合。

網格搜尋方法也需要制定策略,在初始階段最好先確定各超引數值的大概範圍。可以先嚐試在較小迭代次數或較小規模的訓練集上進行大步幅的網格搜尋。然後在下個階段中,設定更大的迭代次數,或是使用整個訓練集,實現小幅精確定位。

雖然在許多機器學習演算法中,通常會使用網格搜尋來確定超引數組合,但是隨著引數量的增大,訓練網路所需的計算量呈指數型增長,這種方法在深層神經網路的超引數調整時效果並不是很好。

有研究指出,在深度神經網路的超引數調整中,隨機搜尋方法比網格搜尋的效率更高,具體可參考文末中的“隨機搜尋在超引數優化中的應用”。

當然,可根據神經網路的理論經驗,進行超引數的手動調整在一些場景下也是可行的。

視覺化

我們可以通過視覺化各個卷積層,來更好地瞭解CNN網路是如何學習輸入影象的特徵。

視覺化有兩種直接方式,分別是視覺化啟用程度和視覺化相關權重。在網路訓練過程中,卷積層的啟用情況通常會變得更為稀疏和具有區域性特性。當不同輸入影象的啟用圖都存在大片未啟用的區域,那麼可能是設定了過高的學習率使得卷積核不起作用,導致產生零啟用影象。

效能優良的神經網路通常含有多個明顯而平滑的卷積器,且沒有任何干擾特徵。若在權重中觀察到相關干擾特徵,可能原因是網路未被充分訓練,或是正則化強度較低導致了過擬合效應。

相關連結

1.在深度結構中關於梯度方法的幾個實用建議(Yoshua Bengio):

2.隨機搜尋在超引數優化中的應用:

3.CS231n課程中理解和視覺化卷積神經網路:

4.如何使用網格搜尋來優化深度學習模型中的超引數(Keras):

【完】

 

 

 

神經網路CNN訓練心得--調參經驗

1.樣本要隨機化,防止大資料淹沒小資料

2.樣本要做歸一化。關於歸一化的好處請參考:為何需要歸一化處理
3.啟用函式要視樣本輸入選擇(多層神經網路一般使用relu)
4.mini batch很重要,幾百是比較合適的(很大資料量的情況下)
5.學習速率(learning rate)很重要,比如一開始可以lr設定為0.01,然後執行到loss不怎麼降的時候,學習速率除以10,接著訓練
6.權重初始化,可用高斯分佈乘上一個很小的數,這個可以看:權值初始化
7.Adam收斂速度的確要快一些,可結果往往沒有sgd + momentum的解好(如果模型比較複雜的話,sgd是比較難訓練的,這時候adam的威力就體現出來了)
8.Dropout的放置位置以及大小非常重要
9.early stop,發現val_loss沒更新,就儘早停止
 
另:心得體會
深度學習真是一門實驗科學,很多地方解釋不了為什麼好,為什麼不好。
網路層數、卷積核大小、滑動步長,學習速率這些引數的設定大多是通過已有的架構來做一些微調
 
 
 
參考:知乎討論 https://www.zhihu.com/question/41631631

相關文章