解決過擬合

2021-10-09 03:47:20 字數 1522 閱讀 7376

獲取和使用更多的資料集

對於解決過擬合的辦法就是給與足夠多的資料集,讓模型在更可能多的資料上進行「觀察」和擬合,從而不斷修正自己。然而事實上,收集無限多的資料集幾乎是不可能的,因此乙個常用的辦法就是調整已有的資料,新增大量的「噪音」,或者對影象進行銳化、旋轉、明暗度調整等優化。

另外補充一句,cnn在影象識別的過程中有強大的「不變性」規則,即待辨識的物體在影象中的形狀、姿勢、位置、明暗度都不會影響分類結果。

採用合適的模型

目前來說,針對不同的情況和分類要求,對使用的模型也是千差萬別。過於複雜的模型會帶來過擬合問題。

對於模型的設計,目前公認的乙個深度學習規律「deeper is better」。國內外各種大牛通過實驗和競賽發現,對於cnn來說,層數越多效果越好,但是也更容易產生過擬合,並且計算所耗費的時間也越長。因此對於模型的設計需要合理參考各種模型的取捨。

使用 dropout

dropout 是乙個非常有用和常用的方法。dropout 指的是在訓練過程中每次按一定的機率關閉或忽略某些層的節點。使得模型在使用同樣的資料進行訓練時相當於從不同的模型中隨機選擇乙個進行訓練。

至於 dropout 起作用的原因,可以簡單理解成在訓練過程中會產生不同的訓練模型,不同的訓練模型也會產生不同的的計算結果,隨著訓練的不斷進行,計算結果會在乙個範圍內波動,但是均值卻不會有很大變化,因此可以把最終的訓練結果看作是不同模型的平均輸出。

正則化early stopping

early stopping 是引數微調中的一種,即在每個迴圈結束一次以後(這裡的迴圈可能是 full data batch,也可能是 mini batch size),計算模型的準確率(accuracy)。當準確率不再增加時就停止訓練。

這是一種非常簡單和自然的辦法,準確率不再增加時就停止訓練,防止模型對已有的資料繼續訓練。但是問題在於,準確率在每個迴圈之後的計算是變化的,沒有任何人和任何模型能保證準確率不會變化,可能某次迴圈結束後,準確率很高,但是下一輪結束後準確率又降得很低。

這裡筆者建議的乙個辦法是人為地設定乙個範圍。當連續10次準確率在此範圍內波動時就停止迴圈。

可變化的學習率

可變化的學習率也是根據模型計算出的準確率進行調整。乙個簡單的方法是在人為設定的準確率範圍內,達到10次範圍內的波動後,依次將學習率減半,直到最終的學習率降為原始的 1/1024 時停止模型的訓練。

使用 batch_normalization

還有乙個資料處理的方法 batch_normalization,即資料在經過卷積層之後,真正進入啟用函式之前需要對其進行一次 batch_normalization,分批對輸入的資料求取均值和方差之後重新對資料進行歸一化計算。

這樣做的好處就是對資料進行一定程度的預處理,使得無論是訓練集還是測試集都在一定範圍內進行分布和波動,對資料點中包含的誤差進行掩蓋化處理,從而增大模型的泛化能力。

除此之外還有哪些常用的消除過擬合的方法?

除了上述提到的方法,還有常用的是交叉驗證、pca特徵提取、增加各種噪音等。這樣實際上還是屬於增加了資料集,增加資料集是解決過擬合的根本性方法。除此之外對於模型來說,盡量選擇較為簡單的模型也是解決過擬合的乙個常用方法。

防止過擬合以及解決過擬合

過擬合 為了得到一致假設而使假設變得過度複雜稱為過擬合。乙個過配的模型試圖連誤差 噪音 都去解釋 而實際上噪音又是不需要解釋的 導致泛化能力比較差,顯然就過猶不及了。這句話很好的詮釋了過擬合產生的原因,但我認為這只是一部分原因,另乙個原因是模型本身並不能很好地解釋 匹配 資料,也就是說觀測到的資料並...

dropout解決過擬合

原理就是在第一次學習的過程中,隨即忽略一些神經元和神經的鏈結。使得神經網路變得不完整。一次一次。每一次得出的結果不依賴某乙個引數。這樣就解決了過擬合問題。import tensorflow as tf from sklearn.datasets import load digits from skl...

怎麼解決過擬合

過擬合主要包括 建模樣本選取有誤。樣本噪音干擾過大。假設的模型無法合理存在,或者說是假設成立的條件實際並不成立。引數太多,模型複雜度過高。對於神經網路模型 a 對樣本資料可能存在分類決策面不唯一,隨著學習的進行,bp演算法使權值可能收斂過於複雜的決策面 b 權值學習迭代次數足夠多 overtrain...