天天看點

解決過拟合的方法:正則化、dropout

文章目錄

      • 1. 産生過拟合的原因
      • 2. 應對過拟合的方法
        • 2.1 正則化
          • 2.1.1 L1正則化
          • 2.1.2 L2正則化
        • 2.2 dropout
      • 參考資料:

1. 産生過拟合的原因

  1. 模型的複雜度太高。比如:網絡太深
  2. 過多的特征
  3. 訓練疊代次數多
  4. 資料集太小

2. 應對過拟合的方法

一般來說有如下方法:

  1. 盡量減少特征的數量
  2. 資料集擴增
  3. 增加正則化參數 λ
  4. dropout

下面就比較難了解的正則化和 dropout 進行解釋

2.1 正則化

機器學習中幾乎都可以看到損失函數後面會添加一個額外項,常用的額外項一般有兩種,一般英文稱作 l1-norm 或 l2-norm,中文稱作 L1 正則化 和 L2 正則化,或者 L1 範數 和 L2 範數。

L1 正則化和 L2 正則化可以看做是損失函數的懲罰項。所謂『懲罰』是指對損失函數中的某些參數做一些限制。對于線性回歸模型,使用 L1 正則化的模型叫做 Lasso 回歸,使用 L2 正則化的模型叫做 Ridge 回歸(嶺回歸)。

2.1.1 L1正則化

通常帶有 L1 正則項的損失函數如下:

J = J 0 + λ ∑ i n ∣ ω i ∣ J = J_0 + λ\sum^n_i|ω_i| J=J0​+λi∑n​∣ωi​∣

其中 J 0 J_0 J0​ 是原始的損失函數,加号後面一項是 L1 正則項,λ 是正則化參數,注意到:

  • L1 正則項是權值的絕對值之和

我們在原始損失函數 J 0 J_0 J0​ 後添加 L1 正則項時,相當于對 J 0 J_0 J0​ 做了一個限制。令 L = α ∑ ω ∣ ω ∣ L = α\sum_ω|ω| L=α∑ω​∣ω∣,則 J = J 0 + L J = J_0 + L J=J0​+L,對此我們的任務變成在 L 限制下求出 J 0 J_0 J0​ 取最小值的解。考慮二維的情況,即隻有兩個權值 ω 1 ω^1 ω1 和 ω 2 ω^2 ω2。此時 L = ∣ ω 1 ∣ + ∣ ω 2 ∣ L = |ω^1| + |ω^2| L=∣ω1∣+∣ω2∣。對于梯度下降法,求解 J 0 J_0 J0​ 的過程可以畫出等值線,同時 L1 正則化的函數 L 也可以在 ω 1 ω 2 ω^1ω^2 ω1ω2的二維平面上畫出來。如下圖所示:

解決過拟合的方法:正則化、dropout

其中彩色的圈圈是 J 0 J_0 J0​ 的等值線,黑色四邊形是 L 函數圖形。

在圖中,當 J 0 J_0 J0​ 等值線與 L 圖形首次相交的地方就是最優解。上圖中 J 0 J_0 J0​ 與 L 的一個頂點處相交,這個頂點就是最優解,值為 ( ω 1 , ω 2 ) = ( 0 , ω ) (ω^1, ω^2) = (0, ω) (ω1,ω2)=(0,ω)。 J 0 J_0 J0​ 與這些角接觸的機率會遠大于其它部位接觸的機率(這是很直覺的想象,突出的角比直線的邊離等值線更近些),而在這些角上,會有很多權值等于 0(因為角就在坐标軸上),是以:

  • L1 正則化可以産生稀疏權值矩陣,即産生一個稀疏模型,用于特征選擇。
2.1.2 L2正則化

L2 正則化,也稱為權重衰減。帶有 L2 正則項的損失函數如下:

J = J 0 + λ ∑ i n ω i 2 J = J_0 + λ\sum^n_iω_i^2 J=J0​+λi∑n​ωi2​

  • L2 正則項是權值的平方和

線性回歸的損失函數為例:

J ( ω ) = 1 2 m ∑ i = 1 m ( h ω ( x ( i ) ) − y ( i ) ) 2 J(ω) = \frac{1}{2m} \sum^m_{i = 1}(h_ω(x^{(i)}) - y^{(i)}) ^ 2 J(ω)=2m1​i=1∑m​(hω​(x(i))−y(i))2

在梯度下降算法中,需要先對損失函數求導,得到梯度。對于單個樣本,先對某個參數 ω j ω_j ωj​ 求導,最後得到下式:

∂ ∂ ω j J ( ω ) = 1 m ∑ i = 1 m ( h ω ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\partial}{\partial ω_j}J(ω) = \frac{1} {m} \sum^m_{i = 1}(h_ω(x^{(i)}) - y^{(i)})x^{(i)}_j ∂ωj​∂​J(ω)=m1​i=1∑m​(hω​(x(i))−y(i))xj(i)​

最後再乘以一個系數α(學習率),得到沒有添加正則項的 ω j ω_j ωj​ 參數更新公式為:

ω j : = ω j − α 1 m ∑ i = 1 m ( h ω ( x ( i ) ) − y ( i ) ) x j ( i ) ω_j := ω_j - α \frac{1} {m} \sum^m_{i = 1}(h_ω(x^{(i)}) - y^{(i)})x^{(i)}_j ωj​:=ωj​−αm1​i=1∑m​(hω​(x(i))−y(i))xj(i)​

正則項 L2 對參數 ω j ω_j ωj​ 求導:

∂ ∂ ω j L 2 = 2 λ ω j \frac{\partial}{\partial ω_j}L2 = 2 λ ω_j ∂ωj​∂​L2=2λωj​

綜合 L2 正則項之後參數 ω j ω_j ωj​ 的更新公式為:

ω j : = ω j ( 1 − 2 λ ) − α 1 m ∑ i = 1 m ( h ω ( x ( i ) ) − y ( i ) ) x j ( i ) ω_j := ω_j(1 - 2 λ) - α \frac{1} {m} \sum^m_{i = 1}(h_ω(x^{(i)}) - y^{(i)})x^{(i)}_j ωj​:=ωj​(1−2λ)−αm1​i=1∑m​(hω​(x(i))−y(i))xj(i)​

其中 λ 就是正則化參數。從上式可以看到,與未添加L2正則化的疊代公式相比,每一次疊代, θ j \theta_j θj​ 都要先乘以一個小于1的因子,即 ( 1 − 2 λ ) (1 - 2 λ) (1−2λ),進而使得 θ j \theta_j θj​ 不斷減小,是以總的來看, θ θ θ 是不斷減小的。是以:

  • L2 正則化可以産生參數值較小的模型,能适應不同的資料集,一定程度上防止過拟合,抗擾動能力強。

2.2 dropout

除了前面介紹的正則化方法以外,深度學習模型常常使用丢棄法(dropout)[4] 來應對過拟合問題。丢棄法有一些不同的變體。本節中提到的丢棄法特指倒置丢棄法(inverted dropout)。

描述一個單隐藏層的多層感覺機。其中輸入個數為 4,隐藏單元個數為 5,且隐藏單元 h i ( i = 1 , . . . , 5 ) h_i (i=1,...,5) hi​(i=1,...,5) 的計算表達式為:

h i = φ ( x 1 ω 1 i + x 2 ω 2 i + x 3 ω 3 i + x 4 ω 4 i + b i ) h_i = φ(x_1ω_{1i} + x_2ω_{2i} + x_3ω_{3i} + x_4ω_{4i} + b_i) hi​=φ(x1​ω1i​+x2​ω2i​+x3​ω3i​+x4​ω4i​+bi​)

這裡 φ 是激活函數, x 1 , . . . , x 4 x_1,...,x_4 x1​,...,x4​ 是輸入,權重參數為 ω 1 i , . . . , ω 4 i ω_{1i},...,ω_{4i} ω1i​,...,ω4i​ ,偏差參數為 b i b_i bi​。當對該隐藏層使用丢棄法時,該層的隐藏單元将有一定機率被丢棄掉。設丢棄機率為 p p p,那麼有 p p p 的機率 h i h_i hi​ 會被清零,有 1 − p 1-p 1−p的機率 h i h_i hi​ 會除以 1 − p 1-p 1−p 做拉伸。丢棄機率是丢棄法的超參數。具體來說,設随機變量 ξ i \xi_i ξi​ 為 0 和 1 的機率分别為 p p p 和 1 − p 1-p 1−p。使用丢棄法時我們計算新的隐藏單元

h i ′ = ξ i 1 − p h i h_i'= \frac{\xi_i}{1-p} h_i hi′​=1−pξi​​hi​

  • 即丢棄法不改變其輸入的期望值,而随機丢棄訓練中隐藏層的神經元,進而應對過拟合。
  • 在測試模型中,我們為了拿到更加确定性的結果,一般不使用丢棄法。
    解決過拟合的方法:正則化、dropout
    在上圖中, h 2 h_2 h2​ 和 h 5 h_5 h5​ 被丢棄了,輸出層的計算無法過度依賴 h 1 i , . . . , h 5 i h_{1i},...,h_{5i} h1i​,...,h5i​ 中的任一個,進而在訓練模型時起到正則化的作用,可以用來應對過拟合。

參考資料:

[1]機器學習中正則化項L1和L2的直覺了解

[2]《動手學深度學習》(PyTorch版)3.12 權重衰減

[3]資料預處理–特征選擇-L1、L2正則化

[4]Srivastava, N., Hinton, G., Krizhevsky, A., Sutskever, I., & Salakhutdinov, R. (2014). Dropout: a simple way to prevent neural networks from overfitting. JMLR

[5]《動手學深度學習》(PyTorch版)3.13 丢棄法

繼續閱讀