天天看點

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

上節課我們主要介紹了深度神經網絡的優化算法。包括對原始資料集進行分割,使用mini-batch gradient descent。然後介紹了指數權重平均(Exponentially weighted averages)的概念以及偏移校正(bias correction)方法。接着,我們着重介紹了三種常用的加速神經網絡學習速度的三種算法:動量梯度下降、RMSprop和Adam算法。

本節課,我們将重點介紹三個方面的内容:超參數調試、Batch正則化和深度學習程式設計架構。

——前言

Tuning Process

深度神經網絡需要調試的超參數(Hyperparameters)較多,包括:

超參數之間也有重要性差異。通常來說,學習因子α是最重要的超參數,也是需要重點調試的超參數。動量梯度下降因子β、各隐藏層神經元個數#hidden units和mini-batch size的重要性僅次于α。然後就是神經網絡層數#layers和學習因子下降參數learning rate decay。最後,Adam算法的三個參數β1,β2,ε一般常設定為0.9,0.999和10^−8,不需要反複調試。當然,這裡超參數重要性的排名并不是絕對的,具體情況,具體分析。

如何選擇和調試超參數?傳統的機器學習中,我們對每個參數等距離選取任意個數的點,然後,分别使用不同點對應的參數組合進行訓練,最後根據驗證集上的表現好壞,來標明最佳的參數。例如有兩個待調試的參數,分别在每個參數上選取5個點,這樣構成了5x5=25中參數組合,如下圖所示:

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構
這種做法在參數比較少的時候效果較好。但是在深度神經網絡模型中,我們一般不采用這種均勻間隔取點的方法,比較好的做法是使用随機選擇。也就是說,對于上面這個例子,我們随機選擇25個點,作為待調試的超參數,如下圖所示:
吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

随機化選擇參數的目的是為了盡可能地得到更多種參數組合。還是上面的例子,如果使用均勻采樣的話,每個參數隻有5種情況;而使用随機采樣的話,每個參數有25種可能的情況,是以更有可能得到最佳的參數組合。

這種做法帶來的另外一個好處就是對重要性不同的參數之間的選擇效果更好。假設hyperparameter1為α,hyperparameter2為ε,顯然二者的重要性是不一樣的。如果使用第一種均勻采樣的方法,ε的影響很小,相當于隻選擇了5個α值。而如果使用第二種随機采樣的方法,ε和α都有可能選擇25種不同值。這大大增加了α調試的個數,更有可能選擇到最優值。其實,在實際應用中完全不知道哪個參數更加重要的情況下,随機采樣的方式能有效解決這一問題,但是均勻采樣做不到這點。

在經過随機采樣之後,我們可能得到某些區域模型的表現較好。然而,為了得到更精确的最佳參數,我們應該繼續對標明的區域進行由粗到細的采樣(coarse to fine sampling scheme)。也就是放大表現較好的區域,再對此區域做更密集的随機采樣。例如,對下圖中右下角的方形區域再做25點的随機采樣,以獲得最佳參數。

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

Using an Appropriate Scale to Pick Hyperparameters

上一部分講的調試參數使用随機采樣,對于某些超參數是可以進行尺度均勻采樣的,但是某些超參數需要選擇不同的合适尺度進行随機采樣。

什麼意思呢?例如對于超參數#layers和#hidden units,都是正整數,是可以進行均勻随機采樣的,即超參數每次變化的尺度都是一緻的(如每次變化為1,猶如一個刻度尺一樣,刻度是均勻的)。

但是,對于某些超參數,可能需要非均勻随機采樣(即非均勻刻度尺)。例如超參數α,待調範圍是[0.0001, 1]。如果使用均勻随機采樣,那麼有90%的采樣點分布在[0.1, 1]之間,隻有10%分布在[0.0001, 0.1]之間。這在實際應用中是不太好的,因為最佳的α值可能主要分布在[0.0001, 0.1]之間,而[0.1, 1]範圍内α值效果并不好。是以我們更關注的是區間[0.0001, 0.1],應該在這個區間内細分更多刻度。

通常的做法是将linear scale轉換為log scale,将均勻尺度轉化為非均勻尺度,然後再在log scale下進行均勻采樣。這樣,[0.0001, 0.001],[0.001, 0.01],[0.01, 0.1],[0.1, 1]各個區間内随機采樣的超參數個數基本一緻,也就擴大了之前[0.0001, 0.1]區間内采樣值個數。

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構
一般解法是,如果線性區間為[a, b],令m=log(a),n=log(b),則對應的log區間為[m,n]。對log區間的[m,n]進行随機均勻采樣,然後得到的采樣值r,最後反推到線性區間,即10^r。10^r就是最終采樣的超參數。相應的Python語句為:
吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

除了α之外,動量梯度因子β也是一樣,在超參數調試的時候也需要進行非均勻采樣。一般β的取值範圍在[0.9, 0.999]之間,那麼1−β的取值範圍就在[0.001, 0.1]之間。那麼直接對1−β在[0.001, 0.1]區間内進行log變換即可。

這裡解釋下為什麼β也需要向α那樣做非均勻采樣。假設β從0.9000變化為0.9005,那麼1/(1−β)基本沒有變化。但假設β從0.9990變化為0.9995,那麼1/(1−β)前後差别1000。β越接近1,指數權重平均的個數越多,變化越大。是以對β接近1的區間,應該采集得更密集一些。

3 Hyperparameters Tuning in Practice: Pandas vs. Caviar

經過調試選擇完最佳的超參數并不是一成不變的,一段時間之後(例如一個月),需要根據新的資料和實際情況,再次調試超參數,以獲得實時的最佳模型。

在訓練深度神經網絡時,一種情況是受計算能力所限,我們隻能對一個模型進行訓練,調試不同的超參數,使得這個模型有最佳的表現。我們稱之為Babysitting one model。另外一種情況是可以對多個模型同時進行訓練,每個模型上調試不同的超參數,根據表現情況,選擇最佳的模型。我們稱之為Training many models in parallel。

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

因為第一種情況隻使用一個模型,是以類比做Panda approach;第二種情況同時訓練多個模型,類比做Caviar approach。使用哪種模型是由計算資源、計算能力所決定的。一般來說,對于非常複雜或者資料量很大的模型,使用Panda approach更多一些。

4 Normalizing Activations in A Network

Sergey Ioffe和Christian Szegedy兩位學者提出了Batch Normalization方法。Batch Normalization不僅可以讓調試超參數更加簡單,而且可以讓神經網絡模型更加“健壯”。也就是說較好模型可接受的超參數範圍更大一些,包容性更強,使得更容易去訓練一個深度神經網絡。接下來,我們就來介紹什麼是Batch Normalization,以及它是如何工作的。

之前,我們在吳恩達《優化深度神經網絡》精煉筆記(1)中提到過在訓練神經網絡時,标準化輸入可以提高訓練的速度。方法是對訓練資料集進行歸一化的操作,即将原始資料減去其均值μ後,再除以其方差σ^2。但是标準化輸入隻是對輸入進行了處理,那麼對于神經網絡,又該如何對各隐藏層的輸入進行标準化處理呢?

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構
吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構
吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

5 Fitting Batch Norm into A Neural Network

我們已經知道了如何對某單一隐藏層的所有神經元進行Batch Norm,接下來将研究如何把Bath Norm應用到整個神經網絡中。

對于L層神經網絡,經過Batch Norm的作用,整體流程如下:

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構
實際上,Batch Norm經常使用在mini-batch上,這也是其名稱的由來。
吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

6 Why does Batch Norm work?

我們可以把輸入特征做均值為0,方差為1的規範化處理,來加快學習速度。而Batch Norm也是對隐藏層各神經元的輸入做類似的規範化處理。總的來說,Batch Norm不僅能夠提高神經網絡訓練速度,而且能讓神經網絡的權重W的更新更加“穩健”,尤其在深層神經網絡中更加明顯。比如神經網絡很後面的W對前面的W包容性更強,即前面的W的變化對後面W造成的影響很小,整體網絡更加健壯。

舉個例子來說明,假如用一個淺層神經網絡(類似邏輯回歸)來訓練識别貓的模型。如下圖所示,提供的所有貓的訓練樣本都是黑貓。然後,用這個訓練得到的模型來對各種顔色的貓樣本進行測試,測試的結果可能并不好。其原因是訓練樣本不具有一般性(即不是所有的貓都是黑貓),這種訓練樣本(黑貓)和測試樣本(貓)分布的變化稱之為covariate shift。

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構
吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構
吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

7 Batch Norm at Test Time

訓練過程中,Batch Norm是對單個mini-batch進行操作的,但在測試過程中,如果是單個樣本,該如何使用Batch Norm進行處理呢?

首先,回顧一下訓練過程中Batch Norm的主要過程:

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

8 Softmax Regression

目前我們介紹的都是二分類問題,神經網絡輸出層隻有一個神經元,表示預測輸出y^是正類的機率P(y=1|x),y^>0.5則判斷為正類,y^<0.5則判斷為負類。

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構
吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

9 Training a Softmax Classifier

Softmax classifier的訓練過程與我們之前介紹的二進制分類問題有所不同。先來看一下softmax classifier的loss function。舉例來說,假如C=4,某個樣本的預測輸出y^和真實輸出y為:

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構
吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構
吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

10 Deep Learning Frameworks

深度學習架構有很多,例如:

  • Caffe/Caffe2
  • CNTK
  • DL4J
  • Keras
  • Lasagne
  • mxnet
  • PaddlePaddle
  • TensorFlow
  • Theano
  • Torch

一般選擇深度學習架構的基本準則是:

  • Ease of programming(development and deployment)
  • Running speed
  • Truly open(open source with good governance)

實際應用中,我們應該根據自己的需求選擇最合适的深度學習架構。

11 TensorFlow

這裡簡單介紹一下最近幾年比較火的一個深度學習架構:TensorFlow。

舉個例子來說明,例如cost function是參數w的函數:

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

如果使用TensorFlow對cost function進行優化,求出最小值對應的w,程式如下:

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

TensorFlow架構内可以直接調用梯度下降優化算法,不需要我們自己再寫程式了,大大提高了效率。在運作1000次梯度下降算法後,w的解為4.99999,已經非常接近w的最優值5了。

針對上面這個例子,如果對w前的系數用變量x來代替,程式如下:

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

結果跟之前是一樣的。除此之外,我們還可以更改x即cofficients的值,而得到不同的優化結果w。

另外,上段程式中的:

吳恩達《優化深度神經網絡》精煉筆記(3)-- 超參數調試、Batch正則化和程式設計架構

TensorFlow的最大優點就是采用資料流圖(data flow graphs)來進行數值運算。圖中的節點(Nodes)表示數學操作,圖中的線(edges)則表示在節點間互相聯系的多元資料數組,即張量(tensor)。而且它靈活的架構讓你可以在多種平台上展開計算,例如台式計算機中的一個或多個CPU(或GPU),伺服器,移動裝置等等。

關于TensorFlow更多的原理和程式設計技巧這裡就不在贅述了,感興趣的朋友可以關注更詳細的TensorFlow相關文檔。