1. 程式人生 > >如何確定梯度爆炸和解決梯度爆炸

如何確定梯度爆炸和解決梯度爆炸

github部落格傳送門
csdn部落格傳送門

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

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

  1. 模型無法從訓練資料中獲得更新(如低損失)。
  2. 模型不穩定,導致更新過程中的損失出現顯著變化。
  3. 訓練過程中,模型損失變成 NaN。

如果你發現這些問題,那麼你需要仔細檢視是否出現梯度爆炸問題。
以下是一些稍微明顯一點的訊號,有助於確認是否出現梯度爆炸問題。

  1. 訓練過程中模型梯度快速變大。
  2. 訓練過程中模型權重變成 NaN 值。
  3. 訓練過程中,每個節點和層的誤差梯度值持續超過 1.0。

解決辦法:

重新設計網路模型
  1. 在深度神經網路中,梯度爆炸可以通過重新設計層數更少的網路來解決。
  2. 使用更小的批尺寸對網路訓練也有好處。
  3. 在迴圈神經網路中,訓練過程中在更少的先前時間步上進行更新(沿時間的截斷反向傳播,truncated Backpropagation through time)可以緩解梯度爆炸問題。
使用 ReLU 啟用函式
  1. 在深度多層感知機神經網路中,梯度爆炸的發生可能是因為啟用函式,如之前很流行的 Sigmoid 和 Tanh 函式。
  2. 使用 ReLU 啟用函式可以減少梯度爆炸。
使用長短期記憶網路
  1. 在迴圈神經網路中,梯度爆炸的發生可能是因為某種網路的訓練本身就存在不穩定性,如隨時間的反向傳播本質上將迴圈網路轉換成深度多層感知機神經網路。
  2. 使用長短期記憶(LSTM)單元和相關的門型別神經元結構可以減少梯度爆炸問題。
使用梯度截斷(Gradient Clipping)
  • 在非常深且批尺寸較大的多層感知機網路和輸入序列較長的 LSTM 中,仍然有可能出現梯度爆炸。如果梯度爆炸仍然出現,你可以在訓練過程中檢查和限制梯度的大小。這就是梯度截斷。
  • 處理梯度爆炸有一個簡單有效的解決方案:如果梯度超過閾值,就截斷它們。
    具體來說,檢查誤差梯度的值是否超過閾值,如果超過,則截斷梯度,將梯度設定為閾值。

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

print_r('點個贊吧');
var_dump('點個贊吧');
NSLog(@"點個贊吧!")
System.out.println("點個贊吧!");
console.log("點個贊吧!");
print("點個贊吧!");
printf("點個贊吧!\n");
cout << "點個贊吧!" << endl;
Console.WriteLine("點個贊吧!");
fmt.Println("點個贊吧!")
Response.Write("點個贊吧");
alert(’點個贊吧’)