【DL碎片5】深度學習中的正則化(Regularization))

深度學習中的正則化(Regularization)

一、Bias(偏差) & Variance(方差)

在機器學習中,這兩個名詞經常讓我們傻傻分不清。
我們不妨用案例來看看怎麼區分。
假設我們正在做一個分類器,分別在訓練集和驗證集上測試,以下爲四種可能的情況:

四種情況

可見①、④兩種情況的訓練集誤差都很小,接近optimal error,這種就稱爲low bias。說明訓練的很到位了。
相反,②、③兩者的訓練集誤差很大,這就稱爲high bias。因此我們知道,bias就是衡量訓練集和我們的最小誤差的差距。

再來看看variance是怎麼判斷。①情況下,驗證集相比訓練集誤差上升了很多,這就是high variance。而②呢,雖然它的驗證集誤差更大,但是相比它的訓練集誤差,基本沒太大變化,因此它不能叫low variance。所以,說白了,variance是指你的驗證集和你訓練集的效果的差別,而不是某個絕對的值。

用這樣一個圖可以更加清晰地理解兩者的意思:

bias和variance的關係

最後不妨總結一下,我直接總結在一張圖裏:

這麼好的圖,還不隨手保存?

高bias往往意味着模型根本沒訓練到位,也就是欠擬合。而高variance往往意味着模型訓練過頭了,過擬合了。但注意,過擬合一般是對於訓練集誤差很小而驗證集/測試集誤差很大而言。如果兩者都高的話,只能說模型太爛了,不知道怎麼評價了。

二、如何解決bias和variance的問題

如果你的模型訓練結果是high bias,我們一般用以下幾種方法來改進:

  1. 嘗試使用更復雜更大的網絡結構(增加單元數、增加層數,或者更改結構)
  2. 訓練更長的時間(增加迭代次)數

因爲high bias意味着我們訓練的還不夠,連訓練集的內容都無法很好的識別。所以這種情況下不用去想增加數據量,因爲這個沒關係,是模型太差了。

當bias問題解決好了之後,如果還有high variance問題,那我們可以這樣改進:

  1. 收集更多的訓練樣本去訓練
  2. 使用 正則化手段

爲什麼這個時候可以嘗試收集更多的數據來解決呢?因爲,high variance意味着你的訓練集和驗證集的效果有很大差別,很可能是因爲你的訓練集裏面的數據並不能很好地反映驗證集裏面的特徵,或者說驗證集中有一些需要學習到的東西在你的訓練集中卻沒有,所以模型無論如何學習你的訓練集,也無法很好地預測驗證集的數據,因此我們應該收集更多的數據,學習更多的特徵。

如果你增加了數據量去訓練之後,variance還是很大,那說明我們遇到了典型的 over fitting,我們就需要考慮用 正則化手段了。

三、正則化(Regularization)

很多人一聽到“正則化”這個詞,就覺得高深莫測,比如我,一直以來都覺得這個詞很奇怪,然後老師們講課也都是說“正則化,就是給損失函數加一個正則化項,相當於給它一個懲罰...”云云,更加讓人覺得高神莫測。

現在終於明白了,大家可以這樣理解,我現場想了 一個例子:

假設我們的模型就是一隻 蚊子,我們要訓練它去模擬空中的一些點的整體路徑:
我們空中的點也分爲訓練集和測試集,蚊子去學習訓練集的路徑,然後閉上眼睛,按照自己學習到的那個路徑去預測測試集的點是否在路徑上。

蚊子飛行遊戲

 

首先,蚊子自以爲聰明靈活,自由自在地飛翔,它輕輕鬆鬆地經過了所有訓練集的點:

 

蚊子自由自在地飛翔,經過所有訓練點

很明顯,訓練集滿分!每個點都完美經過了!
接下來給它蒙上眼睛,看看它能否經過預測集的點:

 

很可惜,自以爲聰明的蚊子按照自己學習到的複雜的路徑上上下下,卻幾乎一個點都沒預測對。。。這就是over fitting!因爲每個數據都帶有隨機性,你不能學的太認真,正所謂“你認真,就輸了”。

但是蚊子也沒辦法,它也不知道怎麼“不認真”,於是我們來想辦法,強迫它別那麼較真。
我們想了個什麼辦法呢?請看:

我們設計了一個 掛墜給蚊子掛上,這樣蚊子飛起來就有些費勁了,沒辦法自由自在上躥下跳地飛行了,這也就是大家常常聽說的“懲罰項”,因爲身上有個掛墜,你蚊子上下飛就很費力,於是限制了蚊子的亂動

給蚊子掛一個掛墜

 

再次起飛:

 

帶重飛行

果真,蚊子的飛行沒有那麼“皮”了,它怎麼省力怎麼飛,每次看到新的點,它只是忘那個方向偏一點,不能偏太多,因爲下一個點可能方向又變了,那得累死它,所以它在掛墜的限制下,會努力找一箇中間的位置,讓它不費力,又能儘可能擬合訓練點。

接着,捂上眼睛進入預測區:

 

負重飛行就是不一樣

這次的成績就好多了。蚊子很驚喜,感嘆這掛墜好神奇。

這個 掛掛墜,就是“正則化”

當然,舉例子是爲了容易理解,具體的原理可能會有差別。
具體的正則化,就是在前面所說的“給損失函數加一個正則化項(掛墜)”,掛墜怎麼設計,是很複雜的,不能太重也不能太輕,而且說不定還要隨時變動,這裏的細節就不深究了,我們直接看看常見的正則化方法:

假設我們的損失函數 J(w,b)=avg(L(y,y'))
這裏由於不方便打公式,所以我用avg來表示求所有訓練樣本損失的平均值,
正則化項一般採用L2正則化,也就是給J加上一個 (λ/2m) * sum(w^2),也就是所有w的平方和,再乘以λ/2m,m是樣本量。
綜合起來就是:J(w,b)=avg(L(y,y')) + (λ/2m) * sum(w^2)

這樣一來,我們在用梯度下降的時候,求J對w的偏導,你會發現dw變大了,而我們的更新法則爲w-->w-α·dw,因此最終選擇的 參數w會變得更小參數更小,對於模型來說,就意味着更加簡單,於是我們的目的就達到了。

其他的正則化方法:

除了加一個懲罰項,其實正則化還有多種多樣的方法,但是總體的思想史一樣的,就是想辦法使得我們的模型不要那麼複雜。下面簡單介紹兩種方法:

(1)dropout 丟棄法

這個dropout是神經網絡中常用的正則化方法,就是在訓練過程中,隨機地“丟棄”一些神經元,強行簡化模型!
具體的操作方法通常是:在一層神經網絡之後,隨機按照一定概率“敲掉”一部分神經元,然後再將激活值傳給下一層,下一層如果有必要,再敲掉一些,再傳給下一層... ...

 

dropout

爲什麼這種方法可以起到正則化作用呢?

我們訓練模型實際上就是學習參數,參數就是每個神經元的權重。
現在 每個神經元都有可能被丟掉,因此模型訓練的時候,模型不敢給任何神經元過大的參數,因此這樣風險太大,萬一給某個神經元的權重很大,結果下一回這個神經元就被敲掉了,那這個模型肯定會表現很差。因此,在dropout機制下,每個神經元最後的參數都會比較小

這裏注意,我們在訓練的時候,採用dropout敲掉神經元,但是並不是真的把它敲沒了,而是暫時“失活”,等訓練完畢,在預測的時候,我們又會使用它們。dropout只是讓我們在訓練的時候讓參數變小。

當然了,這裏就有了一個 超參數(hyperparameter)需要我們去設置了,一般如果該層神經網絡的神經元很多,我們可以設置drop掉0.5甚至更多比例的神經元,對於神經元不多的,一般設置爲0.25左右。

(2)early-stopping

這個很簡單,說白了就是不要訓練那麼久了,見好就收。這裏就不多贅述了。



作者:Stack_empty
鏈接:https://www.jianshu.com/p/db86e9330fff
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章