【技術觀點】深度網路的過擬合問題討論

【技術觀點】深度網路的過擬合問題討論

Author: Zongwei Zhou | 周縱葦

Weibo: @MrGiovanni

Email: zongweiz@asu。edu

原部落格:深度網路的過擬合問題討論

1. 問題背景

最近做深度學習實驗的時候遇到了一個很棘手的問題,那就是大名鼎鼎的“過擬合”,直觀地表現在圖中是長這個樣子的,分析來講就是說深度網路在擬合訓練集的時候是可以很好地實現,Loss很小,Accuracy很大(我這兒能達到99。99%),但是呢,測試集的Loss很大,Accuracy在一個比較低的範圍內波動(我這兒是70%-80%),並沒有像論文中說的那樣,測試集的Loss隨著迭代的增加而減小,Accuracy隨著迭代的增加而增大。

【技術觀點】深度網路的過擬合問題討論

【技術觀點】深度網路的過擬合問題討論

如果你沒有看出來上圖有什麼毛病的話,我就放一張理想狀態的結果圖做對比(如下圖粗粗的線),畫的比較挫,但是大概的意思在那兒,隨著迭代的增加,訓練集和測試集的精確度應該上升,我們可以容忍測試集的精確度沒有訓練集那麼高,畢竟有擬合的誤差,但是像上圖我做出來的結果那樣,一定是“過擬合”啦。

【技術觀點】深度網路的過擬合問題討論

【技術觀點】深度網路的過擬合問題討論

用白話來說“過擬合”就是:老師給你的題你都會做了,考試給你換個花樣你就懵逼了。好,老師給你的題就相當於我們的訓練資料,考試的題相當於測試資料,“過擬合”就是深度網路把訓練的資料擬合的特別好,但是有點好過頭了,對訓練資料當然是100%好用,但是一來測試資料就瘋了,那這樣的網路訓練出來其實是沒有用的,訓練集已經是監督學習了,擬合的再好也沒用。 體現在函式上就是下圖

【技術觀點】深度網路的過擬合問題討論

【技術觀點】深度網路的過擬合問題討論

2.網路結構介紹

我實驗中用到的深度網路結構原型是Fully Convolutional Networks,參考的論文中也叫它U-Net,總之就是一個用來做影象分割的深度網路。示意圖如下:

【技術觀點】深度網路的過擬合問題討論

【技術觀點】深度網路的過擬合問題討論

用Keras的實現程式碼是:

【技術觀點】深度網路的過擬合問題討論

【技術觀點】深度網路的過擬合問題討論

大概的問題背景和網路結構介紹完畢,更多實驗Details請參考“PET/CT images segmentation via U-Net, using keras”。

3. 問題分析

當年LeNet-5在手寫字的識別上出盡了風頭,但是當LeNet-5應用到其他資料集中的時候卻出現了很多問題,從此,學者們開始了瘋狂的理論、實踐探索。“過擬合”問題算是深度學習中一個特別重要的問題,老生常談了,也有不少解決的方法供我選擇。

舉例來講(感謝“知乎深度學習Keras”——QQ群中大神們的幫助):

1。 加入Dropout層

2。 檢查資料集是否過小(Data Augmentation)

3。 用一用遷移學習的思想

4。 調參小tricks。

調小學習速率(Learning Rate)

調小每次反向傳播的訓練樣本數(batch_size)

5。 試一試別的最佳化器(optimizer)

6。 Keras的回撥函式EarlyStopping()

評價:我認為第一個是比較可行,因為“教科書”上的確有說dropout是專門用來對付“過擬合”問題的。

關於資料集的大小,這也是導致過擬合的原因,如果太小,很容易過擬合。那麼多大的資料集夠了呢?反正我的肯定夠了,我的深度網路輸入影象是369,468幅,68·80畫素的,二通道輸入,總共的大小是19。5GB。這個資料量可以說是十分可觀了,所以對我來說,第二條可能不適用。那麼如果想要擴充資料集,需要用到Data Augmentation,這個是在醫學影像中十分常用的手段,包括平移,旋轉,拉伸,扭曲等等變換造出新的資料,來增加資料量。

第三條是深度學習中比較有效的方法了,英文名叫fine-tuning,就是用已有的訓練完的網路引數作為初始化,在這個基礎上繼續訓練。原來的網路引數往往會在很多論文和github裡頭能找到,這是在很大的影象資料集中訓練完的網路,根據圖形影象的“語義”相似性(我也不知道該怎麼描述,就是認為世界上的圖片都有某種相似性,就像人類,每個人都長得不一樣,但是你不會把人和其他動物混在一起,這就是一個宏觀的,抽象的相似性),把這個網路“遷移”到一個新的影象資料集中是有一定的道理的。由於時間原因,我暫時還沒有采用這個。

第四條就是比較說不清道不明的調參了,這幾乎是機器學習的主要話題,人說“有多少人工,就有多少智慧”,這個調參真的需要“經驗”啊哈哈哈。知乎上有一篇比較精彩的帖子:你有哪些deep learning(rnn、cnn)調參的經驗? 不好意思,第五條又是試湊法。。。可供選擇的Optimizers有很多,都試一下,看看用哪兒效果好,聽上去有點喪心病狂了。 第六條方法是一個小函式,叫做EarlyStopping,程式碼如下

【技術觀點】深度網路的過擬合問題討論

【技術觀點】深度網路的過擬合問題討論

作用是監視每次迭代的指標,比如說這兒監視的是val_loss(測試集的Loss),隨著迭代的增加,當val_loss不再發生大的變化的時候可以終止訓練,在過擬合之前阻斷。這種策略也稱為“No-improvement-in-n”,n就是Epoch的次數。

不幸的是,以上六個方案,我測試了以後都沒有很好地解決“過擬合”問題。

4. 正則化方法

正則化方法是指在進行目標函式或代價函式最佳化時,在目標函式或代價函式後面加上一個正則項,一般有L1正則與L2正則等。這個很理論了,會涉及到一些公式。

【技術觀點】深度網路的過擬合問題討論

【技術觀點】深度網路的過擬合問題討論

這部分內容我在學習的時候就當它純理論來記,當時根本沒有想過會去真正用它,看來現在是必須要try一下了。

【技術觀點】深度網路的過擬合問題討論

【技術觀點】深度網路的過擬合問題討論

要在Keras中修改這部分代價函式(Objectives)的程式碼,可以參考這部分內容,裡面包括了若干個代價函式,如果想要自己編寫代價函式也可以的。根據這個部落格:基於Theano的深度學習(Deep Learning)框架Keras學習隨筆08規則化(規格化),有效解決過擬合的方法就是加入規則項。具體的規則化可以參見深度學習(DL)與卷積神經網路(CNN)學習筆記隨筆-04-基於Python的LeNet之MLP中對於規則化的介紹。博主Tig_Free是真神啊,膜拜一下!

5. 問題解決

最終,過擬合的現象基本上被控制住了,總的來說,L1/L2規範化的確是很牛逼,在學術論文中也有所體現:

【技術觀點】深度網路的過擬合問題討論

【技術觀點】深度網路的過擬合問題討論

網路調整如下:

【技術觀點】深度網路的過擬合問題討論

【技術觀點】深度網路的過擬合問題討論

配置:)

1。 dropout層(0。3)

2。 全連線層的L2規範化

3。 最佳化器(adadelta)

4。 學習速率(1e-9)

達到的效果比較令人滿意,不僅訓練集的Loss在降低,Acc在上升,測試集的Loss也同樣降低,測試集的Acc在上升,整體的網路學習效能也變得比以前好了。

【技術觀點】深度網路的過擬合問題討論

【技術觀點】深度網路的過擬合問題討論

【技術觀點】深度網路的過擬合問題討論

【技術觀點】深度網路的過擬合問題討論

6. 關於過擬合的參考材料

[1] 機器學習中使用「正則化來防止過擬合」到底是一個什麼原理?為什麼正則化項就可以防止過擬合?

[2] 機器學習中防止過擬合的處理方法

[3] 用簡單易懂的語言描述「過擬合 overfitting」?

[4] Reducing Overfitting in Deep Networks by Decorrelating Representations。 Michael Cogswell, Faruk Ahmed, Ross Girshick, Larry Zitnick, Dhruv Batra (2015)

[5] Dropout: A Simple Way to Prevent Neural Networks from Overfitting。 N Srivastava, G Hinton, A Krizhevsky, I Sutskever, R Salakhutdinov (2014)

[6] Overfitting & Regularization (牆)

[7] Regularization in Statistics。 PJ Bickel, B Li (2006)

[8] Overfitting, Regularization, and Hyperparameters (牆)

[9] Overfitting。 by Hal Daume III (牆)

[10] Data Science 101: Preventing Overfitting in Neural Networks。 by Nikhil Buduma (牆)

資料智農團隊提供農業資料採集,農產品市場諮詢與調研,農業資料分析服務。如果你在農業方面有獨到的見解或是新奇的發現請在評論區留言,我們會全力解答。

微博:資料智農

微信:資料智農

郵箱:dataintellagr@126。com

製作|何書鑫