1. 程式人生 > >梯度爆炸和梯度消失——引入的誤差越來越多,同時有用資訊減少,同時想到的了relay BP

梯度爆炸和梯度消失——引入的誤差越來越多,同時有用資訊減少,同時想到的了relay BP

這個將是對於用基於梯度優化方法的死結。

爆炸梯度是一個問題,其中大的誤差梯度累積並導致在訓練期間對神經網路模型權重的非常大的更新。

這會導致您的模型不穩定,無法從您的訓練資料中學習。

在這篇文章中,您將發現使用深度人工神經網路爆炸梯度的問題。

完成這篇文章後,你會知道:

  • 爆炸的梯度是什麼以及它們在訓練過程中引起的問題。
  • 如何知道您的網路模型是否有爆炸漸變。
  • 如何解決網路中的爆炸梯度問題。

讓我們開始吧。

  • 更新Oct / 2018:刪除了ReLU作為解決方案的提及。

迴歸神經網路中爆炸梯度的溫和介紹

回顧神經網路中爆炸梯度的溫和介紹 照片由Taro Taylor提供,保留一些權利。

什麼是爆炸梯度?

誤差梯度是在訓練神經網路期間計算的方向和幅度,該神經網路用於以正確的方向和正確的量更新網路權重。

在深度網路或遞迴神經網路中,誤差梯度可能在更新期間累積並導致非常大的梯度。這反過來會導致網路權重的大量更新,進而導致網路不穩定。在極端情況下,權重值可能會變得很大,以至於溢位並導致NaN值。

通過重複地將梯度乘以具有大於1.0的值的網路層,爆炸通過指數增長髮生。

爆炸梯度有什麼問題?

在深層多層Perceptron網路中,爆炸梯度可能導致網路不穩定,最多無法從訓練資料中學習,最壞的情況是導致無法再更新的NaN權重值。

爆炸性的漸變會使學習變得不穩定。

- 第282頁,深度學習,2016年。

在遞迴神經網路中,爆炸性梯度可能導致不穩定的網路無法從訓練資料中學習,並且最多是無法通過長輸入資料序列學習的網路。

...爆炸梯度問題是指訓練期間梯度範數的大幅增加。這些事件是由於長期成分的爆炸造成的

你怎麼知道你是否有爆炸的梯度?

有一些微妙的跡象表明您在網路培訓期間可能會遇到爆炸性的梯度,例如:

  • 該模型無法獲得您的訓練資料(例如損失不大)。
  • 該模型不穩定,導致從更新到更新的損失發生很大變化。
  • 在訓練期間模型損失歸NaN所有。

如果你有這些型別的問題,你可以深入挖掘,看看你是否有爆炸漸變的問題。

有一些不太微妙的跡象可以用來確認你有爆炸的漸變。

  • 在訓練期間,模型權重很快變得非常大。
  • 模型權重在訓練期間達到NaN值。
  • 在訓練期間,每個節點和層的誤差梯度值始終高於1.0。

如何修復爆炸梯度?

解決爆炸梯度的方法有很多種; 本節列出了一些您可以使用的最佳實踐方法。

1.重新設計網路模型

在深度神經網路中,可以通過重新設計網路以減少層數來解決爆炸梯度問題。

在訓練網路時使用較小的批量大小也可能有一些好處。

在遞迴神經網路中,在訓練期間通過較少的先前時間步驟進行更新(稱為截斷反向傳播)可以減少爆炸梯度問題。

2.使用長短期記憶體網路

在遞迴神經網路中,考慮到這種型別網路的訓練中的固有不穩定性,例如通過基本上將時間反向傳播,基本上將復現網路轉換成深層多層感知器神經網路,可以發生梯度爆炸。

通過使用長短期記憶(LSTM)儲存器單元和可能相關的門控型神經元結構,可以減少爆炸梯度。

採用LSTM儲存器單元是用於序列預測的遞迴神經網路的新的最佳實踐。

3.使用漸變剪輯

在具有大批量大小和具有非常長輸入序列長度的LSTM的非常深的多層感知器網路中仍然可能發生爆炸梯度。

如果仍然出現爆炸漸變,您可以在網路訓練期間檢查並限制漸變的大小。

這稱為漸變剪裁。

處理爆炸梯度有一個簡單但非常有效的解決方案:如果它們的範數超過給定閾值,則剪下梯度。

- 第5.2.4節,消失和爆炸梯度,自然語言處理中的神經網路方法,2017年。

具體地,如果誤差梯度超過閾值,則針對閾值檢查誤差梯度的值並將其限幅或設定為該閾值。

在某種程度上,可以通過梯度限幅(在執行梯度下降步驟之前對梯度值進行閾值處理)來減輕爆炸梯度問題。

- 第294頁,深度學習,2016年。

在Keras深度學習庫中,您可以通過在訓練之前在優化器上設定clipnormclipvalue引數來使用漸變剪裁。

好的預設值是clipnorm = 1.0clipvalue = 0.5

4.使用重量正規化

如果仍然出現爆炸梯度,則另一種方法是檢查網路權重的大小,並對網路損失函式應用較大權重值的懲罰。

這稱為權重正則化,並且通常可以使用L1(絕對權重)或L2(平方權重)懲罰。

對復發權重使用L1或L2懲罰可以幫助爆炸漸變

在Keras深度學習庫中,您可以通過在圖層上設定kernel_regularizer引數並使用L1L2正則化器來使用權重正則化。

消失梯度問題是在使用基於梯度的方法(例如反向傳播)訓練某些人工神經網路時發現的困難。特別是,這個問題使得學習和調整網路中較早層的引數變得非常困難。隨著架構中層數的增加,這個問題變得更糟。

這不是神經網路的基本問題 - 這是由某些啟用函式引起的基於梯度的學習方法的問題讓我們試著直觀地理解問題及其背後的原因。

問題

基於梯度的方法通過了解引數值的微小變化將如何影響網路輸出來學習引數值。如果引數值的變化導致網路輸出的變化非常小 - 網路就無法有效地學習引數,這是一個問題。

這正是消失的梯度問題中發生的事情 - 網路輸出相對於早期層中引數的梯度變得非常小。這是一種奇特的說法,即使早期層的引數值發生很大變化也不會對輸出產生很大影響。讓我們試著瞭解這個問題發生的時間和原因。

原因

消失梯度問題取決於啟用函式的選擇。許多常見的啟用函式(例如,sigmoid或tanh)以非常非線性的方式將它們的輸入“壓縮”到非常小的輸出範圍內。例如,sigmoid將實數行對映到[0,1]的“小”範圍。結果,輸入空間的大區域被對映到極小範圍。在輸入空間的這些區域中,即使輸入的大的變化也會在輸出中產生小的變化 - 因此梯度很小。

當我們將多個這樣的非線性層堆疊在彼此之上時,這變得更加糟糕。例如,第一層將大輸入區域對映到較小的輸出區域,該較小的輸出區域將被第二層對映到更小的區域,第三層將被對映到更小的區域,依此類推。結果,即使第一層的引數的大的變化也不會大大改變輸出。

我們可以通過使用啟用函式來避免這個問題,啟用函式沒有將輸入空間“壓縮”到一個小區域的屬性。一種流行的選擇是整流線性單位,它將[math] x [/ math]對映到[math] max(0,x)[/ math]。

希望這有助於您瞭解漸變漸漸消失的問題。我還建議閱讀這個 iPython筆記本,它做了一個小實驗,以理解和視覺化這個問題,並突出了sigmoid和矯正線性單位的行為之間的差異。