1. 程式人生 > >深度學習防止過擬合的方法

深度學習防止過擬合的方法

過擬合即在訓練誤差很小,而泛化誤差很大,因為模型可能過於的複雜,使其”記住”了訓練樣本,然而其泛化誤差卻很高,在傳統的機器學習方法中有很大防止過擬合的方法,同樣這些方法很多也適合用於深度學習中,同時深度學習中又有一些獨特的防止過擬合的方法,下面對其進行簡單的梳理.

1. 引數範數懲罰

範數正則化是一種非常普遍的方法,也是最常用的方法,假如優化:

minObj(θ)=L(y,f(x))+αG(θ)
其中L為經驗風險,其為在訓練樣本上的誤差,而G為對引數的懲罰,也叫結構風險.α是平衡兩者,如果太大則對應的懲罰越大,如過太小,甚至接近與0,則沒有懲罰.
最常用的範數懲罰為L1,L2正則化,L1又被成為Lasso
:
||w||1=|w1|+|w2|+...
即絕對值相加,其趨向於是一些引數為0.可以起到特徵選擇的作用.
L2正則化為:
||w||2=w12+w22+...
其趨向與,使權重很小.其又成為ridge.
關於更多可以參考:機器學習中的範數規則化之(一)L0、L1與L2範數

2. 資料增強

讓模型泛化的能力更好的最好辦法就是使用更多的訓練資料進行訓練,但是在實踐中,我們擁有的資料是有限的,解決這一問題可以人為的創造一些假資料新增到訓練集中.
一個具體的例子:
在AlexNet中,將256*256影象隨機的擷取224*224大小,增加了許多的訓練樣本,同時可以對影象進行左右翻轉,增加樣本的個數,實驗的結果可以可降低1%的誤差.
在神經網路中輸入噪聲也可以看做是資料增強的一種方式.

3. 提前終止

如下圖所示(圖片來源deep learning),當隨著模型的能力提升,訓練集的誤差會先減小再增大,這樣可以提前終止演算法減緩過擬合現象.關於演算法的具體流程參考deep learning.

這裡寫圖片描述

提前終止是一種很常用的緩解過擬合的方法,如在決策樹的先剪枝的演算法,提前終止演算法,使得樹的深度降低,防止其過擬合.

4. 引數繫結與引數共享

在卷積神經網路CNN中(計算機視覺與卷積神經網路 ),卷積層就是其中權值共享的方式,一個卷積核通過在影象上滑動從而實現共享引數,大幅度減少引數的個數,用卷積的形式是合理的,因為對於一副貓的圖片來說,右移一個畫素同樣還是貓,其具有區域性的特徵.這是一種很好的緩解過擬合現象的方法.
同樣在RNN中用到的引數共享,在其整條時間鏈上可以進行引數的共享,這樣才使得其能夠被訓練.

5. bagging 和其他整合方法

其實bagging的方法是可以起到正則化的作用,因為正則化就是要減少泛化誤差,而bagging的方法可以組合多個模型起到減少泛化誤差的作用.
在深度學習中同樣可以使用此方法,但是其會增加計算和儲存的成本.

6. Dropout

Dropout提供了一種廉價的Bagging整合近似,能夠訓練和評估指數級數量的神經網路。dropout可以隨機的讓一部分神經元失活,這樣彷彿是bagging的取樣過程,因此可以看做是bagging的廉價的實現.
但是它們訓練不太一樣,因為bagging,所有的模型都是獨立的,而dropout下所有模型的引數是共享的.
通常可以這樣理解dropout:假設我們要判別一隻貓,有一個神經元說看到有毛就是貓,但是如果我讓這個神經元失活,它還能判斷出來是貓的話,這樣就比較具有泛化的能力,減輕了過擬合的風險.

7. 輔助分類節點(auxiliary classifiers)

在Google Inception V1中,採用了輔助分類節點的策略,即將中間某一層的輸出用作分類,並按一個較小的權重加到最終的分類結果中,這樣相當於做了模型的融合,同時給網路增加了反向傳播的梯度訊號,提供了額外的正則化的思想.

8. Batch Normalization

在Google Inception V2中所採用,是一種非常有用的正則化方法,可以讓大型的卷積網路訓練速度加快很多倍,同事收斂後分類的準確率也可以大幅度的提高.
BN在訓練某層時,會對每一個mini-batch資料進行標準化(normalization)處理,使輸出規範到N(0,1)的正太分佈,減少了Internal convariate shift(內部神經元分佈的改變),傳統的深度神經網路在訓練是,每一層的輸入的分佈都在改變,因此訓練困難,只能選擇用一個很小的學習速率,但是每一層用了BN後,可以有效的解決這個問題,學習速率可以增大很多倍.

未完待續…

參考資料: