1
雷鋒網(wǎng)按:本文作者 qqfly,上海交通大學機器人所博士生,本科畢業(yè)于清華大學機械工程系,主要研究方向機器視覺與運動規(guī)劃,會寫一些好玩的內(nèi)容在微信公眾號:Nao(ID:qRobotics)。本文整理自知乎回答:機器學習中用來防止過擬合的方法有哪些?
給《機器視覺與應(yīng)用》課程出大作業(yè)的時候,正好涉及到這方面內(nèi)容,所以簡單整理了一下(參考 Hinton 的課程)。按照之前的套路寫:
是什么
過擬合(overfitting)是指在模型參數(shù)擬合過程中的問題,由于訓練數(shù)據(jù)包含抽樣誤差,訓練時,復雜的模型將抽樣誤差也考慮在內(nèi),將抽樣誤差也進行了很好的擬合。
具體表現(xiàn)就是最終模型在訓練集上效果好;在測試集上效果差。模型泛化能力弱。
為什么
為什么要解決過擬合現(xiàn)象?這是因為我們擬合的模型一般是用來預測未知的結(jié)果(不在訓練集內(nèi)),過擬合雖然在訓練集上效果好,但是在實際使用時(測試集)效果差。同時,在很多問題上,我們無法窮盡所有狀態(tài),不可能將所有情況都包含在訓練集上。所以,必須要解決過擬合問題。
為什么在機器學習中比較常見?這是因為機器學習算法為了滿足盡可能復雜的任務(wù),其模型的擬合能力一般遠遠高于問題復雜度,也就是說,機器學習算法有「擬合出正確規(guī)則的前提下,進一步擬合噪聲」的能力。
而傳統(tǒng)的函數(shù)擬合問題(如機器人系統(tǒng)辨識),一般都是通過經(jīng)驗、物理、數(shù)學等推導出一個含參模型,模型復雜度確定了,只需要調(diào)整個別參數(shù)即可。模型「無多余能力」擬合噪聲。
怎么樣
既然過擬合這么討厭,我們應(yīng)該怎么防止過擬合呢?最近深度學習比較火,我就以神經(jīng)網(wǎng)絡(luò)為例吧:
1. 獲取更多數(shù)據(jù)
這是解決過擬合最有效的方法,只要給足夠多的數(shù)據(jù),讓模型「看見」盡可能多的「例外情況」,它就會不斷修正自己,從而得到更好的結(jié)果:
如何獲取更多數(shù)據(jù),可以有以下幾個方法:
從數(shù)據(jù)源頭獲取更多數(shù)據(jù):這個是容易想到的,例如物體分類,我就再多拍幾張照片好了;但是,在很多情況下,大幅增加數(shù)據(jù)本身就不容易;另外,我們不清楚獲取多少數(shù)據(jù)才算夠;
根據(jù)當前數(shù)據(jù)集估計數(shù)據(jù)分布參數(shù),使用該分布產(chǎn)生更多數(shù)據(jù):這個一般不用,因為估計分布參數(shù)的過程也會代入抽樣誤差。
數(shù)據(jù)增強(Data Augmentation):通過一定規(guī)則擴充數(shù)據(jù)。如在物體分類問題里,物體在圖像中的位置、姿態(tài)、尺度,整體圖片明暗度等都不會影響分類結(jié)果。我們就可以通過圖像平移、翻轉(zhuǎn)、縮放、切割等手段將數(shù)據(jù)庫成倍擴充;
2. 使用合適的模型
前面說了,過擬合主要是有兩個原因造成的:數(shù)據(jù)太少 + 模型太復雜。所以,我們可以通過使用合適復雜度的模型來防止過擬合問題,讓其足夠擬合真正的規(guī)則,同時又不至于擬合太多抽樣誤差。
(PS:如果能通過物理、數(shù)學建模,確定模型復雜度,這是最好的方法,這也就是為什么深度學習這么火的現(xiàn)在,我還堅持說初學者要學掌握傳統(tǒng)的建模方法。)
對于神經(jīng)網(wǎng)絡(luò)而言,我們可以從以下四個方面來限制網(wǎng)絡(luò)能力:
2.1 網(wǎng)絡(luò)結(jié)構(gòu) Architecture
這個很好理解,減少網(wǎng)絡(luò)的層數(shù)、神經(jīng)元個數(shù)等均可以限制網(wǎng)絡(luò)的擬合能力;
2.2 訓練時間 Early stopping
對于每個神經(jīng)元而言,其激活函數(shù)在不同區(qū)間的性能是不同的:
當網(wǎng)絡(luò)權(quán)值較小時,神經(jīng)元的激活函數(shù)工作在線性區(qū),此時神經(jīng)元的擬合能力較弱(類似線性神經(jīng)元)。
有了上述共識之后,我們就可以解釋為什么限制訓練時間(early stopping)有用:因為我們在初始化網(wǎng)絡(luò)的時候一般都是初始為較小的權(quán)值。訓練時間越長,部分網(wǎng)絡(luò)權(quán)值可能越大。如果我們在合適時間停止訓練,就可以將網(wǎng)絡(luò)的能力限制在一定范圍內(nèi)。
2.3 限制權(quán)值 Weight-decay,也叫正則化(regularization)
原理同上,但是這類方法直接將權(quán)值的大小加入到 Cost 里,在訓練的時候限制權(quán)值變大。以 L2 regularization 為例:
訓練過程需要降低整體的 Cost,這時候,一方面能降低實際輸出與樣本之間的誤差C0,也能降低權(quán)值大小。
2.4 增加噪聲 Noise
給網(wǎng)絡(luò)加噪聲也有很多方法:
2.4.1 在輸入中加噪聲:
噪聲會隨著網(wǎng)絡(luò)傳播,按照權(quán)值的平方放大,并傳播到輸出層,對誤差 Cost 產(chǎn)生影響。推導直接看 Hinton 的 PPT 吧:
在輸入中加高斯噪聲,會在輸出中生成的干擾項。訓練時,減小誤差,同時也會對噪聲產(chǎn)生的干擾項進行懲罰,達到減小權(quán)值的平方的目的,達到與 L2 regularization 類似的效果(對比公式)。
2.4.2 在權(quán)值上加噪聲
在初始化網(wǎng)絡(luò)的時候,用 0 均值的高斯分布作為初始化。Alex Graves 的手寫識別 RNN 就是用了這個方法
Graves, Alex, et al. "A novel connectionist system for unconstrained handwriting recognition." IEEE transactions on pattern analysis and machine intelligence 31.5 (2009): 855-868.
- It may work better, especially in recurrent networks (Hinton)
2.4.3 對網(wǎng)絡(luò)的響應(yīng)加噪聲
如在前向傳播過程中,讓默寫神經(jīng)元的輸出變?yōu)?binary 或 random。顯然,這種有點亂來的做法會打亂網(wǎng)絡(luò)的訓練過程,讓訓練更慢,但據(jù) Hinton 說,在測試集上效果會有顯著提升 (But it does significantly better on the test set!)。
3. 結(jié)合多種模型
簡而言之,訓練多個模型,以每個模型的平均輸出作為結(jié)果。
從 N 個模型里隨機選擇一個作為輸出的期望誤差,會比所有模型的平均輸出的誤差
大(我不知道公式里的圓括號為什么顯示不了):
大概基于這個原理,就可以有很多方法了:
3.1 Bagging
簡單理解,就是分段函數(shù)的概念:用不同的模型擬合不同部分的訓練集。以隨機森林(Rand Forests)為例,就是訓練了一堆互不關(guān)聯(lián)的決策樹。但由于訓練神經(jīng)網(wǎng)絡(luò)本身就需要耗費較多自由,所以一般不單獨使用神經(jīng)網(wǎng)絡(luò)做 Bagging。
3.2 Boosting
既然訓練復雜神經(jīng)網(wǎng)絡(luò)比較慢,那我們就可以只使用簡單的神經(jīng)網(wǎng)絡(luò)(層數(shù)、神經(jīng)元數(shù)限制等)。通過訓練一系列簡單的神經(jīng)網(wǎng)絡(luò),加權(quán)平均其輸出。
3.3 Dropout
這是一個很高效的方法。
在訓練時,每次隨機(如 50% 概率)忽略隱層的某些節(jié)點;這樣,我們相當于隨機從 2^H 個模型中采樣選擇模型;同時,由于每個網(wǎng)絡(luò)只見過一個訓練數(shù)據(jù)(每次都是隨機的新網(wǎng)絡(luò)),所以類似 bagging 的做法,這就是我為什么將它分類到「結(jié)合多種模型」中;
此外,而不同模型之間權(quán)值共享(共同使用這 H 個神經(jīng)元的連接權(quán)值),相當于一種權(quán)值正則方法,實際效果比 L2 regularization 更好。
4. 貝葉斯方法
這部分我還沒有想好怎么才能講得清楚,為了不誤導初學者,我就先空著,以后如果想清楚了再更新。當然,這也是防止過擬合的一類重要方法。
綜上:
“TensorFlow & 神經(jīng)網(wǎng)絡(luò)算法高級應(yīng)用班”開課了!
最受歡迎的谷歌TensorFlow 框架,ThoughtWorks大牛教你玩轉(zhuǎn)深度學習!
課程鏈接:http://www.mooc.ai/course/82
加入AI慕課學院人工智能學習交流QQ群:624413030,與AI同行一起交流成長
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。