1. 程式人生 > >斯坦福大學公開課機器學習: advice for applying machine learning | regularization and bais/variance(機器學習中方差和偏差如何相互影響、以及和算法的正則化之間的相互關系)

斯坦福大學公開課機器學習: advice for applying machine learning | regularization and bais/variance(機器學習中方差和偏差如何相互影響、以及和算法的正則化之間的相互關系)

交叉 來講 相對 同時 test 如果 開始 遞增 相互

算法正則化可以有效地防止過擬合, 但正則化跟算法的偏差和方差又有什麽關系呢?下面主要討論一下方差和偏差兩者之間是如何相互影響的、以及和算法的正則化之間的相互關系

假如我們要對高階的多項式進行擬合,為了防止過擬合現象,我們要使用圖下所示的正則化。因此我們試圖通過下面的正則化項,來讓參數的值盡可能小。正則化項的求和範圍,照例取為j等於1到m,而非j等於0到m。

技術分享圖片

然後我們來分析以下三種情形。第一種情形:正則化參數lambda取一個比較大的值(比如lambda的值取為10000甚至更大)。在這種情況下,所有這些參數,包括theta1,包括theta2,包括theta3等等,將被大大懲罰。其結果是這些參數的值將近似等於0,並且假設模型h(x)的值將等於或者近似等於theta0的值,因此我們最終得到的假設函數應該是近似一條平滑的直線。因此這個假設處於高偏差,對數據集欠擬合。因此這條水平直線,對這個數據集來講不是一個好的假設模型。

技術分享圖片


與之對應的另一種情況:lambda值很小(比如說lambda的值等於0,如下圖)。在這種情況下,如果我們要擬合一個高階多項式的話,此時我們通常會處於過擬合的情況。在這種情況下,擬合一個高階多項式時,如果沒有進行正則化,或者正則化程度很微小的話,我們通常會得到高方差和過擬合的結果。通常來說,lambda的值等於0,相當於沒有正則化項,因此是過擬合假設。

技術分享圖片

只有當我們取一個中間大小的lambda值時(如下圖),我們才會得到一組合理的,對數據剛好擬合的theta參數值。

技術分享圖片

那麽我們應該怎樣自動地選擇出一個最合適的正則化參數lambda呢?

假設在使用正則化的情形中,定義Jtrain(θ)為另一種不同的形式。目標同樣是最優化,但不使用正則化項。在前面的介紹中,當我們沒有使用正則化時,我們定義的Jtrain(θ) 就是代價函數J(θ)。但當我們使用正則化多出這個lambda項時,我們就將訓練集誤差(Jtrain)定義為訓練集數據預測的平方誤差的求和。或者準確的說,是訓練集的平均誤差平方和,但不考慮正則化項。與此類似,我們定義交叉驗證集誤差以及測試集誤差為:對交叉驗證集和測試集進行預測,取平均誤差平方和的形式。我們對於訓練誤差Jtrain、交叉驗證集誤差Jcv,和測試集誤差Jtest的定義都是平均誤差平方和。或者準確地說,是訓練集、驗證集和測試集進行預測,在不使用正則化項時,平均誤差平方和的二分之一。

技術分享圖片

下面是我們自動選取正則化參數lambda的方法。通常做法是選取一系列想要嘗試的lambda值(比如是0.01,0.02,0.04等等),通常來講,一般將步長設為2倍速度增長,一直到一個比較大的值。以兩倍步長遞增的話,最終取值10.24,實際上我們取的是10,但取10已經非常接近了。小數點後的0.24,對最終的結果不會有太大影響。因此,這樣就得到了12個不同的正則化參數lambda對應的12個不同的模型。我們將從這個12個模型中選出一個最合適的模型,當然,我們也可以試小於0.01或者大於10的值。得到這12組模型後,接下來我們要做的事情是選用第一個模型(也就是lambda等於0),最小化代價函數J(θ)。這樣我們就得到了某個參數向量theta,與之前做法類似,我使用theta上標(1)來表示第一個參數向量theta。然後再取第二個模型,也就是lambda等於0.01的模型,最小化代價方差,那麽會得到一個完全不同的參數向量theta(2),同理,會得到theta(3)對應第三個模型,以此類推,一直到最後一個lambda等於10或10.24的模型,對應theta(12)。接下來就可以用所有這些假設,所有這些參數,以及交叉驗證集來評價它們了。因此我們可以從第一個模型、第二個模型等等開始,對每一個不同的正則化參數lambda進行擬合。然後用交叉驗證集來評價每一個模型,也即測出每一個參數thata在交叉驗證集上的平均誤差平方和。然後我就選取這12個模型中交叉驗證集誤差最小的那個模型作為最終選擇。對於本例而言,假如說最終選擇了theta(5),也就是五次多項式,因為此時的交叉驗證集誤差最小。做完這些,如果想看看該模型在測試集上的表現,我們可以用經過學習得到的模型theta(5) 來測出它對測試集的預測效果。這裏我們依然用交叉驗證集來擬合模型。這也是為什麽我們之前預留了一部分數據作為測試集的原因。這樣就可以用測試集比較準確地估計出參數向量theta對於新樣本的泛化能力。這就是模型選擇在選取正則化參數lambda時的應用。

技術分享圖片

最後一個問題是,當我們改變正則化參數lambda的值時,交叉驗證集誤差和訓練集誤差會隨之發生怎樣的變化。我們最初的代價函數J(θ) 是這樣的形式(如下圖)

技術分享圖片

但在這裏我們把訓練誤差定義為不包括正則化項,交叉驗證集誤差也定義為不包括正則化項(如下圖)

技術分享圖片

我們要做的是繪制出Jtrain和Jcv的曲線。隨著我們增大正則化項參數lambda的值,我們的假設在訓練集上以及在交叉驗證集上的表現如何變化。就像我們之前看到的,如果正則化項參數lambda的值很小,也就是說我們幾乎沒有使用正則化,有很大可能處於過擬合。而如果lambda值取的很大的時候(也就是說取值在橫坐標的右端,如下圖),很有可能處於高偏差的問題。所以,如果畫出Jtrain和Jcv的曲線,就會發現當lambda的值取得很小時,對訓練集的擬合相對較好,因為沒有使用正則化。因此,對於lambda值很小的情況,正則化項基本可以忽略。我們只需要對平方誤差做最小化處理即可。當lambda增大時,訓練集誤差Jtrain的值會趨於上升。因為lambda的值比較大時,對應著高偏差的問題,此時連訓練集都不能很好地擬合。反過來,當lambda的值取得很小的時候,數據能隨意地與高次多項式很好地擬合。交叉驗證集誤差的曲線是這樣的(下圖紫紅色曲線),在曲線的右端,當lambda值取得很大時,我們會處於欠擬合問題,也對應著偏差問題。那麽此時交叉驗證集誤差將會很大,這是交叉驗證集誤差Jcv。由於高偏差的原因我們不能很好地擬合,我們的假設不能在交叉驗證集上表現地比較好。而曲線的左端對應的是高方差問題,此時我們的lambda值取得很小很小,因此我們會對數據過度擬合。所以由於過擬合的原因,交叉驗證集誤差Jcv結果也會很大。前面就是當我們改變正則化參數lambda的值時,交叉驗證集誤差和訓練集誤差隨之發生的變化。在中間取的某個lambda的值表現得剛好合適,交叉驗證集誤差或者測試集誤差都很小。

技術分享圖片

當然在這裏畫的圖顯得太卡通也太理想化了。對於真實的數據你得到的曲線可能比這看起來更淩亂,會有很多的噪聲。通過繪出交叉驗證集誤差的變化趨勢曲線,可以選擇出或者編寫程序自動得出能使交叉驗證集誤差最小的那個點,然後選出那個與之對應的參數lambda的值。當我們在嘗試為學習算法選擇正則化參數lambda的時候,通常都會得出類似上圖的結果,幫助我們更好地理解各種情況,同時也幫助我們確認選擇的正則化參數值好不好。

斯坦福大學公開課機器學習: advice for applying machine learning | regularization and bais/variance(機器學習中方差和偏差如何相互影響、以及和算法的正則化之間的相互關系)