記錄一下對RNN,LSTM,GRU基本原理(正向過程以及簡單的反向過程)的個人理解
RNN
Recurrent Neural Networks,循環神經網絡
(注意區別於recursive neural network,遞歸神經網絡)
爲了解決DNN存在着無法對時間序列上的變化進行建模的問題(如自然語言處理、語音識別、手寫體識別),出現的另一種神經網絡結構——循環神經網絡RNN。
RNN結構

- 第
t
層神經元的輸入,除了其自身的輸入
xt
,還包括上一層神經元的隱含層輸出
st−1
- 每一層的參數U,W,V都是共享的

- 每一層並不一定都得有輸入和輸出,如對句子進行情感分析是多到一,文本翻譯多到多,圖片描述一到多
數學描述
(以下開始符號統一)
回憶一下單隱含層的前饋神經網絡
輸入爲
X∈Rn×x
(n個維度爲x的向量)
隱含層輸出爲
H=ϕ(XWxh+bh)
輸出層輸入
H∈Rn×h
輸出爲
Y^=softmax(HWhy+by)
現在對
X
、
H
、
Y
都加上時序下標
同時引入一個新權重
Whh∈Rh×h
得到RNN表達式
Ht=ϕ(XtWxh+Ht−1Whh+bh)
Y^t=softmax(HtWhy+by)
H0
通常置零
深層RNN和雙向RNN

通過時間反向傳播和隨之帶來的問題
輸入爲
xt∈Rx
不考慮偏置
隱含層變量爲
ht=ϕ(Whxxt+Whhht−1)
輸出層變量爲
ot=Wyhht
則損失函數爲
L=1T∑t=1Tℓ(ot,yt)
以一個三層爲例
三個參數更新公式爲
Whx=Whx−η∂L∂Whx
Whh=Whh−η∂L∂Whh
Wyh=Wyh−η∂L∂Wyh
明顯的
∂L∂ot=∂ℓ(ot,yt)T⋅∂ot
根據鏈式法則
∂L∂Wyh=∑t=1Tprod(∂L∂ot,∂ot∂Wyh)=∑t=1T∂L∂oth⊤t
先計算目標函數有關最終時刻隱含層變量的梯度
∂L∂hT=prod(∂L∂oT,∂oT∂hT)=W⊤yh∂L∂oT
假設
ϕ(x)=x
(RNN中用激活函數relu還是tanh衆說紛紜,有點玄學)
∂L∂ht=prod(∂L∂ht+1,∂ht+1∂ht)+prod(∂L∂ot,∂ot∂ht)=W⊤hh∂L∂ht+1+W⊤yh∂L∂ot
通項爲
∂L∂ht=∑i=tT(W⊤hh)T−iW⊤yh∂L∂oT+t−i
注意上式,當每個時序訓練數據樣本的時序長度T較大或者時刻t較小,目標函數有關隱含層變量梯度較容易出現衰減和爆炸
∂L∂Whx=∑t=1Tprod(∂L∂ht,∂ht∂Whx)=∑t=1T∂L∂htx⊤t
∂L∂Whh=∑t=1Tprod(∂L∂ht,∂ht∂Whh)=∑t=1T∂L∂hth⊤t−1
梯度裁剪
爲了應對梯度爆炸,一個常用的做法是如果梯度特別大,那麼就投影到一個比較小的尺度上。
θ
爲設定的裁剪「閾值」,爲標量,若梯度的範數大於此閾值,將梯度縮小,若梯度的範數小於此閾值,梯度不變
g=min(θ∥g∥,1)g
LSTM
RNN的隱含層變量梯度可能會出現衰減或爆炸。雖然梯度裁剪可以應對梯度爆炸,但無法解決梯度衰減。因此,給定一個時間序列,例如文本序列,循環神經網絡在實際中其實較難捕捉兩個時刻距離較大的文本元素(字或詞)之間的依賴關係。
LSTM(long short-term memory)由Hochreiter和Schmidhuber在1997年被提出。
LSTM結構
這裏兩張圖先不用細看,先着重記住公式後再回來看

數學描述
(同上,符號統一)
設隱含狀態長度
h
,h
,
t
時刻輸入
Xt∈Rn×x
(
x
維)及
t−1
時刻隱含狀態
H