對于深度學習或機器學習模型而言,我們不僅要求它對訓練數據集有很好的擬合(訓練誤差),同時也希望它可以對未知數據集(測試集)有很好的擬合結果(泛化能力),所產生的測試誤差被稱為泛化誤差。度量泛化能力的好壞,最直觀的表現就是模型的過擬合(overfitting)和欠擬合(underfitting)。過擬合和欠擬合是用于描述模型在訓練過程中的兩種狀態。一般來說,訓練過程會是如下所示的一個曲線圖
一、什么是欠擬合?
欠擬合是指模型不能在訓練集上獲得足夠低的誤差。換句換說,就是模型復雜度低,模型在訓練集上就表現很差,沒法學習到數據背后的規律。
如何解決欠擬合?
欠擬合基本上都會發生在訓練剛開始的時候,經過不斷訓練之后欠擬合應該不怎么考慮了。但是如果真的還是存在的話,可以通過增加網絡復雜度或者在模型中增加特征,這些都是很好解決欠擬合的方法。
二、什么是過擬合?
過擬合是指訓練誤差和測試誤差之間的差距太大。換句換說,就是模型復雜度高于實際問題,模型在訓練集上表現很好,但在測試集上卻表現很差。模型對訓練集"死記硬背"(記住了不適用于測試集的訓練集性質或特點),沒有理解數據背后的規律,泛化能力差。
為什么會出現過擬合現象?
造成原因主要有以下幾種:
1、訓練數據集樣本單一,樣本不足。如果訓練樣本只有負樣本,然后那生成的模型去預測正樣本,這肯定預測不準。所以訓練樣本要盡可能的全面,覆蓋所有的數據類型。
2、訓練數據中噪聲干擾過大。噪聲指訓練數據中的干擾數據。過多的干擾會導致記錄了很多噪聲特征,忽略了真實輸入和輸出之間的關系。
3、模型過于復雜。模型太復雜,已經能夠“死記硬背”記下了訓練數據的信息,但是遇到沒有見過的數據的時候不能夠變通,泛化能力太差。我們希望模型對不同的模型都有穩定的輸出。模型太復雜是過擬合的重要因素。
三、如何防止過擬合?
要想解決過擬合問題,就要顯著減少測試誤差而不過度增加訓練誤差,從而提高模型的泛化能力。我們可以使用正則化(Regularization)方法。那什么是正則化呢?正則化是指修改學習算法,使其降低泛化誤差而非訓練誤差。
常用的正則化方法根據具體的使用策略不同可分為:(1)直接提供正則化約束的參數正則化方法,如L1/L2正則化;(2)通過工程上的技巧來實現更低泛化誤差的方法,如提前終止(Early stopping)和Dropout;(3)不直接提供約束的隱式正則化方法,如數據增強等。
3 1. 獲取和使用更多的數據(數據集增強)——解決過擬合的根本性方法
讓機器學習或深度學習模型泛化能力更好的辦法就是使用更多的數據進行訓練。但是,在實踐中,我們擁有的數據量是有限的。解決這個問題的一種方法就是創建“假數據”并添加到訓練集中——數據集增強。通過增加訓練集的額外副本來增加訓練集的大小,進而改進模型的泛化能力。
我們以圖像數據集舉例,能夠做:旋轉圖像、縮放圖像、隨機裁剪、加入隨機噪聲、平移、鏡像等方式來增加數據量。另外補充一句,在物體分類問題里,CNN在圖像識別的過程中有強大的“不變性”規則,即待辨識的物體在圖像中的形狀、姿勢、位置、圖像整體明暗度都不會影響分類結果。我們就可以通過圖像平移、翻轉、縮放、切割等手段將數據庫成倍擴充。
2. 采用合適的模型(控制模型的復雜度)
過于復雜的模型會帶來過擬合問題。對于模型的設計,目前公認的一個深度學習規律"deeper is better"。國內外各種大牛通過實驗和競賽發現,對于CNN來說,層數越多效果越好,但是也更容易產生過擬合,并且計算所耗費的時間也越長。
根據奧卡姆剃刀法則:在同樣能夠解釋已知觀測現象的假設中,我們應該挑選“最簡單”的那一個。對于模型的設計而言,我們應該選擇簡單、合適的模型解決復雜的問題。
3. 降低特征的數量
對于一些特征工程而言,可以降低特征的數量——刪除冗余特征,人工選擇保留哪些特征。這種方法也可以解決過擬合問題。
4. L1 / L2 正則化
(1) L1 正則化
在原始的損失函數后面加上一個L1正則化項,即全部權重www的絕對值的和,再乘以λ/n。則損失函數變為:
對應的梯度(導數):
其中 [公式] 只是簡單地取 [公式] 各個元素地正負號。
梯度下降時權重 [公式] 更新變為:
當w=0w=0w=0時,|w|是不可導的。所以我們僅僅能依照原始的未經正則化的方法去更新w。
當 w>0w>0w>0時,sgn( www )>0, 則梯度下降時更新后的 www變小。
當 w<0w<0w<0 時,sgn( www )>0, 則梯度下降時更新后的 www 變大。換句換說,L1正則化使得權重www往0靠,使網絡中的權重盡可能為0,也就相當于減小了網絡復雜度,防止過擬合。
這也就是L1正則化會產生更稀疏(sparse)的解的原因。此處稀疏性指的是最優值中的一些參數為0。L1正則化的稀疏性質已經被廣泛地應用于特征選擇機制,從可用的特征子集中選擇出有意義的特征。
(2) L2 正則化
L2正則化通常被稱為權重衰減(weight decay),就是在原始的損失函數后面再加上一個L2正則化項,即全部權重www的平方和,再乘以λ/2n。則損失函數變為:
對應的梯度(導數):
能夠發現L2正則化項對偏置 b 的更新沒有影響,可是對于權重 [公式] 的更新有影響:
這里的[公式]都是大于0的, 所以[公式] 小于1。因此在梯度下降過程中,權重 www 將逐漸減小,趨向于0但不等于0。這也就是權重衰減(weight decay)的由來。
L2正則化起到使得權重參數www變小的效果,為什么能防止過擬合呢?因為更小的權重參數 www意味著模型的復雜度更低,對訓練數據的擬合剛剛好,不會過分擬合訓練數據,從而提高模型的泛化能力。
5. Dropout
Dropout是在訓練網絡時用的一種技巧(trike),相當于在隱藏單元增加了噪聲。Dropout 指的是在訓練過程中每次按一定的概率(比如50%)隨機地“刪除”一部分隱藏單元(神經元)。所謂的“刪除”不是真正意義上的刪除,其實就是將該部分神經元的激活函數設為0(激活函數的輸出為0),讓這些神經元不計算而已。
Dropout為什么有助于防止過擬合呢?
(a)在訓練過程中會產生不同的訓練模型,不同的訓練模型也會產生不同的的計算結果。隨著訓練的不斷進行,計算結果會在一個范圍內波動,但是均值卻不會有很大變化,因此可以把最終的訓練結果看作是不同模型的平均輸出。
(b)它消除或者減弱了神經元節點間的聯合,降低了網絡對單個神經元的依賴,從而增強了泛化能力。
6. Early stopping(提前終止)
對模型進行訓練的過程即是對模型的參數進行學習更新的過程,這個參數學習的過程往往會用到一些迭代方法,如梯度下降(Gradient descent)。Early stopping是一種迭代次數截斷的方法來防止過擬合的方法,即在模型對訓練數據集迭代收斂之前停止迭代來防止過擬合。
為了獲得性能良好的神經網絡,訓練過程中可能會經過很多次epoch(遍歷整個數據集的次數,一次為一個epoch)。如果epoch數量太少,網絡有可能發生欠擬合;如果epoch數量太多,則有可能發生過擬合。Early stopping旨在解決epoch數量需要手動設置的問題。具體做法:每個epoch(或每N個epoch)結束后,在驗證集上獲取測試結果,隨著epoch的增加,如果在驗證集上發現測試誤差上升,則停止訓練,將停止之后的權重作為網絡的最終參數。
為什么能防止過擬合?當還未在神經網絡運行太多迭代過程的時候,w參數接近于0,因為隨機初始化w值的時候,它的值是較小的隨機值。當你開始迭代過程,w的值會變得越來越大。到后面時,w的值已經變得十分大了。所以early stopping要做的就是在中間點停止迭代過程。我們將會得到一個中等大小的w參數,會得到與L2正則化相似的結果,選擇了w參數較小的神經網絡。
Early Stopping缺點:沒有采取不同的方式來解決優化損失函數和過擬合這兩個問題,而是用一種方法同時解決兩個問題 ,結果就是要考慮的東西變得更復雜。之所以不能獨立地處理,因為如果你停止了優化損失函數,你可能會發現損失函數的值不夠小,同時你又不希望過擬合。