詳解梯度爆炸和梯度消失


那么為什么會出現梯度消失的現象呢?因為通常神經網絡所用的激活函數是sigmoid函數,這個函數有個特點,就是能將負無窮到正無窮的數映射到0和1之間,並且對這個函數求導的結果是f(x)=f(x)(1f(x))。因此兩個0到1之間的數相乘,得到的結果就會變得很小了。神經網絡的反向傳播是逐層對函數偏導相乘,因此當神經網絡層數非常深的時候,最后一層產生的偏差就因為乘了很多的小於1的數而越來越小,最終就會變為0,從而導致層數比較淺的權重沒有更新,這就是梯度消失

那么什么是梯度爆炸呢?梯度爆炸就是由於初始化權值過大,前面層會比后面層變化的更快,就會導致權值越來越大,梯度爆炸的現象就發生了。

在深層網絡或循環神經網絡中,誤差梯度可在更新中累積,變成非常大的梯度,然后導致網絡權重的大幅更新,並因此使網絡變得不穩定。在極端情況下,權重的值變得非常大,以至於溢出,導致 NaN 值。

網絡層之間的梯度(值大於 1.0)重復相乘導致的指數級增長會產生梯度爆炸。

 

如何確定是否出現梯度爆炸?

訓練過程中出現梯度爆炸會伴隨一些細微的信號,如:

  • 模型無法從訓練數據中獲得更新(如低損失)。

  • 模型不穩定,導致更新過程中的損失出現顯著變化。

  • 訓練過程中,模型損失變成 NaN。

 

如何修復梯度爆炸問題?

 

有很多方法可以解決梯度爆炸問題,本節列舉了一些最佳實驗方法。

 

1. 重新設計網絡模型

在深度神經網絡中,梯度爆炸可以通過重新設計層數更少的網絡來解決。

使用更小的批尺寸對網絡訓練也有好處。另外也許是學習率的原因,學習率過大導致的問題,減小學習率。

在循環神經網絡中,訓練過程中在更少的先前時間步上進行更新(沿時間的截斷反向傳播,truncated Backpropagation through time)可以緩解梯度爆炸問題。

 

2. 使用 ReLU 激活函數

在深度多層感知機神經網絡中,梯度爆炸的發生可能是因為激活函數,如之前很流行的 Sigmoid 和 Tanh 函數。

使用 ReLU 激活函數可以減少梯度爆炸。采用 ReLU 激活函數是最適合隱藏層的新實踐。

 

3. 使用長短期記憶網絡

 在循環神經網絡中,梯度爆炸的發生可能是因為某種網絡的訓練本身就存在不穩定性,如隨時間的反向傳播本質上將循環網絡轉換成深度多層感知機神經網絡。

使用長短期記憶(LSTM)單元和相關的門類型神經元結構可以減少梯度爆炸問題。

采用 LSTM 單元是適合循環神經網絡的序列預測的最新最好實踐。

 

4. 使用梯度截斷(Gradient Clipping)

 在非常深且批尺寸較大的多層感知機網絡和輸入序列較長的 LSTM 中,仍然有可能出現梯度爆炸。如果梯度爆炸仍然出現,你可以在訓練過程中檢查和限制梯度的大小。這就是梯度截斷。

 

5. 使用權重正則化(Weight Regularization)

如果梯度爆炸仍然存在,可以嘗試另一種方法,即檢查網絡權重的大小,並懲罰產生較大權重值的損失函數。該過程被稱為權重正則化,通常使用的是 L1 懲罰項(權重絕對值)或 L2 懲罰項(權重平方)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM