神經網絡優化方法(避免過擬合,提高模型泛化性)

一、背景簡介
  在深度學習和機器學習的各種模型訓練過程中,在訓練數據不夠多時,自己常常會遇到的問題就是過擬合(overfitting),過擬合的意思就是模型過度接近訓練的數據,使得模型的泛化能力降低,泛化能力降低表現爲模型在訓練集上測試的誤差很低,但是真正在驗證集上測試時卻發現error很大,如下圖所示。所以此時得到的過擬合的模型不是我們想要的模型,我們需要對模型進行優化,從而提高其泛化性能,使其在測試時模型表現更好。

這裏寫圖片描述

  如今常用的神經網絡優化方法(避免過擬合,提高模型泛化性)有以下幾種:early stopping、數據集擴增、正則化(Regularization)包括L1、L2(L2 regularization也叫權重衰減),dropout。下面將分別對這幾種優化方法進行介紹。
  在進行優化方法之前先介紹一下一個知識點,在深度學習的模型訓練中,我們用於訓練的原始數據集常常分爲3部分:訓練集(training data)、驗證集(validation data)和測試集(testing data)。這三個數據集分別有各自的功能,其中訓練集是用於模型的訓練的,驗證集的作用爲確定網絡結構或者控制模型複雜程度的參數,測試集是用於評估訓練模型的好壞和精確度。
  這三個數據集最不好理解的就是驗證集,現在我們單獨來理解這個數據集的作用。假設建立一個BP神經網絡,對於隱含層的節點數目,我們並沒有很好的方法去確定。此時,一般將節點數設定爲某一具體的值,通過訓練集訓練出相應的參數後,再由交叉驗證集去檢測該模型的誤差;然後再改變節點數,重複上述過程,直到交叉驗證誤差最小。此時的節點數可以認爲是最優節點數,即該節點數(這個參數)是通過交叉驗證集得到的。所以由上面可以發現交叉驗證集是用於確定網絡結構或者控制模型複雜程度的參數。

二、early stopping
  Early stopping方法的具體做法是,在每一個Epoch結束時(一個Epoch集爲對所有的訓練數據的一輪遍歷)計算驗證集(validation data)的精確率(accuracy),當accuracy不再提高時,就停止訓練,及早的停止訓練也可以在一定程度上避免訓練模型對於訓練數據的過擬合。
  我們可以很好理解這種做法,因爲當accurary不再提高,再繼續訓練也是無益的,這隻會提高訓練的時間。但是現在的問題就是如何評判驗證集的精確率不再提高了呢?這裏並不是認爲validation accuracy一降下來便認爲不再提高了,這是因爲一個epoch精確率降低了,隨後的epoch有可能它又升高上去了。所以在實際中我們不能僅根據一兩次的epoch來判定驗證集的精確率的變化。這裏我們一般採用的方法是多看幾個epoch(例如10、20、30等),這種方法也非常好理解,就是當我們經過一定的epoch之後發現驗證集精確率還是沒有達到最佳,我們就認爲精確率不再提高。此時停止迭代(Early Stopping)。這種策略我們也稱爲“No-improvement-in-n”,n即Epoch的次數,可以設定n爲10、20、30等,具體情況具體分析。

三、L2 正則化(權重衰減)
3.1 公式推導說明核心思想
  L2正則化所做的改變就是在原代價函數後面加上一個正則化項,如下所示:

這裏寫圖片描述

  其中C0爲原始的代價函數,後面的一項就是L2正則化項,它的值爲所有權重w的平方的和除以訓練集的樣本大小n。λ爲正則項係數,用於權衡正則項與C0項的比重。另外還有一個係數1/2,主要是爲了後面求導的結果方便,後面那一項求導會產生一個2,與1/2相乘剛好爲1。
  那麼L2正則項是如何避免overfitting的呢?我們可以通過推導來發現原因,對C進行求導得:

這裏寫圖片描述

  由上圖可以發現L2正則項對b的更新沒有任何影響,但對於w的更新有些影響,影響如下:

這裏寫圖片描述

  由上圖可以發現,當λ=0時即爲沒有L2正則化情況,但當加入L2正則化時,因爲η、λ、n都是正的,所以 1−ηλ/n肯定小於1,所以L2正則化的效果就是減小w,這也就是權重衰減(weight decay)的由來。但是這裏需要說明的是權重衰減並不是說權重w會減小,我們這裏的權重衰減講的是相比於沒加入L2正則化的情況權重w會減小,在加入L2正則化時,權重w的增加或減小極大程度取決於後面的導數項,所以w最終的值可能增大也可能減小。
  現在,我們通過公式推導解釋了L2正則化項會有讓w“變小”的效果,但是還沒解釋爲什麼w“變小”可以防止overfitting?
3.2 權重衰減如何防止overfitting?
  一個所謂“顯而易見”的解釋就是:更小的權值w,從某種意義上說,表示網絡的複雜度更低,對數據的擬合剛剛好(這個法則也叫做奧卡姆剃刀),還沒達到過擬合,而在實際應用中,也驗證了這一點,L2正則化的效果往往好於未經正則化的效果。當然,這個解釋沒有那麼有說服力,沒辦法直觀理解,現在我們通過數學知識來理解這個問題。
  過擬合的時候,擬合函數的係數往往非常大,爲什麼?如下圖所示,過擬合,就是擬合函數需要顧忌每一個點,最終形成的擬合函數波動很大。在某些很小的區間裏,函數值的變化很劇烈。這就意味着函數在某些小區間裏的導數值(絕對值)非常大,由於自變量值可大可小,所以只有係數足夠大,才能保證導數值很大。 而正則化是通過約束參數的範數使其不要太大,所以它可以在一定程度上減少過擬合情況。

這裏寫圖片描述

四、L1正則化
  在原始的代價函數後面加上一個L1正則化項,即所有權重w的絕對值的和,乘以λ/n。

這裏寫圖片描述

  同樣先計算導數:

這裏寫圖片描述

  上式中sgn(w)表示w的符號,當w>0時,sgn(w)=1,當w<0時,sgn(w)=-1,sgn(0)=0。那麼權重w的更新公式爲:

這裏寫圖片描述

  上式比原始的更新規則多出了η * λ * sgn(w)/n這一項。當w爲正時,更新後的w變小。當w爲負時,更新後的w變大——因此它的效果就是讓w往0靠,使網絡中的權重儘可能爲0,也就相當於減小了網絡複雜度,防止過擬合。

五、Dropout
  L1、L2正則化是通過修改代價函數來實現的,而Dropout則是通過修改神經網絡本身來實現的,它直接使一些神經節點失活,它在訓練神經網絡模型時常常採用的提高模型泛化性的方法。假設dropout的概率爲0.5,我們要訓練的神經網絡結構如下:

這裏寫圖片描述

  在訓練時,我們採用的dropout的方法就是使得上面的某些神經元節點失效,將這些節點視爲不存在,網絡如下:

這裏寫圖片描述

  保持輸入輸出層不變,按照BP算法更新上圖神經網絡中的權值(虛線連接的單元不更新,因爲它們被“臨時失活”了)。以上就是一次迭代的過程,在第二次迭代中,也用同樣的方法,只不過這次失活的那一半隱層單元,跟上一次失活的神經節點是不一樣的,因爲我們每一次迭代都是“隨機”地去失活一半。第三次、第四次……都是這樣,直至訓練結束。
  上面的過程就是Dropout,但是它爲什麼有助於防止過擬合呢?可以簡單地這樣解釋,運用了dropout的訓練過程,相當於訓練了很多個只有半數隱層單元的神經網絡(以dropout的概率爲0.5爲例),每一個這樣的半數網絡,都可以給出一個分類結果,這些結果有的是正確的,有的是錯誤的。隨着訓練的進行,大部分半數網絡都可以給出正確的分類結果,那麼少數的錯誤分類結果就不會對最終結果造成大的影響。

六、數據集的擴增
  數據集在模型訓練的時候顯得非常重要,沒有好的數據沒有更多的數據好的模型無從談起。在深度學習中,更多的訓練數據,意味着可以用更深的網絡,訓練出更好的模型。
  我們瞭解到數據對於模型的重要性,但是數據的獲取常常需要耗費更多的人力物力。之前在做圖像檢測的項目時就幹過這件事,特別麻煩,效率特別低。不過在做圖像相關的模型時,獲取數據還有一個很好的途徑,就是在原始數據上做改動,從而可得到更多的數據,做各種變換。如:將原始圖片旋轉一個小角度;在圖像上添加噪聲;做一些有彈性的畸變;截取原始圖像的一部分。通過這種方式可以在數據集不足的情況下對數據進行擴增,極大的增加數據集。

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