當我們在訓練模型時,並不是訓練越久越好,雖然對訓練模型可以有好的擬合度,但對於「非訓練集」的資料卻不是這麼回事,訓練過度就有可能造成「過擬合」(overfitting)。今天就想來談一談overfitting的生平,從誕生到消滅(? 的過程,讓我們帶著輕鬆的心情把它滅了吧 (它好可憐 QQ
怎麼來非常簡單地理解overfitting
? 可以想像一個人為了在數學考試取得高的成績,將 所有的習題的解題過程默寫並背下來 ,在期中期末考時確實地次次拿到了高分,但 卻在升學大考中大失利 ,因為 題目的變化性使得他無從默寫算式 ,明明相同的題型卻只會解某些數字搭配下的解答,這樣的情況就是overfitting
了。
還是不懂啦 !!
好吧,我只是回憶一下自己耍白癡的過去(誤~ ,可以看看下方表格,這是一個例子,假如初始狀態有很多離散點,而使用回歸可以簡單解這個問題,但如果我們用網路模型去訓練的話,可以擬合出更好的模型,此時就會牽扯到「到底要擬合到什麼程度 ?」
初始狀態 | Regression | best | overfitting |
---|---|---|---|
看起來
overfitting
很厲害耶 ! 所有點幾乎都有連到了 !! 真的可以訓練到這樣嗎 ?
是的,這是很常見的現象,就是過擬合,就跟背答案一樣 (無奈
如果使用迴歸模型,我們可以很輕易地預測新的未知點是否可以歸類為紅點,但如果是對過擬合模型,感覺將會有更高的錯誤率。
真的可以訓練到這樣的模型嗎?
如果你還是糾結於這個點的話,可以去看看上一篇「沒有實作所以只好講幹話系列(二) :: 模型中的激勵函數」中的tensorflow playground
,那種點分布在使用更深的網路後都可以over fitting
了,更何況是上面的圖形呢? 所以現在,對overfitting
有點了解後,我們來看看他實際所會造成的現象吧!
假如我們的訓練資料是上圖中的紅藍點,而訓練至過擬合後的結果也如上圖般扭曲,那麼可以想像,「對於這個訓練集」的loss肯定非常低,但此時如果我們放入新的未知紅藍點至圖形中,在擬合線附近的預測真的會準嗎?
如果測試的loss與訓練資料相差甚遠,即代表
overfitting
,我們訓練了一個「不能實用」的模型
所以要觀察overfitting
非常簡單,測它就對了 XD
說得容易,在訓練過程中我怎麼測它 ?
這很簡單,我們只要將我們的dataset撥一點出來當作我們每次訓練完作的「驗證資料」(validation data)就好啦! 加入之後,我們就可以看到當training loss
下降,validaion loss
也下降,代表還可以繼續擬合,反之...我training loss
下降了,但validaion loss
突然不聽話地長大了Orz,這代表過擬合了。
training\validation | increase | decrease |
---|---|---|
increase | 可能learning rate 太大 |
反指標訓練法? |
decrease | overfittig |
keep going |
所以其實要觀察出overfitting
挺容易的,反倒我們真正關心的是「如何避免overfitting?」
有時候,我們訓練簡單一點的應用時,因為對於模型來說「太好學了」,所以就給它overfitting了。或是另一種情況,當我們在訓練一個「非常深」的模型時,因為深的layers
不容易被梯度更新,所以造成前段的layers
容易overfitting
,此時我們會使用dropout
方式,讓層與層間變得容易傳遞,而一般的dataset可以使用大的batch size去訓練,此方式的另一個附加價值就是還能更「全局」地去訓練模型,讓我們一個一個談起吧!
Dropout
residual
殘差學習
Dropout
概念很像,但我不是單單地拔掉幾個「神經元」,而是乾脆地在層與層之間跳躍。這樣的做法通常用在深的類神經網路,其始祖是ResNet
,它最大的功效是有效更新更深的網路層,只是剛好可以一定程度上防止overfitting
而已Data augmentation
加大batch size
batch size
即代表看更「全局」的資料,代表更能夠做到全局擬合,這也是我們希望的事情。但有時候太大的batch size
會收斂過慢,硬體也會吃不消(記憶體、計算量等等),且有時候,小一點的資料集用大的batch size
也不一定是好事。Early Stopping
機制
tensorflow
幫你包好的call back function
,它會幫你注意validation data
的loss
會不會不減反增了,當遇到此情形就停止訓練。雖然很方便,但有時候可能只是浮動了一下而已,實際應用還是要視情況而定XDcheck point
方法
loss
曲線中選擇自己認為最適合的epoch
來當作最後的模型,我覺得這個也是最保險的方式 !!今天理解了什麼是overfitting
,也知道該怎麼去警覺或是注意它,因為我們不希望使用overfitting
的模型來到這個世上,它只是單單地消耗電腦效能,卻沒有實際作為。 在我之前的測試中也有出現overfitting
的情況,但因為我有設立checkpoint
,所以我可以透過這些「檢查點」來避免我的參數被洗掉XDD 那麼今天先到這邊,我今天有做了一點點點...點點點..再一個點的實作,從結果來看有點搞笑 哈哈哈,這將出現再明天的文章中,可以看一下放個鬆 (?
Coding Neural Network — Dropout