吴恩达《优化深度神经网络》精炼笔记(3)-- 超参数调试、Batch正则化和编程框架...
AI有道
不可錯(cuò)過的AI技術(shù)公眾號(hào)
關(guān)注
重要通知
本公眾號(hào)原名“紅色石頭的機(jī)器學(xué)習(xí)之路”已經(jīng)改名為“AI有道”,請(qǐng)大家留意并繼續(xù)關(guān)注本公眾號(hào)!謝謝!
上節(jié)課我們主要介紹了深度神經(jīng)網(wǎng)絡(luò)的優(yōu)化算法。包括對(duì)原始數(shù)據(jù)集進(jìn)行分割,使用mini-batch gradient descent。然后介紹了指數(shù)加權(quán)平均(Exponentially weighted averages)的概念以及偏移校正(bias correction)方法。接著,我們著重介紹了三種常用的加速神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)速度的三種算法:動(dòng)量梯度下降、RMSprop和Adam算法。
本節(jié)課,我們將重點(diǎn)介紹三個(gè)方面的內(nèi)容:超參數(shù)調(diào)試、Batch正則化和深度學(xué)習(xí)編程框架。
——前言
1
Tuning Process
深度神經(jīng)網(wǎng)絡(luò)需要調(diào)試的超參數(shù)(Hyperparameters)較多,包括:
超參數(shù)之間也有重要性差異。通常來說,學(xué)習(xí)因子α是最重要的超參數(shù),也是需要重點(diǎn)調(diào)試的超參數(shù)。動(dòng)量梯度下降因子β、各隱藏層神經(jīng)元個(gè)數(shù)#hidden units和mini-batch size的重要性僅次于α。然后就是神經(jīng)網(wǎng)絡(luò)層數(shù)#layers和學(xué)習(xí)因子下降參數(shù)learning rate decay。最后,Adam算法的三個(gè)參數(shù)β1,β2,ε一般常設(shè)置為0.9,0.999和10^?8,不需要反復(fù)調(diào)試。當(dāng)然,這里超參數(shù)重要性的排名并不是絕對(duì)的,具體情況,具體分析。
如何選擇和調(diào)試超參數(shù)?傳統(tǒng)的機(jī)器學(xué)習(xí)中,我們對(duì)每個(gè)參數(shù)等距離選取任意個(gè)數(shù)的點(diǎn),然后,分別使用不同點(diǎn)對(duì)應(yīng)的參數(shù)組合進(jìn)行訓(xùn)練,最后根據(jù)驗(yàn)證集上的表現(xiàn)好壞,來選定最佳的參數(shù)。例如有兩個(gè)待調(diào)試的參數(shù),分別在每個(gè)參數(shù)上選取5個(gè)點(diǎn),這樣構(gòu)成了5x5=25中參數(shù)組合,如下圖所示:
這種做法在參數(shù)比較少的時(shí)候效果較好。但是在深度神經(jīng)網(wǎng)絡(luò)模型中,我們一般不采用這種均勻間隔取點(diǎn)的方法,比較好的做法是使用隨機(jī)選擇。也就是說,對(duì)于上面這個(gè)例子,我們隨機(jī)選擇25個(gè)點(diǎn),作為待調(diào)試的超參數(shù),如下圖所示:
隨機(jī)化選擇參數(shù)的目的是為了盡可能地得到更多種參數(shù)組合。還是上面的例子,如果使用均勻采樣的話,每個(gè)參數(shù)只有5種情況;而使用隨機(jī)采樣的話,每個(gè)參數(shù)有25種可能的情況,因此更有可能得到最佳的參數(shù)組合。
這種做法帶來的另外一個(gè)好處就是對(duì)重要性不同的參數(shù)之間的選擇效果更好。假設(shè)hyperparameter1為α,hyperparameter2為ε,顯然二者的重要性是不一樣的。如果使用第一種均勻采樣的方法,ε的影響很小,相當(dāng)于只選擇了5個(gè)α值。而如果使用第二種隨機(jī)采樣的方法,ε和α都有可能選擇25種不同值。這大大增加了α調(diào)試的個(gè)數(shù),更有可能選擇到最優(yōu)值。其實(shí),在實(shí)際應(yīng)用中完全不知道哪個(gè)參數(shù)更加重要的情況下,隨機(jī)采樣的方式能有效解決這一問題,但是均勻采樣做不到這點(diǎn)。
在經(jīng)過隨機(jī)采樣之后,我們可能得到某些區(qū)域模型的表現(xiàn)較好。然而,為了得到更精確的最佳參數(shù),我們應(yīng)該繼續(xù)對(duì)選定的區(qū)域進(jìn)行由粗到細(xì)的采樣(coarse to fine sampling scheme)。也就是放大表現(xiàn)較好的區(qū)域,再對(duì)此區(qū)域做更密集的隨機(jī)采樣。例如,對(duì)下圖中右下角的方形區(qū)域再做25點(diǎn)的隨機(jī)采樣,以獲得最佳參數(shù)。
2
Using an Appropriate Scale to Pick Hyperparameters
上一部分講的調(diào)試參數(shù)使用隨機(jī)采樣,對(duì)于某些超參數(shù)是可以進(jìn)行尺度均勻采樣的,但是某些超參數(shù)需要選擇不同的合適尺度進(jìn)行隨機(jī)采樣。
什么意思呢?例如對(duì)于超參數(shù)#layers和#hidden units,都是正整數(shù),是可以進(jìn)行均勻隨機(jī)采樣的,即超參數(shù)每次變化的尺度都是一致的(如每次變化為1,猶如一個(gè)刻度尺一樣,刻度是均勻的)。
但是,對(duì)于某些超參數(shù),可能需要非均勻隨機(jī)采樣(即非均勻刻度尺)。例如超參數(shù)α,待調(diào)范圍是[0.0001, 1]。如果使用均勻隨機(jī)采樣,那么有90%的采樣點(diǎn)分布在[0.1, 1]之間,只有10%分布在[0.0001, 0.1]之間。這在實(shí)際應(yīng)用中是不太好的,因?yàn)樽罴训摩林悼赡苤饕植荚赱0.0001, 0.1]之間,而[0.1, 1]范圍內(nèi)α值效果并不好。因此我們更關(guān)注的是區(qū)間[0.0001, 0.1],應(yīng)該在這個(gè)區(qū)間內(nèi)細(xì)分更多刻度。
通常的做法是將linear scale轉(zhuǎn)換為log scale,將均勻尺度轉(zhuǎn)化為非均勻尺度,然后再在log scale下進(jìn)行均勻采樣。這樣,[0.0001, 0.001],[0.001, 0.01],[0.01, 0.1],[0.1, 1]各個(gè)區(qū)間內(nèi)隨機(jī)采樣的超參數(shù)個(gè)數(shù)基本一致,也就擴(kuò)大了之前[0.0001, 0.1]區(qū)間內(nèi)采樣值個(gè)數(shù)。
一般解法是,如果線性區(qū)間為[a, b],令m=log(a),n=log(b),則對(duì)應(yīng)的log區(qū)間為[m,n]。對(duì)log區(qū)間的[m,n]進(jìn)行隨機(jī)均勻采樣,然后得到的采樣值r,最后反推到線性區(qū)間,即10^r。10^r就是最終采樣的超參數(shù)。相應(yīng)的Python語句為:
m = np.log10(a) n = np.log10(b) r = np.random.rand() r = m + (n-m)*r r = np.power(10,r)除了α之外,動(dòng)量梯度因子β也是一樣,在超參數(shù)調(diào)試的時(shí)候也需要進(jìn)行非均勻采樣。一般β的取值范圍在[0.9, 0.999]之間,那么1?β的取值范圍就在[0.001, 0.1]之間。那么直接對(duì)1?β在[0.001, 0.1]區(qū)間內(nèi)進(jìn)行l(wèi)og變換即可。
這里解釋下為什么β也需要向α那樣做非均勻采樣。假設(shè)β從0.9000變化為0.9005,那么1/(1?β)基本沒有變化。但假設(shè)β從0.9990變化為0.9995,那么1/(1?β)前后差別1000。β越接近1,指數(shù)加權(quán)平均的個(gè)數(shù)越多,變化越大。所以對(duì)β接近1的區(qū)間,應(yīng)該采集得更密集一些。
3
Hyperparameters Tuning in Practice: Pandas vs. Caviar
經(jīng)過調(diào)試選擇完最佳的超參數(shù)并不是一成不變的,一段時(shí)間之后(例如一個(gè)月),需要根據(jù)新的數(shù)據(jù)和實(shí)際情況,再次調(diào)試超參數(shù),以獲得實(shí)時(shí)的最佳模型。
在訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)時(shí),一種情況是受計(jì)算能力所限,我們只能對(duì)一個(gè)模型進(jìn)行訓(xùn)練,調(diào)試不同的超參數(shù),使得這個(gè)模型有最佳的表現(xiàn)。我們稱之為Babysitting one model。另外一種情況是可以對(duì)多個(gè)模型同時(shí)進(jìn)行訓(xùn)練,每個(gè)模型上調(diào)試不同的超參數(shù),根據(jù)表現(xiàn)情況,選擇最佳的模型。我們稱之為Training many models in parallel。
因?yàn)榈谝环N情況只使用一個(gè)模型,所以類比做Panda approach;第二種情況同時(shí)訓(xùn)練多個(gè)模型,類比做Caviar approach。使用哪種模型是由計(jì)算資源、計(jì)算能力所決定的。一般來說,對(duì)于非常復(fù)雜或者數(shù)據(jù)量很大的模型,使用Panda approach更多一些。
4
Normalizing Activations in A Network
Sergey Ioffe和Christian Szegedy兩位學(xué)者提出了Batch Normalization方法。Batch Normalization不僅可以讓調(diào)試超參數(shù)更加簡(jiǎn)單,而且可以讓神經(jīng)網(wǎng)絡(luò)模型更加“健壯”。也就是說較好模型可接受的超參數(shù)范圍更大一些,包容性更強(qiáng),使得更容易去訓(xùn)練一個(gè)深度神經(jīng)網(wǎng)絡(luò)。接下來,我們就來介紹什么是Batch Normalization,以及它是如何工作的。
之前,我們?cè)趨嵌鬟_(dá)《優(yōu)化深度神經(jīng)網(wǎng)絡(luò)》精煉筆記(1)中提到過在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),標(biāo)準(zhǔn)化輸入可以提高訓(xùn)練的速度。方法是對(duì)訓(xùn)練數(shù)據(jù)集進(jìn)行歸一化的操作,即將原始數(shù)據(jù)減去其均值μ后,再除以其方差σ^2。但是標(biāo)準(zhǔn)化輸入只是對(duì)輸入進(jìn)行了處理,那么對(duì)于神經(jīng)網(wǎng)絡(luò),又該如何對(duì)各隱藏層的輸入進(jìn)行標(biāo)準(zhǔn)化處理呢?
5
Fitting Batch Norm into A Neural Network
我們已經(jīng)知道了如何對(duì)某單一隱藏層的所有神經(jīng)元進(jìn)行Batch Norm,接下來將研究如何把Bath Norm應(yīng)用到整個(gè)神經(jīng)網(wǎng)絡(luò)中。
對(duì)于L層神經(jīng)網(wǎng)絡(luò),經(jīng)過Batch Norm的作用,整體流程如下:
實(shí)際上,Batch Norm經(jīng)常使用在mini-batch上,這也是其名稱的由來。
6
Why does Batch Norm work?
我們可以把輸入特征做均值為0,方差為1的規(guī)范化處理,來加快學(xué)習(xí)速度。而Batch Norm也是對(duì)隱藏層各神經(jīng)元的輸入做類似的規(guī)范化處理。總的來說,Batch Norm不僅能夠提高神經(jīng)網(wǎng)絡(luò)訓(xùn)練速度,而且能讓神經(jīng)網(wǎng)絡(luò)的權(quán)重W的更新更加“穩(wěn)健”,尤其在深層神經(jīng)網(wǎng)絡(luò)中更加明顯。比如神經(jīng)網(wǎng)絡(luò)很后面的W對(duì)前面的W包容性更強(qiáng),即前面的W的變化對(duì)后面W造成的影響很小,整體網(wǎng)絡(luò)更加健壯。
舉個(gè)例子來說明,假如用一個(gè)淺層神經(jīng)網(wǎng)絡(luò)(類似邏輯回歸)來訓(xùn)練識(shí)別貓的模型。如下圖所示,提供的所有貓的訓(xùn)練樣本都是黑貓。然后,用這個(gè)訓(xùn)練得到的模型來對(duì)各種顏色的貓樣本進(jìn)行測(cè)試,測(cè)試的結(jié)果可能并不好。其原因是訓(xùn)練樣本不具有一般性(即不是所有的貓都是黑貓),這種訓(xùn)練樣本(黑貓)和測(cè)試樣本(貓)分布的變化稱之為covariate shift。
從另一個(gè)方面來說,Batch Norm也起到輕微的正則化(regularization)效果。具體表現(xiàn)在:
但是,Batch Norm的正則化效果比較微弱,正則化也不是Batch Norm的主要功能。
7
Batch Norm at Test Time
訓(xùn)練過程中,Batch Norm是對(duì)單個(gè)mini-batch進(jìn)行操作的,但在測(cè)試過程中,如果是單個(gè)樣本,該如何使用Batch Norm進(jìn)行處理呢?
首先,回顧一下訓(xùn)練過程中Batch Norm的主要過程:
8
Softmax Regression
目前我們介紹的都是二分類問題,神經(jīng)網(wǎng)絡(luò)輸出層只有一個(gè)神經(jīng)元,表示預(yù)測(cè)輸出y^是正類的概率P(y=1|x),y^>0.5則判斷為正類,y^<0.5則判斷為負(fù)類。
下面給出幾個(gè)簡(jiǎn)單的線性多分類的例子:
如果使用神經(jīng)網(wǎng)絡(luò),特別是深層神經(jīng)網(wǎng)絡(luò),可以得到更復(fù)雜、更精確的非線性模型。
9
Training a Softmax Classifier
Softmax classifier的訓(xùn)練過程與我們之前介紹的二元分類問題有所不同。先來看一下softmax classifier的loss function。舉例來說,假如C=4,某個(gè)樣本的預(yù)測(cè)輸出y^和真實(shí)輸出y為:
從y^值來看,P(y=4|x)=0.4,概率最大,而真實(shí)樣本屬于第2類,因此該預(yù)測(cè)效果不佳。我們定義softmax classifier的loss function為:
所有m個(gè)樣本的cost function為:
對(duì)于所有m個(gè)訓(xùn)練樣本:
10
Deep Learning Frameworks
深度學(xué)習(xí)框架有很多,例如:
Caffe/Caffe2
CNTK
DL4J
Keras
Lasagne
mxnet
PaddlePaddle
TensorFlow
Theano
Torch
一般選擇深度學(xué)習(xí)框架的基本準(zhǔn)則是:
Ease of programming(development and deployment)
Running speed
Truly open(open source with good governance)
實(shí)際應(yīng)用中,我們應(yīng)該根據(jù)自己的需求選擇最合適的深度學(xué)習(xí)框架。
11
TensorFlow
這里簡(jiǎn)單介紹一下最近幾年比較火的一個(gè)深度學(xué)習(xí)框架:TensorFlow。
舉個(gè)例子來說明,例如cost function是參數(shù)w的函數(shù):
如果使用TensorFlow對(duì)cost function進(jìn)行優(yōu)化,求出最小值對(duì)應(yīng)的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框架內(nèi)可以直接調(diào)用梯度下降優(yōu)化算法,不需要我們自己再寫程序了,大大提高了效率。在運(yùn)行1000次梯度下降算法后,w的解為4.99999,已經(jīng)非常接近w的最優(yōu)值5了。
針對(duì)上面這個(gè)例子,如果對(duì)w前的系數(shù)用變量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結(jié)果跟之前是一樣的。除此之外,我們還可以更改x即cofficients的值,而得到不同的優(yōu)化結(jié)果w。
另外,上段程序中的:
session = tf.Session() session.run(init) print(session.run(w))with tf.Session() as session: session.run(init) print(session.run(w))TensorFlow的最大優(yōu)點(diǎn)就是采用數(shù)據(jù)流圖(data flow graphs)來進(jìn)行數(shù)值運(yùn)算。圖中的節(jié)點(diǎn)(Nodes)表示數(shù)學(xué)操作,圖中的線(edges)則表示在節(jié)點(diǎn)間相互聯(lián)系的多維數(shù)據(jù)數(shù)組,即張量(tensor)。而且它靈活的架構(gòu)讓你可以在多種平臺(tái)上展開計(jì)算,例如臺(tái)式計(jì)算機(jī)中的一個(gè)或多個(gè)CPU(或GPU),服務(wù)器,移動(dòng)設(shè)備等等。
關(guān)于TensorFlow更多的原理和編程技巧這里就不在贅述了,感興趣的朋友可以關(guān)注更詳細(xì)的TensorFlow相關(guān)文檔。
喜歡就請(qǐng)贊賞或轉(zhuǎn)發(fā)分享一下吧
往 期 推 薦
【1】吳恩達(dá)《優(yōu)化深度神經(jīng)網(wǎng)絡(luò)》精煉筆記(1)-- 深度學(xué)習(xí)的實(shí)用層面
【2】吳恩達(dá)《優(yōu)化深度神經(jīng)網(wǎng)絡(luò)》精煉筆記(2)-- 優(yōu)化算法
【3】干貨|機(jī)器學(xué)習(xí)基石精選文章鏈接
【4】機(jī)器學(xué)習(xí)中的維度災(zāi)難
長(zhǎng)按二維碼掃描關(guān)注
AI有道
ID:redstonewill
紅色石頭
個(gè)人微信 : WillowRedstone
新浪微博:@RedstoneWill
總結(jié)
以上是生活随笔為你收集整理的吴恩达《优化深度神经网络》精炼笔记(3)-- 超参数调试、Batch正则化和编程框架...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解析Winndows 2000/XP物理
- 下一篇: 有的人能轻松学会Python编程,不是基