吴恩达《优化深度神经网络》精炼笔记(1)-- 深度学习的实用层面
AI有道
不可錯(cuò)過(guò)的AI技術(shù)公眾號(hào)
關(guān)注
吳恩達(dá)的深度學(xué)習(xí)專項(xiàng)課程的第一門課《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》的所有精煉筆記我已經(jīng)整理完畢。迷路的小伙伴請(qǐng)見(jiàn)文章末尾的推薦閱讀:
在接下來(lái)的幾次筆記中,我們將對(duì)第二門課《優(yōu)化深度神經(jīng)網(wǎng)絡(luò)》進(jìn)行筆記總結(jié)和整理。我們?cè)诘谝婚T課中已經(jīng)學(xué)習(xí)了如何建立一個(gè)神經(jīng)網(wǎng)絡(luò),或者淺層的,或者深度的。而這第二門課,我們將著重討論和研究如何優(yōu)化神經(jīng)網(wǎng)絡(luò)模型,例如調(diào)整超參數(shù),提高算法運(yùn)行速度等等。開始吧~
——前言
1
Train/Dev/Test sets
選擇最佳的訓(xùn)練集(Training sets)、驗(yàn)證集(Development sets)、測(cè)試集(Test sets)對(duì)神經(jīng)網(wǎng)絡(luò)的性能影響非常重要。除此之外,在構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò)的時(shí)候,我們需要設(shè)置許多參數(shù),例如神經(jīng)網(wǎng)絡(luò)的層數(shù)、每個(gè)隱藏層包含的神經(jīng)元個(gè)數(shù)、學(xué)習(xí)因子(學(xué)習(xí)速率)、激活函數(shù)的選擇等等。實(shí)際上很難在第一次設(shè)置的時(shí)候就選擇到這些最佳的參數(shù),而是需要通過(guò)不斷地迭代更新來(lái)獲得。這個(gè)循環(huán)迭代的過(guò)程是這樣的:我們先有個(gè)想法Idea,先選擇初始的參數(shù)值,構(gòu)建神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu);然后通過(guò)代碼Code的形式,實(shí)現(xiàn)這個(gè)神經(jīng)網(wǎng)絡(luò);最后,通過(guò)實(shí)驗(yàn)Experiment驗(yàn)證這些參數(shù)對(duì)應(yīng)的神經(jīng)網(wǎng)絡(luò)的表現(xiàn)性能。根據(jù)驗(yàn)證結(jié)果,我們對(duì)參數(shù)進(jìn)行適當(dāng)?shù)恼{(diào)整優(yōu)化,再進(jìn)行下一次的Idea->Code->Experiment循環(huán)。通過(guò)很多次的循環(huán),不斷調(diào)整參數(shù),選定最佳的參數(shù)值,從而讓神經(jīng)網(wǎng)絡(luò)性能最優(yōu)化。
深度學(xué)習(xí)已經(jīng)應(yīng)用于許多領(lǐng)域中,比如NLP,CV,Speech Recognition等等。通常來(lái)說(shuō),最適合某個(gè)領(lǐng)域的深度學(xué)習(xí)網(wǎng)絡(luò)往往不能直接應(yīng)用在其它問(wèn)題上。解決不同問(wèn)題的最佳選擇是根據(jù)樣本數(shù)量、輸入特征數(shù)量和電腦配置信息(GPU或者CPU)等,來(lái)選擇最合適的模型。即使是最有經(jīng)驗(yàn)的深度學(xué)習(xí)專家也很難第一次就找到最合適的參數(shù)。因此,應(yīng)用深度學(xué)習(xí)是一個(gè)反復(fù)迭代的過(guò)程,需要通過(guò)反復(fù)多次的循環(huán)訓(xùn)練得到最優(yōu)化參數(shù)。決定整個(gè)訓(xùn)練過(guò)程快慢的關(guān)鍵在于單次循環(huán)所花費(fèi)的時(shí)間,單次循環(huán)越快,訓(xùn)練過(guò)程越快。而設(shè)置合適的Train/Dev/Test sets數(shù)量,能有效提高訓(xùn)練效率。
一般地,我們將所有的樣本數(shù)據(jù)分成三個(gè)部分:Train/Dev/Test sets。訓(xùn)練集(Train sets)用來(lái)訓(xùn)練你的算法模型;驗(yàn)證集(Dev sets)用來(lái)驗(yàn)證不同算法的表現(xiàn)情況,從中選擇最好的算法模型;測(cè)試集(Test sets)用來(lái)測(cè)試最好算法的實(shí)際表現(xiàn),作為該算法的無(wú)偏估計(jì)。
之前人們通常設(shè)置Train sets和Test sets的數(shù)量比例為70%和30%。如果有Dev sets,則設(shè)置比例為60%、20%、20%,分別對(duì)應(yīng)Train/Dev/Test sets。這種比例分配在樣本數(shù)量不是很大的情況下,例如100,1000,10000,是比較科學(xué)的。但是如果數(shù)據(jù)量很大的時(shí)候,例如100萬(wàn),這種比例分配就不太合適了。科學(xué)的做法是要將Dev sets和Test sets的比例設(shè)置得很低。因?yàn)镈ev sets的目標(biāo)是用來(lái)比較驗(yàn)證不同算法的優(yōu)劣,從而選擇更好的算法模型就行了。因此,通常不需要所有樣本的20%這么多的數(shù)據(jù)來(lái)進(jìn)行驗(yàn)證。對(duì)于100萬(wàn)的樣本,往往只需要10000個(gè)樣本來(lái)做驗(yàn)證就夠了。Test sets也是一樣,目標(biāo)是測(cè)試已選算法的實(shí)際表現(xiàn),無(wú)偏估計(jì)。對(duì)于100萬(wàn)的樣本,往往也只需要10000個(gè)樣本就夠了。因此,對(duì)于大數(shù)據(jù)樣本,Train/Dev/Test sets的比例通常可以設(shè)置為98%/1%/1%,或者99%/0.5%/0.5%。樣本數(shù)據(jù)量越大,相應(yīng)的Dev/Test sets的比例可以設(shè)置的越低一些。
現(xiàn)代深度學(xué)習(xí)還有個(gè)重要的問(wèn)題就是訓(xùn)練樣本和測(cè)試樣本分布上不匹配,意思是訓(xùn)練樣本和測(cè)試樣本來(lái)自于不同的分布。舉個(gè)例子,假設(shè)你開發(fā)一個(gè)手機(jī)app,可以讓用戶上傳圖片,然后app識(shí)別出貓的圖片。在app識(shí)別算法中,你的訓(xùn)練樣本可能來(lái)自網(wǎng)絡(luò)下載,而你的驗(yàn)證和測(cè)試樣本可能來(lái)自不同用戶的上傳。從網(wǎng)絡(luò)下載的圖片一般像素較高而且比較正規(guī),而用戶上傳的圖片往往像素不穩(wěn)定,且圖片質(zhì)量不一。因此,訓(xùn)練樣本和驗(yàn)證/測(cè)試樣本可能來(lái)自不同的分布。解決這一問(wèn)題的比較科學(xué)的辦法是盡量保證Dev sets和Test sets來(lái)自于同一分布。值得一提的是,訓(xùn)練樣本非常重要,通常我們可以將現(xiàn)有的訓(xùn)練樣本做一些處理,例如圖片的翻轉(zhuǎn)、假如隨機(jī)噪聲等,來(lái)擴(kuò)大訓(xùn)練樣本的數(shù)量,從而讓該模型更加強(qiáng)大。即使Train sets和Dev/Test sets不來(lái)自同一分布,使用這些技巧也能提高模型性能。
最后提一點(diǎn)的是如果沒(méi)有Test sets也是沒(méi)有問(wèn)題的。Test sets的目標(biāo)主要是進(jìn)行無(wú)偏估計(jì)。我們可以通過(guò)Train sets訓(xùn)練不同的算法模型,然后分別在Dev sets上進(jìn)行驗(yàn)證,根據(jù)結(jié)果選擇最好的算法模型。這樣也是可以的,不需要再進(jìn)行無(wú)偏估計(jì)了。如果只有Train sets和Dev sets,通常也有人把這里的Dev sets稱為Test sets,我們要注意加以區(qū)別。
2
Bias/Variance
偏差(Bias)和方差(Variance)是機(jī)器學(xué)習(xí)領(lǐng)域非常重要的兩個(gè)概念和需要解決的問(wèn)題。在傳統(tǒng)的機(jī)器學(xué)習(xí)算法中,Bias和Variance是對(duì)立的,分別對(duì)應(yīng)著欠擬合和過(guò)擬合,我們常常需要在Bias和Variance之間進(jìn)行權(quán)衡。而在深度學(xué)習(xí)中,我們可以同時(shí)減小Bias和Variance,構(gòu)建最佳神經(jīng)網(wǎng)絡(luò)模型。
如下圖所示,顯示了二維平面上,high bias,just right,high variance的例子。可見(jiàn),high bias對(duì)應(yīng)著欠擬合,而high variance對(duì)應(yīng)著過(guò)擬合。
上圖這個(gè)例子中輸入特征是二維的,high bias和high variance可以直接從圖中分類線看出來(lái)。而對(duì)于輸入特征是高維的情況,如何來(lái)判斷是否出現(xiàn)了high bias或者h(yuǎn)igh variance呢?
例如貓識(shí)別問(wèn)題,輸入是一幅圖像,其特征維度很大。這種情況下,我們可以通過(guò)兩個(gè)數(shù)值Train set error和Dev set error來(lái)理解bias和variance。假設(shè)Train set error為1%,而Dev set error為11%,即該算法模型對(duì)訓(xùn)練樣本的識(shí)別很好,但是對(duì)驗(yàn)證集的識(shí)別卻不太好。這說(shuō)明了該模型對(duì)訓(xùn)練樣本可能存在過(guò)擬合,模型泛化能力不強(qiáng),導(dǎo)致驗(yàn)證集識(shí)別率低。這恰恰是high variance的表現(xiàn)。假設(shè)Train set error為15%,而Dev set error為16%,雖然二者error接近,即該算法模型對(duì)訓(xùn)練樣本和驗(yàn)證集的識(shí)別都不是太好。這說(shuō)明了該模型對(duì)訓(xùn)練樣本存在欠擬合。這恰恰是high bias的表現(xiàn)。假設(shè)Train set error為15%,而Dev set error為30%,說(shuō)明了該模型既存在high bias也存在high variance(深度學(xué)習(xí)中最壞的情況)。再假設(shè)Train set error為0.5%,而Dev set error為1%,即low bias和low variance,是最好的情況。值得一提的是,以上的這些假設(shè)都是建立在base error是0的基礎(chǔ)上,即人類都能正確識(shí)別所有貓類圖片。base error不同,相應(yīng)的Train set error和Dev set error會(huì)有所變化,但沒(méi)有相對(duì)變化。
一般來(lái)說(shuō),Train set error體現(xiàn)了是否出現(xiàn)bias,Dev set error體現(xiàn)了是否出現(xiàn)variance(正確地說(shuō),應(yīng)該是Dev set error與Train set error的相對(duì)差值)。
我們已經(jīng)通過(guò)二維平面展示了high bias或者h(yuǎn)igh variance的模型,下圖展示了high bias and high variance的模型:
模型既存在high bias也存在high variance,可以理解成某段區(qū)域是欠擬合的,某段區(qū)域是過(guò)擬合的。
3
Basic Recipe for Machine Learning
機(jī)器學(xué)習(xí)中基本的一個(gè)訣竅就是避免出現(xiàn)high bias和high variance。首先,減少high bias的方法通常是增加神經(jīng)網(wǎng)絡(luò)的隱藏層個(gè)數(shù)、神經(jīng)元個(gè)數(shù),訓(xùn)練時(shí)間延長(zhǎng),選擇其它更復(fù)雜的NN模型等。在base error不高的情況下,一般都能通過(guò)這些方式有效降低和避免high bias,至少在訓(xùn)練集上表現(xiàn)良好。其次,減少high variance的方法通常是增加訓(xùn)練樣本數(shù)據(jù),進(jìn)行正則化Regularization,選擇其他更復(fù)雜的NN模型等。
這里有幾點(diǎn)需要注意的。第一,解決high bias和high variance的方法是不同的。實(shí)際應(yīng)用中通過(guò)Train set error和Dev set error判斷是否出現(xiàn)了high bias或者h(yuǎn)igh variance,然后再選擇針對(duì)性的方法解決問(wèn)題。
第二,Bias和Variance的折中tradeoff。傳統(tǒng)機(jī)器學(xué)習(xí)算法中,Bias和Variance通常是對(duì)立的,減小Bias會(huì)增加Variance,減小Variance會(huì)增加Bias。而在現(xiàn)在的深度學(xué)習(xí)中,通過(guò)使用更復(fù)雜的神經(jīng)網(wǎng)絡(luò)和海量的訓(xùn)練樣本,一般能夠同時(shí)有效減小Bias和Variance。這也是深度學(xué)習(xí)之所以如此強(qiáng)大的原因之一。
4
Regularization
如果出現(xiàn)了過(guò)擬合,即high variance,則需要采用正則化(regularization)來(lái)解決。雖然擴(kuò)大訓(xùn)練樣本數(shù)量也是減小high variance的一種方法,但是通常獲得更多訓(xùn)練樣本的成本太高,比較困難。所以,更可行有效的辦法就是使用regularization。
我們先來(lái)回顧一下之前介紹的Logistic regression。采用L2 regularization,其表達(dá)式為:
這里有個(gè)問(wèn)題:為什么只對(duì)w進(jìn)行正則化而不對(duì)b進(jìn)行正則化呢?其實(shí)也可以對(duì)b進(jìn)行正則化。但是一般w的維度很大,而b只是一個(gè)常數(shù)。相比較來(lái)說(shuō),參數(shù)很大程度上由w決定,改變b值對(duì)整體模型影響較小。所以,一般為了簡(jiǎn)便,就忽略對(duì)b的正則化了。
除了L2 regularization之外,還有另外一只正則化方法:L1 regularization。其表達(dá)式為:
與L2 regularization相比,L1 regularization得到的w更加稀疏,即很多w為零值。其優(yōu)點(diǎn)是節(jié)約存儲(chǔ)空間,因?yàn)榇蟛糠謜為0。然而,實(shí)際上L1 regularization在解決high variance方面比L2 regularization并不更具優(yōu)勢(shì)。而且,L1的在微分求導(dǎo)方面比較復(fù)雜。所以,一般L2 regularization更加常用。
L1、L2 regularization中的λ就是正則化參數(shù)(超參數(shù)的一種)。可以設(shè)置λ為不同的值,在Dev set中進(jìn)行驗(yàn)證,選擇最佳的λ。順便提一下,在python中,由于lambda是保留字,所以為了避免沖突,我們使用lambd來(lái)表示λ。
在深度學(xué)習(xí)模型中,L2 regularization的表達(dá)式為:
5
Why regularization reduces overfitting
為什么正則化能夠有效避免high variance,防止過(guò)擬合呢?下面我們通過(guò)幾個(gè)例子說(shuō)明。
還是之前那張圖,從左到右,分別表示了欠擬合,剛好擬合,過(guò)擬合三種情況。
因此,選擇合適大小的λλ值,就能夠同時(shí)避免high bias和high variance,得到最佳模型。
6
Dropout Regularization
除了L2 regularization之外,還有另外一種防止過(guò)擬合的有效方法:Dropout。
Dropout是指在深度學(xué)習(xí)網(wǎng)絡(luò)的訓(xùn)練過(guò)程中,對(duì)于每層的神經(jīng)元,按照一定的概率將其暫時(shí)從網(wǎng)絡(luò)中丟棄。也就是說(shuō),每次訓(xùn)練時(shí),每一層都有部分神經(jīng)元不工作,起到簡(jiǎn)化復(fù)雜網(wǎng)絡(luò)模型的效果,從而避免發(fā)生過(guò)擬合。
Dropout有不同的實(shí)現(xiàn)方法,接下來(lái)介紹一種常用的方法:Inverted dropout。假設(shè)對(duì)于第l層神經(jīng)元,設(shè)定保留神經(jīng)元比例概率keep_prob=0.8,即該層有20%的神經(jīng)元停止工作。dl為dropout向量,設(shè)置dl為隨機(jī)vector,其中80%的元素為1,20%的元素為0。在python中可以使用如下語(yǔ)句生成dropout vector:
dl = np.random.rand(al.shape[0],al.shape[1])<keep_prob然后,第l層經(jīng)過(guò)dropout,隨機(jī)刪減20%的神經(jīng)元,只保留80%的神經(jīng)元,其輸出為:
al = np.multiply(al,dl)最后,還要對(duì)alal進(jìn)行scale up處理,即:
al /= keep_prob以上就是Inverted dropout的方法。之所以要對(duì)al進(jìn)行scale up是為了保證在經(jīng)過(guò)dropout后,al作為下一層神經(jīng)元的輸入值盡量保持不變。假設(shè)第l層有50個(gè)神經(jīng)元,經(jīng)過(guò)dropout后,有10個(gè)神經(jīng)元停止工作,這樣只有40神經(jīng)元有作用。那么得到的al只相當(dāng)于原來(lái)的80%。scale up后,能夠盡可能保持al的期望值相比之前沒(méi)有大的變化。
Inverted dropout的另外一個(gè)好處就是在對(duì)該dropout后的神經(jīng)網(wǎng)絡(luò)進(jìn)行測(cè)試時(shí)能夠減少scaling問(wèn)題。因?yàn)樵谟?xùn)練時(shí),使用scale up保證al的期望值沒(méi)有大的變化,測(cè)試時(shí)就不需要再對(duì)樣本數(shù)據(jù)進(jìn)行類似的尺度伸縮操作了。
對(duì)于m個(gè)樣本,單次迭代訓(xùn)練時(shí),隨機(jī)刪除掉隱藏層一定數(shù)量的神經(jīng)元;然后,在刪除后的剩下的神經(jīng)元上正向和反向更新權(quán)重w和常數(shù)項(xiàng)b;接著,下一次迭代中,再恢復(fù)之前刪除的神經(jīng)元,重新隨機(jī)刪除一定數(shù)量的神經(jīng)元,進(jìn)行正向和反向更新w和b。不斷重復(fù)上述過(guò)程,直至迭代訓(xùn)練完成。
值得注意的是,使用dropout訓(xùn)練結(jié)束后,在測(cè)試和實(shí)際應(yīng)用模型時(shí),不需要進(jìn)行dropout和隨機(jī)刪減神經(jīng)元,所有的神經(jīng)元都在工作。
7
Understanding Dropout
Dropout通過(guò)每次迭代訓(xùn)練時(shí),隨機(jī)選擇不同的神經(jīng)元,相當(dāng)于每次都在不同的神經(jīng)網(wǎng)絡(luò)上進(jìn)行訓(xùn)練,類似機(jī)器學(xué)習(xí)中Bagging的方法(三個(gè)臭皮匠,賽過(guò)諸葛亮),能夠防止過(guò)擬合。
除此之外,還可以從權(quán)重w的角度來(lái)解釋為什么dropout能夠有效防止過(guò)擬合。對(duì)于某個(gè)神經(jīng)元來(lái)說(shuō),某次訓(xùn)練時(shí),它的某些輸入在dropout的作用被過(guò)濾了。而在下一次訓(xùn)練時(shí),又有不同的某些輸入被過(guò)濾。經(jīng)過(guò)多次訓(xùn)練后,某些輸入被過(guò)濾,某些輸入被保留。這樣,該神經(jīng)元就不會(huì)受某個(gè)輸入非常大的影響,影響被均勻化了。也就是說(shuō),對(duì)應(yīng)的權(quán)重w不會(huì)很大。這從從效果上來(lái)說(shuō),與L2 regularization是類似的,都是對(duì)權(quán)重w進(jìn)行“懲罰”,減小了w的值。
總結(jié)一下,對(duì)于同一組訓(xùn)練數(shù)據(jù),利用不同的神經(jīng)網(wǎng)絡(luò)訓(xùn)練之后,求其輸出的平均值可以減少overfitting。Dropout就是利用這個(gè)原理,每次丟掉一定數(shù)量的隱藏層神經(jīng)元,相當(dāng)于在不同的神經(jīng)網(wǎng)絡(luò)上進(jìn)行訓(xùn)練,這樣就減少了神經(jīng)元之間的依賴性,即每個(gè)神經(jīng)元不能依賴于某幾個(gè)其他的神經(jīng)元(指層與層之間相連接的神經(jīng)元),使神經(jīng)網(wǎng)絡(luò)更加能學(xué)習(xí)到與其他神經(jīng)元之間的更加健壯robust的特征。
在使用dropout的時(shí)候,有幾點(diǎn)需要注意。首先,不同隱藏層的dropout系數(shù)keep_prob可以不同。一般來(lái)說(shuō),神經(jīng)元越多的隱藏層,keep_out可以設(shè)置得小一些.,例如0.5;神經(jīng)元越少的隱藏層,keep_out可以設(shè)置的大一些,例如0.8,設(shè)置是1。另外,實(shí)際應(yīng)用中,不建議對(duì)輸入層進(jìn)行dropout,如果輸入層維度很大,例如圖片,那么可以設(shè)置dropout,但keep_out應(yīng)設(shè)置的大一些,例如0.8,0.9。總體來(lái)說(shuō),就是越容易出現(xiàn)overfitting的隱藏層,其keep_prob就設(shè)置的相對(duì)小一些。沒(méi)有準(zhǔn)確固定的做法,通常可以根據(jù)validation進(jìn)行選擇。
Dropout在電腦視覺(jué)CV領(lǐng)域應(yīng)用比較廣泛,因?yàn)檩斎雽泳S度較大,而且沒(méi)有足夠多的樣本數(shù)量。值得注意的是dropout是一種regularization技巧,用來(lái)防止過(guò)擬合的,最好只在需要regularization的時(shí)候使用dropout。
使用dropout的時(shí)候,可以通過(guò)繪制cost function來(lái)進(jìn)行debug,看看dropout是否正確執(zhí)行。一般做法是,將所有層的keep_prob全設(shè)置為1,再繪制cost function,即涵蓋所有神經(jīng)元,看J是否單調(diào)下降。下一次迭代訓(xùn)練時(shí),再將keep_prob設(shè)置為其它值。
8
Other regularization methods
除了L2 regularization和dropout regularization之外,還有其它減少過(guò)擬合的方法。
一種方法是增加訓(xùn)練樣本數(shù)量。但是通常成本較高,難以獲得額外的訓(xùn)練樣本。但是,我們可以對(duì)已有的訓(xùn)練樣本進(jìn)行一些處理來(lái)“制造”出更多的樣本,稱為data augmentation。例如圖片識(shí)別問(wèn)題中,可以對(duì)已有的圖片進(jìn)行水平翻轉(zhuǎn)、垂直翻轉(zhuǎn)、任意角度旋轉(zhuǎn)、縮放或擴(kuò)大等等。如下圖所示,這些處理都能“制造”出新的訓(xùn)練樣本。雖然這些是基于原有樣本的,但是對(duì)增大訓(xùn)練樣本數(shù)量還是有很有幫助的,不需要增加額外成本,卻能起到防止過(guò)擬合的效果。
在數(shù)字識(shí)別中,也可以將原有的數(shù)字圖片進(jìn)行任意旋轉(zhuǎn)或者扭曲,或者增加一些noise,如下圖所示:
還有另外一種防止過(guò)擬合的方法:early stopping。一個(gè)神經(jīng)網(wǎng)絡(luò)模型隨著迭代訓(xùn)練次數(shù)增加,train set error一般是單調(diào)減小的,而dev set error 先減小,之后又增大。也就是說(shuō)訓(xùn)練次數(shù)過(guò)多時(shí),模型會(huì)對(duì)訓(xùn)練樣本擬合的越來(lái)越好,但是對(duì)驗(yàn)證集擬合效果逐漸變差,即發(fā)生了過(guò)擬合。因此,迭代訓(xùn)練次數(shù)不是越多越好,可以通過(guò)train set error和dev set error隨著迭代次數(shù)的變化趨勢(shì),選擇合適的迭代次數(shù),即early stopping。
然而,Early stopping有其自身缺點(diǎn)。通常來(lái)說(shuō),機(jī)器學(xué)習(xí)訓(xùn)練模型有兩個(gè)目標(biāo):一是優(yōu)化cost function,盡量減小J;二是防止過(guò)擬合。這兩個(gè)目標(biāo)彼此對(duì)立的,即減小J的同時(shí)可能會(huì)造成過(guò)擬合,反之亦然。我們把這二者之間的關(guān)系稱為正交化orthogonalization。該節(jié)課開始部分就講過(guò),在深度學(xué)習(xí)中,我們可以同時(shí)減小Bias和Variance,構(gòu)建最佳神經(jīng)網(wǎng)絡(luò)模型。但是,Early stopping的做法通過(guò)減少得帶訓(xùn)練次數(shù)來(lái)防止過(guò)擬合,這樣J就不會(huì)足夠小。也就是說(shuō),early stopping將上述兩個(gè)目標(biāo)融合在一起,同時(shí)優(yōu)化,但可能沒(méi)有“分而治之”的效果好。
與early stopping相比,L2 regularization可以實(shí)現(xiàn)“分而治之”的效果:迭代訓(xùn)練足夠多,減小J,而且也能有效防止過(guò)擬合。而L2 regularization的缺點(diǎn)之一是最優(yōu)的正則化參數(shù)λ的選擇比較復(fù)雜。對(duì)這一點(diǎn)來(lái)說(shuō),early stopping比較簡(jiǎn)單。總的來(lái)說(shuō),L2 regularization更加常用一些。
9
Normalizing inputs
在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),標(biāo)準(zhǔn)化輸入可以提高訓(xùn)練的速度。標(biāo)準(zhǔn)化輸入就是對(duì)訓(xùn)練數(shù)據(jù)集進(jìn)行歸一化的操作,即將原始數(shù)據(jù)減去其均值μ后,再除以其方差σ^2:
以二維平面為例,下圖展示了其歸一化過(guò)程:
值得注意的是,由于訓(xùn)練集進(jìn)行了標(biāo)準(zhǔn)化處理,那么對(duì)于測(cè)試集或在實(shí)際應(yīng)用時(shí),應(yīng)該使用同樣的μ和σ^2對(duì)其進(jìn)行標(biāo)準(zhǔn)化處理。這樣保證了訓(xùn)練集合測(cè)試集的標(biāo)準(zhǔn)化操作一致。
之所以要對(duì)輸入進(jìn)行標(biāo)準(zhǔn)化操作,主要是為了讓所有輸入歸一化同樣的尺度上,方便進(jìn)行梯度下降算法時(shí)能夠更快更準(zhǔn)確地找到全局最優(yōu)解。假如輸入特征是二維的,且x1的范圍是[1,1000],x2的范圍是[0,1]。如果不進(jìn)行標(biāo)準(zhǔn)化處理,x1與x2之間分布極不平衡,訓(xùn)練得到的w1和w2也會(huì)在數(shù)量級(jí)上差別很大。這樣導(dǎo)致的結(jié)果是cost function與w和b的關(guān)系可能是一個(gè)非常細(xì)長(zhǎng)的橢圓形碗。對(duì)其進(jìn)行梯度下降算法時(shí),由于w1和w2數(shù)值差異很大,只能選擇很小的學(xué)習(xí)因子α,來(lái)避免J發(fā)生振蕩。一旦α較大,必然發(fā)生振蕩,J不再單調(diào)下降。如下左圖所示。
然而,如果進(jìn)行了標(biāo)準(zhǔn)化操作,x1與x2分布均勻,w1和w2數(shù)值差別不大,得到的cost function與w和b的關(guān)系是類似圓形碗。對(duì)其進(jìn)行梯度下降算法時(shí),α可以選擇相對(duì)大一些,且J一般不會(huì)發(fā)生振蕩,保證了J是單調(diào)下降的。如下右圖所示。
另外一種情況,如果輸入特征之間的范圍本來(lái)就比較接近,那么不進(jìn)行標(biāo)準(zhǔn)化操作也是沒(méi)有太大影響的。但是,標(biāo)準(zhǔn)化處理在大多數(shù)場(chǎng)合下還是值得推薦的。
10
Vanishing and Exploding gradients
在神經(jīng)網(wǎng)絡(luò)尤其是深度神經(jīng)網(wǎng)絡(luò)中存在可能存在這樣一個(gè)問(wèn)題:梯度消失和梯度爆炸。意思是當(dāng)訓(xùn)練一個(gè) 層數(shù)非常多的神經(jīng)網(wǎng)絡(luò)時(shí),計(jì)算得到的梯度可能非常小或非常大,甚至是指數(shù)級(jí)別的減小或增大。這樣會(huì)讓訓(xùn)練過(guò)程變得非常困難。
舉個(gè)例子來(lái)說(shuō)明,假設(shè)一個(gè)多層的每層只包含兩個(gè)神經(jīng)元的深度神經(jīng)網(wǎng)絡(luò)模型,如下圖所示:
11
Weight Initialization for Deep Networks
下面介紹如何改善Vanishing and Exploding gradients這類問(wèn)題,方法是對(duì)權(quán)重w進(jìn)行一些初始化處理。
深度神經(jīng)網(wǎng)絡(luò)模型中,以單個(gè)神經(jīng)元為例,該層(l)的輸入個(gè)數(shù)為n,其輸出為:
這里忽略了常數(shù)項(xiàng)b。為了讓z不會(huì)過(guò)大或者過(guò)小,思路是讓w與n有關(guān),且n越大,w應(yīng)該越小才好。這樣能夠保證z不會(huì)過(guò)大。一種方法是在初始化w時(shí),令其方差為1/n。相應(yīng)的python偽代碼為:
w[l] = np.random.randn(n[l],n[l-1])*np.sqrt(1/n[l-1])如果激活函數(shù)是tanh,一般選擇上面的初始化方法。
如果激活函數(shù)是ReLU,權(quán)重w的初始化一般令其方差為2/n:
w[l] = np.random.randn(n[l],n[l-1])*np.sqrt(2/n[l-1])w[l] = np.random.randn(n[l],n[l-1])*np.sqrt(2/n[l-1]*n[l])至于選擇哪種初始化方法因人而異,可以根據(jù)不同的激活函數(shù)選擇不同方法。另外,我們可以對(duì)這些初始化方法中設(shè)置某些參數(shù),作為超參數(shù),通過(guò)驗(yàn)證集進(jìn)行驗(yàn)證,得到最優(yōu)參數(shù),來(lái)優(yōu)化神經(jīng)網(wǎng)絡(luò)。
12
Numerical approximation of gradients
Back Propagation神經(jīng)網(wǎng)絡(luò)有一項(xiàng)重要的測(cè)試是梯度檢查(gradient checking)。其目的是檢查驗(yàn)證反向傳播過(guò)程中梯度下降算法是否正確。該小節(jié)將先介紹如何近似求出梯度值。
利用微分思想,函數(shù)f在點(diǎn)θ處的梯度可以表示成:
其中,ε>0,且足夠小。
13
Gradient checking
介紹完如何近似求出梯度值后,我們將介紹如何進(jìn)行梯度檢查,來(lái)驗(yàn)證訓(xùn)練過(guò)程中是否出現(xiàn)bug。
14
Gradient Checking Implementation Notes
在進(jìn)行梯度檢查的過(guò)程中有幾點(diǎn)需要注意的地方:
不要在整個(gè)訓(xùn)練過(guò)程中都進(jìn)行梯度檢查,僅僅作為debug使用。
如果梯度檢查出現(xiàn)錯(cuò)誤,找到對(duì)應(yīng)出錯(cuò)的梯度,檢查其推導(dǎo)是否出現(xiàn)錯(cuò)誤。
注意不要忽略正則化項(xiàng),計(jì)算近似梯度的時(shí)候要包括進(jìn)去。
梯度檢查時(shí)關(guān)閉dropout,檢查完畢后再打開dropout。
隨機(jī)初始化時(shí)運(yùn)行梯度檢查,經(jīng)過(guò)一些訓(xùn)練后再進(jìn)行梯度檢查(不常用)。
覺(jué) 得 有 用 就?轉(zhuǎn) 發(fā) 分 享?一 下 吧
往 期 推 薦
【1】吳恩達(dá)《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》精煉筆記(4)-- 淺層神經(jīng)網(wǎng)絡(luò)
【2】干貨|機(jī)器學(xué)習(xí)基石精選文章鏈接
【3】機(jī)器學(xué)習(xí)中的維度災(zāi)難
長(zhǎng)按二維碼掃描關(guān)注
紅色石頭的機(jī)器學(xué)習(xí)之路
ID:redstonewill
紅色石頭
個(gè)人微信 : WillowRedstone
新浪微博:@RedstoneWill
總結(jié)
以上是生活随笔為你收集整理的吴恩达《优化深度神经网络》精炼笔记(1)-- 深度学习的实用层面的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 编程获取图标一法
- 下一篇: 干货 | 神经网络与深度学习精选文章汇总