如何判斷深度神經網路是否過擬合?

具體的都有哪些方法?

我能想到的就是對比訓練集和測試集的正確率。因為訓練集大,訓練好一個模型需要一個月左右,有些方法不太適合。


如果你需要1個月才能出模型,感覺是先換設備會是更緊要的


根據你的情況,我說一個算是trick的,但是不能保證。

因為你訓練集大,所以考慮採樣一個子集出來(當然,還是要劃分好訓練/驗證集),在這個數據集上訓練一個模型。

這個速度可以夠快,可以快速獲得一個在這個訓練集合上的沒有過擬合的模型,以這個模型的正確率作為參考,再來挑選整個數據集合的模型。理論上說,考慮到完整訓練集合的數據量更大(我們假設數據質量不錯),正確率一類的指標應該不低於這個。

小數據集和大數據的模型可以同步訓練,所以只要硬體有富餘的,不影響時間。

難點在於,

1. 採樣演算法。小數據集的採樣必須盡量接近大數據集的統計分布。

2. 樣本量。太多了訓練太慢,太少了完全沒意義,會有誤導。

3. 大小數據集的模型的capacity是否需要有區分(如果上兩點做得好,前後模型就可以用一樣的)

另外,實踐中,過擬合沒有想像的那麼誇張。

如果不是刷數據集排名,這玩意其實你不用太關注。輕微過擬合完全不會對你的應用有什麼負面影響(其實如果你數據量大,且質量好,過擬合也只會是輕微)。

我這裡說的質量好,意思是能夠良好代表實際應用中的分布。


如果訓練需要一個月的話,建議題主使用多個GPU同時訓練,這樣可以顯著的提升訓練速度。

過擬合最直觀的表現就是 training accuracy 特別高,但是testing accuracy 特別低,即兩者相差特別大。題主訓練完了以後可以測試一下網路在訓練集的正確率,如果和測試集的正確率相差特別大(比如20%),則說明網路過擬合了。

在訓練之前可以使用少量數據訓練一個更小的模型,如果這個模型的泛化比較好的,再去train更深更大的網路。否則直接訓練一個超級大網路最後發現結果不好就不好了。

具體設計網路的過程可以參考Residual Net, 或者最新的Wide Residual Net。他們一般是在小的數據集上線訓練小網路,確定這種結構work之後再在更大的數據集上train更深的網路

Residual Net: https://arxiv.org/pdf/1512.03385.pdf

Wide Reisdual Net: https://arxiv.org/pdf/1605.07146.pdf


如果想在訓練早期獲知是否過擬合,我只知道一種馬馬虎虎的方法,就是每訓練一小段時間就做一次測試,如果多次發生測試精度下降,說明可能過擬合的趨勢已經發生,立即停止訓練,或者還原保存的測試前的狀態,調整參數(比如降低學習率或其他值)繼續訓練。

但也有一種可能,多次過擬合後繼續訓練,可能又會重新提高識別率,這就不能判斷為過擬合了。所以我個人感覺,還是很難判斷的,需要綜合模型特點來考慮。


1. 判斷過擬合 generalizaton set error &> &> training set error

一般採用新樣本的測試集誤差即為泛化誤差,測試集誤差大於訓練樣本誤差則說明模型出現過擬合。

2. 訓練集較大難以訓練,可以考慮採用pre-train的方法節省訓練時間。(例如利用ImageNet的model)

有些回答建議採用一個子集,但是採用子集可能涉及到兩個問題:

(1)如何採樣取得同分布的子集,若無法取得分布較為一致的子集,可能在子集訓練中會出現數據有偏的情況,這有可能會導致子集的訓練集合驗證集精度下降。可以採用分層抽樣方法盡量使得分布一致,但實際中還是無法做到完全同分布。

(2)子集數據規模問題。如果子集數據規模接近整個數據集(數量級一致),可能並不會大大縮短訓練時間,如果子集數據規模遠遠小於整個數據集,你之前用於訓練整個數據集的網路可能對子集來說太過巨大,較大的網路可能會導致子集訓練集精度高,驗證集精度低的現象。

3. 一般來說,交叉驗證是判斷過擬合的重要方法,但鑒於題主數據量非常大,可能較難實現。

4. 有時雖然訓練集合測試集誤差相差較大,看起來是模型過擬合,但實際上可能是訓練集和測試集分布不同造成的,也就是數據有偏,這是一個所謂的data shift問題。如果是這個原因,建議題主想辦法解決訓練集分布有偏問題。


訓好一個模型需要一個月,還是別玩了,沒法做。


瀉藥。

可以準備一個驗證集,每一段時間在驗證集合上看一下指標是不是和訓練集合的的指標變化一致,如果不一致,並且變壞了,那麼意味著過擬合。注意,驗證集不能跟訓練集合和測試集合有交集


在機器學習中,神經網路的數據一般劃分為訓練集、驗證集和測試集三個部分,當然,用訓練集去訓練,然後用驗證集去隨時驗證此階段神經網路的訓練情況,如果結果趨向於便好,那麼尚可,但是如果你發現,某一時刻突然驗證集上的表現變差,越來越不好,那就要考慮是不是過擬合了。

至於過擬合的概念以及如何判別是不是過擬合,包括一些常用的解決方案,可以參考這篇文章: 機器學習:過擬合與欠擬合問題 - AI檸檬

題主提到的訓練時間長達一個月,感覺有點神奇,不知道是否使用了GPU來計算,如果沒有的話,還是切換到GPU吧,速度會直接上升至少一個數量級。


Train Accuracy &>&> Test Accuracy

不過訓練一個月,題主你真的應該更新設備了!


推薦閱讀:

數據挖掘的系統教程是怎樣的,包含哪些教材?
學習神經網路、SVM等機器學習的知識,為了更好的投入到應用當中,用matlab還是c++好呢?
在數據量不足的情況下,用哪種數據挖掘模型效果會更好?
機器學習or電子,我該選哪個?
想從事大數據、海量數據處理相關的工作,如何自學打基礎?

TAG:人工智慧 | 數據挖掘 | 機器學習 | 深度學習DeepLearning |