梯度消失、梯度爆炸
深度模型有關數值穩定性的典型問題是消失(vanishing)和爆炸(explosion)。
當神經網絡的層數較多時,模型的數值穩定性容易變差。
假設一個層數爲的多層感知機的第層的權重參數爲,輸出層的權重參數爲。爲了便於討論,不考慮偏差參數,且設所有隱藏層的激活函數爲恆等映射(identity mapping)。給定輸入,多層感知機的第層的輸出。此時,如果層數較大,的計算可能會出現衰減或爆炸。舉個例子,假設輸入和所有層的權重參數都是標量,如權重參數爲0.2和5,多層感知機的第30層輸出爲輸入分別與(消失)和(爆炸)的乘積。當層數較多時,梯度的計算也容易出現消失或爆炸。
梯度消失、爆炸會帶來哪些影響
舉個例子,對於一個含有三層隱藏層的簡單神經網絡來說,當梯度消失發生時,接近於輸出層的隱藏層由於其梯度相對正常,所以權值更新時也就相對正常,但是當越靠近輸入層時,由於梯度消失現象,會導致靠近輸入層的隱藏層權值更新緩慢或者更新停滯。這就導致在訓練時,只等價於後面幾層的淺層網絡的學習。
解決辦法
梯度消失和梯度爆炸本質上是一樣的,都是因爲網絡層數太深而引發的梯度反向傳播中的連乘效應。
解決梯度消失、爆炸主要有以下幾種方案:
換用Relu、LeakyRelu、Elu等激活函數
ReLu:讓激活函數的導數爲1
LeakyReLu:包含了ReLu的幾乎所有有點,同時解決了ReLu中0區間帶來的影響
ELU:和LeakyReLu一樣,都是爲了解決0區間問題,相對於來,elu計算更耗時一些(爲什麼)
具體可以看關於各種激活函數的解析與討論
BatchNormalization
BN本質上是解決傳播過程中的梯度問題
ResNet殘差結構
LSTM結構
LSTM不太容易發生梯度消失,主要原因在於LSTM內部複雜的“門(gates)”,具體看LSTM基本原理解析
預訓練加finetunning
此方法來自Hinton在06年發表的論文上,其基本思想是每次訓練一層隱藏層節點,將上一層隱藏層的輸出作爲輸入,而本層的輸出作爲下一層的輸入,這就是逐層預訓練。
訓練完成後,再對整個網絡進行“微調(fine-tunning)”。
此方法相當於是找全局最優,然後整合起來尋找全局最優,但是現在基本都是直接拿imagenet的預訓練模型直接進行finetunning。
梯度剪切、正則
這個方案主要是針對梯度爆炸提出的,其思想是設值一個剪切閾值,如果更新梯度時,梯度超過了這個閾值,那麼就將其強制限制在這個範圍之內。這樣可以防止梯度爆炸。
另一種防止梯度爆炸的手段是採用權重正則化,正則化主要是通過對網絡權重做正則來限制過擬合,但是根據正則項在損失函數中的形式:可以看出,如果發生梯度爆炸,那麼權值的範數就會變的非常大,反過來,通過限制正則化項的大小,也可以在一定程度上限制梯度爆炸的發生。