總結自吳恩達老師的網易深度學習工程師微專業
介紹GRU之前,首先我們先直觀的理解一下梯度消失(Gradient Vanishing)問題。
RNN在NLP中具有很大的應用價值,但是其存在一個很大的缺陷,那就是梯度消失的問題。例如下面的例句中:
The cat, which already ate …,was full;
The cats, which already ate …,were full.
在這兩個句子中,cat對應着was,cats對應着were,(中間存在很多很長省略的單詞),句子中存在長期依賴(long-term dependencies),前面的單詞對後面的單詞有很重要的影響。但是我們目前所見到的基本的RNN模型,是不擅長捕獲這種長期依賴關係的。
和基本的深度神經網絡結構類似,輸出y y y 得到的梯度很難通過反向傳播再傳播回去,也就是很難對前面幾層的權重產生影響,所以RNN也有同樣的問題,也就是很難讓網絡記住前面的單詞是單數或者複數,進而對後面的輸出產生影響。
對於梯度消失問題,在RNN的結構中是我們首要關心的問題,也更難解決; 雖然梯度爆炸 在RNN中也會出現,但對於梯度爆炸問題,因爲參數會指數級的梯度,會讓我們的網絡參數變得很大,得到很多的Nan或者數值溢出,所以梯度爆炸是很容易發現的,我們的解決方法就是用梯度修剪(gradient clipping) ,也就是觀察梯度向量,如果其大於某個閾值,則對其進行縮放,保證它不會太大。
1. GRU
一個包含一個更新門Γ u \Gamma_u Γ u 的GRU簡化版本如下圖示:
公式如下:
c ~ < t > = t a n h ( W c [ c < t − 1 > , x < t > ] + b c ) \tilde c^{<t>}=tanh(W_c[c^{<t-1>},x^{<t>}]+b_c) c ~ < t > = t a n h ( W c [ c < t − 1 > , x < t > ] + b c )
Γ u = σ ( W u [ c < t − 1 > , x < t > ] + b u ) \Gamma_u=\sigma(W_u[c^{<t-1>},x^{<t>}]+b_u) Γ u = σ ( W u [ c < t − 1 > , x < t > ] + b u )
c < t > = Γ u ∗ c ~ < t > + ( 1 − Γ u ) ∗ c < t − 1 > c^{<t>}=\Gamma_u*\tilde c^{<t>}+(1-\Gamma_u)*c^{<t-1>} c < t > = Γ u ∗ c ~ < t > + ( 1 − Γ u ) ∗ c < t − 1 >
完整的GRU單元存在着Γ u , Γ r \Gamma_u, \Gamma_r Γ u , Γ r 兩個門,決定着每個時間步的候選值,圖示如下:
公式如下:
Γ r = σ ( W r [ c < t − 1 > , x < t > ] + b r ) \Gamma_r=\sigma(W_r[c^{<t-1>},x^{<t>}]+b_r) Γ r = σ ( W r [ c < t − 1 > , x < t > ] + b r )
c ~ < t > = t a n h ( W c [ Γ r ∗ c < t − 1 > , x < t > ] + b c ) \tilde c^{<t>}=tanh(W_c[\Gamma_r*c^{<t-1>},x^{<t>}]+b_c) c ~ < t > = t a n h ( W c [ Γ r ∗ c < t − 1 > , x < t > ] + b c )
Γ u = σ ( W u [ c < t − 1 > , x < t > ] + b u ) \Gamma_u=\sigma(W_u[c^{<t-1>},x^{<t>}]+b_u) Γ u = σ ( W u [ c < t − 1 > , x < t > ] + b u )
c < t > = Γ u ∗ c ~ < t > + ( 1 − Γ u ) ∗ c < t − 1 > c^{<t>}=\Gamma_u*\tilde c^{<t>}+(1-\Gamma_u)*c^{<t-1>} c < t > = Γ u ∗ c ~ < t > + ( 1 − Γ u ) ∗ c < t − 1 >
2. LSTM
GRU能夠讓我們在序列中學習到更深的聯繫,LSTM(long short-term memory)對捕捉序列中更深層次的聯繫要比GRU更加有效,當然也更復雜。
LSTM中,使用了單獨的更新門Γ u Γ_u Γ u 和遺忘門Γ f Γ_f Γ f ,以及一個輸出門Γ o Γ_o Γ o ,LSTM單元的可視化圖如下所示:
c ~ < t > = t a n h ( W c [ a < t − 1 > , x < t > ] + b c ) \tilde c^{<t>}=tanh(W_c[a^{<t-1>},x^{<t>}]+b_c) c ~ < t > = t a n h ( W c [ a < t − 1 > , x < t > ] + b c )
Γ u = σ ( W u [ a < t − 1 > , x < t > ] + b u ) \Gamma_u=\sigma(W_u[a^{<t-1>},x^{<t>}]+b_u) Γ u = σ ( W u [ a < t − 1 > , x < t > ] + b u )
Γ f = σ ( W f [ a < t − 1 > , x < t > ] + b f ) \Gamma_f=\sigma(W_f[a^{<t-1>},x^{<t>}]+b_f) Γ f = σ ( W f [ a < t − 1 > , x < t > ] + b f )
Γ o = σ ( W o [ a < t − 1 > , x < t > ] + b o ) \Gamma_o=\sigma(W_o[a^{<t-1>},x^{<t>}]+b_o) Γ o = σ ( W o [ a < t − 1 > , x < t > ] + b o )
c < t > = Γ u ∗ c ~ < t > + Γ f ∗ c < t − 1 > c^{<t>}=\Gamma_u*\tilde c^{<t>}+\Gamma_f*c^{<t-1>} c < t > = Γ u ∗ c ~ < t > + Γ f ∗ c < t − 1 >
a < t > = Γ o ∗ t a n h ( c < t > ) a^{<t>}=\Gamma_o*tanh(c^{<t>}) a < t > = Γ o ∗ t a n h ( c < t > )
在實際使用時,幾個門值不僅僅取決於 a < t − 1 > a^{<t-1>} a < t − 1 > 和 x < t − 1 > x^{<t-1>} x < t − 1 > ,還可能會取決於上一個記憶細胞的值c < t − 1 > c^{<t-1>} c < t − 1 > ,這也叫做peephole connection。