1. 程式人生 > >過擬合解決方案之正則化

過擬合解決方案之正則化

1.過擬合問題

對於過擬合問題,通常原因是模型選擇太過複雜,也有可能是訓練資料太少。對於模型太複雜的情況,我們一般有如下考慮:一是通過分析刪除部分特徵(比如重複多餘的特徵或者對輸出值貢獻不太大的特徵),但是這樣有可能會損失一部分資訊。所以,我們可以通過正則化的方法來降低引數值,從而避免過擬合問題。對於過擬合問題的詳細描述,可以檢視我的另一篇部落格機器學習之欠擬合與過擬合。

2.正則化

回顧一下,在迴歸問題中,在確定模型之後,要根據該損失函式找出使得損失函式最小的引數矩陣。在整個迴歸過程中,最為重要的一步是確定迴歸模型。通常情況下,如果選擇的模型太簡單,就會欠擬合。如果模型選擇太複雜,就會過擬合。正則化可以很好地解決之一問題,通過對某些引數進行“懲罰”,就可以達到降低引數值的目的。正則化的方法有很多,這裡僅介紹L1正則化和L2正則化,對應的分別是Lasson迴歸和Ridge迴歸。正則化就是在損失函式中加入正則項(用\(\Omega(\theta)\)表示),L1正則對應的正則項為:\(L1 = \lambda\sum_{i=1}^n|\theta_i|\),L2對應的正則項是:\(L2 = \lambda\sum_{i=1}^n\theta_i^2\)。例如線性迴歸的正則化損失函式為:

\[J(\theta)={1\over 2m} \sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})^2 + \Omega(\theta)\tag{2.1}\]

邏輯迴歸的正則化損失函式為:

\[J(\theta)= \dfrac{1}{m}\sum_{i=1}^m[-y^{(i)}ln(h_\theta(x^{(i)}))-(1-y^{(i)})ln(1-h_\theta(x^{(i)}))] +\Omega(\theta) \tag{2.2}\]

3.L1正則與L2正則的不同
3.1L1正則

在介紹L1正則之前,我們有必要了解一下L0範數,L0範數表示向量中非零元素的個數,其數學表示式為:

\[||x||_0 = \sum_{j=1}^{|x|} x_j \neq 0?1:0 \tag{3.1.1}\]

如果我們使用L0範數作為正則項(即\(\Omega(\theta)=\lambda||\theta||_0\)),那就說明我們希望權向量\(w\)當中的大部分元素都是零。L0正則更通俗的解釋是:如果要增加模型複雜度來加強模型的表達能力,對於增加的每個引數,我們都要進行這樣的考量----該引數不為0時對初始損失函式(即不加正則項的損失函式)的降低程度是否達到\(\lambda\)。如果不足\(\lambda\),我們認為增加這樣的複雜度是得不償失的。通過L0正則,可以使模型稀疏化,並且在一定程度上實現了特徵選擇(如果某個引數為0,相當於摒棄了該引數對應的樣本特徵)。但是由於L0正則項不連續、不可導、也不是凸函式,所以最小化L0正則損失函式是一個NP問題,相當複雜。所以我們需要更為有效的方式----L1正則。L1範數是L0範數最優凸近似,比L0範數更容易求得最優解。所以我們可以用L1正則來近似代替L0正則。如果採用L1正則,那麼損失函式就變為:

\[J(\theta) =J(\theta)_0 + \dfrac{1}{2m}\lambda\sum_{i=1}^n|\theta_i|) \tag{3.1.2}\]

對引數求偏導數的結果就是:

\[\dfrac{\partial J(\theta)}{\partial \theta_0 } = \dfrac{\partial J(\theta)_0}{\partial \theta_0},\dfrac{\partial J(\theta)}{\partial \theta_i } = \dfrac{\partial J(\theta)_0}{\partial \theta_i} + \dfrac{1}{m}\lambda sgn(\theta_i)\quad (i = 1,2,\dots,n) \tag{3.1.3}\]

在梯度下降法中,對應的引數更新方式為:

\[\theta_0 = \theta_0 -\alpha\dfrac{\partial J(\theta)_0}{\partial \theta_0},\theta_i = \theta_i - \alpha\dfrac{\partial J(\theta)_0}{\partial \theta_i} -\dfrac{\alpha}{m} \lambda sgn(\theta_i)) \quad (i = 1,2,\dots,n) \tag{3.1.4} \]

上述各式中,\(J(\theta_0)\)表示初始損失函式(即未新增正則項的損失函式),sgn為符號函式。正則項和\(\theta_0\)無關是因為\(\theta_0\)與任何特徵項都無關(即不對應任何\(x_i\)),所以\(\theta_0\)對過擬合的影響並不大,也就不需要在正則項中引入。

3.2L2正則

L0和L1正則都會使引數矩陣變得稀疏(即存在很多為0的元素),對樣本特徵有所捨棄,雖然對減小方差很有作用,但通常這會使偏差變大。那麼有沒有什麼方法可以使方差變小的同時,偏差又不會變得太大呢?L2正則就可以解決這一問題。L2範數的數學表示式的直觀解釋是引數的平方的\(\lambda\)倍求和,如果採用L2範數作為正則項,這會讓部分引數值非常小,接近於0,但並不是等於0。這就保證了不會捨棄樣本特徵,只是讓特徵對應的權重變小。同樣可以起到減小方差的作用,並且偏差不會變得太大。如果採用L1正則,那麼損失函式就變為:

\[J(\theta) =J(\theta)_0 + \dfrac{1}{2m}\lambda\sum_{i=1}^n\theta_i^2 \tag{3.2.1}\]

對引數求偏導數的結果就是:

\[\dfrac{\partial J(\theta)}{\partial \theta_0 } = \dfrac{\partial J(\theta)_0}{\partial \theta_0},\dfrac{\partial J(\theta)}{\partial \theta_i } = \dfrac{\partial J(\theta)_0}{\partial \theta_i} + \dfrac{1}{m}\lambda \theta_i \quad (i = 1,2,\dots,n) \tag{3.1.2}\]

在梯度下降法中,對應的引數更新方式為:

\[\theta_0 = \theta_0 -\alpha\dfrac{\partial J(\theta)_0}{\partial \theta_0},\theta_i = \theta_i - \dfrac{\partial J(\theta)_0}{\partial \theta_i} -\dfrac{\alpha}{m} 2\lambda \theta_i \quad (i = 1,2,\dots,n) \tag{3.2.3} \]

上述各式中,\(J(\theta_0)\)表示初始損失函式(即未新增正則項的損失函式)。(不要糾結於係數,m和2m都是一樣的,只是方便求偏導時約去1/2)。

對於線性迴歸來說,初始損失函式\(J(\theta)_0 =\dfrac{1}{2m}\sum_\limits{i=0}^m(y^{(i)}-h_\theta(x^{(i)}))^2\)。

加入正則項後,最小二乘法求解結果為:\(\theta = \left(X^TX+\lambda \left[\begin{matrix} 0 \\ &1 \\ & & 1 \\ & & &\ddots \\ & & & & 1 \end{matrix} \right]\right)^{-1}X^TY\)。

對於邏輯迴歸來說,初始損失函式\(J(\theta)_0= \dfrac{1}{m}\sum_{i=1}^m[-yln(h_\theta(x))-(1-y)ln(1-h_\theta(x))]\)。

4.總結

對於過擬合問題,我們可以採用正則化來解決。在機器學習中,我們一般會使用L2正則。在使用正則化的時候,要注意正則化引數\(\lambda\)的選擇。如果\(\lambda\)太小,那麼正則項幾乎就沒有起到作用,也就無法解決過擬合問題;如果\(\lambda\)太大,這時除了\(\theta_0\)以外的其他引數\(\theta_i(i = 1,2,\dots,n)\)就會很小,最後得到的模型幾乎就是一條水平直線,會出現欠擬合問題