1. 程式人生 > >白話--長短期記憶(LSTM)的幾個步驟,附程式碼!

白話--長短期記憶(LSTM)的幾個步驟,附程式碼!

1. 什麼是LSTM

在你閱讀這篇文章時候,你都是基於自己已經擁有的對先前所見詞的理解來推斷當前詞的真實含義。我們不會將所有的東西都全部丟棄,然後用空白的大腦進行思考。我們的思想擁有永續性。LSTM就是具備了這一特性。

這篇將介紹另⼀種常⽤的⻔控迴圈神經⽹絡:⻓短期記憶(long short-term memory,LSTM)[1]。它⽐⻔控迴圈單元的結構稍微複雜⼀點,也是為了解決在RNN網路中梯度衰減的問題,是GRU的一種擴充套件。

可以先理解GRU的過程,在來理解LSTM會容易許多,連結地址:三步理解--門控迴圈單元(GRU)

LSTM 中引⼊了3個⻔,即輸⼊⻔(input gate)、遺忘⻔(forget gate)和輸出⻔(output gate),以及與隱藏狀態形狀相同的記憶細胞(某些⽂獻把記憶細胞當成⼀種特殊的隱藏狀態),從而記錄額外的資訊。

2. 輸⼊⻔、遺忘⻔和輸出⻔

與⻔控迴圈單元中的重置⻔和更新⻔⼀樣,⻓短期記憶的⻔的輸⼊均為當前時間步輸⼊Xt與上⼀時間步隱藏狀態Ht−1,輸出由啟用函式為sigmoid函式的全連線層計算得到。如此⼀來,這3個⻔元素的值域均為[0, 1]。如下圖所示:

具體來說,假設隱藏單元個數為 h,給定時間步 t 的小批量輸⼊ \(X_t\in_{}\mathbb{R}^{n*d}\)(樣本數為n,輸⼊個數為d)和上⼀時間步隱藏狀態 \(H_{t-1}\in_{}\mathbb{R}^{n*h}\) 。三個門的公式如下:

輸入門:\[I_t=\sigma(X_tW_{xi}+H_{t-1}W_{hi}+b_i)\]

遺忘問: \[F_t=\sigma(X_tW_{xf}+H_{t-1}W_{hf}+b_f)\]

輸出門: \[O_t=\sigma(X_tW_{xo}+H_{t-1}W_{ho}+b_o)\]

3. 候選記憶細胞

接下來,⻓短期記憶需要計算候選記憶細胞 \(\tilde{C}_t\)。它的計算與上⾯介紹的3個⻔類似,但使⽤了值域在[−1, 1]的tanh函式作為啟用函式,如下圖所示:

具體來說,時間步t的候選記憶細胞計算如下:

\[\tilde{C}_t=tanh(X_tWxc+H_{t-1}W_{hc}+b_c)\]

4. 記憶細胞

我們可以通過元素值域在[0, 1]的輸⼊⻔、遺忘⻔和輸出⻔來控制隱藏狀態中資訊的流動,這⼀般也是通過使⽤按元素乘法(符號為⊙)來實現的。當前時間步記憶細胞\(H_{t}\in_{}\mathbb{R}^{n*h}\)的計算組合了上⼀時間步記憶細胞和當前時間步候選記憶細胞的資訊,並通過遺忘⻔和輸⼊⻔來控制資訊的流動:

\[C_t=F_t⊙C_{t-1}+I_t⊙\tilde{C}_t\]

如下圖所⽰,遺忘⻔控制上⼀時間步的記憶細胞Ct−1中的資訊是否傳遞到當前時間步,而輸⼊⻔則控制當前時間步的輸⼊Xt通過候選記憶細胞C˜t如何流⼊當前時間步的記憶細胞。如果遺忘⻔⼀直近似1且輸⼊⻔⼀直近似0,過去的記憶細胞將⼀直通過時間儲存並傳遞⾄當前時間步。這個設計可以應對迴圈神經⽹絡中的梯度衰減問題,並更好地捕捉時間序列中時間步距離較⼤的依賴關係。

5. 隱藏狀態

有了記憶細胞以後,接下來我們還可以通過輸出⻔來控制從記憶細胞到隱藏狀態Ht的信
息的流動:

\[H_t=O_t⊙tanh(C_t)\]

這⾥的tanh函式確保隱藏狀態元素值在-1到1之間。需要注意的是,當輸出⻔近似1時,記憶細胞資訊將傳遞到隱藏狀態供輸出層使⽤;當輸出⻔近似0時,記憶細胞資訊只⾃⼰保留。下圖展⽰了⻓短期記憶中隱藏狀態的全部計算:

6. LSTM與GRU的區別

LSTM與GRU二者結構十分相似,不同在於:

  1. 新的記憶都是根據之前狀態及輸入進行計算,但是GRU中有一個重置門控制之前狀態的進入量,而在LSTM裡沒有類似門;
  2. 產生新的狀態方式不同,LSTM有兩個不同的門,分別是遺忘門(forget gate)和輸入門(input gate),而GRU只有一種更新門(update gate);
  3. LSTM對新產生的狀態可以通過輸出門(output gate)進行調節,而GRU對輸出無任何調節。
  4. GRU的優點是這是個更加簡單的模型,所以更容易建立一個更大的網路,而且它只有兩個門,在計算性上也執行得更快,然後它可以擴大模型的規模。
  5. LSTM更加強大和靈活,因為它有三個門而不是兩個。

7. LSTM可以使用別的啟用函式嗎?

關於啟用函式的選取,在LSTM中,遺忘門、輸入門和輸出門使用Sigmoid函式作為啟用函式;在生成候選記憶時,使用雙曲正切函式Tanh作為啟用函式。

值得注意的是,這兩個啟用函式都是飽和的,也就是說在輸入達到一定值的情況下,輸出就不會發生明顯變化了。如果是用非飽和的啟用函式,例如ReLU,那麼將難以實現門控的效果。

Sigmoid函式的輸出在0~1之間,符合門控的物理定義。且當輸入較大或較小時,其輸出會非常接近1或0,從而保證該門開或關。在生成候選記憶時,使用Tanh函式,是因為其輸出在−1~1之間,這與大多數場景下特徵分佈是0中心的吻合。此外,Tanh函式在輸入為0附近相比Sigmoid函式有更大的梯度,通常使模型收斂更快。

啟用函式的選擇也不是一成不變的,但要選擇合理的啟用函式。

8. 程式碼實現

MIST資料分類--TensorFlow實現LSTM

【機器學習通俗易懂系列文章】

9. 參考文獻

《動手學--深度學習》


作者:@mantchs

GitHub:https://github.com/NLP-LOVE/ML-NLP

歡迎大家加入討論!共同完善此專案!群號:【541954936】