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