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