理解深度學(xué)習(xí)的鑰匙–參數(shù)篇
這是你所有看到的有關(guān)神經(jīng)網(wǎng)絡(luò)參數(shù)的理解中最通俗易懂的一個了,公式也減到了最少,神經(jīng)網(wǎng)絡(luò)的專業(yè)人士繞道哦。
在上一篇《理解深度學(xué)習(xí)的鑰匙 –啟蒙篇》,我們提到定義⼀個二次代價函數(shù),也叫損失函數(shù)或目標(biāo)函數(shù):
這⾥ w 表⽰所有的⽹絡(luò)中權(quán)重的集合,b 是所有的偏置,n 是訓(xùn)練輸⼊數(shù)據(jù)的個數(shù),a 是表⽰當(dāng)輸⼊為 x 時輸出的向量,y(x)是實際輸出的向量,求和則是在總的訓(xùn)練輸⼊ x 上進⾏的。
參考《理解深度學(xué)習(xí)的鑰匙 –啟蒙篇》文章C(v)中v的計算過程,∇C 來表示梯度向量:
現(xiàn)在有兩個分量組成w 和b,⽽梯度向量∇C 則有相應(yīng)的分量∂C/∂w 和 ∂C/∂b,⽤這些分量來寫梯度下降的更新規(guī)則,我們得到:
通過重復(fù)應(yīng)⽤這⼀更新規(guī)則我們就能“讓球體滾下⼭”,并且有望能找到代價函數(shù)的最⼩值,換句話說,這是⼀個能讓神經(jīng)⽹絡(luò)學(xué)習(xí)的規(guī)則。
注意這個代價函數(shù)是遍及每個訓(xùn)練樣本的,x表示某一個樣本:
在實踐中,為了計算梯度∇C,我們需要為每個訓(xùn)練輸⼊x 單獨地計算梯度值∇Cx,然后求平均值:
不幸的是,當(dāng)訓(xùn)練輸⼊的數(shù)量過⼤時會花費很⻓時間,這樣會使學(xué)習(xí)變得相當(dāng)緩慢。
1、隨機梯度下降
這一節(jié)你將了解具體的一個訓(xùn)練過程,了解什么叫作⼩批量數(shù)據(jù)(mini-batch),什么叫作訓(xùn)練迭代期(epoch)。
有種叫做隨機梯度下降的算法能夠加速學(xué)習(xí),其思想就是通過隨機選取⼩量訓(xùn)練輸⼊樣本來計算∇Cx,進⽽估算梯度∇C,通過計算少量樣本的平均值我們可以快速得到⼀個對于實際梯度∇C 的很好的估算,這有助于加速梯度下降,進⽽加速學(xué)習(xí)過程。
更準(zhǔn)確地說,隨機梯度下降通過隨機選取⼩量的m 個訓(xùn)練輸⼊來⼯作,我們將這些隨機的訓(xùn)練輸⼊標(biāo)記為X1;X2… Xm,并把它們稱為⼀個⼩批量數(shù)據(jù)(mini-batch)。假設(shè)樣本數(shù)量m ⾜夠⼤,我們期望∇Cxj 的平均值⼤致相等于整個∇Cx 的平均值,即:
可以推導(dǎo)得到:
然后我們再挑選另⼀隨機選定的⼩批量數(shù)據(jù)去訓(xùn)練,直到我們⽤完了所有的訓(xùn)練輸⼊,這被稱為完成了⼀個訓(xùn)練迭代期(epoch)。然后我們就會開始⼀個新的訓(xùn)練迭代期。
我們可以把隨機梯度下降想象成⼀次⺠意調(diào)查:在⼀個⼩批量數(shù)據(jù)上采樣⽐對⼀個完整數(shù)據(jù)集進⾏梯度下降分析要容易得多,正如進⾏⼀次⺠意調(diào)查⽐舉⾏⼀次全⺠選舉要更容易。例如,如果我們有⼀個規(guī)模為n = 60000 的訓(xùn)練集,就像MNIST,并選取⼩批量數(shù)據(jù)⼤⼩為m=10,這意味著在估算梯度過程中加速了6000 倍。
現(xiàn)在讓我們寫⼀個學(xué)習(xí)如何識別⼿寫數(shù)字的程序,使⽤隨機梯度下降算法和MNIST
訓(xùn)練數(shù)據(jù),除了MNIST 數(shù)據(jù),我們還需要⼀個叫做Numpy 的Python 庫,⽤來做快速線性代數(shù),不要怕,筆者不會貼代碼,只是示意一下,大家理解函數(shù)調(diào)用的方式即可:
在加載完MNIST 數(shù)據(jù)之后,我們將設(shè)置⼀個有784個像素輸入、30 個隱藏層神經(jīng)元、10個輸出的Network:
我們將使⽤隨機梯度下降來從MNIST training_data 學(xué)習(xí)超過30 次迭代期,⼩批量數(shù)據(jù)⼤⼩為10,學(xué)習(xí)速率η=3.0:
打印內(nèi)容顯⽰了在每輪訓(xùn)練期后神經(jīng)⽹絡(luò)能正確識別測試圖像的數(shù)量。正如你所⻅到,在僅僅⼀次迭代期后,達(dá)到了10,000 中選中的9,129 個,⽽且數(shù)⽬還在持續(xù)增⻓,經(jīng)過訓(xùn)練的⽹絡(luò)給出的識別率約為95%:
讓我們重新運⾏上⾯的實驗,將隱藏神經(jīng)元數(shù)量改到100:
果然,它將結(jié)果提升⾄96.59%,⾄少在這種情況下,使⽤更多的隱藏神經(jīng)元幫助我們得到了更好的結(jié)果。
當(dāng)然,為了獲得這些準(zhǔn)確性,我不得不對訓(xùn)練的迭代期數(shù)量(epoch),⼩批量數(shù)據(jù)⼤⼩(minbatch)和學(xué)習(xí)速率η做特別的選擇,正如我上⾯所提到的,這些在我們的神經(jīng)⽹絡(luò)中被稱為超參數(shù),以區(qū)別于通過我們的學(xué)習(xí)算法所學(xué)到的參數(shù)(權(quán)重和偏置),如果我們選擇了糟糕的超參數(shù),我們會得到較差的結(jié)果。
假如我們選定學(xué)習(xí)速率為η= 0.001:
結(jié)果則不太令人鼓舞了:
然⽽,你可以看到⽹絡(luò)的性能隨著時間的推移慢慢地變好了,這表明應(yīng)該增⼤學(xué)習(xí)速率,例如η= 0.01,如果我們那樣做了,我們會得到更好的結(jié)果,這表明我們應(yīng)該再次增加學(xué)習(xí)速率。(如果改變能夠改善⼀些事情,試著做更多!)如果我們這樣做⼏次,我們最終會得到⼀個像η=1.0 的學(xué)習(xí)速率(或者調(diào)整到3.0),這跟我們之前的實驗很接近。因此即使我們最初選擇了糟糕的超參數(shù),我們⾄少獲得了⾜夠的信息來幫助我們改善對于超參數(shù)的選擇。
通常,調(diào)試⼀個神經(jīng)⽹絡(luò)是具有挑戰(zhàn)性的,尤其是當(dāng)初始的超參數(shù)的選擇產(chǎn)⽣的結(jié)果還不如隨機噪點的時候。假如我們試⽤之前成功的具有30 個隱藏神經(jīng)元的⽹絡(luò)結(jié)構(gòu),但是學(xué)習(xí)速率改為η= 100,在這點上,我們實際⾛的太遠(yuǎn),學(xué)習(xí)速率太⾼了:
我們可能不僅關(guān)⼼學(xué)習(xí)速率,還要關(guān)⼼我們的神經(jīng)⽹絡(luò)中的其它每⼀個部分,我們可能想知道是否⽤了讓⽹絡(luò)很難學(xué)習(xí)的初始權(quán)重和偏置?或者可能我們沒有⾜夠的訓(xùn)練數(shù)據(jù)來獲得有意義的學(xué)習(xí)?或者我們沒有進⾏⾜夠的迭代期?或者可能對于具有這種結(jié)構(gòu)的神經(jīng)⽹絡(luò),學(xué)習(xí)識別⼿寫數(shù)字是不可能的?可能學(xué)習(xí)速率太低?或者可能學(xué)習(xí)速率太⾼?當(dāng)你第⼀次遇到問題,你不總是能有把握。
就像常規(guī)編程那樣,它是⼀⻔藝術(shù),你需要學(xué)習(xí)調(diào)試的藝術(shù)來獲得神經(jīng)⽹絡(luò)更好的結(jié)果,更普通的是,我們需要啟發(fā)式⽅法來選擇好的超參數(shù)和好的結(jié)構(gòu),后面將討論怎么樣選擇超參數(shù)。
2、邁向深度學(xué)習(xí)
這一節(jié)你將了解神經(jīng)網(wǎng)絡(luò)是如何過渡到深度學(xué)習(xí)的。
雖然我們的神經(jīng)網(wǎng)絡(luò)給出了令⼈印象深刻的表現(xiàn),但這樣的表現(xiàn)帶有⼏分神秘,⽹絡(luò)中的權(quán)重和偏置是被⾃動發(fā)現(xiàn)的,這意味著我們不能⽴即解釋⽹絡(luò)怎么做的、做了什么,我們能否找到⼀些方法來理解我們的⽹絡(luò)通過什么原理分類⼿寫數(shù)字?并且,在知道了這些原理后,我們能做得更好嗎?
為了讓這些問題更具體,我們假設(shè)數(shù)⼗年后神經(jīng)⽹絡(luò)引發(fā)了⼈工智能(AI)。到那個時候,我們能明⽩這種智能⽹絡(luò)的⼯作機制嗎?或許,因為有著⾃動學(xué)習(xí)得到的權(quán)重和偏置,這些是我們⽆法理解的,這樣的神經(jīng)⽹絡(luò)對我們來說是不透明的。在⼈⼯智能的早期研究階段,⼈們希望在構(gòu)建⼈⼯智能的努⼒過程中,也同時能夠幫助我們理解智能背后的機制,以及⼈類⼤腦的運轉(zhuǎn)⽅式,但結(jié)果可能是我們既不能夠理解⼤腦的機制,也不能夠理解⼈⼯智能的機制。
為解決這些問題,讓我們重新思考⼀下我在本章開始時所給的⼈⼯神經(jīng)元的解釋,作為⼀種衡量證據(jù)的方法,假設(shè)我們要確定⼀幅圖像是否顯⽰有⼈臉 :
我們可以用解決⼿寫識別問題的相同⽅式來攻克這個問題 —— ⽹絡(luò)的輸⼊是圖像中的像素,⽹絡(luò)的輸出是⼀個單個的神經(jīng)元⽤于表明“是的,這是⼀張臉”或“不,這不是⼀張臉”,假設(shè)我們就采取了這個⽅法,但接下來我們先不去使⽤⼀個學(xué)習(xí)算法,⽽是去嘗試親⼿設(shè)計⼀個⽹絡(luò),并為它選擇合適的權(quán)重和偏置。我們要怎樣做呢?暫時先忘掉神經(jīng)⽹絡(luò),我們受到啟發(fā)的⼀個想法是將這個問題分解成⼦問題:圖像的左上⻆有⼀個眼睛嗎?右上⻆有⼀個眼睛嗎?中間有⼀個⿐⼦嗎?下⾯中央有⼀個嘴嗎?上⾯有頭發(fā)嗎?諸如此類,如果⼀些問題的回答是“是”,或者甚⾄僅僅是“可能是”,那么我們可以作出結(jié)論這個圖像可能是⼀張臉,相反地,如果⼤多數(shù)這些問題的答案是“不是”,那么這張圖像可能不是⼀張臉。
這個想法表明了如果我們能夠使用神經(jīng)⽹絡(luò)來解決這些⼦問題,那么我們也許可以通過將這些解決⼦問題的⽹絡(luò)結(jié)合起來,構(gòu)成⼀個⼈臉檢測的神經(jīng)⽹絡(luò),下圖是⼀個可能的結(jié)構(gòu),其中的⽅框表⽰⼦⽹絡(luò),注意,這不是⼀個⼈臉檢測問題的現(xiàn)實的解決⽅法,⽽是為了幫助我們構(gòu)建起⽹絡(luò)如何運轉(zhuǎn)的直觀感受。
子網(wǎng)絡(luò)也可以被繼續(xù)分解,這看上去很合理,假設(shè)我們考慮這個問題:“左上⻆有⼀個眼睛嗎?”這個問題可以被分解成這些⼦問題:“有⼀個眉⽑嗎?”,“有睫⽑嗎?”,“有虹膜嗎?”等等,當(dāng)然這些問題也應(yīng)該包含關(guān)于位置的信息 —— 諸如“在左上⻆有眉⽑,上⾯有虹膜嗎?”——但是讓我們先保持簡單,回答問題“左上⻆有⼀個眼睛嗎?”的⽹絡(luò)能夠被分解成:
這些子問題也同樣可以繼續(xù)被分解,并通過多個⽹絡(luò)層傳遞得越來越遠(yuǎn),最終,我們的⼦⽹絡(luò)可以回答那些只包含若⼲個像素點的簡單問題。舉例來說,這些簡單的問題可能是詢問圖像中的⼏個像素是否構(gòu)成⾮常簡單的形狀,這些問題就可以被那些與圖像中原始像素點相連的單個神經(jīng)元所回答,最終的結(jié)果是,我們設(shè)計出了⼀個⽹絡(luò),它將⼀個⾮常復(fù)雜的問題 —— 這張圖像是否有⼀張⼈臉 —— 分解成在單像素層⾯上就可回答的⾮常簡單的問題,它通過⼀系列多層結(jié)構(gòu)來完成,在前⾯的⽹絡(luò)層,它回答關(guān)于輸⼊圖像⾮常簡單明確的問題,在后⾯的⽹絡(luò)層,它建⽴了⼀個更加復(fù)雜和抽象的層級結(jié)構(gòu),包含這種多層結(jié)構(gòu) —— 兩層或更多隱藏層 —— 的⽹絡(luò)被稱為深度神經(jīng)網(wǎng)絡(luò)。
⾃ 2006 年以來,⼈們已經(jīng)開發(fā)了⼀系列技術(shù)使深度神經(jīng)網(wǎng)絡(luò)能夠?qū)W習(xí),這些深度學(xué)習(xí)技術(shù)基于隨機梯度下降和反向傳播,并引進了新的想法,這些技術(shù)已經(jīng)使更深(更⼤)的⽹絡(luò)能夠被訓(xùn)練 —— 現(xiàn)在訓(xùn)練⼀個有 5 到 10 層隱藏層的⽹絡(luò)都是很常⻅的,⽽且事實證明,在許多問題上,它們⽐那些淺層神經(jīng)⽹絡(luò),例如僅有⼀個隱藏層的⽹絡(luò),表現(xiàn)的更加出⾊,當(dāng)然,原因是深度⽹絡(luò)能夠構(gòu)建起⼀個復(fù)雜的概念的層次結(jié)構(gòu)。
3、交叉熵代價函數(shù)
這一節(jié)你將了解神經(jīng)網(wǎng)絡(luò)訓(xùn)練速度太慢的原因,為什么要用交叉熵代價函數(shù)替代MSE或二次代價函數(shù)。
我們希望和期待神經(jīng)網(wǎng)絡(luò)可以從錯誤中快速地學(xué)習(xí),在實踐中,這種情況經(jīng)常出現(xiàn)嗎?為了回答這個問題,讓我們看看⼀個⼩例⼦,這個例⼦包含⼀個只有⼀個輸入的神經(jīng)元:
我們會訓(xùn)練這個神經(jīng)元來做⼀件非常簡單的事:讓輸⼊ 1 轉(zhuǎn)化為 0。當(dāng)然,這很簡單了,⼿⼯找到合適的權(quán)重和偏置就可以了,然⽽,看起來使⽤梯度下降的⽅式來學(xué)習(xí)權(quán)重和偏置是很有啟發(fā)的,所以,我們來看看神經(jīng)元如何學(xué)習(xí)。
為了讓這個例⼦更明確,我會⾸先將權(quán)重和偏置初始化為 0.6 和 0.9。這些就是⼀般的開始學(xué)習(xí)的選擇,并沒有任何刻意的想法。⼀開始的神經(jīng)元的輸出是 0.82,所以這離我們的⽬標(biāo)輸出0.0 還差得很遠(yuǎn),從下圖來看看神經(jīng)元如何學(xué)習(xí)到讓輸出接近 0.0 的,注意這些圖像實際上是正在進⾏梯度的計算,然后使⽤梯度更新來對權(quán)重和偏置進⾏更新,并且展⽰結(jié)果,設(shè)置學(xué)習(xí)速率 η = 0.15 進行學(xué)習(xí)⼀⽅⾯⾜夠慢的讓我們跟隨學(xué)習(xí)的過程,另⼀⽅⾯也保證了學(xué)習(xí)的時間不會太久,⼏秒鐘應(yīng)該就⾜夠了,代價函數(shù)就是MSE,C。
隨著迭代期的增加,神經(jīng)元的輸出、權(quán)重、偏置和代價的變化如下⾯⼀系列圖形所⽰:
正如你所⻅,神經(jīng)元快速地學(xué)到了使得代價函數(shù)下降的權(quán)重和偏置,給出了最終的輸出為0.09,這雖然不是我們的目標(biāo)輸出 0.0,但是已經(jīng)挺好了。
假設(shè)我們現(xiàn)在將初始權(quán)重和偏置都設(shè)置為 2.0,此時初始輸出為 0.98,這是和目標(biāo)值的差距相當(dāng)⼤的,現(xiàn)在看看神經(jīng)元學(xué)習(xí)的過程。
你將看到如下的⼀系列變化:
雖然這個例⼦使用了同樣的學(xué)習(xí)速率(η = 0.15),我們可以看到剛開始的學(xué)習(xí)速度是⽐較緩慢的,對前 150 左右的學(xué)習(xí)次數(shù),權(quán)重和偏置并沒有發(fā)⽣太⼤的變化,隨后學(xué)習(xí)速度加快,與上⼀個例⼦中類似了,神經(jīng)⽹絡(luò)的輸出也迅速接近 0.0。
這種行為看起來和⼈類學(xué)習(xí)⾏為差異很,我們通常是在犯錯⽐較明顯的時候?qū)W習(xí)的速度最快,但是我們已經(jīng)看到了⼈⼯神經(jīng)元在其犯錯較⼤的情況下其實學(xué)習(xí)很有難度,⽽且,這種現(xiàn)象不僅僅是在這個⼩例⼦中出現(xiàn),也會在更加⼀般的神經(jīng)⽹絡(luò)中出現(xiàn),為何學(xué)習(xí)如此緩慢?我們能夠找到避免這種情況的方法嗎?
為了理解這個問題的源頭,想想我們的神經(jīng)元是通過改變權(quán)重和偏置,并以⼀個代價函數(shù)的偏導(dǎo)數(shù)(∂C/∂w 和 ∂C/∂b)決定的速度學(xué)習(xí),所以,我們在說“學(xué)習(xí)緩慢”時,實際上就是說這些偏導(dǎo)數(shù)很⼩,理解他們?yōu)楹芜@么⼩就是我們⾯臨的挑戰(zhàn),為了理解這些,讓我們計算偏導(dǎo)數(shù)看看,我們⼀直在⽤的是⼆次代價函數(shù),定義如下:
其中 a 是神經(jīng)元的輸出,訓(xùn)練輸⼊為 x = 1,y = 0 則是⽬標(biāo)輸出,顯式地使⽤權(quán)重和偏置來表達(dá)這個,我們有 a = σ(z),其中 z = wx + b,使用鏈?zhǔn)椒▌t來求權(quán)重和偏置的偏導(dǎo)數(shù)就有:
其中我已經(jīng)將 x = 1 和 y = 0 代⼊了。為了理解這些表達(dá)式的行為,讓我們仔細(xì)看 σ ′ (z) 這⼀項,⾸先回憶⼀下 σ 函數(shù)圖像:
我們可以從這幅圖看出,當(dāng)神經(jīng)元的輸出接近 1 的時候,曲線變得相當(dāng)平,所以 σ ′ (z) 就很⼩了,也即∂C/∂w 和 ∂C/∂b 會⾮常⼩,這其實就是學(xué)習(xí)緩慢的原因所在,⽽且,我們后面也會提到,這種學(xué)習(xí)速度下降的原因?qū)嶋H上也是更加⼀般的神經(jīng)⽹絡(luò)學(xué)習(xí)緩慢的原因,并不僅僅是在這個特例中特有的。
研究表明,我們可以通過使用交叉熵代價函數(shù)來替換⼆次代價函數(shù),為了理解什么是交叉熵,我們稍微改變⼀下之前的簡單例⼦,假設(shè),我們現(xiàn)在要訓(xùn)練⼀個包含若⼲輸⼊變量的的神經(jīng)元,x1 ,x2 ,... 對應(yīng)的權(quán)重為 w1 ,w2 ,... 和偏置 b:
神經(jīng)元的輸出就是 a = σ(z),其中 z =∑j W j X j+ b 是輸⼊的帶權(quán)和,我們?nèi)缦露x這個神經(jīng)元的交叉熵代價函數(shù):
其中 n 是訓(xùn)練數(shù)據(jù)的總數(shù),求和是在所有的訓(xùn)練輸⼊ x 上進⾏的,y 是對應(yīng)的⽬標(biāo)輸出,在解決學(xué)習(xí)緩慢前,我們來看看交叉熵為何能夠解釋成⼀個代價函數(shù)。
如果對于所有的訓(xùn)練輸⼊ x,神經(jīng)元實際的輸出接近⽬標(biāo)值,那么交叉熵將接近 0,假設(shè)在這個例⼦中,y = 0 ⽽ a ≈ 0,交叉熵接近于0,反之,y = 1 ⽽ a ≈ 1,交叉熵也接近于0,綜上所述,交叉熵是⾮負(fù)的,在神經(jīng)元達(dá)到很好的正確率的時候會接近 0,這些其實就是我們想要的代價函數(shù)的特性,其實這些特性也是⼆次代價函數(shù)具備的,所以,交叉熵就是很好的選擇了。
但是交叉熵代價函數(shù)有⼀個⽐二次代價函數(shù)更好的特性就是它避免了學(xué)習(xí)速度下降的問題,為了弄清楚這個情況,我們來算算交叉熵函數(shù)關(guān)于權(quán)重的偏導(dǎo)數(shù),只列出結(jié)果:
這是⼀個優(yōu)美的公式,它告訴我們權(quán)重學(xué)習(xí)的速度受到 σ(z) − y,也就是輸出中的誤差的控制,更大的誤差,更快的學(xué)習(xí)速度,這是我們直覺上期待的結(jié)果。特別地,這個代價函數(shù)還避免了像在⼆次代價函數(shù)中類似⽅程中 σ ′ (z) 導(dǎo)致的學(xué)習(xí)緩慢。
讓我們重回最原初的例⼦,來看看換成了交叉熵之后的學(xué)習(xí)過程,現(xiàn)在仍然按照前⾯的參數(shù)配置來初始化⽹絡(luò),開始權(quán)重為 0.6,而偏置為 0.9。
看看在換成交叉熵之后⽹絡(luò)的學(xué)習(xí)情況,你將看到如下變化的曲線:
毫不奇怪,在這個例子中,神經(jīng)元學(xué)習(xí)得相當(dāng)出⾊,跟之前差不多,現(xiàn)在我們再看看之前出問題的那個例⼦(鏈接),權(quán)重和偏置都初始化為 2.0:
你將看到如下變化的曲線:
成功了!這次神經(jīng)元的學(xué)習(xí)速度相當(dāng)快,跟我們預(yù)期的那樣,如果你觀測的⾜夠仔細(xì),你可以發(fā)現(xiàn)代價函數(shù)曲線要⽐二次代價函數(shù)訓(xùn)練前⾯部分要陡很多,那個交叉熵導(dǎo)致的陡度讓我們⾼興,這正是我們期待的當(dāng)神經(jīng)元開始出現(xiàn)嚴(yán)重錯誤時能以最快速度學(xué)習(xí)。
4、過度擬合
這一節(jié)你將了解過度擬合的一般原因和解決策略。
諾貝爾獎獲得者,物理學(xué)家恩⾥科·費⽶有⼀次被問到他對⼀些同僚提出的⼀個數(shù)學(xué)模型的意⻅,這個數(shù)學(xué)模型嘗試解決⼀個重要的未解決的物理難題。模型和實驗⾮常匹配,但是費⽶卻對其產(chǎn)⽣了懷疑。他問模型中需要設(shè)置的⾃由參數(shù)有多少個。答案是“4”。費⽶回答道 6 :“我記得我的朋友約翰·馮·諾伊曼過去常說,有四個參數(shù),我可以模擬⼀頭⼤象,⽽有五個參數(shù),我還能讓他卷鼻⼦。”
這⾥,其實是說擁有大量的⾃由參數(shù)的模型能夠描述特別神奇的現(xiàn)象。即使這樣的模型能夠很好的擬合已有的數(shù)據(jù),但并不表⽰是⼀個好模型。因為這可能只是因為模型中⾜夠的⾃由度使得它可以描述⼏乎所有給定⼤⼩的數(shù)據(jù)集,⽽不需要真正洞察現(xiàn)象的本質(zhì)。所以發(fā)⽣這種情形時,模型對已有的數(shù)據(jù)會表現(xiàn)的很好,但是對新的數(shù)據(jù)很難泛化,對⼀個模型真正的測驗就是它對沒有⻅過的場景的預(yù)測能⼒。
費米和馮·諾伊曼對有四個參數(shù)的模型就開始懷疑了,我們⽤來對 MNIST 數(shù)字分類的 30 個隱藏神經(jīng)元神經(jīng)⽹絡(luò)擁有將近 24,000 個參數(shù)!當(dāng)然很多,我們有 100 個隱藏元的⽹絡(luò)擁有將近80,000 個參數(shù),⽽⽬前最先進的深度神經(jīng)⽹絡(luò)包含百萬級或者⼗億級的參數(shù)。我們應(yīng)當(dāng)信賴這些結(jié)果么?
讓我們通過構(gòu)造⼀個網(wǎng)絡(luò)泛華能⼒很差的例⼦使這個問題更清晰。我們的⽹絡(luò)有 30 個隱藏神經(jīng)元,共 23,860 個參數(shù),但是我們不會使⽤所有 50,000 幅 MNIST 訓(xùn)練圖像,相反,我們只使⽤前 1,000 幅圖像。使⽤這個受限的集合,會讓泛化的問題突顯。我們按照之前同樣的⽅式,使⽤交叉熵代價函數(shù),學(xué)習(xí)速率設(shè)置為 η = 0.5 ⽽⼩批量數(shù)據(jù)⼤⼩設(shè)置為 10,不過這⾥我們要訓(xùn)練 400 個迭代期,⽐前⾯的要多⼀些,因為我們只⽤了少量的訓(xùn)練樣本。
使⽤上面的結(jié)果,我們可以畫出當(dāng)⽹絡(luò)學(xué)習(xí)時代價變化的情況:
這看起來令人振奮,因為代價函數(shù)有⼀個光滑的下降,跟我們預(yù)期⼀致。注意,我只是展⽰了 200 到 399 迭代期的情況。
讓我們看看分類準(zhǔn)確率在測試集上的表現(xiàn):
這里我還是聚焦到了后⾯的過程。在前 200 迭代期(圖中沒有顯⽰)中準(zhǔn)確率提升到了 82%。然后學(xué)習(xí)逐漸變緩,最終,在 280 迭代期左右分類準(zhǔn)確率就停⽌了增⻓,后⾯的迭代期,僅僅看到了在 280 迭代期準(zhǔn)確率周圍隨機的⼩波動,將這幅圖和前⾯的圖進⾏對⽐,前⾯的圖中和訓(xùn)練數(shù)據(jù)相關(guān)的代價持續(xù)平滑下降,如果我們只看那個代價,會發(fā)現(xiàn)我們模型的表現(xiàn)變得“更好”,但是測試準(zhǔn)確率展⽰了提升只是⼀種假象,就像費⽶不⼤喜歡的那個模型⼀樣,我們的⽹絡(luò)在 280 迭代期后就不在能夠推⼴到測試數(shù)據(jù)上,所以這不是有⽤的學(xué)習(xí),我們說⽹絡(luò)在 280迭代期后就過度擬合(overfitting)或者過度訓(xùn)練(overtraining)了。
所以我們的網(wǎng)絡(luò)實際上在學(xué)習(xí)訓(xùn)練數(shù)據(jù)集的特例,⽽不是能夠⼀般地進⾏識別,我們的⽹絡(luò)⼏乎是在單純記憶訓(xùn)練集合,⽽沒有對數(shù)字本質(zhì)進⾏理解能夠泛化到測試數(shù)據(jù)集上。
過度擬合是神經(jīng)網(wǎng)絡(luò)的⼀個主要問題。這在現(xiàn)代⽹絡(luò)中特別正常,因為⽹絡(luò)權(quán)重和偏置數(shù)量巨⼤,為了⾼效地訓(xùn)練,我們需要⼀種檢測過度擬合是不是發(fā)⽣的技術(shù),這樣我們不會過度訓(xùn)練,并且我們也想要找到⼀些技術(shù)來降低過度擬合的影響。
檢測過度擬合的明顯方法是使⽤上⾯的⽅法 —— 跟蹤測試數(shù)據(jù)集合上的準(zhǔn)確率隨訓(xùn)練變化情況,如果我們看到測試數(shù)據(jù)上的準(zhǔn)確率不再提升,那么我們就停⽌訓(xùn)練。當(dāng)然,嚴(yán)格地說,這其實并⾮是過度擬合的⼀個必要現(xiàn)象,因為測試集和訓(xùn)練集上的準(zhǔn)確率可能會同時停⽌提升,當(dāng)然,采⽤這樣的策略是可以阻⽌過度擬合的。
我們已經(jīng)研究了只使⽤ 1,000 幅訓(xùn)練圖像時的過度擬合問題。那么如果我們使⽤所有的50,000 幅圖像的訓(xùn)練數(shù)據(jù)會發(fā)⽣什么?我們會保留所有其它的參數(shù)都⼀樣(30 個隱藏元,學(xué)習(xí)速率 0.5,小批量數(shù)據(jù)規(guī)模為 10),但是迭代期為 30 次,下圖展⽰了分類準(zhǔn)確率在訓(xùn)練和測試集上的變化情況。
如你所⻅,測試集和訓(xùn)練集上的準(zhǔn)確率相⽐我們使⽤ 1,000 個訓(xùn)練數(shù)據(jù)時相差更小。特別地,在訓(xùn)練數(shù)據(jù)上的最佳的分類準(zhǔn)確率 97.86% 只⽐測試集上的 95.33% 準(zhǔn)確率⾼了 1.53%。⽽之前的例⼦中,這個差距是 17.73%!過度擬合仍然發(fā)⽣了,但是已經(jīng)減輕了不少,我們的⽹絡(luò)從訓(xùn)練數(shù)據(jù)上更好地泛化到了測試數(shù)據(jù)上,⼀般來說,最好的降低過度擬合的⽅式之⼀就是增加訓(xùn)練樣本的量,有了⾜夠的訓(xùn)練數(shù)據(jù),就算是⼀個規(guī)模⾮常⼤的⽹絡(luò)也不⼤容易過度擬合,不幸的是,訓(xùn)練數(shù)據(jù)其實是很難或者很昂貴的資源,所以這不是⼀種太切實際的選擇。
5、規(guī)范化
這一節(jié)你將了解用規(guī)范化方法來防止過度擬合的方法,但無法給出科學(xué)的解釋。
增加訓(xùn)練樣本的數(shù)量是⼀種減輕過度擬合的方法,還有其他的⼀下⽅法能夠減輕過度擬合的程度嗎?⼀種可⾏的⽅式就是降低⽹絡(luò)的規(guī)模。然⽽,⼤的⽹絡(luò)擁有⼀種⽐⼩⽹絡(luò)更強的潛⼒,所以這⾥存在⼀種應(yīng)⽤冗余性的選項,幸運的是,還有其他的技術(shù)能夠緩解過度擬合,即使我們只有⼀個固定的⽹絡(luò)和固定的訓(xùn)練集合,這種技術(shù)就是規(guī)范化。
本節(jié),我會給出⼀種最為常⽤的規(guī)范化手段 —— 有時候被稱為權(quán)重衰減(weight decay)或者 L2 規(guī)范化,L2 規(guī)范化的想法是增加⼀個額外的項到代價函數(shù)上,這個項叫做規(guī)范化項,下⾯是規(guī)范化的交叉熵:
其中第⼀個項就是常規(guī)的交叉熵的表達(dá)式。第⼆個現(xiàn)在加⼊的就是所有權(quán)重的平⽅的和,然后使⽤⼀個因⼦ λ/2n 進⾏量化調(diào)整,其中 λ > 0 可以稱為規(guī)范化參數(shù),⽽ n 就是訓(xùn)練集合的⼤⼩,我們會在后⾯討論 λ 的選擇策略。
直覺地看,規(guī)范化的效果是讓網(wǎng)絡(luò)傾向于學(xué)習(xí)⼩⼀點的權(quán)重,其他的東西都⼀樣的。⼤的權(quán)重只有能夠給出代價函數(shù)第⼀項⾜夠的提升時才被允許,換⾔之,規(guī)范化可以當(dāng)做⼀種尋找⼩的權(quán)重和最⼩化原始的代價函數(shù)之間的折中,這兩部分之前相對的重要性就由 λ 的值來控制了:λ 越⼩,就偏向于最⼩化原始代價函數(shù),反之,傾向于⼩的權(quán)重。
現(xiàn)在,對于這樣的折中為何能夠減輕過度擬合還不是很清楚!但是,實際表現(xiàn)表明了這點。
為了構(gòu)造這個例⼦,我們⾸先需要弄清楚如何將隨機梯度下降算法應(yīng)⽤在⼀個規(guī)范化的神經(jīng)網(wǎng)絡(luò)上。
這正和通常的梯度下降學(xué)習(xí)規(guī)則相同,除了通過⼀個因⼦ 1−ηλ/n重新調(diào)整了權(quán)重 w,這種調(diào)整有時被稱為權(quán)重衰減,因為它使得權(quán)重變⼩,粗看,這樣會導(dǎo)致權(quán)重會不斷下降到 0,但是實際不是這樣的,因為如果在原始代價函數(shù)中造成下降的話其他的項可能會讓權(quán)重增加。
讓我們看看規(guī)范化給網(wǎng)絡(luò)帶來的性能提升吧。這⾥還會使⽤有 30 個隱藏神經(jīng)元、⼩批量數(shù)據(jù)⼤⼩為 10,學(xué)習(xí)速率為 0.5,使⽤交叉熵的神經(jīng)⽹絡(luò),然⽽,這次我們會使⽤規(guī)范化參數(shù)為λ = 0.1,注意在代碼中,我們使⽤的變量名字為 lmbda。
訓(xùn)練集上的代價函數(shù)持續(xù)下降,和前⾯無規(guī)范化的情況⼀樣的規(guī)律:
但是這次測試集上的準(zhǔn)確率在整個 400 迭代期內(nèi)持續(xù)增加:
顯然,規(guī)范化的使用能夠解決過度擬合的問題,⽽且,準(zhǔn)確率相當(dāng)⾼了,最⾼處達(dá)到了 87.1%,相較于之前的 82.27%,因此,我們⼏乎可以確信在 400 迭代期之后持續(xù)訓(xùn)練會有更加好的結(jié)果,看起來,經(jīng)實踐檢驗,規(guī)范化讓⽹絡(luò)具有更好的泛化能⼒,顯著地減輕了過度擬合的影響。
我們已經(jīng)看到了規(guī)范化在實踐中能夠減少過度擬合了,這是令⼈振奮的,不過,這背后的原因還不得而知!通常的說法是:⼩的權(quán)重在某種程度上,意味著更低的復(fù)雜性,也就對數(shù)據(jù)給出了⼀種更簡單卻更強⼤解釋,因此應(yīng)該優(yōu)先選擇,這雖然很簡短,不過暗藏了⼀些可能看起來會令⼈困惑的因素。
假設(shè)神經(jīng)網(wǎng)絡(luò)⼤多數(shù)有很⼩的權(quán)重,這最可能出現(xiàn)在規(guī)范化的⽹絡(luò)中,更⼩的權(quán)重意味著⽹絡(luò)的⾏為不會因為我們隨便改變了⼀個輸⼊⽽改變太⼤,這會讓規(guī)范化⽹絡(luò)學(xué)習(xí)局部噪聲的影響更加困難,將它看做是⼀種讓單個的證據(jù)不會影響⽹絡(luò)輸出太多的⽅式。相對的,規(guī)范化⽹絡(luò)學(xué)習(xí)去對整個訓(xùn)練集中經(jīng)常出現(xiàn)的證據(jù)進⾏反應(yīng)。對⽐看,⼤權(quán)重的⽹絡(luò)可能會因為輸⼊的微⼩改變⽽產(chǎn)⽣⽐較⼤的⾏為改變。所以⼀個⽆規(guī)范化的⽹絡(luò)可以使⽤⼤的權(quán)重來學(xué)習(xí)包含訓(xùn)練數(shù)據(jù)中的噪聲的⼤量信息的復(fù)雜模型。簡⾔之,規(guī)范化⽹絡(luò)受限于根據(jù)訓(xùn)練數(shù)據(jù)中常⻅的模式來構(gòu)造相對簡單的模型,⽽能夠抵抗訓(xùn)練數(shù)據(jù)中的噪聲的特性影響,我們的想法就是這可以讓我們的⽹絡(luò)對看到的現(xiàn)象進⾏真實的學(xué)習(xí),并能夠根據(jù)已經(jīng)學(xué)到的知識更好地進⾏泛化。
所以,傾向于更簡單的解釋的想法其實會讓我們覺得緊張。人們有時候?qū)⑦@個想法稱為“奧卡姆剃⼑原則”,然后就會熱情地將其當(dāng)成某種科學(xué)原理來應(yīng)⽤這個法則。但是,這就不是⼀個⼀般的科學(xué)原理,也沒有任何先驗的邏輯原因來說明簡單的解釋就⽐更為負(fù)責(zé)的解釋要好。
我們應(yīng)當(dāng)時時記住這⼀點,規(guī)范化的神經(jīng)網(wǎng)絡(luò)常常能夠⽐⾮規(guī)范化的泛化能⼒更強,這只是⼀種實驗事實(empirical fact)。
6、棄權(quán)
這一節(jié)你將了解用相當(dāng)激進的棄權(quán)(Dropout)防止過度擬合的技術(shù)。
棄權(quán)(Dropout)是⼀種相當(dāng)激進的技術(shù),和規(guī)范化不同,棄權(quán)技術(shù)并不依賴對代價函數(shù)的修改,⽽是,在棄權(quán)中,我們改變了⽹絡(luò)本⾝。
假設(shè)我們嘗試訓(xùn)練⼀個網(wǎng)絡(luò):
特別地,假設(shè)我們有⼀個訓(xùn)練數(shù)據(jù) x 和對應(yīng)的目標(biāo)輸出 y,通常我們會通過在⽹絡(luò)中前向傳播 x ,然后進⾏反向傳播來確定對梯度的貢獻,使⽤棄權(quán)技術(shù),這個過程就改了。我們會從隨機(臨時)地刪除⽹絡(luò)中的⼀半的隱藏神經(jīng)元開始,同時讓輸⼊層和輸出層的神經(jīng)元保持不變。在此之后,我們會得到最終如下線條所⽰的⽹絡(luò)。注意那些被棄權(quán)的神經(jīng)元,即那些臨時被刪除的神經(jīng)元,⽤虛圈表⽰在圖中:
我們前向傳播輸⼊ x,通過修改后的⽹絡(luò),然后反向傳播結(jié)果,同樣通過這個修改后的⽹絡(luò),在⼀個小批量數(shù)據(jù)⼩批量的若⼲樣本上進⾏這些步驟后,我們對有關(guān)的權(quán)重和偏置進⾏更新。然后重復(fù)這個過程,⾸先重置棄權(quán)的神經(jīng)元,然后選擇⼀個新的隨機的隱藏神經(jīng)元的⼦集進⾏刪除,估計對⼀個不同的⼩批量數(shù)據(jù)的梯度,然后更新權(quán)重和偏置。
通過不斷地重復(fù),我們的網(wǎng)絡(luò)會學(xué)到⼀個權(quán)重和偏置的集合。當(dāng)然,這些權(quán)重和偏置也是在⼀半的隱藏神經(jīng)元被棄權(quán)的情形下學(xué)到的,當(dāng)我們實際運⾏整個⽹絡(luò)時,是指兩倍的隱藏神經(jīng)元將會被激活,為了補償這個,我們將從隱藏神經(jīng)元元出去的權(quán)重減半。
為什么我們會指望這樣的⽅法能夠進⾏規(guī)范化呢?為了解釋所發(fā)⽣的事,我希望你停下來想⼀下沒有標(biāo)準(zhǔn)(沒有棄權(quán))的訓(xùn)練⽅式。特別地,想象⼀下我們訓(xùn)練⼏個不同的神經(jīng)⽹絡(luò),都使⽤同⼀個訓(xùn)練數(shù)據(jù),當(dāng)然,⽹絡(luò)可能不是從同⼀初始狀態(tài)開始的,最終的結(jié)果也會有⼀些差異。出現(xiàn)這種情況時,我們可以使⽤⼀些平均或者投票的⽅式來確定接受哪個輸出。例如,如果我們訓(xùn)練了五個⽹絡(luò),其中三個把⼀個數(shù)字分類成“3”,那很可能它是“3”,另外兩個可能就犯了錯誤。這種平均的方式通常是⼀種強⼤(盡管代價昂貴)的⽅式來減輕過度擬合,原因在于不同的⽹絡(luò)可能會以不同的⽅式過度擬合,平均法可能會幫助我們消除那樣的過度擬合。
那么這和棄權(quán)有什么關(guān)系呢?啟發(fā)式地看,當(dāng)我們棄權(quán)掉不同的神經(jīng)元集合時,有點像我們在訓(xùn)練不同的神經(jīng)網(wǎng)絡(luò)。所以,棄權(quán)過程就如同⼤量不同⽹絡(luò)的效果的平均那樣,不同的⽹絡(luò)會以不同的⽅式過度擬合了,所以,棄權(quán)過的⽹絡(luò)的效果會減輕過度擬合。
棄權(quán)技術(shù)的真正衡量是它已經(jīng)在提升神經(jīng)⽹絡(luò)性能上應(yīng)用得相當(dāng)成功,在訓(xùn)練⼤規(guī)模深度⽹絡(luò)時尤其有⽤,這樣的⽹絡(luò)中過度擬合問題經(jīng)常特別突出。
7、人為擴展訓(xùn)練數(shù)據(jù)
我們前面看到了 MNIST 分類準(zhǔn)確率在我們使⽤ 1,000 幅訓(xùn)練圖像時候下降到了 80% 中間的準(zhǔn)確率。這種情況并不奇怪,因為更少的訓(xùn)練數(shù)據(jù)意味著我們的⽹絡(luò)接觸更少的⼈類⼿寫的數(shù)字中的變化。讓我們訓(xùn)練 30 個隱藏神經(jīng)元的⽹絡(luò),使⽤不同的訓(xùn)練數(shù)據(jù)集,來看看性能的變化情況。我們使⽤⼩批量數(shù)據(jù)⼤⼩為 10,學(xué)習(xí)速率為 η = 0.5,規(guī)范化參數(shù)是λ = 5.0,交叉熵代價函數(shù),我們在全部訓(xùn)練數(shù)據(jù)集合上訓(xùn)練 30 個迭代期,然后會隨著訓(xùn)練數(shù)據(jù)量的下降⽽成⽐例增加迭代期的數(shù)量。
分類準(zhǔn)確率在使⽤更多的訓(xùn)練數(shù)據(jù)時提升了很⼤。根據(jù)這個趨勢的話,提升會隨著更多的數(shù)據(jù)⽽不斷增加。
獲取更多的訓(xùn)練樣本其實是很好的想法。不幸的是,這個⽅法代價很⼤,在實踐中常常是很難達(dá)到的,不過,還有⼀種⽅法能夠獲得類似的效果,那就是⼈為擴展訓(xùn)練數(shù)據(jù),假設(shè)我們使⽤⼀個 5 的 MNIST 訓(xùn)練圖像:
將其進⾏旋轉(zhuǎn),比如說 15 度:
這還是會被設(shè)別為同樣的數(shù)字的,但是在像素層級這和任何⼀幅在 MNIST 訓(xùn)練數(shù)據(jù)中的圖像都不相同,所以將這樣的樣本加⼊到訓(xùn)練數(shù)據(jù)中是很可能幫助我們的⽹絡(luò)學(xué)會更多如何分類數(shù)字,⽽且,顯然我們不限于只增加這幅圖像,我們可以在所有的 MNIST 訓(xùn)練樣本上通過很多小的旋轉(zhuǎn)擴展訓(xùn)練數(shù)據(jù),然后使⽤擴展后的訓(xùn)練數(shù)據(jù)來提升我們⽹絡(luò)的性能。
這個想法非常強⼤并且已經(jīng)被⼴發(fā)應(yīng)⽤了。讓我們從⼀篇論⽂看看⼀些結(jié)果,這⽚論⽂中,作者在 MNIST 上使⽤了⼏個的這種想法的變化⽅式。其中⼀種他們考慮的⽹絡(luò)結(jié)構(gòu)其實和我們已經(jīng)使⽤過的類似 —— ⼀個擁有 800 個隱藏元的前饋神經(jīng)⽹絡(luò),使⽤了交叉熵代價函數(shù)。在標(biāo)準(zhǔn)的 MNIST 訓(xùn)練數(shù)據(jù)上運⾏這個⽹絡(luò),得到了 98.4% 的分類準(zhǔn)確率,他們不只旋轉(zhuǎn),還轉(zhuǎn)換和扭曲圖像來擴展訓(xùn)練數(shù)據(jù),通過在這個擴展后的數(shù)據(jù)集上的訓(xùn)練,他們提升到了 98.9% 的準(zhǔn)確率,然后還在“彈性扭曲”的數(shù)據(jù)上進⾏了實驗,這是⼀種特殊的為了模仿⼿部肌⾁的隨機抖動的圖像扭曲⽅法,通過使⽤彈性扭曲擴展的數(shù)據(jù),他們最終達(dá)到了 99.3% 的分類準(zhǔn)確率,他們通過展⽰訓(xùn)練數(shù)據(jù)的所有類型的變化形式來擴展⽹絡(luò)的經(jīng)驗。
8、權(quán)重初始化
創(chuàng)建了神經(jīng)網(wǎng)絡(luò)后,我們需要進⾏權(quán)重和偏置的初始化,之前的⽅式就是根據(jù)獨⽴⾼斯隨機變量來選擇權(quán)重和偏置,其被歸⼀化為均值為 0,標(biāo)準(zhǔn)差 1。這個⽅法⼯作的還不錯,但是⾮常特別,所以值得去重新探討它,看看是否能尋找⼀些更好的⽅式來設(shè)置初始的權(quán)重和偏置,這也許能幫助我們的⽹絡(luò)學(xué)習(xí)得更快。
結(jié)果表明,我們可以比使⽤歸⼀化的⾼斯分布做得更好,為什么?假設(shè)我們使⽤⼀個有⼤量輸⼊神經(jīng)元的⽹絡(luò),⽐如說 1,000 個,假設(shè),我們已經(jīng)使⽤歸⼀化的⾼斯分布初始化了連接第⼀個隱藏層的權(quán)重,現(xiàn)在我將注意⼒集中在這⼀層的連接權(quán)重上,忽略⽹絡(luò)其他部分:
為了簡化,假設(shè)我們使用訓(xùn)練輸⼊ x,其中⼀半的輸⼊神經(jīng)元值為 1,另⼀半為 0,以下的論點更普遍適⽤,但你可以從這種特殊情況得到要點。讓我們考慮隱藏神經(jīng)元輸⼊的帶權(quán)和z =∑j W j X j+ b。其中 500 個項消去了,因為對應(yīng)的輸⼊ X j 為 0。所以 z 是遍歷總共 501 個歸⼀化的⾼斯隨機變量的和,包含 500 個權(quán)重項和額外的 1 個偏置項,因此 z 本⾝是⼀個均值為 0標(biāo)準(zhǔn)差為√ 501 ≈ 22.4 的⾼斯分布。z 其實有⼀個⾮常寬的⾼斯分布,完全不是⾮常尖的形狀:
尤其是,我們可以從這幅圖中看出 |z| 會變得非常的⼤,即 z ≫ 1 或者 z ≪−1。如果是這樣,隱藏神經(jīng)元的輸出 σ(z) 就會接近 1 或者 0。也就表⽰我們的隱藏神經(jīng)元會飽和。所以當(dāng)出現(xiàn)這樣的情況時,在權(quán)重中進⾏微⼩的調(diào)整僅僅會給隱藏神經(jīng)元的激活值帶來極其微弱的改變。⽽這種微弱的改變也會影響⽹絡(luò)中剩下的神經(jīng)元,然后會帶來相應(yīng)的代價函數(shù)的改變。結(jié)果就是,這些權(quán)重在我們進⾏梯度下降算法時會學(xué)習(xí)得⾮常緩慢。
假設(shè)我們有⼀個有 n 個輸入權(quán)重的神經(jīng)元。我們會使⽤均值為 0 標(biāo)準(zhǔn)差為 1/ √ n 的⾼斯隨機分布初始化這些權(quán)重。也就是說,我們會向下擠壓⾼斯分布,讓我們的神經(jīng)元更不可能飽和,我們會繼續(xù)使⽤均值為 0 標(biāo)準(zhǔn)差為 1 的⾼斯分布來對偏置進⾏初始化,后⾯會告訴你原因。有了這些設(shè)定,帶權(quán)和 z =∑jW jX j+ b 仍然是⼀個均值為 0,不過有尖銳峰值的⾼斯分布。假設(shè),我們有 500 個值為 0 的輸⼊和 500 個值為 1 的輸⼊。那么很容易證明 z 是服從均值為 0 標(biāo)準(zhǔn)差為√ 3/2 = 1.22... 的⾼斯分布。
這樣的⼀個神經(jīng)元更不可能飽和,因此也不大可能遇到學(xué)習(xí)速度下降的問題,讓我們在 MNIST 數(shù)字分類任務(wù)上⽐較⼀下新舊兩種權(quán)重初始化⽅式,同樣,還是使⽤ 30 個隱藏元,⼩批量數(shù)據(jù)的⼤⼩為 10,規(guī)范化參數(shù) λ = 5.0,然后是交叉熵代價函數(shù)。我們將學(xué)習(xí)速率從 η = 0.5 降到 0.1,因為這樣會讓結(jié)果在圖像中表現(xiàn)得更加明顯。
兩種情形下,我們在 96% 的準(zhǔn)確率上重合了。最終的分類準(zhǔn)確率⼏乎完全⼀樣。但是新的初始化技術(shù)帶來了速度的提升,在第⼀種初始化⽅式的分類準(zhǔn)確率在 87% 以下,⽽新的⽅法已經(jīng)⼏乎達(dá)到了 93%。看起來的情況就是我們新的關(guān)于權(quán)重初始化的⽅式將訓(xùn)練帶到了⼀個新的境界,讓我們能夠更加快速地得到好的結(jié)果。
9、寬泛策略
直到現(xiàn)在,我們還沒有解釋對諸如學(xué)習(xí)速率 η,規(guī)范化參數(shù) λ 等等超參數(shù)選擇的⽅法,我只是給出那些效果很好的值⽽已,實踐中,當(dāng)你使⽤神經(jīng)網(wǎng)絡(luò)解決問題時,尋找好的超參數(shù)其實是很困難的⼀件事。例如,我們要解決 MNIST 問題,開始時對于選擇什么樣的超參數(shù)⼀⽆所知。假設(shè),剛開始的實驗中選擇前⾯章節(jié)的參數(shù)都是運⽓較好,但在使⽤學(xué)習(xí)速率 η=10.0 ⽽規(guī)范化參數(shù) λ = 1000.0,下⾯是我們的⼀個嘗試:
我們分類準(zhǔn)確率并不比隨機選擇更好,⽹絡(luò)就像隨機噪聲產(chǎn)⽣器⼀樣,你可能會說,“這好辦,降低學(xué)習(xí)速率和規(guī)范化參數(shù)就好了。”不幸的是,你并不先驗地知道這些就是需要調(diào)整的超參數(shù)??赡苷嬲膯栴}出在 30 個隱藏元中,本身就不能很有效,不管我們?nèi)绾握{(diào)整其他的超參數(shù)都沒有作⽤的?可能我們真的需要⾄少 100 個隱藏神經(jīng)元?或者是 300個隱藏神經(jīng)元?或者更多層的⽹絡(luò)?或者不同輸出編碼⽅式?可能我們的⽹絡(luò)⼀直在學(xué)習(xí),只是學(xué)習(xí)的回合還不夠?可能 minibatch 的太⼩了?可能我們需要切換成⼆次代價函數(shù)?可能我們需要嘗試不同的權(quán)重初始化⽅法?等等。很容易就在超參數(shù)的選擇中迷失了⽅向。如果你的⽹絡(luò)規(guī)模很⼤,或者使⽤了很多的訓(xùn)練數(shù)據(jù),這種情況就很令⼈失望了,因為⼀次訓(xùn)練可能就要⼏個⼩時甚⾄⼏天乃⾄⼏周,最終什么都沒有獲得。如果這種情況⼀直發(fā)⽣,就會打擊你的⾃信⼼。可能你會懷疑神經(jīng)⽹絡(luò)是不是適合你所遇到的問題?可能就應(yīng)該放棄這種嘗試了?
假設(shè),我們第⼀次遇到 MNIST 分類問題。剛開始,你很有激情,但是當(dāng)?shù)?#12032;個神經(jīng)⽹絡(luò)完全失效時,你會就得有些沮喪,此時就可以將問題簡化,丟開訓(xùn)練和驗證集合中的那些除了 0 和 1的那些圖像,然后試著訓(xùn)練⼀個⽹絡(luò)來區(qū)分 0 和 1,不僅僅問題⽐ 10 個分類的情況簡化了,同樣也會減少 80% 的訓(xùn)練數(shù)據(jù),這樣就給出了 5 倍的加速。這樣可以保證更快的實驗,也能給予你關(guān)于如何構(gòu)建好的網(wǎng)絡(luò)更快的洞察。
你通過簡化網(wǎng)絡(luò)來加速實驗進⾏更有意義的學(xué)習(xí),如果你相信 [784,10] 的⽹絡(luò)更可能⽐隨機更加好的分類效果,那么就從這個⽹絡(luò)開始實驗,這會⽐訓(xùn)練⼀個 [784,30,10] 的⽹絡(luò)更快,你可以進⼀步嘗試后⼀個。
你可以通過提⾼監(jiān)控的頻率來在試驗中獲得另⼀個加速了,比如我們將訓(xùn)練數(shù)據(jù)減少到前 1,000 幅 MNIST 訓(xùn)練圖像。讓我們嘗試⼀下,看看結(jié)果:
在上⾯的例⼦中,我設(shè)置 λ=1000.0,跟我們之前⼀樣。但是因為這⾥改變了訓(xùn)練樣本的個數(shù),我們必須對 λ 進⾏調(diào)整以保證權(quán)重下降的同步性,這意味著改變 λ =20.0,如果我們這樣設(shè)置,則有:
哦也!現(xiàn)在有了信號了,不是非常糟糕的信號,卻真是⼀個信號。我們可以基于這點,來改變超參數(shù)從⽽獲得更多的提升,可能我們猜測學(xué)習(xí)速率需要增加(你可以能會發(fā)現(xiàn),這只是⼀個不⼤好的猜測,原因后⾯會講,但是相信我)所以為了測試我們的猜測就將 η 調(diào)整⾄ 100.0:
這并不好!告訴我們之前的猜測是錯誤的,問題并不是學(xué)習(xí)速率太低了,所以,我們試著將η 將⾄ η = 1.0:
這樣好點了!所以我們可以繼續(xù),逐個調(diào)整每個超參數(shù),慢慢提升性能。⼀旦我們找到⼀種提升性能的 η 值,我們就可以嘗試尋找好的值。然后按照⼀個更加復(fù)雜的⽹絡(luò)架構(gòu)進⾏實驗,假設(shè)是⼀個有 10 個隱藏元的⽹絡(luò)。然后繼續(xù)調(diào)整 η 和 λ。接著調(diào)整成 20 個隱藏元。然后將其他的超參數(shù)調(diào)整再調(diào)整。如此進⾏,在每⼀步使用我們 hold out 驗證數(shù)據(jù)集來評價性能,使⽤這些度量來找到越來越好的超參數(shù),當(dāng)我們這么做的時候,⼀般都需要花費更多時間來發(fā)現(xiàn)由于超參數(shù)改變帶來的影響,這樣就可以⼀步步減少監(jiān)控的頻率。
所有這些作為⼀種寬泛的策略看起來很有前途。
10、學(xué)習(xí)速率
假設(shè)我們運⾏了三個不同學(xué)習(xí)速率(η = 0.025、η = 0.25、η = 2.5)的 MNIST 網(wǎng)絡(luò),我們會像前⾯介紹的實驗?zāi)菢釉O(shè)置其他的超參數(shù),進⾏30 回合,minibatch ⼤⼩為 10,然后λ = 5.0,我們同樣會使⽤整個 50,000 幅訓(xùn)練圖像,下⾯是⼀副展⽰了訓(xùn)練代價的變化情況的圖:
使⽤ η = 0.025,代價函數(shù)平滑下降到最后的回合,使⽤ η = 0.25,代價剛開始下降,在⼤約20 回合后接近飽和狀態(tài),后⾯就是微小的震蕩和隨機抖動,最終使⽤ η = 2.5 代價從始⾄終都震蕩得⾮常明顯,為了理解震蕩的原因,回想⼀下隨機梯度下降其實是期望我們能夠逐漸地抵達(dá)代價函數(shù)的⾕底的:
然⽽,如果 η 太大的話,步⻓也會變⼤可能會使得算法在接近最⼩值時候⼜越過了⾕底,這在η = 2.5 時⾮常可能發(fā)⽣。當(dāng)我們選擇 η = 0.25 時,初始⼏步將我們帶到了⾕底附近,但⼀旦到達(dá)了⾕底,⼜很容易跨越過去,⽽在我們選擇 η = 0.025 時,在前 30 回合的訓(xùn)練中不再受到這個情況的影響。當(dāng)然,選擇太⼩的學(xué)習(xí)速率,也會帶來另⼀個問題 —— 隨機梯度下降算法變慢了,⼀種更加好的策略其實是,在開始時使⽤ η = 0.25,隨著越來越接近⾕底,就換成 η = 0.025,現(xiàn)在,我們就聚焦在找出⼀個單獨的好的學(xué)習(xí)速率的選擇η。
所以,有了這樣的想法,我們可以如下設(shè)置 η。⾸先,我們選擇在訓(xùn)練數(shù)據(jù)上的代價⽴即開始下降⽽非震蕩或者增加時作為 η 的閾值的估計,這個估計并不需要太過精確,你可以估計這個值的量級,⽐如說從 η = 0.01 開始,如果代價在訓(xùn)練的前⾯若⼲回合開始下降,你就可以逐步地嘗試 η = 0.1,1.0,...,直到你找到⼀個 η 的值使得在開始若⼲回合代價就開始震蕩或者增加,相反,如果代價在 η = 0.01 時就開始震蕩或者增加,那就嘗試 η = 0.001,0.0001,... 直到你找到代價在開始回合就下降的設(shè)定,按照這樣的⽅法,我們可以掌握學(xué)習(xí)速率的閾值的量級的估計,你可以選擇性地優(yōu)化估計,選擇那些最⼤的 η,⽐⽅說 η = 0.5 或者 η = 0.2。
11、小批量數(shù)據(jù)大小
我們應(yīng)該如何設(shè)置小批量數(shù)據(jù)的⼤⼩?為了回答這個問題,讓我們先假設(shè)正在進⾏在線學(xué)習(xí),也就是說使⽤⼤⼩為 1 的⼩批量數(shù)據(jù)。
我們使用100 的小批量數(shù)據(jù)的學(xué)習(xí)規(guī)則如下:
這⾥是對小批量數(shù)據(jù)中所有訓(xùn)練樣本求和,而在線學(xué)習(xí)是:
即使它僅僅是 50 倍的時間,結(jié)果仍然⽐直接在線學(xué)習(xí)更好,因為我們在線學(xué)習(xí)更新得太過頻繁了。
所以,選擇最好的小批量數(shù)據(jù)⼤⼩也是⼀種折衷,太⼩了,你不會⽤上很好的矩陣庫的快速計算,太⼤,你是不能夠⾜夠頻繁地更新權(quán)重的,你所需要的是選擇⼀個折衷的值,可以最⼤化學(xué)習(xí)的速度,幸運的是,⼩批量數(shù)據(jù)⼤⼩的選擇其實是相對獨⽴的⼀個超參數(shù)(⽹絡(luò)整體架構(gòu)外的參數(shù)),所以你不需要優(yōu)化那些參數(shù)來尋找好的⼩批量數(shù)據(jù)⼤⼩,因此,可以選擇的⽅式就是使⽤某些可以接受的值(不需要是最優(yōu)的)作為其他參數(shù)的選擇,然后進⾏不同⼩批量數(shù)據(jù)⼤⼩的嘗試,像上⾯那樣調(diào)整 η。畫出驗證準(zhǔn)確率的值隨時間(⾮回合)變化的圖,選擇哪個得到最快性能的提升的⼩批量數(shù)據(jù)⼤⼩。得到了 ⼩批量數(shù)據(jù)⼤⼩,也就可以對其他的超參數(shù)進⾏優(yōu)化了。
跟隨上面看的經(jīng)驗并不能幫助你的⽹絡(luò)給出絕對最優(yōu)的結(jié)果,但是很可能給你⼀個好的開始和⼀個改進的基礎(chǔ),特別地,我已經(jīng)非常獨⽴地討論了超參數(shù)的選擇。實踐中,超參數(shù)之間存在著很多關(guān)系,你可能使⽤ η 進⾏試驗,發(fā)現(xiàn)效果不錯,然后去優(yōu)化 λ,發(fā)現(xiàn)這⾥⼜對 η 混在⼀起了,在實踐中,⼀般是來回往復(fù)進⾏的,最終逐步地選擇到好的值??傊?,啟發(fā)式規(guī)則其實都是經(jīng)驗,不是⾦規(guī)⽟律。你應(yīng)該注意那些沒有效果的嘗試的信號,然后樂于嘗試更多試驗,特別地,這意味著需要更加細(xì)致地監(jiān)控神經(jīng)⽹絡(luò)⾏為,特別是驗證集上的準(zhǔn)確率。
設(shè)定超參數(shù)的挑戰(zhàn)讓⼀些人抱怨神經(jīng)⽹絡(luò)相⽐較其他的機器學(xué)習(xí)算法需要⼤量的⼯作進⾏參數(shù)選擇。我也聽到很多不同的版本:“的確,參數(shù)完美的神經(jīng)⽹絡(luò)可能會在這問題上獲得最優(yōu)的性能。但是,我可以嘗試⼀下隨機森林(或者 SVM 或者……這⾥腦補⾃⼰偏愛的技術(shù))也能夠⼯作的。我沒有時間搞清楚那個最好的神經(jīng)⽹絡(luò)。”當(dāng)然,從⼀個實踐者角度,肯定是應(yīng)⽤更加容易的技術(shù),這在你剛開始處理某個問題時尤其如此,因為那時候,你都不確定⼀個機器學(xué)習(xí)算法能夠解決那個問題。但是,如果獲得最優(yōu)的性能是最重要的⽬標(biāo)的話,你就可能需要嘗試更加復(fù)雜精妙的知識的⽅法了,如果機器學(xué)習(xí)總是簡單的話那是太好不過了,但也沒有⼀個應(yīng)當(dāng)?shù)睦碛烧f機器學(xué)習(xí)⾮得這么簡單。
洋洋灑灑這么多,其實也只是接觸了些皮毛,但相對于很多書本關(guān)于公式和代碼的堆砌,這寫內(nèi)容的確給人以不少啟迪,讓你知道為什么這么做,而讓筆者吃驚的是,神經(jīng)網(wǎng)絡(luò)的參數(shù)調(diào)整很多竟然是沒有明確科學(xué)依據(jù)的,更多的還要依賴經(jīng)驗。