1. 程式人生 > >深度學習:梯度消失和梯度爆炸

深度學習:梯度消失和梯度爆炸

梯度消失

主要是因為網路層數太多,太深,導致梯度無法傳播。本質應該是啟用函式的飽和性。

DNN結果出現nan值?

梯度爆炸,導致結果不收斂。都是梯度太大惹的禍,所以可以通過減小學習率(梯度變化直接變小)、減小batch size(累積梯度更小)、 features規格化(避免突然來一個大的輸入)。

RNN的梯度爆炸和消失問題

不幸的是,實踐中前面介紹的幾種RNNs並不能很好的處理較長的序列。一個主要的原因是,RNN在訓練中很容易發生梯度爆炸和梯度消失,這導致訓練時梯度不能在較長序列中一直傳遞下去,從而使RNN無法捕捉到長距離的影響。

為什麼RNN會產生梯度爆炸和消失問題呢?我們接下來將詳細分析一下原因。我們根據式3可得:


上式的定義為矩陣的模的上界。因為上式是一個指數函式,如果t-k很大的話(也就是向前看`很遠的時候),會導致對應的誤差項的值增長或縮小的非常快,這樣就會導致相應的梯度爆炸和梯度消失問題(取決於大於1還是小於1)。

通常來說,梯度爆炸更容易處理一些。因為梯度爆炸的時候,我們的程式會收到NaN錯誤。我們也可以設定一個梯度閾值,當梯度超過這個閾值的時候可以直接擷取。

梯度消失更難檢測,而且也更難處理一些。總的來說,我們有三種方法應對梯度消失問題:

  1. 合理的初始化權重值。初始化權重,使每個神經元儘可能不要取極大或極小值,以躲開梯度消失的區域。
  2. 使用relu代替sigmoid和tanh作為啟用函式。
  3. 使用其他結構的RNNs,比如長短時記憶網路(LTSM)和Gated Recurrent Unit(GRU),這是最流行的做法。我們將在以後的文章中介紹這兩種網路。