1. 程式人生 > >斯坦福大學公開課機器學習:advice for applying machine learning | learning curves (改進學習算法:高偏差和高方差與學習曲線的關系)

斯坦福大學公開課機器學習:advice for applying machine learning | learning curves (改進學習算法:高偏差和高方差與學習曲線的關系)

繪制 學習曲線 pos 情況 但我 容量 繼續 並且 inf

繪制學習曲線非常有用,比如你想檢查你的學習算法,運行是否正常。或者你希望改進算法的表現或效果。那麽學習曲線就是一種很好的工具。學習曲線可以判斷某一個學習算法,是偏差、方差問題,或是二者皆有。

為了繪制一條學習曲線,通常先繪制出訓練集數據的平均誤差平方和(Jtrain),或者交叉驗證集數據的平均誤差平方和(Jcv)。將其繪制成一個關於參數m的函數。也就是一個關於訓練集、樣本總數的函數。m一般是一個常數,比如m等於100,表示100組訓練樣本。但我們要自己取一些m的值,也就是說對m的取值做一點限制,比如說取10、20或者30、40組訓練集,然後繪出訓練集誤差、以及交叉驗證集誤差。那麽我們來看看這條曲線繪制出來是什麽樣子。假設只有一組訓練樣本,也即m=1。正如第一幅圖中所示(下圖,m=1),並且假設使用二次函數來擬合模型,那麽由於我只有一個訓練樣本,擬合的結果很明顯會很好,用二次函數來擬合對這一個訓練樣本擬合其誤差一定為0。如果有兩組訓練樣本,二次函數也能很好得擬合。即使是使用正則化,擬合的結果也會很好。而如果不使用正則化的話,那麽擬合效果絕對棒極了。如果用三組訓練樣本的話,看起來依然能很好地用二次函數擬合。也就是說,當m等於1、2、3時,對訓練集數據進行預測,得到的訓練集誤差都將等於0,這裏假設不使用正則化。當然如果使用正則化,那麽誤差就稍大於0。如果訓練集樣本很大,要人為地限制訓練集樣本的容量。比如說,將m值設為3,然後僅用這三組樣本進行訓練,然後對應到這個圖中。我只看對這三組訓練樣本,進行預測得到的訓練誤差。也是和模型擬合的三組樣本,所以即使有100組訓練樣本,而我們還是想繪制當m等於3時的訓練誤差,那麽我們要關註的仍然是對這三組訓練樣本進行預測的誤差。同樣,這三組樣本也是我們用來擬合模型的三組樣本。所有其他的樣本,都在訓練過程中選擇性忽略了。總結一下,我們現在已經看到,當訓練樣本容量m很小的時候,訓練誤差也會很小。因為很顯然,如果我們訓練集很小,那麽很容易就能把訓練集擬合到很好,甚至擬合得天衣無縫。現在我們來看,當m等於4的時候,二次函數似乎也能對數據擬合得很好。那我們再看當m等於5的情況,這時候再用二次函數來擬合,好像效果有下降但還是差強人意。而當我的訓練集越來越大的時候,要保證使用二次函數的擬合效果依然很好,就顯得越來越困難了。

技術分享圖片

事實上隨著訓練集容量的增大,平均訓練誤差是逐漸增大的。因此如果畫出這條曲線,你就會發現訓練集誤差(對假設進行預測的誤差平均值)隨著m的增大而增大(下圖)。再重復一遍對這一問題的理解,當訓練樣本很少的時候,對每一個訓練樣本都能很容易地擬合到很好,所以訓練誤差將會很小。而反過來,當m的值逐漸增大,那麽想對每一個訓練樣本都擬合到很好,就顯得愈發的困難了,因此訓練集誤差就會越來越大。那麽交叉驗證集誤差的情況如何呢。交叉驗證集誤差是對完全陌生的交叉驗證集數據進行預測得到的誤差,那麽我們知道當訓練集樣本很小的時候,泛化程度不會很好,意思是不能很好地適應新樣本。因此這個假設就不是一個理想的假設。只有使用一個更大的訓練集時,我們才有可能得到一個能夠更好擬合數據的可能的假設。因此,驗證集誤差和測試集誤差都會隨著訓練集樣本容量m的增加而減小,因為你使用的數據越多,你越能獲得更好地泛化表現,或者說對新樣本的適應能力更強。因此,數據越多,越能擬合出合適的假設。所以,如果把Jtrain和Jcv繪制出來就應該得到如下的曲線。

技術分享圖片

現在我們來看看,當處於高偏差或者高方差的情況時,這些學習曲線又會變成什麽樣子。假如我們的假設處於高偏差問題,為了更清楚地解釋這個問題,下面用一個簡單的例子來說明,也就是用一條直線,來擬合數據的例子(下圖)。很顯然一條直線不能很好地擬合數據。

技術分享圖片

現在我們來想一想,如果我們增大訓練集樣本容量,會發生什麽情況呢。不難發現還是會得到類似的一條直線假設。但一條直線再怎麽接近,也不可能對這組數據進行很好的擬合。

技術分享圖片

所以,如果你繪出交叉驗證集誤差,應該是如下圖(藍色曲線)。最左端表示訓練集樣本容量很小,比如說只有一組樣本,那麽表現當然很不好,而隨著你增大訓練集樣本數,當達到某一個容量值的時候,你就會找到那條最有可能擬合數據的那條直線,並且此時即便你繼續增大訓練集的樣本容量,即使你不斷增大m的值,你基本上還是會得到的一條差不多的直線。因此,交叉驗證集誤差,或者測試集誤差,將會很快變為水平而不再變化。只要訓練集樣本容量值達到或超過了那個特定的數值,交叉驗證集誤差和測試集誤差就趨於不變,這樣你會得到最能擬合數據的那條直線。那麽訓練誤差又如何呢?同樣,訓練誤差一開始也是很小的,而在高偏差的情形中,你會發現訓練集誤差會逐漸增大。一直趨於接近交叉驗證集誤差,這是因為你的參數很少。但當m很大的時候,數據太多,此時訓練集和交叉驗證集的預測效果將會非常接近,這是當你的學習算法處於高偏差情形時,學習曲線的大致走向。最後補充一點,高偏差的情形反映出的問題是,交叉驗證集和訓練集誤差都很大。也就是說,你最終會得到一個值比較大Jcv和Jtrain。這也得出一個很有意思的結論,那就是如果一個學習算法有很大的偏差,那麽當我們選用更多的訓練樣本時,也就是在這幅圖中,隨著我們增大橫坐標,我們發現交叉驗證集誤差的值,不會表現出明顯的下降,實際上是變為水平了。所以如果學習算法正處於高偏差的情形,那麽選用更多的訓練集數據,對於改善算法表現無益

。正如我們右邊的這兩幅圖所體現的,這裏我們只有五組訓練樣本,我們找到這條直線來擬合,然後我們增加了更多的訓練樣本,但我們仍然得到幾乎一樣的一條直線。因此如果學習算法處於高偏差時,給再多的訓練數據也於事無補。交叉驗證集誤差或測試集誤差也不會降低多少。所以,能夠看清算法正處於高偏差的情形是一件很有意義的事情,因為這樣可以避免把時間浪費在收集更多的訓練集數據上。因為再多的數據也是無意義的。

技術分享圖片

接下來我們再來看看當學習算法正處於高方差的時候,學習曲線應該是什麽樣子的。首先我們來看訓練集誤差,如果你的訓練集樣本容量很小,比如像下圖所示情形只有五組訓練樣本,如果我們用很高階次的多項式來擬合,比如用了100次的多項式函數。當然不會有人這麽用的,這裏只是演示。並且假設我們使用一個很小的lambda值,可能不等於0,但足夠小的lambda。那麽很顯然,我們會對這組數據擬合得非常非常好,因此這個假設函數對數據過擬合。所以如果訓練集樣本容量很小時,訓練集誤差Jtrain將會很小。

技術分享圖片

隨著訓練集樣本容量的增加,可能這個假設函數仍然會對數據或多或少有一點過擬合,但很明顯此時要對數據很好地擬合,顯得更加困難和吃力了(如下圖所示)。

技術分享圖片

所以,隨著訓練集樣本容量的增大,我們會發現Jtrain的值會隨之增大。因為當訓練樣本越多的時候,我們就越難跟訓練集數據擬合得很好,但總的來說訓練集誤差還是很小。交叉驗證集誤差又如何呢?在高方差的情形中,假設函數對數據過擬合,因此交叉驗證集誤差將會一直都很大,即便我們選擇一個比較合適恰當的訓練集樣本數,因此交叉驗證集誤差畫出來差不多是圖下紫色曲線。所以算法處於高方差情形最明顯的一個特點是在訓練集誤差和交叉驗證集誤差之間有一段很大的差距。而這個曲線圖也反映出如果我們要考慮增大訓練集的樣本數,也就是在這幅圖中向右延伸曲線。我們大致可以看出這兩條學習曲線,藍色和紅色的兩條曲線正在相互靠近。因此,如果我們將曲線向右延伸出去, 那麽似乎訓練集誤差很可能會逐漸增大. 而交叉驗證集誤差則會持續下降。當然我們最關心的還是交叉驗證集誤差或者測試集誤差。所以從這幅圖中,我們基本可以預測如果繼續增大訓練樣本的數量,將曲線向右延伸,交叉驗證集誤差將會逐漸下降。所以,在高方差的情形中,使用更多的訓練集數據,對改進算法的表現是有效果的。這同樣也體現出知道你的算法正處於高方差的情形,也是非常有意義的。因為它能告訴你是否有必要浪費時間來增加更多的訓練集數據。

技術分享圖片

上面畫出的學習曲線都是相當理想化的曲線,針對一個實際的學習算法,如果畫出學習曲線的話,基本會得到類似的結果。雖然如此,有時候也會看到帶有一點噪聲或幹擾的曲線。但總的來說,像這樣畫出學習曲線,確實能幫助我們看清學習算法是否處於高偏差、高方差、或二者皆有的情形。所以當我們打算改進一個學習算法的表現時,通常要進行的一項工作,就是畫出這些學習曲線。

斯坦福大學公開課機器學習:advice for applying machine learning | learning curves (改進學習算法:高偏差和高方差與學習曲線的關系)