深度學習:梯度消失和梯度爆炸
阿新 • • 發佈:2018-12-29
梯度消失
主要是因為網路層數太多,太深,導致梯度無法傳播。本質應該是啟用函式的飽和性。
梯度爆炸,導致結果不收斂。都是梯度太大惹的禍,所以可以通過減小學習率(梯度變化直接變小)、減小batch size(累積梯度更小)、 features規格化(避免突然來一個大的輸入)。
RNN的梯度爆炸和消失問題
不幸的是,實踐中前面介紹的幾種RNNs並不能很好的處理較長的序列。一個主要的原因是,RNN在訓練中很容易發生梯度爆炸和梯度消失,這導致訓練時梯度不能在較長序列中一直傳遞下去,從而使RNN無法捕捉到長距離的影響。
為什麼RNN會產生梯度爆炸和消失問題呢?我們接下來將詳細分析一下原因。我們根據式3可得:
上式的定義為矩陣的模的上界。因為上式是一個指數函式,如果t-k很大的話(也就是向前看`很遠的時候),會導致對應的誤差項的值增長或縮小的非常快,這樣就會導致相應的梯度爆炸和梯度消失問題(取決於大於1還是小於1)。
通常來說,梯度爆炸更容易處理一些。因為梯度爆炸的時候,我們的程式會收到NaN錯誤。我們也可以設定一個梯度閾值,當梯度超過這個閾值的時候可以直接擷取。
梯度消失更難檢測,而且也更難處理一些。總的來說,我們有三種方法應對梯度消失問題:
- 合理的初始化權重值。初始化權重,使每個神經元儘可能不要取極大或極小值,以躲開梯度消失的區域。
- 使用relu代替sigmoid和tanh作為啟用函式。
- 使用其他結構的RNNs,比如長短時記憶網路(LTSM)和Gated Recurrent Unit(GRU),這是最流行的做法。我們將在以後的文章中介紹這兩種網路。