過擬合解決方案之正則化

1.過擬合問題

對於過擬合問題,一般緣由是模型選擇太過複雜,也有多是訓練數據太少。對於模型太複雜的狀況,咱們通常有以下考慮:一是經過分析刪除部分特徵(好比重複多餘的特徵或者對輸出值貢獻不太大的特徵),可是這樣有可能會損失一部分信息。因此,咱們能夠經過正則化的方法來下降參數值,從而避免過擬合問題。對於過擬合問題的詳細描述,能夠查看個人另外一篇博客機器學習之欠擬合與過擬合html

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}\]spa

3.L1正則與L2正則的不一樣
3.1L1正則

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

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

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

\[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)\)就會很小,最後獲得的模型幾乎就是一條水平直線,會出現欠擬合問題。

相關文章
相關標籤/搜索