深度学习之循环神经网络(8)长短时记忆网络(LSTM)
深度學(xué)習(xí)之循環(huán)神經(jīng)網(wǎng)絡(luò)(8)長短時記憶網(wǎng)絡(luò)(LSTM)
- 0. LSTM原理
- 1. 遺忘門
- 2. 輸入門
- 3. 刷新Memory
- 4. 輸出門
- 5. 小結(jié)
?循環(huán)神經(jīng)網(wǎng)絡(luò)除了訓(xùn)練困難,還有一個更嚴(yán)重的問題,那就是 短時記憶(Short-term memory)。考慮一個長句子:
今天天氣太美好了,盡管路上發(fā)生了一件不愉快的事,…,我馬上調(diào)整好狀態(tài),開開心心地準(zhǔn)備迎接美好的一天。
根據(jù)我們的理解,之所以能夠“ 開開心心地準(zhǔn)備迎接美好的一天”,在于句子最開始處點明了“ 今天天氣太美好了”。可見人類是能夠很好地理解長句子的,但是循環(huán)神經(jīng)網(wǎng)絡(luò)卻不一定。研究人員發(fā)現(xiàn),循環(huán)神經(jīng)網(wǎng)絡(luò)在處理較長的句子時,往往只能夠理解有限長度內(nèi)的信息,而對于位于較長范圍內(nèi)的有用信息往往不能很好地利用起來。我們把這種現(xiàn)象叫做短時記憶。
?那么,能不能夠延長這種短時記憶,使得循環(huán)神經(jīng)網(wǎng)絡(luò)可以有效利用較大范圍內(nèi)的訓(xùn)練數(shù)據(jù),從而提升性能呢?1997年,瑞士人工智能科學(xué)家J u¨\ddot{\text{u}}u¨rgen Schmidhuber 提出了 長短時記憶網(wǎng)絡(luò)(Long Short-Term Memory,簡稱LSTM)。LSTM相對于基礎(chǔ)的RNN網(wǎng)絡(luò)來說,記憶能力更強,更擅長處理較長的序列信號數(shù)據(jù),LSTM提出后,被廣泛應(yīng)用在序列預(yù)測、自然語言處理等任務(wù)中,幾乎取代了基礎(chǔ)的RNN模型。
?接下來,我們將介紹更加流行、更加強大的LSTM網(wǎng)絡(luò)。
0. LSTM原理
?基礎(chǔ)的RNN網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示,上一個時間戳的狀態(tài)向量ht?1\boldsymbol h_{t-1}ht?1?與當(dāng)前時間戳的輸入xt\boldsymbol x_txt?經(jīng)過線性變換后,通過激活函數(shù)tanh\text{tanh}tanh后得到新的狀態(tài)向量ht\boldsymbol h_tht?。
相對于基礎(chǔ)的RNN網(wǎng)絡(luò)只有一個狀態(tài)向量ht\boldsymbol h_tht?,LSTM新增了一個狀態(tài)向量ct\boldsymbol c_tct?,同時引入了門控(Gate)機制,通過門控單元來控制信息的遺忘和刷新,如下圖所示:
?在LSTM中,有兩個狀態(tài)向量c\boldsymbol cc和h\boldsymbol hh,其中c\boldsymbol cc作為LSTM的內(nèi)部狀態(tài)向量,可以理解為LSTM的內(nèi)部狀態(tài)向量Memory,而h\boldsymbol hh表示LSTM的輸出向量。相對于基礎(chǔ)的RNN來說,LSTM把內(nèi)部Memory和輸出分開為兩個變量,同時利用三個門控:輸入門(Input Gate)、遺忘門(Forget Gate)和輸出門(Output Gate)來控制內(nèi)部信息的流動。
?門控機制可以理解為控制數(shù)據(jù)流通量的一種手段,類比于水閥門:當(dāng)水閥門全部打開時,水流暢通無阻地通過;當(dāng)水閥門全部關(guān)閉時,水流完全被隔斷。在LSTM中,閥門開合程度利用門控值向量g\boldsymbol gg表示,如下圖所示,通過σ(g)σ(\boldsymbol g)σ(g)激活函數(shù)將門控制壓縮到[0,1][0,1][0,1]之間的區(qū)間,當(dāng)σ(g)=0σ(\boldsymbol g)=0σ(g)=0時,門控全部關(guān)閉,輸出o=0\boldsymbol o=0o=0;當(dāng)σ(g)=1σ(\boldsymbol g)=1σ(g)=1時,門控全部打開,輸出o=x\boldsymbol o=\boldsymbol xo=x。通過門控機制可以較好地控制數(shù)據(jù)的流量程度。
?下面我們分別來介紹三個門控的原理及其作用。
1. 遺忘門
?遺忘門作用于LSTM狀態(tài)向量c\boldsymbol cc上面,用于控制上一個時間戳的記憶ct?1\boldsymbol c_{t-1}ct?1?對當(dāng)前時間戳的影響。遺忘門的控制變量gf\boldsymbol g_fgf?由
gf=σ(Wf[ht?1,xt]+bf)\boldsymbol g_f=σ(\boldsymbol W_f [\boldsymbol h_{t-1},\boldsymbol x_t ]+\boldsymbol b_f)gf?=σ(Wf?[ht?1?,xt?]+bf?)
產(chǎn)生,如下圖所示:
?其中Wf\boldsymbol W_fWf?和bf\boldsymbol b_fbf?為遺忘門的參數(shù)張量,可由反向傳播算法自動優(yōu)化,σσσ激活函數(shù),一般使用Sigmoid函數(shù)。當(dāng)門控gf=1\boldsymbol g_f=1gf?=1時,遺忘門全部打開,LSTM接受上一個狀態(tài)ct?1\boldsymbol c_{t-1}ct?1?,輸出為0的向量。這也是遺忘門的名字由來。
?經(jīng)過遺忘門后,LSTM的狀態(tài)向量變?yōu)?span id="ozvdkddzhkzd" class="katex--inline">gfct?1\boldsymbol g_f \boldsymbol c_{t-1}gf?ct?1?。
2. 輸入門
?輸入門用于控制LSTM對輸入的接收程度。首先通過對當(dāng)前時間戳的輸入xt\boldsymbol x_txt?和上一個時間戳的輸出ht?1\boldsymbol h_{t-1}ht?1?做非線性變換得到新的輸入向量c~t\tilde{\boldsymbol c}_tc~t?:
c~t=tanh?(Wc[ht?1,xt]+bc)\tilde{\boldsymbol c}_t=\text{tanh}?(\boldsymbol W_c [\boldsymbol h_{t-1},\boldsymbol x_t ]+\boldsymbol b_c)c~t?=tanh?(Wc?[ht?1?,xt?]+bc?)
其中Wc\boldsymbol W_cWc?和bc\boldsymbol b_cbc?為輸入門的參數(shù),需要通過反向傳播算法自動優(yōu)化,tanh\text{tanh}tanh為激活函數(shù),用于將輸入標(biāo)準(zhǔn)化到[?1,1][-1,1][?1,1]區(qū)間。c~t\tilde{\boldsymbol c}_tc~t?并不會全部刷新進入LSTM的Memory,而是通過輸入門控制接受輸入的量。輸入門的控制變量同樣來自于輸入xt\boldsymbol x_txt?和輸出ht?1\boldsymbol h_{t-1}ht?1?:
gi=σ(Wi[ht?1,xt]+bi)\boldsymbol g_i=σ(\boldsymbol W_i [\boldsymbol h_{t-1},\boldsymbol x_t ]+\boldsymbol b_i)gi?=σ(Wi?[ht?1?,xt?]+bi?)
其中Wi\boldsymbol W_iWi?和bi\boldsymbol b_ibi?為輸入門的參數(shù),需要通過反向傳播算法自動優(yōu)化,σσσ為激活函數(shù),一般使用Sigmoid函數(shù)。輸入門控制變量gi\boldsymbol g_igi?決定了LSTM對當(dāng)前時間戳的新輸入c~t\tilde{\boldsymbol c}_tc~t?的接受程度:當(dāng)gi\boldsymbol g_igi?=0時,LSTM不接受任何新的輸入c~t\tilde{\boldsymbol c}_tc~t?;當(dāng)gi=1\boldsymbol g_i=1gi?=1時,LSTM全部接受新輸入c~t\tilde{\boldsymbol c}_tc~t?,如下圖所示:
?經(jīng)過輸入門后,待寫入Memory的向量為gic~t\boldsymbol g_i \tilde{\boldsymbol c}_tgi?c~t?。
3. 刷新Memory
?在遺忘門和輸入門的控制下,LSTM有選擇地讀取了上一個時間戳的記憶ct?1\boldsymbol c_{t-1}ct?1?和當(dāng)前時間戳的新輸入c~t\tilde{\boldsymbol c}_tc~t?,狀態(tài)向量ct\boldsymbol c_tct?的刷新方式為:
ct=gic~t+gfct?1\boldsymbol c_t=\boldsymbol g_i \tilde{\boldsymbol c}_t+\boldsymbol g_f \boldsymbol c_{t-1}ct?=gi?c~t?+gf?ct?1?
得到的新狀態(tài)向量ct\boldsymbol c_tct?即為當(dāng)前時間戳的狀態(tài)向量。如下圖所示:
4. 輸出門
?LSTM的內(nèi)部狀態(tài)向量ct\boldsymbol c_tct?并不會直接用于輸出,這一點和基礎(chǔ)的RNN不一樣。基礎(chǔ)的RNN網(wǎng)絡(luò)的狀態(tài)向量h\boldsymbol hh既用于記憶,又用于輸出,所以基礎(chǔ)的RNN可以理解為狀態(tài)向量c\boldsymbol cc和輸出向量h\boldsymbol hh是同一個對象。在LSTM內(nèi)部,狀態(tài)向量并不會全部輸出,而是在輸出門的作用下有選擇地輸出。輸出門的門控變量go\boldsymbol g_ogo?為:
go=σ(Wo[ht?1,xt]+bo)\boldsymbol g_o=σ(\boldsymbol W_o [\boldsymbol h_{t-1},\boldsymbol x_t ]+\boldsymbol b_o)go?=σ(Wo?[ht?1?,xt?]+bo?)
其中Wo\boldsymbol W_oWo?和bo\boldsymbol b_obo?為輸出門的參數(shù),同樣需要通過反向傳播算法自動優(yōu)化,σσσ為激活函數(shù),一般使用Sigmoid函數(shù)。當(dāng)輸出門go=0\boldsymbol g_o=0go?=0時,輸出關(guān)閉,LSTM的內(nèi)部記憶完全被隔斷,無法用作輸出,此時輸出為0的向量;當(dāng)輸出門go=1\boldsymbol g_o=1go?=1時,輸出完全打開,LSTM的狀態(tài)向量ct\boldsymbol c_tct?全部用于輸出。LSTM的輸出由:
ht=go?tanh?(ct)\boldsymbol h_t=\boldsymbol g_o\cdot \text{tanh?}(\boldsymbol c_t)ht?=go??tanh?(ct?)
產(chǎn)生,即內(nèi)存向量ct\boldsymbol c_tct?經(jīng)過tanh\text{tanh}tanh激活函數(shù)后與輸入門作用,得到LSTM的輸出。由于go∈[0,1]\boldsymbol g_o\in[0,1]go?∈[0,1],tanh?(ct)∈[?1,1]\text{tanh}?(\boldsymbol c_t )\in[-1,1]tanh?(ct?)∈[?1,1],因此LSTM的輸出ht∈[?1,1]\boldsymbol h_t\in[-1,1]ht?∈[?1,1]。
5. 小結(jié)
?LSTM雖然狀態(tài)向量和門控數(shù)量較多,計算流程相對復(fù)雜。但是由于每個門控功能清晰明確,每個狀態(tài)的作用也比較好理解。這里將典型的門控行為列舉出來,并解釋其代碼的LSTM行為,如下表所示:
| 0 | 1 | 只使用記憶 |
| 1 | 1 | 綜合輸入和記憶 |
| 0 | 0 | 清零記憶 |
| 1 | 0 | 輸入覆蓋記憶 |
總結(jié)
以上是生活随笔為你收集整理的深度学习之循环神经网络(8)长短时记忆网络(LSTM)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10怎么改主题颜色 win10改主
- 下一篇: 深度学习之循环神经网络(9)LSTM层使