淺談神經網路中的梯度爆炸問題
在神經網路中,梯度下降演算法是使用非常廣泛的優化演算法。梯度下降演算法的變體有好多,比如隨機梯度下降(Stochastic gradient descent,SGD)、小批量梯度下降(Mini Batch Gradient Descent)等,但對於梯度下降演算法而言,難免需要考慮梯度下降演算法中遇到的梯度彌散以及梯度爆炸等問題,本文主要講解神經網路中的梯度爆炸問題,從以下三個方面講解:
- 什麼是梯度爆炸,以及在訓練過程中梯度爆炸會引發哪些問題;
- 如何知道網路模型是否存在梯度爆炸;
- 如何在網路模型中解決梯度爆炸問題;
梯度爆炸是什麼?
誤差梯度在網路訓練時被用來得到網路參數更新的方向和幅度,進而在正確的方向上以合適的幅度更新網路參數。在深層網路或遞歸神經網路中,誤差梯度在更新中累積得到一個非常大的梯度,這樣的梯度會大幅度更新網路參數,進而導致網路不穩定。在極端情況下,權重的值變得特別大,以至於結果會溢出(NaN值,無窮與非數值)。當梯度爆炸發生時,網路層之間反覆乘以大於1.0的梯度值使得梯度值成倍增長。
梯度爆炸會引發哪些問題?
在深度多層感知機網路中,梯度爆炸會導致網路不穩定,最好的結果是無法從訓練數據中學習,最壞的結果是由於權重值為NaN而無法更新權重。
梯度爆炸會使得學習不穩定;
—— 深度學習第282頁
在循環神經網路(RNN)中,梯度爆炸會導致網路不穩定,使得網路無法從訓練數據中得到很好的學習,最好的結果是網路不能在長輸入數據序列上學習。
梯度爆炸問題指的是訓練過程中梯度大幅度增加,這是由於長期組件爆炸造成的;
——訓練循環神經網路中的困難
如何知道網路中是否有梯度爆炸問題?
在網路訓練過程中,如果發生梯度爆炸,那麼會有一些明顯的跡象表明這一點,例如:
- 模型無法在訓練數據上收斂(比如,損失函數值非常差);
- 模型不穩定,在更新的時候損失有較大的變化;
- 模型的損失函數值在訓練過程中變成NaN值;
如果你遇到上述問題,我們就可以深入分析網路是否存在梯度爆炸問題。還有一些不太為明顯的跡象可以用來確認網路中是否存在梯度爆炸問題:
- 模型在訓練過程中,權重變化非常大;
- 模型在訓練過程中,權重變成NaN值;
- 每層的每個節點在訓練時,其誤差梯度值一直是大於1.0;
如何解決梯度爆炸問題?
解決梯度爆炸問題的方法有很多,本部分將介紹一些有效的實踐方法:
1.重新設計網路模型
在深層神經網路中,梯度爆炸問題可以通過將網路模型的層數變少來解決。此外,在訓練網路時,使用較小批量也有一些好處。在循環神經網路中,訓練時使用較小時間步長更新(也被稱作截斷反向傳播)可能會降低梯度爆炸發生的概率。
2.使用修正線性激活函數
在深度多層感知機中,當激活函數選擇為一些之前常用的Sigmoid或Tanh時,網路模型會發生梯度爆炸問題。而使用修正線性激活函數(ReLU)能夠減少梯度爆炸發生的概率,對於隱藏層而言,使用修正線性激活函數(ReLU)是一個比較合適的激活函數,當然ReLU函數有許多變體,大家在實踐過程中可以逐一使用以找到最合適的激活函數。
3.使用長短周期記憶網路
由於循環神經網路中存在的固有不穩定性,梯度爆炸可能會發生。比如,通過時間反向傳播,其本質是將循環網路轉變為深度多層感知神經網路。通過使用長短期記憶單元(LSTM)或相關的門控神經結構能夠減少梯度爆炸發生的概率。
對於循環神經網路的時間序列預測而言,採用LSTM是新的最佳實踐。
4.使用梯度裁剪
在深度多層感知網路中,當有大批量數據以及LSTM是用於很長時間序列時,梯度爆炸仍然會發生。當梯度爆炸發生時,可以在網路訓練時檢查並限制梯度的大小,這被稱作梯度裁剪。
梯度裁剪是處理梯度爆炸問題的一個簡單但非常有效的解決方案,如果梯度值大於某個閾值,我們就進行梯度裁剪。
——自然語言處理中的神經網路方法的第5.2.4節
具體而言,檢查誤差梯度值就是與一個閾值進行比較,若誤差梯度值超過設定的閾值,則截斷或設置為閾值。
在某種程度上,梯度爆炸問題可以通過梯度裁剪來緩解(在執行梯度下降步驟之前對梯度進行閾值操作)
——深度學習第294頁
在Keras深度學習庫中,在訓練網路之前,可以對優化器的clipnorm和 clipvalue參數進行設置來使用梯度裁剪,一般而言,默認將clipnorm和 clipvalue分別設置為1和0.5.
- 在Keras API中使用優化器
5.使用權重正則化
如果梯度爆炸問題仍然發生,另外一個方法是對網路權重的大小進行校驗,並對大權重的損失函數增添一項懲罰項,這也被稱作權重正則化,常用的有L1(權重的絕對值和)正則化與L2(權重的絕對值平方和再開方)正則化。
使用L1或L2懲罰項會減少梯度爆炸的發生概率
——訓練循環神經網路中的困難
在Keras深度學習庫中,可以在每層上使用L1或L2正則器設置kernel_regularizer參數來完成權重的正則化操作。
- 在Keras API中使用正則器
進一步閱讀
如果你想進一步深入研究梯度爆炸問題,本節將提供更多的資源:
書籍
- 深度學習;
- 自然語音處理中的神經網路方法;
文獻
- 訓練循環網路中的困難;
- 學習具有梯度下降的長期依賴是困難的;
- 理解梯度爆炸問題;
文章
- 為什麼在神經網路中梯度爆炸是個問題(尤其是循環神經網路)?
- 在循環神經網路中,LSTM是如何防止梯度彌散和梯度爆炸問題?
- 線性整流函數;
Keras API
- 在Keras API中使用優化器;
- 在Keras API中使用正則化;
總結
通過本文,你將會學習到如何在訓練深層神經網路時發現梯度爆炸問題,尤其是以下幾點:
- 什麼是梯度爆炸,以及在訓練過程中梯度爆炸會引發哪些問題;
- 如何知道網路模型是否存在梯度爆炸;
- 如何在網路模型中解決梯度爆炸問題;
作者信息
Jason Brownlee,機器學習專家,專註於機器學習的推廣教育。
Linkedin: http://www.linkedin.com/in/jasonbrownlee/
本文由阿里云云棲社區組織翻譯。
文章原標題《A Gentle Introduction to Exploding Gradients in Neural Networks》,作者:Jason Brownlee,譯者:海棠,審閱:。
文章為簡譯,更為詳細的內容,請查看原文
更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎
推薦閱讀:
※基於Tensorflow的神經網路解決用戶流失概率問題
※求推薦人工智慧特別是神經網路方面的書?
※人工智慧聊天機器人,微軟小冰就夠了
※強化學習經典入門書的讀書筆記系列--第三篇(上)
※計算機視覺之我見,碧空的cv之旅開篇