1. 程式人生 > >LSTM解決梯度消失和爆炸情況

LSTM解決梯度消失和爆炸情況

1. LSTM避免RNN的梯度消失(gradient vanishing)

RNN的本質是在網路內部維護了一個狀態 StSt,其中 tt 表示時間且 StSt 可遞迴計算。

  • 傳統的RNN總是用“覆寫”的方式計算狀態:St=f(St−1,xt)St=f(St−1,xt), 其中f(·)f(·)表示仿射變換外面在套一個Sigmoid, StSt 表示輸入序列在時刻 tt的值。根據求導的鏈式法則,這種形式直接導致梯度被表示為連成積的形式,以致於造成梯度消失——粗略的說, 很多個小於1的項連乘就很快的逼近零。
  • 現代的RNN(包括但不限於使用LSTM單元的RNN)使用“累加”的形式計算狀態: 
    St=∑tτ=1ΔSτSt=∑τ=1tΔSτ,其中的 ΔΔ 顯示依賴序列輸入xtxt 稍加推導即可發現,這種累加形式導致導數也是累加形式,因此避免了梯度消失。

  • 如長短期記憶(LSTM)與門控已經提出復發單元(GRU)來解決梯度問題。然而,雙曲正切的使用Sigmoid函式作為啟用函式這些變體導致在層上的梯度衰減。因此,深LSTM或GRU的建設與訓練基於RNN的網路實際上是困難的。相比之下,IndRNN 使用非飽和啟用函式等CNNsRelu可以被堆疊到非常深的網路中。使用基本卷積層和100層以上的層

2. LSTM避免RNN的梯度爆炸

  • 設定閾值和使用正則化減少權重 
    爆炸梯度問題相對容易。

通過簡單地收縮其規範超過的梯度來處理閾值,一種被稱為梯度裁剪的技術。 
如果一個巨大的因素減少了梯度,就會受到影響。過於頻繁的裁剪是非常有效的。

3. GRU 與 LSTM 比較

GRU (Gated Recurrent Unit)

GRU與LSTM單元相似,GRU具有調節資訊流動的門單元,但是,沒有一個單獨的記憶單元(memory cells)。 
GRU在時刻 tt 的 激勵 hjthtj 是一個線性的修改:hjt=(1−zjt)hjt−1+zjth̃ jthtj=(1−ztj)ht−1j+ztjh~tj

更新門的計算為 : zjt=σ(Wzxt+Uzht−1)jztj=σ(Wzxt+Uzht−1)j

這個過程是把現在的狀態和新的狀態求和,和LSTM的單元類似。GRU沒有采取任何機制去控制那個狀態暴露出來,而是每次所有狀態都會暴露。

LSTM ( Long Short-Term Memory Unit)

一般的迴圈單元只是簡單的計算輸入訊號的權重和一個非線性函式。

而LSTM每一個在t時刻的LSTM單元 jj 有一個記憶 cjtctj ,LSTM的輸出或者激勵是: hjt=ojttanh(cjt)htj=otjtanh(ctj)

GRC把LSTM的 input gate 和 forget gate 整合成一個update gate,也是通過gate機制來控制梯度。 
除語言建模外,GRU(門控重複單元)在所有任務上都優於LSTM 
這裡寫圖片描述

  • MUT1與GRU在語言建模方面的表現相匹配,在所有其他任務上均優於GRU
  • 允許丟失時,LSTM在PTB上的效能明顯優於其他體系結構
  • 增加大忘記柵極偏置可大大提高LSTM效能
  • LSTM的遺忘門是最重要的,而輸出門相對不重要 一般初始化bais=0.5

4 Batch Normalization 到 Group Normalization

現在我們已經知道:

  1. 啟用函式對梯度也有很大的影響,大部分啟用函式只在某個區域內梯度比較好。
  2. 在後向傳播的時候,我們需要進行鏈式求導,如果網路層很深,啟用函式如果權重很小,會導致梯度消失;如果權重很大,又會導致梯度爆炸。

那麼解決梯度消失可以從這幾方面入手: 
1)換啟用函式;2)調整啟用函式的輸入;3)調整網路結構

事實上,我們有一個好東西可以解決梯度問題,叫做Normalization,就是從第二方面入手同時解決梯度消失和爆炸,而且也可以加快訓練速度。

Batch Normalization

假設對於一個batch內某個維度的特徵 x1,x2,...,xmx1,x2,...,xm, 
BN需要將其轉化成 y1,y2,...,ymy1,y2,...,ym, 
首先對節點的線性組合值進行歸一化,使其均值是0,方差是1。(也就是,對節點的輸入進行歸一化,而不是對輸出進行歸一化)(歸一化後使梯度穩定,快速收斂)

x′i=xi−μσ2+ε‾‾‾‾‾‾√xi′=xi−μσ2+ε

其中 μμ 是均值,σ2σ2 是標準差,εε 是用來控制分母為正。

但是資料本來不是這樣子的啊!我們強行對資料進行縮放,可能是有問題的,所以BN又加了一個scale的操作,使得資料有可能會恢復回原來的樣子:

yi=γx′i+βyi=γxi′+β

加了scale可以提升模型的容納能力。

既然是Batch歸一化,那麼BN就會受到batch size的影響:

  1. 如果size太小,算出的均值和方差就會不準確,影響歸一化,導致效能下降,
  2. 如果太大,記憶體可能不夠用。

Group Normalization

因此上個月提出的GN,就是為了避免batch size帶來的影響。乍一看標題以為做了啥大改革,BN要退出舞臺了,其實只是歸一化的方向不一樣,不再沿batch方向歸一化,他們的不同點就在於歸一化的方向不一樣: 
這裡寫圖片描述 
BN:批量歸一化,往batch方向做歸一化,歸一化維度是[N,H,W] 
LN:層次歸一化,往channel方向做歸一化,歸一化維度為[C,H,W] 
IN:例項歸一化,只在一個channel內做歸一化,歸一化維度為[H,W] 
GN:介於LN和IN之間,在channel方向分group來做歸一化,歸一化的維度為[C//G , H, W]