原文鏈接
Dropout是一種常見(jiàn)的正則化方法。它借用了集成學(xué)習(xí)的思想,近似實(shí)現(xiàn)了同時(shí)訓(xùn)練大量網(wǎng)絡(luò)結(jié)構(gòu),并通過(guò)集成得出預(yù)測(cè)結(jié)果的功能。由于含有集成環(huán)節(jié),Dropout可以有效地避免過(guò)擬合。
一、Dropout的基本思想
Dropout要解決的問(wèn)題是:在同一個(gè)神經(jīng)網(wǎng)絡(luò)模型中,有沒(méi)有可能通過(guò)一定的手段模擬出多個(gè)網(wǎng)絡(luò)模型的效果,從而提升模型精度?針對(duì)這個(gè)問(wèn)題,Dropout巧妙利用了一個(gè)事實(shí):一個(gè)神經(jīng)網(wǎng)絡(luò)模型中,通過(guò)屏蔽部分神經(jīng)元,就可以構(gòu)建出不同的神經(jīng)網(wǎng)絡(luò)模型。如下圖,原始神經(jīng)網(wǎng)絡(luò)的輸入層有2個(gè)神經(jīng)元,隱藏層有2個(gè)神經(jīng)元。通過(guò)把部分神經(jīng)元?jiǎng)h去,我們可以得到24 =16 種不同的網(wǎng)絡(luò)。當(dāng)然,其中一部分網(wǎng)絡(luò)是無(wú)效網(wǎng)絡(luò),例如第4行的所有網(wǎng)絡(luò),但這并不會(huì)造成太大影響,因?yàn)楫?dāng)特征數(shù)、網(wǎng)絡(luò)層數(shù)增加的時(shí)候,這種無(wú)效網(wǎng)絡(luò)的比例會(huì)急劇下降。

和一般的Bagging模型不同,上述的所有網(wǎng)絡(luò)只是網(wǎng)絡(luò)結(jié)構(gòu)不同,但所有的參數(shù)都是共享的。因此,這種方法的效果比直接訓(xùn)練同樣數(shù)量的獨(dú)立網(wǎng)絡(luò)要差一些。但是,我們應(yīng)該注意到,當(dāng)有n個(gè)特征時(shí),不同結(jié)構(gòu)的數(shù)量可以達(dá)到2n個(gè)!對(duì)于如此巨大的網(wǎng)絡(luò)數(shù)量,訓(xùn)練獨(dú)立網(wǎng)絡(luò)本身就是一件不可能的事情。所以,結(jié)構(gòu)不同、參數(shù)共享的網(wǎng)絡(luò)已經(jīng)是一種非常好的實(shí)現(xiàn)方法了。另外,指數(shù)級(jí)別的網(wǎng)絡(luò)數(shù)量也保證了共享參數(shù)的網(wǎng)絡(luò)能達(dá)到好的預(yù)測(cè)效果。
接下來(lái),Dropout還需要解決如下問(wèn)題:
- 如何同時(shí)訓(xùn)練不同結(jié)構(gòu)的(參數(shù)共享)的網(wǎng)絡(luò)?
- 如何對(duì)不同結(jié)構(gòu)的網(wǎng)絡(luò)進(jìn)行集成,從而得到預(yù)測(cè)結(jié)果?
我們?cè)谙乱还?jié)討論這兩個(gè)問(wèn)題。
二、Dropout的訓(xùn)練和預(yù)測(cè)方法
2.1 訓(xùn)練
一般來(lái)說(shuō),神經(jīng)網(wǎng)絡(luò)的訓(xùn)練會(huì)采用隨機(jī)梯度下降法。該方法每次訓(xùn)練會(huì)選取一個(gè)batch的數(shù)據(jù),通過(guò)BP算法計(jì)算梯度,并更新參數(shù)。為了訓(xùn)練不同結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò),我們需要屏蔽其中的一些神經(jīng)元。實(shí)際上,神經(jīng)網(wǎng)絡(luò)的特殊結(jié)構(gòu)使得我們屏蔽相關(guān)的神經(jīng)元非常簡(jiǎn)單——只需要在該神經(jīng)元的輸出上乘以0即可。如下圖,我們?cè)谳斎雽雍碗[含層的每個(gè)神經(jīng)元上面乘以一個(gè)系數(shù)μ,μ只能為0或1。那么,μ=1時(shí),該神經(jīng)元可以正常輸出,而μ=0時(shí),該神經(jīng)元就會(huì)被屏蔽。

值得注意的是,屏蔽神經(jīng)元并不意味著我們會(huì)把該神經(jīng)元的內(nèi)容清空。神經(jīng)元內(nèi)部的參數(shù)仍然是保留的,只是在本次訓(xùn)練中,它的輸出被外部變量μ=0屏蔽了。這樣,我們就能夠?qū)崿F(xiàn)一個(gè)子網(wǎng)絡(luò)的訓(xùn)練。
那么,屏蔽層μ的數(shù)值是如何確定的呢?這就是在深度學(xué)習(xí)框架中的常見(jiàn)超參數(shù):keep probability,即保留概率,在各種框架中一般記作keep_prob。在每次訓(xùn)練中,各個(gè)屏蔽系數(shù)μ獨(dú)立設(shè)置,設(shè)置為1的概率為keep_prob,設(shè)置為0的概率則為1-keep_prob。由此可見(jiàn),保留概率為1時(shí),神經(jīng)網(wǎng)絡(luò)不采用Dropout,而保留概率為0時(shí),神經(jīng)網(wǎng)絡(luò)就不再工作(因?yàn)樗猩窠?jīng)元都被屏蔽)。一般來(lái)說(shuō),保留概率可以選取0.5~0.8。
由于參數(shù)共享,每次訓(xùn)練過(guò)程盡管只針對(duì)某一個(gè)網(wǎng)絡(luò),但所有網(wǎng)絡(luò)的參數(shù)(除了本次被屏蔽的神經(jīng)元參數(shù))都會(huì)同步更新。Dropout的訓(xùn)練方法與不含Dropout的訓(xùn)練方法的區(qū)別在于,訓(xùn)練時(shí)會(huì)考慮到不同網(wǎng)絡(luò)結(jié)構(gòu)下最優(yōu)參數(shù)的設(shè)置,因此最終訓(xùn)練出來(lái)的參數(shù)在每種網(wǎng)絡(luò)結(jié)構(gòu)下都會(huì)有一定的效果??梢钥闯?,這種方法能夠有效地避免過(guò)擬合,因?yàn)檫^(guò)擬合的本質(zhì)在于網(wǎng)絡(luò)參數(shù)對(duì)誤差過(guò)于敏感,而一組參數(shù)如果在不同的網(wǎng)絡(luò)結(jié)構(gòu)下都能取得不錯(cuò)的效果,那么這組參數(shù)發(fā)生過(guò)擬合的概率也會(huì)降低。
2.2 預(yù)測(cè)
集成預(yù)測(cè)方法一般需要計(jì)算每種網(wǎng)絡(luò)結(jié)構(gòu)下的預(yù)測(cè)值,并做加權(quán)平均??上У氖?,由于網(wǎng)絡(luò)結(jié)構(gòu)有2n種,我們無(wú)法逐個(gè)計(jì)算。與訓(xùn)練不同的地方在于,訓(xùn)練時(shí)我們可以通過(guò)訓(xùn)練一種網(wǎng)絡(luò)結(jié)構(gòu),實(shí)現(xiàn)其他網(wǎng)絡(luò)結(jié)構(gòu)的參數(shù)同步更新,而預(yù)測(cè)的時(shí)候,我們無(wú)法通過(guò)某一個(gè)網(wǎng)絡(luò)結(jié)構(gòu)下的預(yù)測(cè)結(jié)果,獲取其他網(wǎng)絡(luò)結(jié)構(gòu)下的預(yù)測(cè)結(jié)果。實(shí)際上,到目前為止還沒(méi)有什么方法能在數(shù)學(xué)意義上保證有效的預(yù)測(cè),所以只能采用一些啟發(fā)式的方法。
一種最簡(jiǎn)單的思路是隨機(jī)選取有限數(shù)量(如10~20組)網(wǎng)絡(luò),分別進(jìn)行預(yù)測(cè),再對(duì)預(yù)測(cè)結(jié)果按照概率進(jìn)行加權(quán)平均。這種方法看上去只利用了很少的網(wǎng)絡(luò)結(jié)構(gòu),但在實(shí)踐中可以運(yùn)行得很好。另一種方法是采用幾何平均值代替算術(shù)加權(quán)平均值,作為Bagging后的結(jié)果。當(dāng)然,幾何平均值并不比算術(shù)平均值更容易求解,但是我們可以用一種有效的方法近似處理:只需考慮所有元素均未屏蔽的網(wǎng)絡(luò),在每個(gè)神經(jīng)元的輸出時(shí)乘以保留概率,最終得到的輸出即可近似表示Bagging后的預(yù)測(cè)值。在一定條件下,可以證明這樣處理得到的結(jié)果即為幾何平均值,但在更多情況下,這只是一種簡(jiǎn)單的近似。
2.3 Dropout的實(shí)用變形
根據(jù)前兩個(gè)小節(jié)的結(jié)果,我們可以看出Dropout的應(yīng)用方法:
在訓(xùn)練時(shí),每個(gè)神經(jīng)元以keep_prob的概率正常輸出,以1-keep_prob的概率輸出0,然后運(yùn)行BP算法進(jìn)行梯度計(jì)算。
在預(yù)測(cè)時(shí),每個(gè)神經(jīng)元的輸出乘以keep_prob后,進(jìn)入下一層。
為了更加方便地使用Dropout,我們通常做如下變形:
在訓(xùn)練時(shí),每個(gè)神經(jīng)元以keep_prob的概率放大1/keep_prob倍輸出。以1-keep_prob的概率輸出0。這樣,每個(gè)神經(jīng)元的輸出期望值和沒(méi)有Dropout時(shí)的正常輸出值相等。
在預(yù)測(cè)時(shí),直接按照全網(wǎng)絡(luò)進(jìn)行預(yù)測(cè)即可。
這個(gè)變形實(shí)際上把預(yù)測(cè)時(shí)乘以keep_prob的過(guò)程轉(zhuǎn)移到了訓(xùn)練中。這樣,Dropout就完全成為訓(xùn)練參數(shù)。由于在深度學(xué)習(xí)中,訓(xùn)練和預(yù)測(cè)通常是分開(kāi)的,這么處理使得預(yù)測(cè)時(shí)完全不用考慮Dropout的問(wèn)題,為程序編寫(xiě)和運(yùn)行帶來(lái)了方便。
作為小結(jié),Dropout是深度學(xué)習(xí)中的常用技巧,通過(guò)同時(shí)訓(xùn)練結(jié)構(gòu)不同、參數(shù)共享的網(wǎng)絡(luò),模擬Bagging的效果。同時(shí),由于訓(xùn)練時(shí)每個(gè)神經(jīng)元的輸出不確定可能為正常值,也可能為零,因此訓(xùn)練出來(lái)的網(wǎng)絡(luò)對(duì)于誤差有更強(qiáng)的適應(yīng)性,從而有效避免過(guò)擬合。Dropout原理的簡(jiǎn)易性使其可以適應(yīng)于各種結(jié)構(gòu)的網(wǎng)絡(luò)。但應(yīng)該注意到,Dropout本質(zhì)上是一種正則化手段,因此引入Dropout有可能會(huì)降低模型的訓(xùn)練速度和精度。