白話--長短期記憶(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 的小批量輸⼊ XtRndX_t\in_{}\mathbb{R}^{n*d}(樣本數爲n,輸⼊個數爲d)和上⼀時間步隱藏狀態 Ht1RnhH_{t-1}\in_{}\mathbb{R}^{n*h} 。三個門的公式如下:

輸入門:It=σ(XtWxi+Ht1Whi+bi)I_t=\sigma(X_tW_{xi}+H_{t-1}W_{hi}+b_i)

遺忘問: Ft=σ(XtWxf+Ht1Whf+bf)F_t=\sigma(X_tW_{xf}+H_{t-1}W_{hf}+b_f)

輸出門: Ot=σ(XtWxo+Ht1Who+bo)O_t=\sigma(X_tW_{xo}+H_{t-1}W_{ho}+b_o)

3. 候選記憶細胞

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

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

C~t=tanh(XtWxc+Ht1Whc+bc)\tilde{C}_t=tanh(X_tWxc+H_{t-1}W_{hc}+b_c)

4. 記憶細胞

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

Ct=FtCt1+ItC~tC_t=F_t⊙C_{t-1}+I_t⊙\tilde{C}_t

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

5. 隱藏狀態

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

Ht=Ottanh(Ct)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

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

3.png

9. 參考文獻

《動手學–深度學習》


作者:@mantchs

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

歡迎大家加入討論!共同完善此項目!羣號:【541954936】NLP面試學習羣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章