1. 程式人生 > >Pytorch_第八篇_深度學習 (DeepLearning) 基礎 [4]---欠擬合、過擬合與正則化

Pytorch_第八篇_深度學習 (DeepLearning) 基礎 [4]---欠擬合、過擬合與正則化

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