深度学习中的欠拟合和过拟合简介
通常情況下,當我們訓練機器學習模型時,我們可以使用某個訓練集,在訓練集上計算一些被稱為訓練誤差(training error)的度量誤差,目標是降低訓練誤差。機器學習和優化不同的地方在于,我們也希望泛化誤差(generalization error)(也被稱為測試誤差(test error))很低。泛化誤差被定義為新輸入的誤差期望。這里,期望的計算基于不同的可能輸入,這些輸入采自于系統在現實中遇到的分布。
通常,我們度量模型在訓練集中分出來的測試集(test set)樣本上的性能,來評估機器學習模型的泛化誤差。
當我們只能觀測到訓練集時,我們如何才能影響測試集的性能呢?統計學習理論(statistical learning theory)提供了一些答案。如果訓練集和測試集的數據是任意收集的,那么我們能夠做的確實很有限。如果我們可以對訓練集和測試集數據的收集方式有些假設,那么我們能夠對算法做些改進。
訓練集和測試集數據通過數據集上被稱為數據生成過程(data generating process)的概率分布生成。通常,我們會做一系列被統稱為獨立同分布假設的假設。該假設是說,每個數據集中的樣本都是彼此相互獨立的(independent),并且訓練集和測試集是同分布的(identically distributed),采樣自相同的分布。這個假設使我們能夠在單個樣本的概率分布描述數據生成過程。然后相同的分布可以用來生成每一個訓練樣本和每一個測試樣本。我們將這個共享的潛在的分布稱為數據生成分布(data generating distribution)。我們能觀察到訓練誤差和測試誤差之間的直接聯系是,隨機模型訓練誤差的期望和該模型測試誤差的期望是一樣的。假設我們有概率分布p(x,y),從中重復采樣生成訓練集和測試集。對于某個固定的w,訓練集誤差的期望恰好和測試集誤差的期望一樣,這是因為這兩個期望的計算都使用了相同的數據集生成過程。這兩種情況的唯一區別是數據集的名字不同。
當然,當我們使用機器學習算法時,我們不會提前固定參數,然后從數據集中采樣。我們會在訓練集上采樣,然后挑選參數去降低訓練集誤差,然后再在測試集上采樣。在這個過程中,測試誤差期望會大于或等于訓練誤差期望。以下是決定機器學習算法效果是否好的因素:降低訓練誤差、縮小訓練誤差和測試誤差的差距。
這兩個因素對應機器學習的兩個主要挑戰:欠擬合(underfitting)和過擬合(overfitting)。欠擬合是指模型不能在訓練集上獲得足夠低的誤差。而過擬合是指訓練誤差和測試誤差之間的差距太大。
通過調整模型的容量(capacity),我們可以控制模型是否偏向于過擬合或者欠擬合。通俗地,模型的容量是指其擬合各種函數的能力。容量低的模型可能很難擬合訓練集。容量高的模型可能會過擬合,因為記住了不適用于測試集的訓練集性質。
一種控制訓練算法容量的方法是選擇假設空間(hypothesis space),即學習算法可以選擇為解決方案的函數集。例如,線性回歸函數將關于其輸入的所有線性函數作為假設空間。
當機器學習算法的容量適合于所執行任務的復雜度和所提供訓練數據的數量時,算法效果通常會最佳。容量不足的模型不能解決復雜任務。容量高的模型能夠解決復雜的任務,但是當其容量高于任務所需時,有可能會過擬合。
從預先知道的真實分布p(x,y)預測而出現的誤差被稱為貝葉斯誤差(Bayes error)。訓練誤差和泛化誤差會隨訓練集的大小發生變化。泛化誤差的期望從不會因為訓練樣本數目的增加而增加。對于非參數模型而言,更多的數據會得到更好的泛化能力,直到達到最佳可能的泛化誤差。任何模型容量小于最優容量的固定參數模型會漸進到大于貝葉斯誤差的誤差值。值得注意的是,具有最優容量的模型仍然有可能在訓練誤差和泛化誤差之間存在很大的差距。在這種情況下,我們可以通過收集更多的訓練樣本來縮小差距。
正則化是指我們修改學習算法,使其降低泛化誤差而非訓練誤差。
過擬合(overfitting):是指在模型參數擬合過程中的問題,由于訓練數據包含抽樣誤差,訓練時,復雜的模型將抽樣也考慮在內,將抽樣誤差也進行了很好的擬合。具體表現就是最終模型在訓練集上效果好;在測試集上效果差。模型泛化能力弱。
我們擬合的模型一般是用來預測未知的結果(不在訓練集內),過擬合雖然在訓練集上效果好,但是在實際使用時(測試集)效果差。同時,在很多問題上,我們無法窮盡所有狀態,不可能將所有情況都包含在訓練集上。所以,必須要解決過擬合問題。
機器學習算法為了滿足盡可能復雜的任務,其模型的擬合能力一般遠遠高于問題復雜度,也就是說,機器學習算法有”擬合出正確規則的前提下,進一步擬合噪聲”的能力。而傳統的函數擬合問題(如機器人系統辨識),一般都是通過經驗、物理、數學等推導出一個含參模型,模型復雜度確定了,只需要調整個別參數即可,模型”無多余能力”擬合噪聲。
防止過擬合:
(1)、獲取更多數據:這是解決過擬合最有效的方法,只要給足夠多的數據,讓模型”看見”盡可能多的”例外情況”,它就會不斷修正自己,從而得到更好的結果。
如何獲取更多數據,可以有以下幾個方法:A、從數據源頭獲取更多數據:例如物體分類,就再多拍些照片;但是,在很多情況下,大幅增加數據本身并不容易;另外,我們也不清楚獲取多少數據才算夠。B、根據當前數據集估計數據分布參數,使用該分布產生更多數據:這個一般不用,因為估計分布參數的過程也會代入抽樣誤差。C、數據增強(Data Augmentation):通過一定規則擴充數據。例如在物體分類問題里,物體在圖像中的位置、姿態、尺度、整體圖片明暗度等都不會影響分類結果。我們就可以通過圖像平移、翻轉、縮放、切割等手段將數據庫成倍擴充。
(2)、使用合適的模型:過擬合主要是有兩個原因造成的:數據太少+模型太復雜。所以,我們可以通過使用合適復雜度的模型來防止過擬合的問題,讓其足夠擬合真正的規則,同時又不至于擬合太多抽樣誤差。
對于神經網絡而言,我們可以從以下四個方面來限制網絡能力:A、網絡結構(Architecture):減少網絡的層數、神經元個數等均可以限制網絡的擬合能力。B、訓練時間(Early stopping):對于每個神經元而言,其激活函數在不同區間的性能是不同的。當網絡權值較小時,神經元的激活函數工作在線性區,此時神經元的擬合能力較弱(類似線性神經元)。我們在初始化網絡的時候一般都是初始為較小的權值。訓練時間越長,部分網絡權值可能越大。如果我們在合適時間停止訓練,就可以將網絡的能力限制在一定范圍內。C、限制權值(weight-decay),也叫正則化(regularization):這類方法直接將權值的大小加入到Cost里,在訓練的時候限制權值變大。D、增加噪聲Noise:在輸入中加噪聲:噪聲會隨著網絡傳播,按照權值的平方放大,并傳播到輸出層,對誤差Cost產生影響。在權值上加噪聲:在初始化網絡的時候,用0均值的高斯分布作為初始化。對網絡的響應加噪聲:如在前向傳播過程中,讓神經元的輸出變為binary或random。顯然,這種有點亂來的做法會打亂網絡的訓練過程,讓訓練更慢,但據Hinton說,在測試集上效果會有顯著提升。
(3)、結合多種模型:簡而言之,訓練多個模型,以每個模型的平均輸出作為結果。從N個模型里隨機選擇一個作為輸出的期望誤差,會比所有模型的平均輸出的誤差大。A、Bagging:是分段函數的概念,用不同的模型擬合不同部分的訓練集。以隨機森林(rand forests)為例,就是訓練了一堆互不關聯的決策樹。一般不單獨使用神經網絡做Bagging。B、Boosting:既然訓練復雜神經網絡比較慢,那我們就可以只使用簡單的神經網絡(層數、神經元數限制等)。通過訓練一系列簡單的神經網絡,加權平均其輸出。C、Dropout:這是一個很高效的方法。在訓練時,每次隨機忽略隱層的某些節點,這樣,我們相當于隨機從模型中采樣選擇模型,同時,由于每個網絡只見過一個訓練數據(每次都是隨機的新網絡),所以類似bagging的做法。
(4)、貝葉斯方法。
在統計學中,過擬合(overfitting,或稱過度擬合)現象是指在擬合一個統計模型時,使用過多參數。對比于可獲取的數據總量來說,一個荒謬的模型只要足夠復雜,是可以完美地適應數據。過擬合一般可以視為違反奧卡姆剃刀原則。當可選擇的參數的自由度超過數據所包含信息內容時,這會導致最后(擬合后)模型使用任意的參數,這會減少或破壞模型一般化的能力更甚于適應數據。過擬合的可能性不只取決于參數個數和數據,也跟模型架構與數據的一致性有關。此外對比于數據中的預期的噪聲或錯誤數量,跟模型錯誤的數量也有關。
在統計和機器學習中,為了避免過擬合現象,需要使用額外的技巧,如交叉驗證、提早停止、貝斯信息量準則、赤池信息量準則或模型比較等。
以上內容主要摘自:?《深度學習中文版》?、知乎?和 ?維基百科
GitHub:?https://github.com/fengbingchun/NN_Test
總結
以上是生活随笔為你收集整理的深度学习中的欠拟合和过拟合简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++/C++11中头文件numeric
- 下一篇: 深度学习中的验证集和超参数简介