一文讀懂:防止過擬合的所有方法
- 2020 年 6 月 20 日
- 筆記
- Python與機器學習競賽, 機器學習常見演算法入門
什麼是過擬合
過擬合就是在訓練集上表現得非常好,在測試集上表現得不好。也就是我們俗稱的泛化能力弱。
過擬合無法避免,只能緩解,那麼如何緩解呢?方法太多了。這篇文章一一介紹。
數據集增強Augmentation
影像上,翻轉,平移,縮放,旋轉,鏡像,增強對比度,增強亮度等諸多方式。
我在下面的內容中介紹了影像處理的影像增強的方法:
【預處理庫函數】albumentations庫的簡單了解和使用
Early Stopping
訓練模型的時候,訓練誤差往往是不斷下降的,但是驗證數據集的誤差,是先下降後上升。 兩個數據集的誤差出現分歧的時候,說明模型開始過擬合了。所以Early Stopping就是當驗證數據集的誤差不在下降的時候,結束訓練,保存模型參數。
正則化regularization
L1正則:模型中只有少部分特徵對模型的泛化能力有貢獻,所以L1就是限制模型中非零參數的數量。讓大部分的模型參數都是0,只有真正對泛化能力其作用的參數才是非零的。
L2正則:我們希望模型找到的極小值是平坦的,為什麼呢?
圖中表示的意思,就是平坦的極小值,可以有更多的容忍,容忍什麼呢?容忍訓練數據集和測試數據集之前的分布偏差。現在,如果模型的某些參數特別大,那麼就算輸入的樣本只有很小的區別,但是經過特別大的參數之後,模型給出的結果很可能是非常不同的。這就是太陡峭。所以L2正則就是限制模型參數的大小。參數的平方的和作為損失的一部分,當參數數值越大,那麼梯度下降的損失越大,就會強迫參數變小。
這裡有兩幅圖:
這一幅圖體現的是假設只有兩個參數的情況下,增加L1正則的情況。圓圈圈體現的是損失等值線,方框是L1正則的損失。假設沒有L1正則,那麼參數應該收斂到最小的那個圓圈中的。但是因為增加了L1正則,所以需要權衡兩個部分的損失,然後找到接觸的交點位置。因為圓形和矩形在矩形的頂點相交的可能性大,而矩形的頂點就是某一個參數為0的情況。所以L1正則會讓模型參數有更大的可能性為0.
【在更多參數的模型中,會有更多的頂點。不過二維影像就畫不出來了】
這個是L2正則的示意圖。L2正則式一個原型因為是參數的平方和。相比L1的(0,1)這樣的交點,L2更希望每一個參數都普遍較小,不希望某一個參數特別大。
Dropout
這個就是神經網路中,在全連接網路中經常用到的。
在每一個Batch數據訓練的時候,Dropout層按照概率P隨機讓一些神經元失活,然後保留下來的神經元的參數被更新。dropout是只有在訓練的時候才使用的,在測試的時候並不適用。
我個人理解的dropout其實就相當於一個多模型融合的過程。因為每一次都會失活一部分的神經元,所以每一次的模型都是不那麼一樣的,相當於不同的模型吧。
增加噪音
輸入中增加噪音
輸入中有噪音\(\epsilon\),那麼輸出中就會有一個類似於\(\epsilon \omega\),這樣的損失項。 從而限制權值的大小。
當然這樣也可以增加模型對輸入的容忍度,我覺得也可以理解為一種數據增強。 去噪自編碼器DAE就是利用這樣的方法的。
權值中加噪音
這個用的不多,在初始化網路的時候,用0均值的高斯分布作為參數的初始化。
集成
集成主要是bagging,boosting,之前說的dropout我覺得也可以算作集成的方法
bagging
將數據集抽取一部分,比如抽取70%的樣本,然後用這些樣本去訓練一個模型。然後再從數據集中抽取70%的樣本,再訓練一個新的。典型的就是隨機森林。
【神經網路因為訓練速度的問題,所以一般不用這樣的方法。決策樹lgb啥的可以用】
boosting
訓練複雜神經網路比較慢,所以可以通過訓練多個簡單的分類器,然後加權平均每一個分類器的輸出。這就是Boost的思想。【這句話給我背下來!】
之後整理一下Adaboost和XGBoost的這些演算法。
其他
- 限制網路的層數和複雜度
喜歡的話請關注我們的微信公眾號~《你好世界煉丹師》或者知乎【你好世界煉丹師】。
- 公眾號主要講統計學,數據科學,機器學習,深度學習,以及一些參加Kaggle競賽的經驗。
- 公眾號內容建議作為課後的一些相關知識的補充,飯後甜點。
- 此外,為了不過多打擾,公眾號每周推送一次,每次4~6篇精選文章。
微信搜索公眾號:你好世界煉丹師。期待您的關注。