长短期记忆(LSTM)相关知识
文章目錄
- LSTM結(jié)構(gòu)
- 遺忘門(mén)
- 輸入門(mén)
- 決定給細(xì)胞狀態(tài)C添加哪些新的信息
- 更新舊的細(xì)胞信息
- 輸出門(mén)
- LSTM小結(jié)
- 如何實(shí)現(xiàn)長(zhǎng)期依賴?
- 如何避免梯度消失/爆炸?
- 雙向LSTM(Bi-LSTM)
- GRU
上一篇文章中,提到RNN難以學(xué)習(xí)到長(zhǎng)期依賴關(guān)系,后來(lái)有人提出了RNN的改進(jìn)版本LSTM很大程度上改善了長(zhǎng)期依賴問(wèn)題。
長(zhǎng)期依賴在序列數(shù)據(jù)中是很常見(jiàn)的,考慮到下面這句話“I grew up in France… I speak fluent French.”,現(xiàn)在需要語(yǔ)言模型通過(guò)現(xiàn)有以前的文字信息預(yù)測(cè)該句話的最后一個(gè)詞,模型結(jié)構(gòu)的可能如下圖所示:
需要通過(guò)以前文字語(yǔ)境來(lái)預(yù)測(cè)出最后一個(gè)詞是French,則需要依賴于開(kāi)頭部分語(yǔ)境中的單詞France。LSTM可以很容易的學(xué)習(xí)到這種長(zhǎng)期依賴,這得益于其內(nèi)部三個(gè)特殊的門(mén)結(jié)構(gòu)。
LSTM結(jié)構(gòu)
RNN結(jié)構(gòu)如下圖所示:
LSTM基于RNN,做出了些調(diào)整,修改后的結(jié)構(gòu)如圖所示:
很明顯可以看到兩個(gè)區(qū)別,一方面是細(xì)胞單元內(nèi)部的結(jié)構(gòu)變復(fù)雜了,另一方面相鄰細(xì)胞單元之間的依賴關(guān)系從一個(gè)變?yōu)榱藘蓚€(gè)。
具體來(lái)說(shuō),LSTM使用上圖中三個(gè)黃色σ方框(σ代表Sigmoid運(yùn)算)代表的遺忘門(mén)、輸入門(mén)和輸出門(mén)來(lái)控制細(xì)胞狀態(tài)。
遺忘門(mén)
遺忘門(mén)控制前一步記憶單元中的信息以多大程度被遺忘掉,主要決定決定細(xì)胞狀態(tài) C 需要丟棄哪些信息。遺忘門(mén)在細(xì)胞單元中的位置,如下圖黃色方框所示:
其中遺忘門(mén)的輸出結(jié)果fff的計(jì)算公式為:
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?)
式子中:WfW_fWf?是遺忘門(mén)的權(quán)重矩陣,[ht?1,xt][h_{t-1},\;x_t][ht?1?,xt?]表示把兩個(gè)向量連接成一個(gè)更長(zhǎng)的向量,bfb_fbf?是遺忘門(mén)的偏置項(xiàng),σ\sigmaσ 表示Sigmoid函數(shù),最終得到一個(gè)介于0與1之間的輸出值。
其中Wf?[ht?1,xt]+bfW_f\cdot[h_{t-1},\;x_t]+b_fWf??[ht?1?,xt?]+bf? 可以理解為:
[Wf][ht?1xt]=[WfhWfx][ht?1xt]=Wfhht?1+Wfxxt\begin{aligned} \begin{bmatrix}W_f\end{bmatrix}\begin{bmatrix}\mathbf{}h_{t-1}\\ \mathbf{}x_t\end{bmatrix}&= \begin{bmatrix}W_{fh}&W_{fx}\end{bmatrix}\begin{bmatrix}\mathbf{}h_{t-1}\\ \mathbf{}x_t\end{bmatrix}\\ &=W_{fh}\mathbf{}h_{t-1}+W_{fx}\mathbf{}x_t \end{aligned} [Wf??][ht?1?xt??]?=[Wfh??Wfx??][ht?1?xt??]=Wfh?ht?1?+Wfx?xt??
也就是遺忘門(mén)通過(guò)查看h(t?1)h_{(t-1)}h(t?1)?和xtx_txt?的信息計(jì)算得到一個(gè)介于0與1之間的向量,該向量中的數(shù)值決定從上一個(gè)單元輸入到此單元的狀態(tài)Ct?1C_{t-1}Ct?1? 中有多少信息需要保留或丟棄,0表示不保留,1表示都保留。至于這個(gè)細(xì)胞狀態(tài)Ct?1C_{t-1}Ct?1?代表什么,后面會(huì)有相關(guān)的解釋說(shuō)明。
輸入門(mén)
決定給細(xì)胞狀態(tài)C添加哪些新的信息
接下來(lái)是決定給細(xì)胞狀態(tài)C添加哪些新的信息。這一步又分為兩個(gè)步驟:
1,首先,利用ht?1h_{t-1}ht?1?和xtx_txt?通過(guò)輸入門(mén)的運(yùn)算來(lái)決定更新哪些信息,輸入門(mén)的位置如下圖中的黃色σ方框所示:
輸入門(mén)的運(yùn)算如下:
it=σ(Wi?[ht?1,xt]+bi)\mathbf{}i_t=\sigma(W_i\cdot[\mathbf{}h_{t-1},\mathbf{x}_t]+\mathbf{}b_i) it?=σ(Wi??[ht?1?,xt?]+bi?)
2,然后,利用ht?1h_{t-1}ht?1?和xtx_txt?通過(guò)一個(gè)tanh層得到新的候選細(xì)胞信息C~t\tilde{C}_tC~t?,這些信息可能會(huì)被更新到細(xì)胞信息中,涉及的運(yùn)算如下:
C~t=tanh?(Wc?[ht?1,xt]+bc)\tilde{C}_t=\tanh(W_c\cdot[\mathbf{}h_{t-1},\mathbf{}x_t]+\mathbf{}b_c) C~t?=tanh(Wc??[ht?1?,xt?]+bc?)
更新舊的細(xì)胞信息
通過(guò)上面的兩個(gè)步驟,得到了新的信息,接下來(lái)就是更新舊的細(xì)胞信息,變?yōu)樾碌募?xì)胞信息。更新的規(guī)則就是通過(guò)遺忘門(mén)的選擇來(lái)忘記舊細(xì)胞信息的一部分,通過(guò)輸入門(mén)的選擇來(lái)添加候選細(xì)胞信息C~t\tilde{C}_tC~t?的一部分得到新的細(xì)胞信息。如下圖所示:
相關(guān)的計(jì)算如下:
Ct=ft?Ct?1+it?C~t\mathbf{}C_t=f_t*{\mathbf{}C_{t-1}}+i_t*{\mathbf{}\tilde{C}_t} Ct?=ft??Ct?1?+it??C~t?
通過(guò)這樣的方式,我們就把LSTM關(guān)于當(dāng)前的記憶C~t\tilde{C}_tC~t?和長(zhǎng)期的記憶Ct?1C_{t-1}Ct?1?組合在一起,形成了新的單元狀態(tài)。由于遺忘門(mén)的控制,它可以保存很久很久之前的信息,由于輸入門(mén)的控制,它又可以避免當(dāng)前無(wú)關(guān)緊要的內(nèi)容加入記憶。
輸出門(mén)
更新完細(xì)胞狀態(tài)后需要根據(jù)輸入的ht?1h_{t-1}ht?1?和xtx_txt?來(lái)決定輸出細(xì)胞狀態(tài)C的哪些特征,這里需要將輸入經(jīng)過(guò)一個(gè)稱為輸出門(mén)的Sigmoid函數(shù),其位置如下圖黃色方框所示:
經(jīng)過(guò)Sigmoid表示的門(mén)之后,還需要經(jīng)過(guò)一個(gè)tanh函數(shù)來(lái)得到取值范圍在 -1~1 之間的向量,該向量與輸出門(mén)得到的輸出結(jié)果相乘就得到了最終該RNN單元的輸出hth_tht?。涉及的計(jì)算如下:
ot=σ(Wo?[ht?1,xt]+bo)ht=ot?tanh?(ct)\mathbf{}o_t=\sigma(W_o\cdot[\mathbf{}h_{t-1},\mathbf{}x_t]+\mathbf{}b_o) \\ \mathbf{}h_t=\mathbf{}o_t* \tanh(\mathbf{}c_t) ot?=σ(Wo??[ht?1?,xt?]+bo?)ht?=ot??tanh(ct?)
LSTM小結(jié)
如何實(shí)現(xiàn)長(zhǎng)期依賴?
當(dāng)輸入序列沒(méi)有重要信息時(shí),LSTM遺忘門(mén)的值接近為1,輸入門(mén)接近0,此時(shí)過(guò)去的記憶會(huì)被保存,從而實(shí)現(xiàn)了長(zhǎng)期記憶;
當(dāng)輸入的序列中出現(xiàn)了重要信息時(shí),LSTM會(huì)將其存入記憶中,此時(shí)輸入門(mén)的值會(huì)接近于1;
當(dāng)輸入序列出現(xiàn)重要信息,且該信息意味著之前的記憶不再重要的時(shí)候,輸入門(mén)接近1,遺忘門(mén)接近0,這樣舊的記憶被遺忘,新的重要信息被記憶。
經(jīng)過(guò)這樣的設(shè)計(jì),整個(gè)網(wǎng)絡(luò)更容易學(xué)習(xí)到序列之間的長(zhǎng)期依賴。
如何避免梯度消失/爆炸?
在LSTM中,狀態(tài) C 是通過(guò)累加的方式來(lái)計(jì)算的,不像RNN中的累乘的形式,這樣的話,它的的導(dǎo)數(shù)也不是乘積的形式,這樣就不會(huì)發(fā)生梯度消失的情況了。
雙向LSTM(Bi-LSTM)
上面介紹的是單向的LSTM,只能根據(jù)先前的序列推導(dǎo)未來(lái)的信息,但是有時(shí)候在給定時(shí)間 t 之后的未來(lái)的信息,可以幫助推斷時(shí)刻 t 的信息。例如在語(yǔ)言識(shí)別中,當(dāng)前識(shí)別到的字可能取決于未來(lái)的幾個(gè)字的發(fā)音。因此,在某些任務(wù)中,雙向的 LSTM 要比單向的 LSTM 的表現(xiàn)要好。
雙向LSTM(Bi-LSTM)的隱藏層要保存兩個(gè)值, A 參與正向計(jì)算, A’ 參與反向計(jì)算。最終的輸出值 y 取決于 A 和 A’,網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示:
以t=2t=2t=2為例,輸入x2x_2x2?,A2A_2A2?是正向計(jì)算的結(jié)果,A’2A’_2A’2?是反向計(jì)算的結(jié)果,輸出y2y_2y2?同時(shí)取決于A2,A’2A_2,A’_2A2?,A’2?。
GRU
GRU(Gated Recurrent Unit)作為L(zhǎng)STM的一種變體,與LSTM有兩個(gè)不同點(diǎn):
(1)GRU將LSTM中的兩個(gè)信息流簡(jiǎn)化成一個(gè)信息流,輸入只有一個(gè)ht\boldsymbol h_tht?。
(2)GRU將遺忘門(mén)和輸入門(mén)合成了一個(gè)單一的更新門(mén),還引入了一個(gè)重置門(mén)。
如下圖所示:
主要運(yùn)算過(guò)程如下:
rt=σ(Wr?[ht?1,xt])zt=σ(Wz?[ht?1,xt])h~t=tanh?(W?[rt?ht?1,xt])ht=(1?zt)?ht?1+zt?h~t\begin{aligned} &r_t = \sigma(W_r\cdot[h_{t-1},x_t]) \\ &z_t = \sigma(W_z\cdot[h_{t-1},x_t]) \\ &\tilde h_t = \tanh(W \cdot[r_t * h_{t-1},x_t]) \\ & h_t = (1-z_t)*h_{t-1} + z_t*\tilde h_t \end{aligned} ?rt?=σ(Wr??[ht?1?,xt?])zt?=σ(Wz??[ht?1?,xt?])h~t?=tanh(W?[rt??ht?1?,xt?])ht?=(1?zt?)?ht?1?+zt??h~t??
相當(dāng)于簡(jiǎn)化了LSTM,運(yùn)算速度提高了很多,并且應(yīng)用效果也沒(méi)有差很多。
參考文章:
LSTM原理詳解
理解LSTM(通俗易懂版)
NLP面試題目匯總1-5
總結(jié)
以上是生活随笔為你收集整理的长短期记忆(LSTM)相关知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 时隔 5 年回归,《机甲世界:重生》游戏
- 下一篇: 华为模拟器——eNSP安装教程(华为技术