RNN学习笔记3-LSTM
引入LSTM
盡管RNN被設計成可以利用歷史的信息來輔助當前的決策,但是由于在上節提到的梯度消失或者梯度爆炸問題,RNN主要還是學習短期的依賴關系。所以RNN新的技術挑戰就是-長期依賴。
長短時記憶網絡(Long Short Term Memory Network, LSTM),是一種改進之后的循環神經網絡,可以解決RNN無法處理長距離的依賴的問題.
LSTM在一個整體的循環網絡結構中除了外部的RNN大循環,還要考慮自身單元“細胞”的自循環。
傳統RNN每個模塊內只是一個簡單的tanh層,LSTM每個循環的模塊內又有4層結構:3個sigmoid層,1個tanh層
其中圖標
粉色的圓圈表示一個二目運算。兩個箭頭匯合成一個箭頭表示2個向量首尾相連拼接在一起。一個箭頭分叉成2個箭頭表示一個數據被復制成2份,分發到不同的地方去。
LSTM內部結構
LSTM的關鍵是細胞狀態CCC,一條水平線貫穿于圖形的上方,這條線上只有些少量的線性操作,信息在上面流傳很容易保持。如下圖
CCC控制參數,決定什么樣的信息要保留,什么樣的信息需要遺忘。–需要一直維護更新
怎么樣進行決策呢,就需要用到門:Gate
門:Gate:是一個使用sigmoid激活函數對輸入信息進行控制的結構。使用門可以對通過這個結構的輸入信息進行控制,使用激活函數后,全連神經網絡輸出一個0-1之間的數值。當sigmoid激活函數輸出為1時,門完全打開,全部信息可以通過;sigmoid激活函數輸出為0時,門完全閉合,任何信息無法通過。
第一層:遺忘門
根據當前的輸入、上一時刻的輸出和門的偏置項共同決定哪一部分記憶需要被遺忘。
ft=σ(Wf?[ht?1,xt]+bf)f_t=\sigma(W_f\cdot[h_{t-1},x_t]+b_f)ft?=σ(Wf??[ht?1?,xt?]+bf?)
Ct?1?ftC_{t-1}\bigodot f_t \quad \quadCt?1??ft? 決定需要遺忘哪些信息
第二層:記憶門
為了使循環神經網絡更有效的保存長期記憶,除了遺忘門,輸入門也發揮至關重要的作用。不僅需要忘記部分之前的記憶,還需要補充新的記憶,就需要輸入門來控制。
一個tanh層用來產生更新值的候選項CtC_tCt?,tanh的輸出在[-1,1]上,說明細胞狀態在某些維度上需要加強,在某些維度上需要減弱;還有一個sigmoid層(輸入門層),它的輸出值要乘到tanh層的輸出上,起到一個縮放的作用,極端情況下sigmoid輸出0說明相應維度上的細胞狀態不需要更新。
it=σ(Wi?[ht?1,xt]+bi)i_t=\sigma(W_i\cdot[h_{t-1},x_t]+b_i)it?=σ(Wi??[ht?1?,xt?]+bi?)
Ct~=tanh(WC?[[ht?1,xt]+bC)\tilde{C_t}=tanh(W_C\cdot[[h_{t-1},x_t]+b_C)Ct?~?=tanh(WC??[[ht?1?,xt?]+bC?)
生成新的細胞狀態
讓舊的細胞狀態Ct?1與ftC_{t-1}與f_tCt?1?與ft?(f是forget忘記門的意思)相乘來丟棄一部分信息,然后再加個需要更新的部分it?Ct~i_t * \tilde{C_t}it??Ct?~?(i是input輸入門的意思),這就生成了新的細胞狀態CtC_tCt?。
Ct=ft?Ct?1+it?Ct~C_t=f_t*C_{t-1}+i_t*\tilde{C_t}Ct?=ft??Ct?1?+it??Ct?~?
輸出層
輸出值跟細胞狀態有關,把CtC_tCt?輸給一個tanh函數得到輸出值的候選項。候選項中的哪些部分最終會被輸出由一個sigmoid層來決定
ot=σ(Wo[ht?1,xt],+bo)o_t=\sigma(W_o[h_{t-1},x_t],+b_o)ot?=σ(Wo?[ht?1?,xt?],+bo?)
ht=ot?tanh(Ct)h_t=o_t*tanh(C_t)ht?=ot??tanh(Ct?)
總結
\qquad\;\;輸入門:it=σ(Wi?[ht?1,xt]+bi)i_t=\sigma(W_i\cdot[h_{t-1},x_t]+b_i)it?=σ(Wi??[ht?1?,xt?]+bi?)
\quad\quad\;\;遺忘門:ft=σ(Wf?[ht?1,xt]+bf)f_t=\sigma(W_f\cdot[h_{t-1},x_t]+b_f)ft?=σ(Wf??[ht?1?,xt?]+bf?)
\quad\quad\;\;輸出門:ot=σ(Wo[ht?1,xt],+bo)o_t=\sigma(W_o[h_{t-1},x_t],+b_o)ot?=σ(Wo?[ht?1?,xt?],+bo?)
\;\;\;新記憶參數:Ct~=tanh(WC?[[ht?1,xt]+bC)\tilde{C_t}=tanh(W_C\cdot[[h_{t-1},x_t]+b_C)Ct?~?=tanh(WC??[[ht?1?,xt?]+bC?)
最后記憶參數:Ct=ft?Ct?1+it?Ct~C_t=f_t*C_{t-1}+i_t*\tilde{C_t}Ct?=ft??Ct?1?+it??Ct?~?
最終輸出狀態:ht=ot?tanh(Ct)h_t=o_t*tanh(C_t)ht?=ot??tanh(Ct?)
梯度消失問題
RNN 通過hth_tht?來保存和傳遞信息,之前分析了如果時間間隔較大容易產生梯度消失的問題。
LSTM 則通過記憶單元CtC_tCt? 來傳遞信息,通過iti_tit?和ftf_tft? 的調控,CtC_tCt? 可以在 t 時刻捕捉到某個關鍵信息,并有能力將此關鍵信息保存一定的時間間隔。
如果沒有遺忘門,Ct=Ct?1+it?Ct~C_t=C_{t-1}+i_t\bigodot\tilde{C_t}Ct?=Ct?1?+it??Ct?~?,這樣的話?Ct?Ct?1\frac{\partial C_t}{\partial C_{t-1}}?Ct?1??Ct??恒為1,這樣CtC_tCt?會不斷增大,容易飽和,從而降低模型的性能。引入遺忘門后,?Ct?Ct?1=ft\frac{\partial C_t}{\partial C_{t-1}}=f_t?Ct?1??Ct??=ft?,當然如果多個ftf_tft?連乘同樣會導致梯度消失(ft∈[0,1]f_t\in[0,1]ft?∈[0,1])。但是LSTM的技巧就是將遺忘門的bias設置為正數,(例如 1 或者 5,如 tensorflow 中的默認值就是 1.0),這樣一來模型剛開始訓練時 forget gate 的值都接近 1,不會發生梯度消失 (反之若 forget gate 的初始值過小則意味著前一時刻的大部分信息都丟失了,這樣很難捕捉到長距離依賴關系)。 隨著訓練過程的進行,forget gate 就不再恒為 1 了。不過,一個訓好的模型里各個 gate 值往往不是在 [0, 1] 這個區間里,而是要么 0 要么 1,很少有類似 0.5 這樣的中間值,其實相當于一個二元的開關。
假如在某個序列里,forget gate 全是 1,那么梯度不會消失;某一個 forget gate 是 0,模型選擇遺忘上一時刻的信息。
參考:
https://www.cnblogs.com/zhangchaoyang/articles/6684906.html
https://zhuanlan.zhihu.com/p/60915302
總結
以上是生活随笔為你收集整理的RNN学习笔记3-LSTM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS开发实现资源包增量更新
- 下一篇: UE5学习笔记——前言