Recurrent Neural Network
(Professor 李宏毅 #21-1)
圖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)。
圖一 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
圖二 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為例,如圖三所示:
圖三 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
圖四 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是比較間接。
圖五 Elman Network vs Jordan Network
Bi-directional RNN
如圖六所示,除了考慮時間由前到後的資訊之外,還可以把兩個RNN並聯起來。
圖六 Bi-directional RNN
一個是正常時間方向,一個是反著時間方向,用順跟逆時間的資訊來預測每個時間點的輸出。這樣考慮順跟逆時間資訊的網路叫做Bidirectional RNN,可以讓每個時間的預測是參照全文的內容。而原本的RNN,只看輸入與此時刻之前的輸入資訊。
LSTM
因為記憶結構限制,RNN能夠記憶只有前後幾個時間點的資訊,為了克服這個問題,又發展出長短期記憶元(long short-term memory)來捕捉比較長時間的訊號關係。LSTM在原本的Memory cell加入閘門 (gate) 的機制,讓外部訊號控制memory cell是否開啟。
圖七 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神經元有四個輸入與一個輸出。跟一般神經元是一個輸入與一個輸出不同,
圖八 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(如表二)的推導演算。
圖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。
圖十一 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。
圖十二 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。
圖十三 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。
圖十四 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,所以要訓練的參數也變成原本的四倍。
圖十五 simple rnn
圖十六 lstm neuron
Vector View of LSTM
在真實使用時,我們使用多個LSTM神經元並排在一起,形成一個記憶向量c¯t,在這種表示方式下,我們可以如圖十七~二十二那樣,重新描述LSTM的架構。圖十七表示,我們可以把輸入訊號向量x¯t乘上對應權重產生控制向量加主訊號(z¯f,z¯i,z¯o,z¯),zx的維度跟LSTM神經元數量相同。
圖十七 Vector LSTM
我們可以把LSTM的模型外型重新排列,從原本圖十八的右半邊,變成左半邊。
圖十八 Reformulated LSTM
所以原本圖三seq2seq的模型,就會變成如圖十九所示,每個時間點都會從原本c¯t−1跟x¯t產生新的c¯t跟輸出y¯t,再往後傳遞
圖十九 Seq2Seq LSTM without recurrent
真實的情況是,我們在產生(z¯f,z¯i,z¯o,z¯),除了當下的訊號x¯t,還有前一個時間的output recurrent訊號h¯t−1,如圖二十所示。
圖二十 Seq2Seq LSTM with recurrent
更複雜的情況是,除了x¯t跟recurrent h¯t−1,還有前一個時間記憶c¯t−1也參與(z¯f,z¯i,z¯o,z¯)的產生,這種做法叫做peephole。
圖二十一 peephole LSTM
LSTM的層數也不限於一層,如圖二十二所示,可以把多個單層的LSTM接在一起變成一個多層LSTM。
圖二十二 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