入門 | 一文了解神經網絡中的梯度爆炸

 2017-12-22 13:18:00.0

原標題:入門 | 一文了解神經網絡中的梯度爆炸

選自MACHINE LEARNING MASTERY

作者:Jason Brownlee

梯度爆炸指神經網絡訓練過程中大的誤差梯度不斷累積,導致模型權重出現重大更新。會造成模型不穩定,無法利用訓練數據學習。本文將介紹深度神經網絡中的梯度爆炸問題。

閱讀本文,你將瞭解:

  • 什麼是梯度爆炸,模型訓練過程中梯度爆炸會引起哪些問題;

  • 如何確定自己的網絡模型是否出現梯度爆炸;

  • 如何修復梯度爆炸問題。

什麼是梯度爆炸?

誤差梯度是神經網絡訓練過程中計算的方向和數量,用於以正確的方向和合適的量更新網絡權重。

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


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

梯度爆炸引發的問題

在深度多層感知機網絡中,梯度爆炸會引起網絡不穩定,最好的結果是無法從訓練數據中學習,而最壞的結果是出現無法再更新的 NaN 權重值。

……梯度爆炸導致學習過程不穩定。

——《深度學習》,2016.

在循環神經網絡中,梯度爆炸會導致網絡不穩定,無法利用訓練數據學習,最好的結果是網絡無法學習長的輸入序列數據。

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

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

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

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

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

如果你發現這些問題,那麼你需要仔細查看是否出現梯度爆炸問題。

以下是一些稍微明顯一點的信號,有助於確認是否出現梯度爆炸問題。

  • 訓練過程中模型梯度快速變大。

  • 訓練過程中模型權重變成 NaN 值。

  • 訓練過程中,每個節點和層的誤差梯度值持續超過 1.0。

如何修復梯度爆炸問題?

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

1. 重新設計網絡模型

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

使用更小的批尺寸對網絡訓練也有好處。

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

2. 使用 ReLU 激活函數

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

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

3. 使用長短期記憶網絡

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

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

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

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

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

處理梯度爆炸有一個簡單有效的解決方案:如果梯度超過閾值,就截斷它們。

——《Neural Network Methods in Natural Language Processing》,2017.

具體來說,檢查誤差梯度的值是否超過閾值,如果超過,則截斷梯度,將梯度設置爲閾值。

梯度截斷可以一定程度上緩解梯度爆炸問題(梯度截斷,即在執行梯度下降步驟之前將梯度設置爲閾值)。

——《深度學習》,2016.

在 Keras 深度學習庫中,你可以在訓練之前設置優化器上的 clipnorm 或 clipvalue 參數,來使用梯度截斷。

默認值爲 clipnorm=1.0 、clipvalue=0.5。詳見:https://keras.io/optimizers/。

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

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

對循環權重使用 L1 或 L2 懲罰項有助於緩解梯度爆炸。

——On the difficulty of training recurrent neural networks,2013.

在 Keras 深度學習庫中,你可以通過在層上設置 kernel_regularizer 參數和使用 L1 或 L2 正則化項進行權重正則化。

延伸閱讀

如想深入瞭解梯度爆炸,可以參閱以下資源。

書籍

  • Deep Learning, 2016.(http://amzn.to/2fwdoKR)

  • Neural Network Methods in Natural Language Processing, 2017.(http://amzn.to/2fwTPCn)

論文

  • On the difficulty of training recurrent neural networks, 2013.(http://proceedings.mlr.press/v28/pascanu13.pdf)

  • Learning long-term dependencies with gradient descent is difficult, 1994.(http://www.dsi.unifi.it/~paolo/ps/tnn-94-gradient.pdf)

  • Understanding the exploding gradient problem, 2012.(https://pdfs.semanticscholar.org/728d/814b92a9d2c6118159bb7d9a4b3dc5eeaaeb.pdf)

文章

  • Why is it a problem to have exploding gradients in a neural net (especially in an RNN)?(https://www.quora.com/Why-is-it-a-problem-to-have-exploding-gradients-in-a-neural-net-especially-in-an-RNN)

  • How does LSTM help prevent the vanishing (and exploding) gradient problem in a recurrent neural network?(https://www.quora.com/How-does-LSTM-help-prevent-the-vanishing-and-exploding-gradient-problem-in-a-recurrent-neural-network)

  • Rectifier (neural networks)(https://en.wikipedia.org/wiki/Rectifier_(neural_networks))

Keras API

  • Usage of optimizers in the Keras API(https://keras.io/optimizers/)

  • Usage of regularizers in the Keras API(https://keras.io/regularizers/)

原文鏈接:https://machinelearningmastery.com/exploding-gradients-in-neural-networks/

文章來源:機器之心