Recurrent Neural Network
(Professor 李宏毅 #21-1)
![](../assets/Schematic_of_Recurrent_Neural_Network.png)
圖0 Schematic of Recurrent Neural Network (Professor 李宏毅 #21-1) Document
圖0表示整個文件的邏輯架構,從Feedforward NN出發,利用Feedforward NN說明在slot filling的應用。Feedforward NN的缺陷是不能記錄字詞前後順序訊息。
為了考慮字詞順序的訊息,RNN加入了cell state。若是再加入未來資訊,RNN 便變成bi-directional RNN。
RNN的cell state每回合被新的資訊覆蓋,這會產生gradient vanishing(梯度消失)的問題。
Long Short-term memory(LSTM)加入了Forget Gate以解決gradient vanishing問題。此文件最後示範如何用LSTM取代RNN,並講解了很多常見的Recurrent Neural Network。
Ticket Booking System as a Slot Fitting example
考慮基於語音辨識的售票系統(ticket booking system)的例子,它的輸入為一段語音,輸出為抵達日期(time of arrival)跟目的地(Destination)。
![](../assets/RNN1_F01%28小06%29.png)
圖一 Schematic of ticket booking system as an NLP slot filling application
如圖一所示,輸入一段文字 "I would like to arrive Taipei on November 2nd.",它能自動擷取目的地是Taipei,抵達日期是November 2nd。這樣的技術稱作Slot Filling。
Feedforward Neural Network For Ticket Booking System
![](../assets/Feedforward_Neural_Network_for_ticket_booking_system.png)
圖二 Feedforward Neural Network for ticket booking system.
如圖二所示:以 "I would like to arrive Taipei on November 2nd." 為例,分別把每個單字轉成 word vector (x1,x2,...)後,依順將每個字輸入網路,輸出的 y1 代表該單字是Destination的機率, y2是抵達時間的機率。
其中,input (word vector, x) 的維度和 output (prob. of slots, y) 的維度間沒有關係,即 x 的維度和 y 的維度不需要一樣。
用Feedforward網路的缺點是他無法考慮字串的順序,以兩個句子為例:
"I would like to arrive Taipei on November 2nd.",
"I would like to leave Taipei on November 2nd."
在第二個句子裡面,Taipei並不是目的地,而是出發地。對於Feedforward網路而言,因為它是單個單字判斷,所以只要輸入相同,輸出的值就一定相同。解決的方式是讓神經網路擁有記憶力(至少前一個字),才有辦法解決。
RNN for Ticket Booking System
Recurrent Neural Network就是讓網路具備記憶的一種方式。以ticket booking system為例,如圖三所示:
![](../assets/RNN+LSTM_F03.png)
圖三 ticket booking system using RNN.
不同的時間把字詞依序輸入網路,輸出是該單字為目的地(destination) 跟 抵達日期(time of arrival)的機率。
RNN有隱藏層(hidden cell state),c¯,它帶有過去字詞的訊息,並在下個時間點同時輸入網路。
以圖三為例,輸入x¯(1)時,網路產生了output y¯(1) ,也產生了cell state c¯(1)。c¯(1)與下一個輸入字詞 x¯(2) 一同輸入網路,再產生output y¯(2) ,也產生了新的cell state c¯(2)。
隱藏層(hidden cell state ) c¯,使得RNN有記憶功能。
RNN can consider history information
![](../assets/RNN+LSTM_F04.png)
圖四 How RNN resolve Word Sequence Order
圖四與之前舉的例子(圖二)的輸入雖然都是"Taipei",但是由於圖四的RNN網路可以考慮Taipei字詞之前的輸入是"leave"還是"arrive",所以對於Probability of "Taipei"會不同。
Elman Network and Jordan Network
在RNN,常見的網路稱作Elman Network(圖五),另外還有另外一種Jordan Network。
兩者的差異是Jordan Network儲存的不是隱藏層的資料,而是輸出層。根據李宏毅教授的survey,Jordan network的performance比Elman Network好,原因是Jordan Network直接是從輸出結果來直接影響網路,而不是Elman Network是比較間接。
![](../assets/rnn_f5-3.png)
圖五 Elman Network vs Jordan Network
Bi-directional RNN
如圖六所示,除了考慮時間由前到後的資訊之外,還可以把兩個RNN並聯起來。
![](../assets/rnn_fig6_2.png)
圖六 Bi-directional RNN
一個是正常時間方向,一個是反著時間方向,用順跟逆時間的資訊來預測每個時間點的輸出。這樣考慮順跟逆時間資訊的網路叫做Bidirectional RNN,可以讓每個時間的預測是參照全文的內容。而原本的RNN,只看輸入與此時刻之前的輸入資訊。
LSTM
因為記憶結構限制,RNN能夠記憶只有前後幾個時間點的資訊,為了克服這個問題,又發展出長短期記憶元(long short-term memory)來捕捉比較長時間的訊號關係。LSTM在原本的Memory cell加入閘門 (gate) 的機制,讓外部訊號控制memory cell是否開啟。
![](../assets/RNN_F07.jpg)
圖七 Block View of LSTM。 LSTM神經元的主要路徑為 輸入訊號(下方)->input gate-> memory cell->output gate。
如圖七所示,LSTM總共有3個Gate:1. input gate 2. forget gate 3. output gate,每個gate被外部的訊號所控制。
輸入訊號(圖七下方) 若要像候傳遞,需先經過input gate,再經過memory cell,與output gate,此路徑也稱作LSTM 神經元主要路徑。
控制訊號決定input gate是否開啟,也就是決定有多少量的輸入訊號可以通過。
控制訊號決定Forget gate是否開啟,也就是決定存在記憶元的資料是否要保留。
記憶元的資料會跟新的輸入混合,再存入記憶單元。
控制訊號決定output gate是否開啟,也就是決定要輸出多少記憶單元資料。
LSTM神經元有四個輸入與一個輸出。跟一般神經元是一個輸入與一個輸出不同,
![](../assets/RNN1_F08%28小01%29.png)
圖八 Mathimatical View of LSTM
圖八解釋Gate閘門的數學模型,每個控制訊號zi,zf,zo經過一個activation function f(⋅), 即f(zi),f(zf),f(zo),再跟主訊號相乘。控制訊號的activation function通常是sigmoid function,值域在0~1之間,目的是模擬開關,開是0,關是1。
輸入訊號zI 通過input gate產生g(zI)f(zi)訊號,新的神經記憶c′為g(zI)f(zi)加上前一時刻記憶c乘上forget gate f(zf)。
c′=c×f(zf)+g(zI)f(zi)
輸出訊號y等於記憶c′通過一個activation function h(⋅) 乘以output gate f(zo)。
y=h(c′)×f(zo)
常見的g(⋅)跟h(⋅)會使用hyperbolic tangent tanh,主要模擬資料壓縮(−inf,inf)→(−1,1)。
Illustrative Example of LSTM
以下舉一個例子來檢視LSTM神經原運作。
圖9-0 Given weight and bias of LSTM neuron to examine LSTM behavior.
此例中,權重是假設給定的,i.e.,
wI,1=1,wI,2=100,wI,3=0,bI=0
wi,1=0,wi,2=100,wi,3=0,bi=−10,
wf,1=0,wf,2=100,wf,3=0,bf=10,
wo,1=0,wo,2=0,wo,3=100,bo=−10
假定LSTM權重與偏差如下:
0.
zI=wI,1x1+wI,2x2+wI,3x3+bI=x1;wI,1=1,wI,2=0,wI,3=0,bI=0
這權重的物理意義是此neuron的input值Z,來自x1。
- zi=wi,1x1+wi,2x2+wi,3x3+bi=100×x2−10;wi,1=0,wi,2=100,wi,3=0,bi=−10
這權重的物理意義是當x2 是正值時,網路傾向把Z值寫入記憶c。
2.zf=wf,1x1+wf,2x2+wf,3x3+bf=100×x2+10;wf,1=0,wf,2=100,wf,3=0,bf=10
這權重的物理意義是當x2是負值時,網路傾向把記憶c歸零。
3.zo=wo,1x1+wo,2x2+wo,3x3+bo=100×x3−10;wo,1=0,wo,2=0,wo,3=100,bo=−10
這權重的物理意義是當x3 是正值時,網路傾向把記憶c值輸出。
考慮輸入序列為
time |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
x1 |
1 |
3 |
2 |
4 |
2 |
1 |
3 |
6 |
1 |
x2 |
0 |
1 |
0 |
1 |
0 |
0 |
-1 |
1 |
0 |
x3 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
表一 example input sequence.
此架構下的cell state與output將為
time |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
c |
0 |
0 |
3 |
3 |
7 |
7 |
0 |
6 |
6 |
y |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
表二 example corresponding cell state and output sequences.
以下將闡述cell state, output(如表二)的推導演算。
![](../assets/Time=1_0428.png)
圖9-1 Time=1
為了簡化計算,假設g(⋅)跟h(⋅)都是linear function (y=x)。
如圖9-1所示,第一個時間點,輸入端會得到 g(z)=x1=3,f(zi)=f(100×x2−10)=f(90)≈1,
f(zf)=f(100×x2+10)=f(110)≈1
並算出memory cell c′=cf(zf)+f(zi)g(z)=3。
其中c 一開始是0。
f(zo)=f(100×x3−10)=f(−10)≈0, y=h(c′)×f(zo)≈0。
![](../assets/Time=2_0428.png)
圖十一 Time=2
第二個時間點, 輸入端會得到 g(z)=x1=4,f(zi)=f(100×x2−10)=f(90)≈1,
f(zf)=f(100×x2+10)=f(110)≈1
並算出memory cell c′=cf(zf)+f(zi)g(z)=3+1×4=7。 f(zo)=f(100×x3−10)=f(−10)≈0, y=h(c′)×f(zo)≈0。
![](../assets/Time=3_0428.png)
圖十二 Time=3
第三個時間點, 輸入端會得到 g(z)=x1=2,f(zi)=f(100×x2−10)=f(−10)≈0,
f(zf)=f(100×x2+10)=f(10)≈1
並算出memory cell c′=cf(zf)+f(zi)g(z)=7+1×0=7。 f(zo)=f(100×x3−10)=f(−10)≈0, y=h(c′)×f(zo)≈0。
![](../assets/Time=4_0428.png)
圖十三 Time=4
第四個時間點,輸入端會得到 g(z)=x1=1,f(zi)=f(100×x2−10)=f(−10)≈0,
f(zf)=f(100×x2+10)=f(10)≈1
並算出memory cell c′=cf(zf)+f(zi)g(z)=7+0×1=7。 f(zo)=f(100×x3−10)=f(90)≈1, y=h(c′)×f(zo)≈7。
![](../assets/Time=5_0428.png)
圖十四 Time=5
第五個時間點,輸入端會得到 g(z)=x1=3,f(zi)=f(100×x2−10)=f(−110)≈0,
f(zf)=f(100×x2+10)=f(−90)≈0
並算出memory cell c′=cf(zf)+f(zi)g(z)≈7×0+3×0=0。 f(zo)=f(100×x3−10)=f(−10)≈0, y=h(c′)×f(zo)≈0。
simple RNN vs LSTM
當我們想把simple RNN換成LSTM時,如圖十五跟十六所示,只是把藍色的RNN神經元換成LSTM神經元就完成了,要稍微注意的是,因為跟simple rnn比起來,LSTM多了三個gate input,所以要訓練的參數也變成原本的四倍。
![](../assets/RNN1_F15%28小01%29.png)
圖十五 simple rnn
![](../assets/lstm_neuron_0428.png)
圖十六 lstm neuron
Vector View of LSTM
在真實使用時,我們使用多個LSTM神經元並排在一起,形成一個記憶向量c¯t,在這種表示方式下,我們可以如圖十七~二十二那樣,重新描述LSTM的架構。圖十七表示,我們可以把輸入訊號向量x¯t乘上對應權重產生控制向量加主訊號(z¯f,z¯i,z¯o,z¯),zx的維度跟LSTM神經元數量相同。
![](../assets/Vector_LSTM_0428.jpg)
圖十七 Vector LSTM
我們可以把LSTM的模型外型重新排列,從原本圖十八的右半邊,變成左半邊。
![](../assets/Reformulated_LSTM_0428.png)
圖十八 Reformulated LSTM
所以原本圖三seq2seq的模型,就會變成如圖十九所示,每個時間點都會從原本c¯t−1跟x¯t產生新的c¯t跟輸出y¯t,再往後傳遞
![](../assets/Seq2Seq_LSTM_without_recurrent_0428.png)
圖十九 Seq2Seq LSTM without recurrent
真實的情況是,我們在產生(z¯f,z¯i,z¯o,z¯),除了當下的訊號x¯t,還有前一個時間的output recurrent訊號h¯t−1,如圖二十所示。
![](../assets/Seq2Seq_LSTM_with_recurrent_0428.png)
圖二十 Seq2Seq LSTM with recurrent
更複雜的情況是,除了x¯t跟recurrent h¯t−1,還有前一個時間記憶c¯t−1也參與(z¯f,z¯i,z¯o,z¯)的產生,這種做法叫做peephole。
![](../assets/peephole_LSTM_0428.png)
圖二十一 peephole LSTM
LSTM的層數也不限於一層,如圖二十二所示,可以把多個單層的LSTM接在一起變成一個多層LSTM。
![](../assets/Multi-Layer_LSTM_0428.png)
圖二十二 Multi-Layer LSTM
雖然LSTM數學上運算比較複雜,不過現在主流的深度學習框架(eg:keras, tensorflow)都已經支援lstm的api,只需要簡單一兩行就可以呼叫內建的LSTM,在開發上可以省不少時間。另外要注意的是,現在研究人員提到他們有使用RNN模型時,絕大部分就是指LSTM或是另外一個參數比較少的Gated Recurrent Unit(GRU),如果是最原始到RNN,則會用simple RNN來表示。
[0] ML Lecture 21-1: Recurrent Neural Network (Part I)
[1] LSTM vs RNN