1. 程式人生 > >神經網路優化演算法:Dropout、梯度消失/爆炸、Adam優化演算法,一篇就夠了!

神經網路優化演算法:Dropout、梯度消失/爆炸、Adam優化演算法,一篇就夠了!

1. 訓練誤差和泛化誤差

機器學習模型在訓練資料集和測試資料集上的表現。如果你改變過實驗中的模型結構或者超引數,你也許發現了:當模型在訓練資料集上更準確時,它在測試資料集上卻不⼀定更準確。這是為什麼呢?

因為存在著訓練誤差和泛化誤差:

  • 訓練誤差:模型在訓練資料集上表現出的誤差。
  • 泛化誤差:模型在任意⼀個測試資料樣本上表現出的誤差的期望,並常常通過測試資料集上的誤差來近似。

訓練誤差的期望小於或等於泛化誤差。也就是說,⼀般情況下,由訓練資料集學到的模型引數會使模型在訓練資料集上的表現優於或等於在測試資料集上的表現。由於⽆法從訓練誤差估計泛化誤差,⼀味地降低訓練誤差並不意味著泛化誤差⼀定會降低。

機器學習模型應關注降低泛化誤差。

2. 該如何選擇模型

在機器學習中,通常需要評估若⼲候選模型的表現並從中選擇模型。這⼀過程稱為模型選擇(model selection)。可供選擇的候選模型可以是有著不同超引數的同類模型。以多層感知機為例,我們可以選擇隱藏層的個數,以及每個隱藏層中隱藏單元個數和啟用函式。為了得到有效的模型,我們通常要在模型選擇上下⼀番功夫。

2.1 驗證資料集

從嚴格意義上講,測試集只能在所有超引數和模型引數選定後使⽤⼀次。不可以使⽤測試資料選擇模型,如調參。由於⽆法從訓練誤差估計泛化誤差,因此也不應只依賴訓練資料選擇模型。鑑於此,我們可以預留⼀部分在訓練資料集和測試資料集以外的資料來進⾏模型選擇。這部分資料被稱為驗證資料集,簡稱驗證集(validation set)。例如,我們可以從給定的訓練集中隨機選取⼀小部分作為驗證集,而將剩餘部分作為真正的訓練集。

可以通過預留這樣的驗證集來進行模型選擇,判斷驗證集在模型中的表現能力。

2.2 K 折交叉驗證

由於驗證資料集不參與模型訓練,當訓練資料不夠⽤時,預留⼤量的驗證資料顯得太奢侈。⼀種改善的⽅法是K折交叉驗證(K-fold cross-validation)。在K折交叉驗證中,我們把原始訓練資料集分割成K個不重合的⼦資料集,然後我們做K次模型訓練和驗證。每⼀次,我們使⽤⼀個⼦資料集驗證模型,並使⽤其他K − 1個⼦資料集來訓練模型。在這K次訓練和驗證中,每次⽤來驗證模型的⼦資料集都不同。最後,我們對這K次訓練誤差和驗證誤差分別求平均。

3. ⽋擬合和過擬合

  • 欠擬合:模型⽆法得到較低的訓練誤差。
  • 過擬合:是模型的訓練誤差遠小於它在測試資料集上的誤差。

給定訓練資料集,

  • 如果模型的複雜度過低,很容易出現⽋擬合;
  • 如果模型複雜度過⾼,很容易出現過擬合。

應對⽋擬合和過擬合的⼀個辦法是針對資料集選擇合適複雜度的模型。

訓練資料集⼤⼩

影響⽋擬合和過擬合的另⼀個重要因素是訓練資料集的⼤小。⼀般來說,如果訓練資料集中樣本數過少,特別是⽐模型引數數量(按元素計)更少時,過擬合更容易發⽣。此外,泛化誤差不會隨訓練資料集⾥樣本數量增加而增⼤。因此,在計算資源允許的範圍之內,我們通常希望訓練資料集⼤⼀些,特別是在模型複雜度較⾼時,例如層數較多的深度學習模型。

正則化

應對過擬合問題的常⽤⽅法:權重衰減(weight decay),權重衰減等價於L2範數正則化(regularization)。正則化通過為模型損失函式新增懲罰項使學出的模型引數值較小,是應對過擬合的常⽤⼿段。

4. 丟棄法(Dropout)

除了上面提到的權重衰減以外,深度學習模型常常使⽤丟棄法(dropout)來應對過擬合問題。丟棄法有⼀些不同的變體。本節中提到的丟棄法特指倒置丟棄法(inverted dropout)。

回憶⼀下,“多層感知機”描述了⼀個單隱藏層的多層感知機。其中輸⼊個數為4,隱藏單元個數為5,且隱藏單元hi(i = 1, . . . , 5)的計算表示式為:

\[h_i=\phi(x_1w_{1i}+x_2w_{2i}+x_3w_{3i}+x_4w_{4i}+b_i)\]

這⾥ϕ是啟用函式,x1, . . . , x4是輸⼊,隱藏單元i的權重引數為w1i, . . . , w4i,偏差引數為bi。當對該隱藏層使⽤丟棄法時,該層的隱藏單元將有⼀定概率被丟棄掉。設丟棄概率為p,那麼有p的概率hi會被清零,有1 − p的概率hi會除以1 − p做拉伸。丟棄概率是丟棄法的超引數。具體來說,設隨機變數ξi為0和1的概率分別為p和1 − p。使⽤丟棄法時我們計算新的隱藏單元 \(h_i^{′}\)。

\[h_i^{′}=\frac{\xi_i}{1-p}\]

由於E(ξi) = 1 − p,因此:

\[E(h_i^{′})=\frac{E(\xi_i)}{1-p}h_i=h_i\]

即丟棄法不改變其輸⼊的期望值。讓我們對隱藏層使⽤丟棄法,⼀種可能的結果如下圖所⽰,其中h2和h5被清零。這時輸出值的計算不再依賴h2和h5,在反向傳播時,與這兩個隱藏單元相關的權重的梯度均為0。由於在訓練中隱藏層神經元的丟棄是隨機的,即h1, . . . , h5都有可能被清零,輸出層的計算⽆法過度依賴h1, . . . , h5中的任⼀個,從而在訓練模型時起到正則化的作⽤,並可以⽤來應對過擬合。在測試模型時,我們為了拿到更加確定性的結果,⼀般不使⽤丟棄法。

5. 梯度消失/梯度爆炸(Vanishing / Exploding gradients)

訓練神經網路,尤其是深度神經所面臨的一個問題就是梯度消失或梯度爆炸,也就是你訓練神經網路的時候,導數或坡度有時會變得非常大,或者非常小,甚至於以指數方式變小,這加大了訓練的難度。

本質上,梯度消失和爆炸是一種情況。在深層網路中,由於網路過深,如果初始得到的梯度過小,或者傳播途中在某一層上過小,則在之後的層上得到的梯度會越來越小,即產生了梯度消失。梯度爆炸也是同樣的。一般地,不合理的初始化以及啟用函式,如sigmoid等,都會導致梯度過大或者過小,從而引起消失/爆炸。

解決方案

  1. 預訓練加微調

    其基本思想是每次訓練一層隱節點,訓練時將上一層隱節點的輸出作為輸入,而本層隱節點的輸出作為下一層隱節點的輸入,此過程就是逐層“預訓練”(pre-training);在預訓練完成後,再對整個網路進行“微調”(fine-tunning)。

    此方法有一定的好處,但是目前應用的不是很多了。

  2. 梯度剪下、正則

    梯度剪下這個方案主要是針對梯度爆炸提出的,其思想是設定一個梯度剪下閾值,然後更新梯度的時候,如果梯度超過這個閾值,那麼就將其強制限制在這個範圍之內。這可以防止梯度爆炸。

    另外一種解決梯度爆炸的手段是採用權重正則化(weithts regularization)比較常見的是L1和L2正則。

  3. ReLu、leakReLu等啟用函式

    ReLu:其函式的導數在正數部分是恆等於1,這樣在深層網路中,在啟用函式部分就不存在導致梯度過大或者過小的問題,緩解了梯度消失或者爆炸。同時也方便計算。當然,其也存在存在一些缺點,例如過濾到了負數部分,導致部分資訊的丟失,輸出的資料分佈不在以0為中心,改變了資料分佈。

    leakrelu:就是為了解決relu的0區間帶來的影響,其數學表達為:leakrelu=max(k*x,0)其中k是leak係數,一般選擇0.01或者0.02,或者通過學習而來。

  4. Batch Normalization

    Batch Normalization是深度學習發展以來提出的最重要的成果之一了,目前已經被廣泛的應用到了各大網路中,具有加速網路收斂速度,提升訓練穩定性的效果,Batch Normalization本質上是解決反向傳播過程中的梯度問題。Batch Normalization,簡稱BN,即批規範化,通過規範化操作將輸出訊號x規範化到均值為0,方差為1保證網路的穩定性。

    • 有一些從 0 到 1 而不是從 1 到 1000 的特徵值,通過歸一化所有的輸入特徵值