引言:相信有接觸過深度學(xué)習(xí)的同學(xué)應(yīng)該知道dropout可以用來解決過擬合問題,但為什么dropout能解決過擬合,它的的原理具體是什么?它有什么經(jīng)驗(yàn)值或者它可能有什么缺點(diǎn)?這次分享也希望能回答這些問題。
什么是Dropout?
為了應(yīng)對(duì)神經(jīng)網(wǎng)絡(luò)很容易過擬合的問題,2014年 Hinton 提出了一個(gè)神器:
Dropout: A Simple Way to Prevent Neural Networks from Overfitting.(防止神經(jīng)網(wǎng)絡(luò)過擬合的一種簡(jiǎn)單方法。)
原始論文:http://jmlr.org/papers/v15/srivastava14a.html
定義就是這么簡(jiǎn)單,就是用來防止神經(jīng)網(wǎng)絡(luò)過擬合問題。
那么這里引出一個(gè)更重要的問題是,什么是過擬合?
什么是過擬合?
定義:過擬合就是訓(xùn)練出來的模型在訓(xùn)練集上表現(xiàn)很好,但是在測(cè)試集上表現(xiàn)較差的一種現(xiàn)象。
這里先普及下訓(xùn)練模型關(guān)于數(shù)據(jù)集的劃分,一般情況我們都會(huì)將數(shù)據(jù)集劃分為以下:
- 訓(xùn)練集(顧名思義,用來訓(xùn)練的)
- 驗(yàn)證集(訓(xùn)練過程中去驗(yàn)證模型效果的)
- 測(cè)試集(用來評(píng)測(cè)模型最終效果的數(shù)據(jù)集)
這樣我們比較清楚過擬合在不同數(shù)據(jù)集會(huì)有什么樣的表現(xiàn)。說白了,就是模型在訓(xùn)練集學(xué)習(xí)到的東西,不能很好的泛化到測(cè)試集,造成這樣的原因有很多,稍后繼續(xù)講。
可能上面的定義對(duì)沒有怎么接觸過深度學(xué)習(xí)的同學(xué)可能還不夠直觀,我舉個(gè)通俗一點(diǎn)的例子:
訓(xùn)練的情況:比如你去學(xué)車,在訓(xùn)練場(chǎng)上你熟練記得倒車入庫還有側(cè)方位停車的口訣,每次都能倒進(jìn)去,因?yàn)槟阋呀?jīng)很熟悉這個(gè)環(huán)境了,這個(gè)是訓(xùn)練的時(shí)候的情況,自我感覺良好
測(cè)試的情況:但真正上考場(chǎng)的時(shí)候,媽蛋,發(fā)現(xiàn)情況跟自己想得完全不一樣,換了車和場(chǎng)地之后就不知道怎么開了,起步直接掛掉,這個(gè)就是考試的情況,完全不符合預(yù)期,這就是過擬合。
或者看圖更好理解:
左邊:欠擬合,完全沒有學(xué)會(huì)東西。
中間:剛剛好擬合,更符合我們對(duì)模型的預(yù)期。
右邊:過擬合,過度擬合訓(xùn)練集的數(shù)據(jù)了。
ok,關(guān)于模型過擬合的定義,我們應(yīng)該比較清楚了。
那么產(chǎn)出過擬合的原因有哪些?
- 數(shù)據(jù)有噪聲
- 訓(xùn)練數(shù)據(jù)不足,有限的訓(xùn)練數(shù)據(jù)
- 訓(xùn)練模型過度導(dǎo)致模型非常復(fù)雜
總的一句話:模型開始胡思亂想了。
那問題來了:怎么避免過擬合?
如何避免過擬合?
直接上結(jié)論:
- early stopping
- 擴(kuò)增數(shù)據(jù)集
- 控制模型參數(shù)大小(正則化:L1、L2)
- dropout正則化
early stopping
大致意思就是在模型對(duì)訓(xùn)練數(shù)據(jù)集迭代收斂之前停止迭代防止過擬合。
上圖更好解釋:
可以看到模型的error是隨著訓(xùn)練時(shí)間是呈曲線下降的,也就是說,這里包括train error和cross validation error,如果它在訓(xùn)練過程中在某個(gè)最低點(diǎn)之后cross validation error開始上升,說明模型可能存在過擬合了。
一般的做法是,在訓(xùn)練的過程中,記錄到目前為止最好的validation accuracy,當(dāng)連續(xù)10次Epoch(或者更多次)沒達(dá)到最佳a(bǔ)ccuracy時(shí),則可以認(rèn)為accuracy不再提高了。此時(shí)便可以停止迭代了(Early Stopping)。
擴(kuò)增數(shù)據(jù)集
有時(shí)候往往擁有更多的數(shù)據(jù)勝過一個(gè)好的模型。
- 從數(shù)據(jù)源頭采集更多數(shù)據(jù)
- 復(fù)制原有的數(shù)據(jù)并加上隨機(jī)噪聲
- 重采樣
- 根據(jù)當(dāng)前數(shù)據(jù)集估計(jì)數(shù)據(jù)分布參數(shù),使用該分布產(chǎn)生更多的數(shù)據(jù)等
正則化
即在對(duì)模型的目標(biāo)函數(shù)或者代價(jià)函數(shù)加上正則項(xiàng)。
一般我們會(huì)采用L1、L2正則項(xiàng),引用莫凡python的一張圖:
其中L1范數(shù)是指向量中各個(gè)元素絕對(duì)值之和。L2范數(shù)是指向量各平方和然后求平方根。
關(guān)于更多L1、L2的詳細(xì)介紹可以參考:L1、L2正則化
dropout
dropout方法是ImageNet中提出的一種方法,通俗一點(diǎn)講就是dropout方法在訓(xùn)練的時(shí)候讓神經(jīng)元以一定的概率不工作。
ok,以上就是避免過擬合的一些方法,下面我們正式講下dropout是如何防止過擬合問題的。
Dropout是如何防止過擬合的?
在理解為什么Dropout對(duì)過擬合為什么有效之前,我們先看下Hinton大神發(fā)明Dropout這個(gè)利器的靈感和動(dòng)機(jī)是什么。
Dropout的靈感:遺傳和突變
我們來看一張圖
左邊這張是沒有用dropout的神經(jīng)網(wǎng)絡(luò),右邊這張是使用了dropout的神經(jīng)網(wǎng)絡(luò)。大家一眼應(yīng)該就能看出它們之間的區(qū)別,明顯左邊的網(wǎng)絡(luò)是比較復(fù)雜的,右邊它似乎刪除了一些神經(jīng)元,讓整個(gè)網(wǎng)絡(luò)變得更小。
無性繁殖vs有性繁殖
在Hinton大神論文中做了這樣的類比,無dropout的網(wǎng)絡(luò)和經(jīng)過dropout的網(wǎng)絡(luò)可以類比成無性繁殖和有性繁殖,為什么它們可以做這樣的類比,我們就要從這兩者之間的特點(diǎn)來看。
無性繁殖有以下特點(diǎn):
- 遺傳單親基因
- 繼承優(yōu)秀基因,輕微突變(不變壞)
而有性繁殖則是:
- 遺傳雙親獨(dú)特基因
- 組合之后,加上隨機(jī)的突變(可好,可壞)
從這兩者的特點(diǎn)來看,似乎無性繁殖會(huì)更有優(yōu)勢(shì)才對(duì),因?yàn)闊o性生殖的物種可以基本把父輩的基因內(nèi)容都保留下來,而這些基因是父輩優(yōu)化好的結(jié)果,如果一直這樣下去的話,應(yīng)該會(huì)越來越優(yōu)才對(duì)。但實(shí)際上并非如此,從進(jìn)化的角度來看,有性繁殖是比無性繁殖要更高級(jí)的。因?yàn)橛行苑敝乘ㄟ^基因的隨機(jī)組合,打破了基因組之間的co-adaptation(聯(lián)合適應(yīng)性),意思減少了基因組之間的依賴,這樣能讓它們?cè)谕蛔兊沫h(huán)境下產(chǎn)生更好的適應(yīng)性。
無dropout的網(wǎng)絡(luò)就像無性繁殖一樣,它雖然能夠?qū)W習(xí)到一些東西,但它更多適用于數(shù)據(jù)固定的情況,特征也比較固定的情況,它確實(shí)是能很有效的擬合數(shù)據(jù)。但一旦出現(xiàn)不可預(yù)見的數(shù)據(jù)的時(shí)候,它就會(huì)變得手無足措了。 而使用dropout的網(wǎng)絡(luò)更能符合我們的實(shí)際的場(chǎng)景,網(wǎng)絡(luò)需要去突變,去進(jìn)化去適應(yīng)環(huán)境,這樣才能更好的去適應(yīng)非特定場(chǎng)景的情況,具有更好的泛化能力。
Dropout帶來的模型變化
左邊:在訓(xùn)練時(shí),每個(gè)神經(jīng)單元都可能以概率p去除。
右邊:在測(cè)試階段,每個(gè)神經(jīng)元都是存在的,權(quán)重參數(shù)w要乘以p,成為pw。
左邊我們應(yīng)該比較好理解,每個(gè)神經(jīng)元都有概率p參與單次神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。而測(cè)試的時(shí)候,神經(jīng)元是不會(huì)去除的,每個(gè)神經(jīng)元都是存在的,權(quán)重參數(shù)w要乘以p。那么這里就產(chǎn)生一個(gè)問題,為什么參數(shù)w要乘以概率p。
問題:怎么理解測(cè)試時(shí)權(quán)重參數(shù)w要乘以概率p?
假設(shè)總共有100個(gè)神經(jīng)元,訓(xùn)練的時(shí)候我們加上dropout,p=0.5,那么我們就有50個(gè)神經(jīng)元參與訓(xùn)練,那么我們每次50個(gè)神經(jīng)元訓(xùn)練出來的模型參數(shù)w是要比直接100個(gè)神經(jīng)元要小的,因?yàn)樗碌拇螖?shù)會(huì)更少。我們測(cè)試的時(shí)候100個(gè)神經(jīng)元是都會(huì)參與計(jì)算的,這就跟訓(xùn)練的時(shí)候我們使用50個(gè)神經(jīng)元產(chǎn)生差異了,如果要保證測(cè)試的時(shí)候每個(gè)神經(jīng)元的關(guān)聯(lián)計(jì)算不能少,只能從通過改變w來達(dá)到跟訓(xùn)練時(shí)一樣輸出,所以才會(huì)有權(quán)重參數(shù)w乘以p。
標(biāo)準(zhǔn)網(wǎng)絡(luò)和dropout網(wǎng)絡(luò)有什么不一樣
左邊是簡(jiǎn)單的模型,右邊是含有dropout的模型。
l: hidden layer index (隱藏層索引)
z: denote the vector of inputs into layer l(表示l層的向量輸入)
y: output of each layer(每一層的輸出)
y0: input layer(輸入層)
f: activation function(激活函數(shù))
這是簡(jiǎn)單模型的輸入輸出的計(jì)算。
含有dropout的模型,它在input layer 乘以伯努利隨機(jī)概率,如果p =0.5,那么y就有50%的概率會(huì)變成0,這樣它就不會(huì)參與運(yùn)算。
Dropout的效果怎么樣?
這個(gè)圖表示的是不同的分類架構(gòu)沒有使用dropout和使用dropout有分類錯(cuò)誤有顯著的下降。
tensorflow中使用dropout
RNN中使用dropout
從時(shí)刻t-1傳遞到時(shí)刻t,循環(huán)神經(jīng)網(wǎng)絡(luò)不會(huì)進(jìn)行狀態(tài)的dropout;而在同一時(shí)刻t中,不同層循環(huán)體之間會(huì)使用dropout.
這里的實(shí)線表示不使用dropout,虛線表示使用dropout。
代碼片段
Dropout率該怎么選擇?
- input 的dropout概率推薦是0.8(添加噪聲)
- hidden layer 推薦是0.5(隨機(jī)生成的網(wǎng)絡(luò)結(jié)構(gòu)最多)
Dropout有什么缺點(diǎn)?
缺點(diǎn)就是會(huì)明顯增加訓(xùn)練時(shí)間,因?yàn)橐雂ropout之后相當(dāng)于每次只是訓(xùn)練的原先網(wǎng)絡(luò)的一個(gè)子網(wǎng)絡(luò),為了達(dá)到同樣的精度需要的訓(xùn)練次數(shù)會(huì)增多。
dropout的缺點(diǎn)就在于訓(xùn)練時(shí)間是沒有dropout網(wǎng)絡(luò)的2-3倍
參考文獻(xiàn)
- https://blog.csdn.net/stdcoutzyx/article/details/49022443
- https://www.bilibili.com/video/av20628794/?p=9
- https://blog.csdn.net/heyongluoyao8/article/details/49429629
- https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-02-dropout/
- https://blog.csdn.net/heyongluoyao8/article/details/49429629