吴恩达《优化深度神经网络》精炼笔记(3)-- 超参数调试、Batch正则化和编程框架...
AI有道
不可錯過的AI技術公眾號
關注
重要通知
本公眾號原名“紅色石頭的機器學習之路”已經改名為“AI有道”,請大家留意并繼續關注本公眾號!謝謝!
上節課我們主要介紹了深度神經網絡的優化算法。包括對原始數據集進行分割,使用mini-batch gradient descent。然后介紹了指數加權平均(Exponentially weighted averages)的概念以及偏移校正(bias correction)方法。接著,我們著重介紹了三種常用的加速神經網絡學習速度的三種算法:動量梯度下降、RMSprop和Adam算法。
本節課,我們將重點介紹三個方面的內容:超參數調試、Batch正則化和深度學習編程框架。
——前言
1
Tuning Process
深度神經網絡需要調試的超參數(Hyperparameters)較多,包括:
超參數之間也有重要性差異。通常來說,學習因子α是最重要的超參數,也是需要重點調試的超參數。動量梯度下降因子β、各隱藏層神經元個數#hidden units和mini-batch size的重要性僅次于α。然后就是神經網絡層數#layers和學習因子下降參數learning rate decay。最后,Adam算法的三個參數β1,β2,ε一般常設置為0.9,0.999和10^?8,不需要反復調試。當然,這里超參數重要性的排名并不是絕對的,具體情況,具體分析。
如何選擇和調試超參數?傳統的機器學習中,我們對每個參數等距離選取任意個數的點,然后,分別使用不同點對應的參數組合進行訓練,最后根據驗證集上的表現好壞,來選定最佳的參數。例如有兩個待調試的參數,分別在每個參數上選取5個點,這樣構成了5x5=25中參數組合,如下圖所示:
這種做法在參數比較少的時候效果較好。但是在深度神經網絡模型中,我們一般不采用這種均勻間隔取點的方法,比較好的做法是使用隨機選擇。也就是說,對于上面這個例子,我們隨機選擇25個點,作為待調試的超參數,如下圖所示:
隨機化選擇參數的目的是為了盡可能地得到更多種參數組合。還是上面的例子,如果使用均勻采樣的話,每個參數只有5種情況;而使用隨機采樣的話,每個參數有25種可能的情況,因此更有可能得到最佳的參數組合。
這種做法帶來的另外一個好處就是對重要性不同的參數之間的選擇效果更好。假設hyperparameter1為α,hyperparameter2為ε,顯然二者的重要性是不一樣的。如果使用第一種均勻采樣的方法,ε的影響很小,相當于只選擇了5個α值。而如果使用第二種隨機采樣的方法,ε和α都有可能選擇25種不同值。這大大增加了α調試的個數,更有可能選擇到最優值。其實,在實際應用中完全不知道哪個參數更加重要的情況下,隨機采樣的方式能有效解決這一問題,但是均勻采樣做不到這點。
在經過隨機采樣之后,我們可能得到某些區域模型的表現較好。然而,為了得到更精確的最佳參數,我們應該繼續對選定的區域進行由粗到細的采樣(coarse to fine sampling scheme)。也就是放大表現較好的區域,再對此區域做更密集的隨機采樣。例如,對下圖中右下角的方形區域再做25點的隨機采樣,以獲得最佳參數。
2
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]區間內采樣值個數。
一般解法是,如果線性區間為[a, b],令m=log(a),n=log(b),則對應的log區間為[m,n]。對log區間的[m,n]進行隨機均勻采樣,然后得到的采樣值r,最后反推到線性區間,即10^r。10^r就是最終采樣的超參數。相應的Python語句為:
m = np.log10(a) n = np.log10(b) r = np.random.rand() r = m + (n-m)*r r = np.power(10,r)除了α之外,動量梯度因子β也是一樣,在超參數調試的時候也需要進行非均勻采樣。一般β的取值范圍在[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。
因為第一種情況只使用一個模型,所以類比做Panda approach;第二種情況同時訓練多個模型,類比做Caviar approach。使用哪種模型是由計算資源、計算能力所決定的。一般來說,對于非常復雜或者數據量很大的模型,使用Panda approach更多一些。
4
Normalizing Activations in A Network
Sergey Ioffe和Christian Szegedy兩位學者提出了Batch Normalization方法。Batch Normalization不僅可以讓調試超參數更加簡單,而且可以讓神經網絡模型更加“健壯”。也就是說較好模型可接受的超參數范圍更大一些,包容性更強,使得更容易去訓練一個深度神經網絡。接下來,我們就來介紹什么是Batch Normalization,以及它是如何工作的。
之前,我們在吳恩達《優化深度神經網絡》精煉筆記(1)中提到過在訓練神經網絡時,標準化輸入可以提高訓練的速度。方法是對訓練數據集進行歸一化的操作,即將原始數據減去其均值μ后,再除以其方差σ^2。但是標準化輸入只是對輸入進行了處理,那么對于神經網絡,又該如何對各隱藏層的輸入進行標準化處理呢?
5
Fitting Batch Norm into A Neural Network
我們已經知道了如何對某單一隱藏層的所有神經元進行Batch Norm,接下來將研究如何把Bath Norm應用到整個神經網絡中。
對于L層神經網絡,經過Batch Norm的作用,整體流程如下:
實際上,Batch Norm經常使用在mini-batch上,這也是其名稱的由來。
6
Why does Batch Norm work?
我們可以把輸入特征做均值為0,方差為1的規范化處理,來加快學習速度。而Batch Norm也是對隱藏層各神經元的輸入做類似的規范化處理。總的來說,Batch Norm不僅能夠提高神經網絡訓練速度,而且能讓神經網絡的權重W的更新更加“穩健”,尤其在深層神經網絡中更加明顯。比如神經網絡很后面的W對前面的W包容性更強,即前面的W的變化對后面W造成的影響很小,整體網絡更加健壯。
舉個例子來說明,假如用一個淺層神經網絡(類似邏輯回歸)來訓練識別貓的模型。如下圖所示,提供的所有貓的訓練樣本都是黑貓。然后,用這個訓練得到的模型來對各種顏色的貓樣本進行測試,測試的結果可能并不好。其原因是訓練樣本不具有一般性(即不是所有的貓都是黑貓),這種訓練樣本(黑貓)和測試樣本(貓)分布的變化稱之為covariate shift。
從另一個方面來說,Batch Norm也起到輕微的正則化(regularization)效果。具體表現在:
但是,Batch Norm的正則化效果比較微弱,正則化也不是Batch Norm的主要功能。
7
Batch Norm at Test Time
訓練過程中,Batch Norm是對單個mini-batch進行操作的,但在測試過程中,如果是單個樣本,該如何使用Batch Norm進行處理呢?
首先,回顧一下訓練過程中Batch Norm的主要過程:
8
Softmax Regression
目前我們介紹的都是二分類問題,神經網絡輸出層只有一個神經元,表示預測輸出y^是正類的概率P(y=1|x),y^>0.5則判斷為正類,y^<0.5則判斷為負類。
下面給出幾個簡單的線性多分類的例子:
如果使用神經網絡,特別是深層神經網絡,可以得到更復雜、更精確的非線性模型。
9
Training a Softmax Classifier
Softmax classifier的訓練過程與我們之前介紹的二元分類問題有所不同。先來看一下softmax classifier的loss function。舉例來說,假如C=4,某個樣本的預測輸出y^和真實輸出y為:
從y^值來看,P(y=4|x)=0.4,概率最大,而真實樣本屬于第2類,因此該預測效果不佳。我們定義softmax classifier的loss function為:
所有m個樣本的cost function為:
對于所有m個訓練樣本:
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的函數:
如果使用TensorFlow對cost function進行優化,求出最小值對應的w,程序如下:
import numpy as np import tensorflow as tf w = tf.Variable(0,dtype=tf.float32) #cost = tf.add(tf.add(w**2,tf.multiply(-10,w)),25) cost = w**2 - 10*w +25 train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) init = tf.global_variables_initializer() session = tf.Session() session.run(init) print(session.run(w))>>0.0session.run(train) print(session.run(w)) >>0.1for i in range(1000): session.run(train) print(session.run(w)) >>4.99999TensorFlow框架內可以直接調用梯度下降優化算法,不需要我們自己再寫程序了,大大提高了效率。在運行1000次梯度下降算法后,w的解為4.99999,已經非常接近w的最優值5了。
針對上面這個例子,如果對w前的系數用變量x來代替,程序如下:
import numpy as np import tensorflow as tf cofficients = np.array([[1.],[-10.],[25.]]) w = tf.Variable(0,dtype=tf.float32) x = tf.placeholder(tf.float32,[3,1]) #cost = tf.add(tf.add(w**2,tf.multiply(-10,w)),25) #cost = w**2 - 10*w +25 cost = x[0][0]*w**2 + x[1][0]*w + x[2][0] train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) init = tf.global_variables_initializer() session = tf.Session() session.run(init) print(session.run(w)) >>0.0session.run(train, feed_dict=(x:coefficients)) print(session.run(w)) >>0.1for i in range(1000): session.run(train, feed_dict=(x:coefficients)) print(session.run(w)) >>4.99999結果跟之前是一樣的。除此之外,我們還可以更改x即cofficients的值,而得到不同的優化結果w。
另外,上段程序中的:
session = tf.Session() session.run(init) print(session.run(w))with tf.Session() as session: session.run(init) print(session.run(w))TensorFlow的最大優點就是采用數據流圖(data flow graphs)來進行數值運算。圖中的節點(Nodes)表示數學操作,圖中的線(edges)則表示在節點間相互聯系的多維數據數組,即張量(tensor)。而且它靈活的架構讓你可以在多種平臺上展開計算,例如臺式計算機中的一個或多個CPU(或GPU),服務器,移動設備等等。
關于TensorFlow更多的原理和編程技巧這里就不在贅述了,感興趣的朋友可以關注更詳細的TensorFlow相關文檔。
喜歡就請贊賞或轉發分享一下吧
往 期 推 薦
【1】吳恩達《優化深度神經網絡》精煉筆記(1)-- 深度學習的實用層面
【2】吳恩達《優化深度神經網絡》精煉筆記(2)-- 優化算法
【3】干貨|機器學習基石精選文章鏈接
【4】機器學習中的維度災難
長按二維碼掃描關注
AI有道
ID:redstonewill
紅色石頭
個人微信 : WillowRedstone
新浪微博:@RedstoneWill
總結
以上是生活随笔為你收集整理的吴恩达《优化深度神经网络》精炼笔记(3)-- 超参数调试、Batch正则化和编程框架...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解析Winndows 2000/XP物理
- 下一篇: 超实用编程技术指南!为什么你还学不会一门