浅谈机器学习中的过拟合
本篇博客主要是基于花書(古德費洛的《Deep Learning》)和西瓜書(周志華的《機器學習》)撰寫的,其中插入了博主的一些個人見解,如有不對之處希望大家指出來一起來討論一下嘿嘿,萬分感謝。
什么是一個好的機器學習算法?
我想我們可以先從這個問題開始:一個機器學習算法滿足什么條件才能被稱得上是一個好算法?
機器學習的主要挑戰是我們的算法必須能夠在先前未觀測到的新輸入上表現良好,而不只是在訓練集上表現良好。這個很容易理解,因為我們平時里所做的就是給一個機器學習算法喂一大堆數據(訓練集),然后希望這個算法在新數據(測試集)上有良好的性能。而這種在先前未觀測到的輸入上表現良好的能力被稱為泛化能力。
為了得到泛化能力好的學習器,我們應該從訓練樣本中盡可能學出適用于所有潛在樣本的“普遍規律”,這樣才能在遇到新樣本時做出正確的判別。如果我們把訓練樣本的一些特有的特點也當做潛在樣本的一般性質,這樣就會導致泛化能力下降,這也是我們常說的“過擬合”現象。
與“過擬合”相對的是“欠擬合”,即訓練樣本的性質都沒有學習完全,這樣又怎么能指望對未知的新樣本表現良好呢?舉個例子,比如現在要識別貓和狗。貓和狗都有兩個眼睛,有四肢,有尾巴,有毛發,如果我們學習器學習能力不行,只學習到了這些比較“淺”的特征,那么這個學習器肯定都無法對訓練集圖片進行正確的分類,這就是欠擬合。如果學習器不僅學習到了這些特征,還學習到了貓和狗有不同的體型、體態、眼睛形狀等合理的特征,那么我們不僅在訓練集上分類誤差很低,在測試集上也能達到不錯的效果,這是學習器成功的例子。如果再進一步,學習器在之前的基礎上,還學到了很多不必要的特征,比如訓練集中有的狗少了一只腿,或者黃色毛發的狗比較多,那么學習器很有可能將一只少了一條腿的貓分類到狗的類別,或者認為其他顏色毛發的狗是狗的概率很低。這些特征強烈干擾了學習器的正確判斷,這便是“過擬合”。
總結一下,決定機器學習算法效果是否好有如下兩個因素:
(1) 降低訓練誤差
(2) 縮小訓練誤差和測試誤差的差距
這兩個因素分別對應機器學習的兩個挑戰:欠擬合和過擬合。欠擬合是指模型不能在訓練集上獲得足夠低的誤差,而過擬合是指訓練誤差和測試誤差之間的差距太大。
獨立同分布假設
上面提到我們希望盡可能最小化模型的泛化誤差,那么泛化誤差應該如何衡量呢?通常我們是通過度量在訓練集中劃分出來的測試集樣本上的性能,來近似估計模型的泛化誤差。但歸根到底,測試集也是我們“能觀測到的已有的數據”的一部分,用它來代表剩下的未觀察到的潛在數據還是具有太大的局限性。不過,我們也不能為了識別貓狗,就把世界上所有的貓狗照片全部找過來,我們能夠分別貓狗,但我們也沒有見過世界上所有的貓狗,不是嗎?
對于這個問題統計學理論提供了一些答案。現在不妨換個角度思考,假設我們現在得到了世界上所有的貓狗照片的數據,但是因為太多,我們還是不想全部使用,于是我們按照一定規律從中抽取一些數據,保證這些數據包含所有的必要特征,能夠100%代表整體數據。在這樣的假設下,訓練集誤差、測試集誤差以及剩下所有數據的誤差理論上應該都一樣,這不正是我們想要的效果?
現在將上面的大白話說的更理論化一些。訓練集和測試集數據通過數據集上被稱為數據生成過程的概率分布生成,我們假設每個數據集中的樣本都彼此相互獨立,并且訓練集和測試集都是同分布的,采樣自相同的分布,我們將這個共享的潛在分布稱為數據生成分布,記為pdatapdata。這就是獨立同分布假設,這使得我們能夠用單個樣本的概率分布表述數據生成過程。
在獨立同分布的假設下,訓練樣本的誤差就等價于潛在樣本的誤差,我們只要盡可能降低訓練誤差即可。但實際上這個假設基本不能能成立,我們往往只是利用部分數據預測整個數據分布,從這個角度來說“過擬合”是無法徹底避免的,我們所能做只是緩解或者減小其風險。幸運的是,但這并不影響我們使用這個假設,大多數情況下算法還是能得到比較令人滿意的結果,而且我們還可以使用其他技巧進一步提升結果。
模型容量與過擬合
現在再從模型容量的角度談一談過擬合。
模型的容量是指其擬合各種函數的能力。我們可以將一個模型視為一個復雜的函數f(X)=Yf(X)=Y,給定輸入XX,然后就能得到相應的輸出YY。這個函數參數越多,函數就越復雜,能夠擬合的函數也就越多越高級。當然,影響模型容量的不止是參數數量,訓練目標也能影響。訓練模型的目的就是從這些函數中挑選出最優函數,然而實際中算法不會真的找到最優函數,而僅是找到一個可以大大降低訓練誤差的函數。一些額外的限制因素,比如優化算法的不完美,會導致算法容量減小。
通過調整模型的容量,我們可以控制模型是否偏向于過擬合或欠擬合。當機器學習算法的容量適合于所執行任務的復雜度和所提供訓練數據的數量時,算法效果通常會最佳。容量不足的模型不能解決復雜任務;容量高的模型能夠解決復雜的任務,但是當其容量高于任務所需時,有可能會發成生擬合。如下圖所示。
我們比較了線性、二次和9次函數擬合真實二次函數的效果。線性函數無法刻畫真實函數的曲率,所以欠擬合。9次函數能夠表示正確的函數,但因為訓練參數比樣本還多,所以它也能表示無限多個剛好穿過訓練樣本點的其他函數,我們很難從這些不同解中選出一個泛化良好的。二次模型非常符合任務的真實結構,因此它可以很好地泛化到新數據上。
上圖是容量和誤差之間的典型關系。在達到最優容量前,訓練誤差和泛化誤差都很高(容量不夠時,最優函數可能沒有包括在模型能夠擬合的函數族中)。如果繼續增加容量,訓練誤差減小,但是訓練誤差和泛化誤差的間距不斷擴大,最終這個間距超過訓練誤差的下降,進入到過擬合機制。因此我們不能為了降低訓練誤差一味提高模型容量,要針對具體問題選擇合適的模型容量。
最后再來看看訓練樣本數量對模型有什么影響。
舉個栗子,通過給一個5階多項式添加適當的噪聲,構造一個回歸問題,然后用二次模型和最優容量的模型去求解該問題,如上圖所示。圖中紫色的虛線是貝葉斯誤差,即從預先知道的真實分布預測而出現的誤差,也是理論上能達到的最佳誤差。比如說,一個骰子,理論上6個面出現的概率都是1616,但如果我們實際扔6次,并不能保證每個面各出現一次,這個誤差就叫做貝葉斯誤差(也可以理解為系統固有誤差?)。總之一個算法因為各種各樣的原因肯定會有誤差,而貝葉斯誤差就是一個算法能達到的最優誤差。
對于二次模型,當訓練樣本數量還不足以匹配其模型容量時,訓練誤差會隨著樣本的增加而降低,但如果繼續增加訓練樣本,超過了模型的擬合能力,訓練誤差(圖中藍色的線)會開始上升。而測試誤差會隨之減小,這是因為訓練數據越多,關于訓練數據的不正確的假設就越少。由于二次模型的容量不足以解決該問題,所以測試誤差會穩定在一個較高的水平。
對于最優容量的模型,測試誤差最終會趨近于貝葉斯誤差。訓練集誤差可以低于貝葉斯誤差,因為該模型有能力記住訓練集中的樣本。但當訓練集趨于無窮大時,任何固定容量的模型的訓練誤差都至少增至貝葉斯誤差。
有心的人可能會問,誤差既能被模型容量影響又能被樣本數量影響,那么我們該如何針對某個容量的模型選擇訓練集大小,或者已有某個大小的訓練集,如何選擇合適容量的模型呢?
從上面這張圖解釋了這個問題。可以看到,當訓練集增大時,最優容量也會隨之增大,但當最優容量足夠捕獲模型復雜度之后就不再增長了。
到這里可能還是有點繞,結論還沒那么清晰。現在將兩張圖結合在一起看一下,現在我們假定要解決的問題的復雜度是固定的。當樣本數量不夠多時,訓練集還不能很好的反應真實的數據分布pdatapdata,即用小訓練集學習到的只是全部數據的部分特征,每次增加訓練集都引入了新的有用特征,模型發現現有模型容量不足以學習,所以在初期模型的最優容量會隨著訓練集的增大而增大。如果訓練集增加到一定地步,這時訓練集已經足夠反應真實數據分布了,再增加訓練集只是相當于多了一些重復的樣本,所以模型的最優容量不會再增加了。在這個增加訓練集大小的過程中,如果在中途因為訓練樣本不夠中止了,這個訓練集大小對應的模型最優容量小于問題的復雜度,那么此時測試誤差就會偏高,因為這個容量下無法捕獲到真實數據分布的全部信息。
在實際應用中,我們通常是用有限的數據去預測真實分布。如果我們選擇剛好和這個訓練集大小相匹配的模型容量,往往測試誤差會偏高,因為此時的模型容量和問題復雜度不匹配。而且模型容量是一個很模糊的邊界,很難確定一個深度學習算法的容量,所以通常我們會使用一個容量比訓練集大很多的模型,來避免容量不夠的問題,但這樣豈不是會發生過擬合?是的,但通過正則化等方法我們可以減輕過擬合帶來的影響。正則化將在下一篇博客中講。
總結
本來打算將過擬合和正則化放到同一篇博客里的,結果發現過擬合講了這么多(知識真是常讀常新啊)。
回到正題,在我看來,過擬合的表象是訓練誤差很小,而測試誤差很大,給人一種模型“記住”樣本的感覺,所以換個新樣本就瓦特了。但歸根到底還是模型容量以及訓練集這兩者和問題復雜度是否匹配的問題。
如果模型容量過小,無論你給多少訓練樣本,都無法得到一個較低水平的泛化誤差,還有可能發生欠擬合;
如果模型容量超過問題的復雜度,但你給的訓練樣本不夠(不是指數量,而是其包含的特征不夠),模型很輕松能學習到訓練集的特征,但泛化能力依舊很有限,這就導致了過擬合;
只有當模型容量和訓練集大小這兩者與問題復雜度平衡時,才能得到理想的泛化誤差。
不過現實中條件有限,無法得知數據的真實分布,所以通常使用大容量模型+正則化來得到不錯的結果。
總結
以上是生活随笔為你收集整理的浅谈机器学习中的过拟合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看不完的那种!前端170面试题+答案学习
- 下一篇: 《深入理解计算机系统》第三版 第三章家庭