深度學習 (DeepLearning) 基礎 [4]---欠擬合、過擬合與正則化
Introduce
在上一篇“深度學習 (DeepLearning) 基礎 [3]---梯度下降法”中我們介紹了梯度下降的主要思想以及優化算法。本文將繼續學習深度學習的基礎知識,主要涉及:
- 欠擬合和過擬合
- 正則化
以下均為個人學習筆記,若有錯誤望指出。
欠擬合和過擬合
要理解欠擬合和過擬合,我們需要先清楚一對概念,即偏差和方差。
偏差和方差是深度學習中非常有用的一對概念,尤其是可以幫助我們理解模型的欠擬合和過擬合。
- 偏差:模型對于訓練集的擬合能力,通俗理解來說,偏差代表模型能夠正確預測訓練集的程度(也就是說,模型在訓練集上表現出的精度)。偏差越高代表模型在訓練集上的精度越低。
- 方差:模型對于除訓練集之外其他數據的預測能力,即泛化能力。通俗理解來說,方差代表模型能夠正確預測測試集的程度(也就是說,模型在測試集上表現出的精度)。方差越高代表模型在各測試集上的精度明顯低于訓練集上的精度。
理解了偏差和方差的概念之后,那模型欠擬合和過擬合又是什么呢?
- 欠擬合:對應于高偏差的情況,即模型不能很好地擬合訓練數據,在訓練集上的預測精度很低。如下圖所示(藍色線為預測的模型,可以發現并不能很好滴擬合訓練數據):
-
過擬合:對應于高方差的情況,即模型雖然在訓練集上的精度很高,但是在測試集上的表現確差強人意。這是由于模型過度擬合了訓練集,將訓練集特有的性質當成了所有數據集的一般性質,導致其在其他數據集上的泛化能力特別差。如下圖所示(藍色線為預測的模型,可以發現似乎過度擬合了訓練數據):
過擬合 正確模型的擬合曲線如下圖所示(與上面欠擬合和過擬合的曲線圖對比,可以更好地幫助我們理解欠擬合和過擬合):
在理解了模型欠擬合和過擬合的概念之后,如果我們在訓練模型的過程中遇到了這兩類問題,我們怎么解決呢?
-
解決欠擬合:
(1) 使用更復雜的網絡結構,如增加隱藏層數目,隱藏層結點數等。(因為神經網絡如果層數和節點數足夠的話,是可以模擬任何函數的)
(2) 訓練更長時間,即增加神經網絡模型的參數更新次數。(更新次數不夠可能使得模型還沒找到合適的參數使損失最小化,降低了模型精度)
(3) 使用其他更合適的神經網絡架構,如前饋神經網絡、卷積神經網絡(CNN)、循環神經網絡(RNN)、深度信念網絡(DBN)等等(后續將進一步學習各種類型的神經網絡);
-
解決過擬合:
(1) 使用更多的訓練數據。(若是我們能把當前領域內所有的訓練數據都拿來學習個夠,那么我們的模型還會在這個領域的數據上表現差嗎?不可能的,對吧!)
(2) 為模型添加正則化模塊 (regularization)。(對于正則化概念以及為什么正則化能解決過擬合問題,在本文后續進行介紹)
(3) 使用其他更合適的神經網絡架構。
對于以上策略一般的思考順序,不論是欠擬合還是過擬合,當我們遇到了,都是優先考慮能不能使用上述中講到的 (1) 和 (2) 來解決。如果不行的話再考慮 (3),因為重構一個神經網絡的話相對于其他解決方法開銷比較大。
正則化
直觀理解:正則化是用來防止模型過擬合的一種方法,其做法是通過在模型損失函數中加入一項正則項,使得其在訓練數據擬合損失和模型復雜度中達到一種權衡。
通常加入正則化的損失函數為如下形式:
其中第一項為模型原本的損失函數,第二項
為正則化項,w為權值參數矩陣。若q=1,則為我們常用的L1正則化;若q=2,則為我們常用的L2正則化。
理解了正則化概念以及加入正則化的損失函數的形式之后,回歸到一個更重要的問題,即為什么正則化能夠防止模型過擬合呢?以下分別從三個角度來理解正則化在模型訓練中的作用。
(1) 從模型擬合曲線的函數形式來看
為了回答上述問題,我們需要先理解過擬合情況下學習出來的擬合函數是什么樣子的。可以看到上述過擬合部分的擬合曲線圖(emm,就是扭來扭去的那張),圖中的數據點實際上只需要一個二次函數就能夠很好擬合了。但是從圖中來看,過擬合情況下學習到的函數,肯定是大于二次的高次函數了。 假設該過擬合得到的函數為p次函數,如下所示:
實際上正確的擬合函數為二次函數,如下所示:
我們可以發現,要是我們能夠更新權值參數w,使得w中的w0、w1和w2非0,而其余的權值均為0的話,我們是可以得到一個能夠比較好地擬合上述曲線的模型的。而正則化就是起到上述這個作用(讓一些不必要的權值參數為0),從而來防止模型過擬合的。
(2) 從神經網絡模型的復雜度來看
現在回過頭來看上述對于正則化的直觀理解,里面有講到模型復雜度,那模型復雜度是什么呀?我們可以將其通俗理解成權值參數的個數,因為網絡的權值參數越多代表著神經網絡更龐大(擁有更多的層和更多的節點以及更多的邊),自然而然模型就更復雜了(如果網絡中某條邊的權重w為0的話,那這條邊不就沒了嘛,那模型不就更簡單一些了嘛,這就是正則化要做的事吧,以上為個人理解)。
(3) 從加了正則化項的損失函數來看
現在再來看上述加入正則化的損失函數的一般形式,第一項為原本的損失函數,第二項為正則化項。以下分為兩點來進行分析:
- 假設沒有添加正則化項的話,模型訓練的結果會使得損失函數盡可能小,也就是說使得模型擬合訓練樣本集的能力最大化,這就可能導致模型將訓練樣本集的一些特殊性質當成數據的普遍性質,使得模型泛化能力差,從而導致過擬合現象。
- 假設添加了正則項,正則項起到什么作用了?首先我們的目標是最小化損失函數,從某種程度上也需要最小化正則項,而由上述L1、L2正則項的形式來看,最小化正則項無非是把其中的某些不重要的權值參數wi設置為0,或者設置一個比較小的值。因此從這個層面上來理解,正則化也是通過將某些不重要權值參數設置為0來防止過擬合的。
需要說明的是:雖然L1正則化和L2正則化都可以防止模型過擬合,但是L1正則化相比于L2正則化會更容易產生稀疏權值矩陣(也就是說,權值矩陣中更多的權值為0)。至于原因,由于個人能力問題,可能解釋不太清楚,可以參考知乎問題--L1 相比于 L2 為什么容易獲得稀疏解?