1. 程式人生 > >coursera-斯坦福-機器學習-吳恩達-正則化

coursera-斯坦福-機器學習-吳恩達-正則化

正則化(Regularization)

1.1 過擬合的問題

參考視訊: 7 - 1 - The Problem of Overfitting (10 min).mkv

到現在為止,我們已經學習了幾種不同的學習演算法,包括線性迴歸和邏輯迴歸,它們能夠有效地解決許多問題,但是當將它們應用到某些特定的機器學習應用時,會遇到過擬合(over-fitting)的問題,可能會導致它們效果很差。

在這段視訊中,我將為你解釋什麼是過度擬合問題,並且在此之後接下來的幾個視訊中,我們將談論一種稱為正則化(regularization)的技術,它可以改善或者減少過度擬合問題。

如果我們有非常多的特徵,我們通過學習得到的假設可能能夠非常好地適應訓練集(代價函式可能幾乎為0),但是可能會不能推廣到新的資料。

下圖是一個迴歸問題的例子:

                    

第一個模型是一個線性模型,欠擬合,不能很好地適應我們的訓練集;第三個模型是一個四次方的模型,過於強調擬合原始資料,而丟失了演算法的本質:預測新資料。我們可以看出,若給出一個新的值使之預測,它將表現的很差,是過擬合,雖然能非常好地適應我們的訓練集但在新輸入變數進行預測時可能會效果不好;而中間的模型似乎最合適。

分類問題中也存在這樣的問題:

                    

就以多項式理解,x的次數越高,擬合的越好,但相應的預測的能力就可能變差。

問題是,如果我們發現了過擬合問題,應該如何處理?

  1. 丟棄一些不能幫助我們正確預測的特徵。可以是手工選擇保留哪些特徵,或者使用一些模型選擇的演算法來幫忙(例如PCA

  2. 正則化。 保留所有的特徵,但是減少引數的大小(magnitude)。

1.2 代價函式

上面的迴歸問題中如果我們的模型是:

                                                          

我們可以從之前的事例中看出,正是那些高次項導致了過擬合的產生,所以如果我們能讓這些高次項的係數接近於0的話,我們就能很好的擬合了。 所以我們要做的就是在一定程度上減小這些引數的值,這就是正則化的基本方法。我們決定要減少的大小,我們要做的便是修改代價函式,在其中設定一點懲罰。這樣做的話,我們在嘗試最小化代價時也需要將這個懲罰納入考慮中,並最終導致選擇較小一些的。 修改後的代價函式如下:

通過這樣的代價函式選擇出的 對預測結果的影響就比之前要小許多。假如我們有非常多的特徵,我們並不知道其中哪些特徵我們要懲罰,我們將對所有的特徵進行懲罰,並且讓代價函式最優化的軟體來選擇這些懲罰的程度。這樣的結果是得到了一個較為簡單的能防止過擬合問題的假設:

其中又稱為正則化引數(Regularization Parameter)。 注:根據慣例,我們不對 進行懲罰。經過正則化處理的模型與原模型的可能對比如下圖所示:

                                                                       

如果選擇的正則化引數過大,則會把所有的引數都最小化了,導致模型變成 ,也就是上圖中紅色直線所示的情況,造成欠擬合。

 

1.3 正則化線性迴歸

參考視訊: 7 - 3 - Regularized Linear Regression (11 min).mkv

對於線性迴歸的求解,我們之前推導了兩種學習演算法:一種基於梯度下降,一種基於正規方程。

正則化線性迴歸的代價函式為:

                                               

如果我們要使用梯度下降法令這個代價函式最小化,因為我們未對$\theta_0$進行正則化,所以梯度下降演算法將分兩種情形:

                                    

對上面的演算法中j=1,2,...,n時的更新式子進行調整可得:

                                             

 可以看出,正則化線性迴歸的梯度下降演算法的變化在於,每次都在原有演算法更新規則的基礎上令值減少了一個額外的值。

我們同樣也可以利用正規方程來求解正則化線性迴歸模型,方法如下所示:

                              

圖中的矩陣尺寸為 (n+1)*(n+1)。

7.4 正則化的邏輯迴歸模型

參考視訊: 7 - 4 - Regularized Logistic Regression (9 min).mkv

針對邏輯迴歸問題,我們在之前的課程已經學習過兩種優化演算法:我們首先學習了使用梯度下降法來優化代價函式,接下來學習了更高階的優化演算法,這些高階優化演算法需要你自己設計代價函式

自己計算導數同樣對於邏輯迴歸,我們也給代價函式增加一個正則化的表示式,得到代價函式:

                        

Python程式碼:

import numpy as np

def costReg(theta, X, y, learningRate):
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    first = np.multiply(-y, np.log(sigmoid(X*theta.T)))
    second = np.multiply((1 - y), np.log(1 - sigmoid(X*theta.T)))
    reg = (learningRate / (2 * len(X))* np.sum(np.power(theta[:,1:theta.shape[1]],2))
    return np.sum(first - second) / (len(X)) + reg

要最小化該代價函式,通過求導,得出梯度下降演算法為:

                    

注:看上去同線性迴歸一樣,但是知道 ,所以與線性迴歸不同。 Octave中,我們依舊可以用 fminuc 函式來求解代價函式最小化的引數,值得注意的是引數的更新規則與其他情況不同。 注意:

  1. 雖然正則化的邏輯迴歸中的梯度下降和正則化的線性迴歸中的表示式看起來一樣,但由於兩者的不同所以還是有很大差別。

  2. 不參與其中的任何一個正則化。

目前大家對機器學習演算法可能還只是略懂,但是一旦你精通了線性迴歸、高階優化演算法和正則化技術,坦率地說,你對機器學習的理解可能已經比許多工程師深入了。現在,你已經有了豐富的機器學習知識,目測比那些矽谷工程師還厲害,或者用機器學習演算法來做產品。

接下來的課程中,我們將學習一個非常強大的非線性分類器,無論是線性迴歸問題,還是邏輯迴歸問題,都可以構造多項式來解決。你將逐漸發現還有更強大的非線性分類器,可以用來解決多項式迴歸問題。我們接下來將將學會,比現在解決問題的方法強大N倍的學習演算法。

那為什麼增加的一項 可以使$\theta $的值減小呢? 因為如果我們令 的值很大的話,為了使Cost Function 儘可能的小,所有的 的值(不包括)都會在一定程度上減小。

但若 的值太大了,那麼(不包括)都會趨近於0,這樣我們所得到的只能是一條平行於x軸的直線。

所以對於正則化,我們要取一個合理的 的值,這樣才能更好的應用正則化。 回顧一下代價函式,為了使用正則化,讓我們把這些概念應用到到線性迴歸和邏輯迴歸中去,那麼我們就可以讓他們避免過度擬合了。