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
製作|何書鑫