LSTM & Bi-LSTM & GRU

星星點燈er發表於2020-12-18

1、LSTM簡介

基於RNN,與之不同的是一個是門控單元有所不同。

長短期記憶網將資訊存放在遞迴網路正常資訊流之外的門控單元中,這些單元可以儲存、寫入或讀取息就像計算機記憶體中的資料一樣。但願通過門的開關判定儲存哪些資訊,何時允許讀取、寫入或清除資訊。這些門是模擬的,包含輸出範圍全部在0~1之間的Sigmoid函式的逐元素相乘操作。這些門依據接收到的訊號開關,而且會用自身的權重集對資訊進行篩選,根據強度和輸入內容決定是否允許資訊通過。這些權重會通過遞迴網路的學習過程進行調整。
LSTM主要是為了解決長序列訓練過程中的梯度消失和梯度爆炸問題。簡單來說,就是相比普通的RNN,LSTM能夠在更長的序列中有更好的表現。
在這裡插入圖片描述
如上圖所示,RNN只有一個門:輸入門(輸入和輸出相當於一個門),而LSTM擁有三個門,分別為:遺忘門、輸入門、輸出門
在這裡插入圖片描述

1.2、遺忘門

對上一個節點傳進來的輸入進行選擇性忘記。簡單來說就是會 “忘記不重要的,記住重要的”。
在這裡插入圖片描述
f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t=\sigma(W_f\cdot[h_{t-1},x_t]+b_f) ft=σWf[ht1,xt]+bf

1.3、輸入門

將這個階段的輸入有選擇性地進行“記憶”。一個新的候選值,判斷是否將其加入到元胞狀態中。
在這裡插入圖片描述

i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t=\sigma(W_i\cdot[h_{t-1},x_t]+b_i) it=σWi[ht1,xt]+bi
C t ~ = t a n h ( W C ⋅ [ h t − 1 , x t ] + b C ) \tilde{C_t}=tanh(W_C\cdot[h_{t-1},x_t]+b_C) Ct~=tanhWC[ht1,xt]+bC
在這裡插入圖片描述
C t = f t ∗ C t − 1 + i t ∗ C t ~ C_t=f_t*C_{t-1}+i_t*\tilde{C_t} Ct=ftCt1+itCt~

1.4、輸出門

決定哪些將會被當成當前狀態的輸出。選擇重要的資訊作為元胞狀態的輸出。
在這裡插入圖片描述
o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) o_t=\sigma(W_o\cdot[h_{t-1},x_t]+b_o) ot=σ(Wo[ht1,xt]+bo)
h t = o t ∗ t a n h ( C t ) h_t=o_t*tanh(C_t) ht=ottanh(Ct)

1.5、LSTM步驟如下:

在這裡插入圖片描述

  1. 決定從元胞狀態中扔掉哪些資訊。由叫做“遺忘門”的Sigmoid層控制。遺忘門會輸出0~1之間的數,1表示保留該資訊,0表示丟棄該資訊。 f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t=\sigma(W_f\cdot[h_{t-1},x_t]+b_f) ft=σWf[ht1,xt]+bf
  2. 通過輸入門將有用的新資訊加入到元胞狀態。首先,將前一狀態和當前狀態的輸入輸入到Sigmoid函式中濾除不重要資訊。另外,通過tanh函式得到一個-1〜1之間的輸出結果。這將產生一個新的候選值,後續將判斷是否將其加入到元胞狀態中。
    i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t=\sigma(W_i\cdot[h_{t-1},x_t]+b_i) it=σWi[ht1,xt]+bi
    C t ~ = t a n h ( W C ⋅ [ h t − 1 , x t ] + b C ) \tilde{C_t}=tanh(W_C\cdot[h_{t-1},x_t]+b_C) Ct~=tanhWC[ht1,xt]+bC
  3. 將上一步中Sigmoid函式和tanh函式的輸出結果相乘,並加上第一步中的輸出結果,從而實現保留的資訊都是重要資訊,此時更新狀態即可忘掉那些不重要的資訊。 C t = f t ∗ C t − 1 + i t ∗ C t ~ C_t=f_t*C_{t-1}+i_t*\tilde{C_t} Ct=ftCt1+itCt~
  4. 最後,從當前狀態中選擇重要的資訊作為元胞狀態的輸出。首先,將前一隱狀態和當前輸入值通過Sigmoid函式得到一個0〜1之間的結果值。然後對第三步中輸出結果計算tanh函式的輸出值,並與得到的結果值相乘,作為當前元胞隱狀態的輸出結果,同時也作為下一個隱狀態的輸入值。
    o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) o_t=\sigma(W_o\cdot[h_{t-1},x_t]+b_o) ot=σ(Wo[ht1,xt]+bo)
    h t = o t ∗ t a n h ( C t ) h_t=o_t*tanh(C_t) ht=ottanh(Ct)

1.6 LSTM訓練過程

在這裡插入圖片描述
在這裡插入圖片描述

1.7 多隱藏層的LSTM

在這裡插入圖片描述
左邊是2個隱藏層,右邊是3個隱藏層。

2、Bi-LSTM(Bi-directional Long Short-Term Memory)

LSTM只關注了"上文",有時候我們需要感知"上下文",特別是在自然語言處理中。
前向的LSTM與後向的LSTM結合成BiLSTM。
例如:前向的依次輸入“我”,“愛”,“中國”得到三個向量{ h L 0 , h L 1 , h L 2 h_{L0},h_{L1},h_{L2} hL0,hL1,hL2}。後向的依次輸入“中國”,“愛”,“我”得到三個向量{ h R 0 , h R 1 , h R 2 h_{R0},h_{R1},h_{R2} hR0,hR1,hR2}。最後將前向和後向的隱向量進行拼接得到{ [ h L 0 , h R 0 ] , [ h L 1 , h R 1 ] , [ h L 2 , h R 2 ] [h_{L0},h_{R0}],[h_{L1},h_{R1}],[h_{L2},h_{R2}] [hL0,hR0],[hL1,hR1],[hL2,hR2]},即:{ h 0 , h 1 , h 2 h_0,h_1,h_{2} h0,h1,h2}。
在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

3、GRU(Gate Recurrent Unit)

GRU是迴圈神經網路的一種,也是為了解決長期記憶和反向傳播中的梯度等問題而提出來的。為什麼用GRU?相比LSTM,使用GRU能夠達到相當的效果,並且相比之下更容易進行訓練,能夠很大程度上提高訓練效率,因此很多時候會更傾向於使用GRU。
門限迴圈單元本質上就是一個沒有輸出門的長短期記憶網路,因此它在每個時間步都會將記憶單元中的所有內容寫入整體網路。
在這裡插入圖片描述
GRU只有兩個門:重置門和更新門,將遺忘門和輸入門合併為更新門,將細胞狀態 與 隱藏層輸出 合併在一起。
將元胞狀態和隱狀態合併,更新門用於控制前一時刻的狀態資訊被帶入到當前狀態中的程度,更新門的值越大說明前一時刻的狀態資訊帶入越多。重置門用於控制忽略前一時刻的狀態資訊的程度,重置門的值越小說明忽略的越多。這個模型比長短期記憶網路更加簡化,也變得越來越流行。
在這裡插入圖片描述

來源:趙衛東《機器學習》

相關文章