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 2nd2^{nd}.",它能自動擷取目的地是Taipei,抵達日期是November 2nd2^{nd}。這樣的技術稱作Slot Filling。

Feedforward Neural Network For Ticket Booking System


圖二 Feedforward Neural Network for ticket booking system.

如圖二所示:以 "I would like to arrive Taipei on November 2nd2^{nd}." 為例,分別把每個單字轉成 word vector (x1,x2,...x_1,x_2,...)後,依順將每個字輸入網路,輸出的 y1y_1 代表該單字是Destination的機率, y2y_2是抵達時間的機率。

其中,input (word vector, x) 的維度和 output (prob. of slots, y) 的維度間沒有關係,即 x 的維度和 y 的維度不需要一樣。
用Feedforward網路的缺點是他無法考慮字串的順序,以兩個句子為例:

"I would like to arrive Taipei on November 2nd2^{nd}.",

"I would like to leave Taipei on November 2nd2^{nd}."

在第二個句子裡面,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¯\bar{c},它帶有過去字詞的訊息,並在下個時間點同時輸入網路。

以圖三為例,輸入x¯(1)\bar{x}^{(1)}時,網路產生了output y¯(1)\bar{y}^{(1)} ,也產生了cell state c¯(1)\bar{c}^{(1)}c¯(1)\bar{c}^{(1)}與下一個輸入字詞 x¯(2)\bar{x}^{(2)} 一同輸入網路,再產生output y¯(2)\bar{y}^{(2)} ,也產生了新的cell state c¯(2)\bar{c}^{(2)}

隱藏層(hidden cell state ) c¯\bar{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,zoz_i, z_f, z_o經過一個activation function f()f(\cdot), 即f(zi),f(zf),f(zo)f(z_i), f(z_f), f(z_o),再跟主訊號相乘。控制訊號的activation function通常是sigmoid function,值域在0~1之間,目的是模擬開關,開是0,關是1。

輸入訊號zIz_I 通過input gate產生g(zI)f(zi)g(z_I)f(z_i)訊號,新的神經記憶cc'g(zI)f(zi)g(z_I)f(z_i)加上前一時刻記憶cc乘上forget gate f(zf)f(z_f)

c=c×f(zf)+g(zI)f(zi)c'=c \times f(z_f) + g(z_I)f(z_i)

輸出訊號yy等於記憶cc'通過一個activation function h()h(\cdot) 乘以output gate f(zo)f(z_o)

y=h(c)×f(zo)y = h(c') \times f(z_o)

常見的g()g(\cdot)h()h(\cdot)會使用hyperbolic tangent tanhtanh,主要模擬資料壓縮(inf,inf)(1,1)(-inf,inf) \to (-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=0w_{I,1}=1, w_{I,2}=100, w_{I,3}=0, b_I=0

wi,1=0,wi,2=100,wi,3=0,bi=10w_{i,1}=0, w_{i,2}=100, w_{i,3}=0, b_i=-10,

wf,1=0,wf,2=100,wf,3=0,bf=10w_{f,1}=0, w_{f,2}=100, w_{f,3}=0, b_f=10,

wo,1=0,wo,2=0,wo,3=100,bo=10 w_{o,1}=0, w_{o,2}=0, w_{o,3}=100, b_o=-10

假定LSTM權重與偏差如下:

0.

zI=wI,1x1+wI,2x2+wI,3x3+bI=x1;wI,1=1,wI,2=0,wI,3=0,bI=0z_I=w_{I,1} x_1 + w_{I,2} x_2+ w_{I,3} x_3 + b_I = x_1; w_{I,1}=1, w_{I,2}=0, w_{I,3}=0, b_I=0

這權重的物理意義是此neuron的input值ZZ,來自x1x_1

  1. zi=wi,1x1+wi,2x2+wi,3x3+bi=100×x210;wi,1=0,wi,2=100,wi,3=0,bi=10z_i=w_{i,1} x_1 + w_{i,2} x_2+ w_{i,3} x_3 + b_i = 100 \times x_2 -10; w_{i,1}=0, w_{i,2}=100, w_{i,3}=0, b_i=-10
    這權重的物理意義是當x2x_2 是正值時,網路傾向把ZZ值寫入記憶cc

2.zf=wf,1x1+wf,2x2+wf,3x3+bf=100×x2+10;wf,1=0,wf,2=100,wf,3=0,bf=10z_f=w_{f,1} x_1 + w_{f,2} x_2+ w_{f,3} x_3 + b_f = 100 \times x_2 +10; w_{f,1}=0, w_{f,2}=100, w_{f,3}=0, b_f=10
這權重的物理意義是當x2x_2是負值時,網路傾向把記憶cc歸零。

3.zo=wo,1x1+wo,2x2+wo,3x3+bo=100×x310;wo,1=0,wo,2=0,wo,3=100,bo=10z_o=w_{o,1} x_1 + w_{o,2} x_2+ w_{o,3} x_3 + b_o = 100 \times x_3 -10; w_{o,1}=0, w_{o,2}=0, w_{o,3}=100, b_o=-10

這權重的物理意義是當x3x_3 是正值時,網路傾向把記憶cc值輸出。

考慮輸入序列為

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()g(\cdot)h()h(\cdot)都是linear function (y=x)(y=x)

如圖9-1所示,第一個時間點,輸入端會得到 g(z)=x1=3g(z)=x_1=3f(zi)=f(100×x210)=f(90)1f(z_i)= f(100 \times x_2-10)=f(90) \approx 1

f(zf)=f(100×x2+10)=f(110)1f(z_f)= f(100 \times x_2+10)=f(110) \approx 1

並算出memory cell c=cf(zf)+f(zi)g(z)=3c'=c f(z_f)+f(z_i)g(z)=3

其中cc 一開始是0。

f(zo)=f(100×x310)=f(10)0f(z_o)=f(100 \times x_3-10)=f(-10) \approx 0, y=h(c)×f(zo)0y=h(c') \times f(z_o) \approx 0


圖十一 Time=2

第二個時間點, 輸入端會得到 g(z)=x1=4g(z)=x_1=4f(zi)=f(100×x210)=f(90)1f(z_i)= f(100 \times x_2-10)=f(90) \approx 1

f(zf)=f(100×x2+10)=f(110)1f(z_f)= f(100 \times x_2+10)=f(110) \approx 1

並算出memory cell c=cf(zf)+f(zi)g(z)=3+1×4=7c'=c f(z_f)+f(z_i)g(z)=3+1 \times 4=7f(zo)=f(100×x310)=f(10)0f(z_o)=f(100 \times x_3-10)=f(-10) \approx 0, y=h(c)×f(zo)0y=h(c') \times f(z_o) \approx 0


圖十二 Time=3

第三個時間點, 輸入端會得到 g(z)=x1=2g(z)=x_1=2f(zi)=f(100×x210)=f(10)0f(z_i)= f(100 \times x_2-10)=f(-10) \approx 0

f(zf)=f(100×x2+10)=f(10)1f(z_f)= f(100 \times x_2+10)=f(10) \approx 1

並算出memory cell c=cf(zf)+f(zi)g(z)=7+1×0=7c'=c f(z_f)+f(z_i)g(z)=7+1 \times 0=7f(zo)=f(100×x310)=f(10)0f(z_o)=f(100 \times x_3-10)=f(-10) \approx 0, y=h(c)×f(zo)0y=h(c') \times f(z_o) \approx 0


圖十三 Time=4

第四個時間點,輸入端會得到 g(z)=x1=1g(z)=x_1=1f(zi)=f(100×x210)=f(10)0f(z_i)= f(100 \times x_2-10)=f(-10) \approx 0

f(zf)=f(100×x2+10)=f(10)1f(z_f)= f(100 \times x_2+10)=f(10) \approx 1

並算出memory cell c=cf(zf)+f(zi)g(z)=7+0×1=7c'=c f(z_f)+f(z_i)g(z)=7+0 \times 1=7f(zo)=f(100×x310)=f(90)1f(z_o)=f(100 \times x_3-10)=f(90) \approx 1, y=h(c)×f(zo)7y=h(c') \times f(z_o) \approx 7


圖十四 Time=5

第五個時間點,輸入端會得到 g(z)=x1=3g(z)=x_1=3f(zi)=f(100×x210)=f(110)0f(z_i)= f(100 \times x_2-10)=f(-110) \approx 0

f(zf)=f(100×x2+10)=f(90)0f(z_f)= f(100 \times x_2+10)=f(-90) \approx 0

並算出memory cell c=cf(zf)+f(zi)g(z)7×0+3×0=0c'=c f(z_f)+f(z_i)g(z) \approx 7 \times 0+3 \times 0=0f(zo)=f(100×x310)=f(10)0f(z_o)=f(100 \times x_3-10)=f(-10) \approx 0, y=h(c)×f(zo)0y=h(c') \times f(z_o) \approx 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\bar{c}^{t},在這種表示方式下,我們可以如圖十七~二十二那樣,重新描述LSTM的架構。圖十七表示,我們可以把輸入訊號向量x¯t\bar{x}^t乘上對應權重產生控制向量加主訊號(z¯f,z¯i,z¯o,z¯)(\bar{z}_f,\bar{z}_i,\bar{z}_o,\bar{z})zxz_x的維度跟LSTM神經元數量相同。

圖十七 Vector LSTM

我們可以把LSTM的模型外型重新排列,從原本圖十八的右半邊,變成左半邊。


圖十八 Reformulated LSTM

所以原本圖三seq2seq的模型,就會變成如圖十九所示,每個時間點都會從原本c¯t1\bar{c}^{t-1}x¯t\bar{x}^t產生新的c¯t\bar{c}^{t}跟輸出y¯t\bar{y}^t,再往後傳遞


圖十九 Seq2Seq LSTM without recurrent

真實的情況是,我們在產生(z¯f,z¯i,z¯o,z¯)(\bar{z}_f,\bar{z}_i,\bar{z}_o,\bar{z}),除了當下的訊號x¯t\bar{x}^t,還有前一個時間的output recurrent訊號h¯t1\bar{h}^{t-1},如圖二十所示。


圖二十 Seq2Seq LSTM with recurrent

更複雜的情況是,除了x¯t\bar{x}^t跟recurrent h¯t1\bar{h}^{t-1},還有前一個時間記憶c¯t1\bar{c}^{t-1}也參與(z¯f,z¯i,z¯o,z¯)(\bar{z}_f,\bar{z}_i,\bar{z}_o,\bar{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

results matching ""

    No results matching ""