Recurrent Neural Network-遞歸神經網絡 (RNN)-Part 1

** 此篇文章內容,整理自李宏毅老師教學影片。

RNN1_F00
圖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)。

RNN1_F01
圖一 Schematic of ticket booking system as an NLP slot filling an application

如圖一所示,輸入一段文字 “I would like to arrive Taipei on November 2nd.",它能自動擷取目的地是Taipei,抵達日期是November 2nd。這樣的技術稱作Slot Filling。

Feedforward Neural Network For Ticket Booking System

RNN1_F02
圖二 Feedforward Neural Network for ticket booking system.

如圖二所示:把一個一個單字(dTaipei)變成word vector (x¯Taipei=[x1,x2]) 輸入網路,輸出的 y1代表該單字是Destination的機率, y2是抵達時間的機率。 用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為例,如圖三所示:

RNN1_F03
圖三 ticket booking system using RNN.

不同的時間把字詞依序輸入網路,輸出是該單字為目的地(destination) 跟 抵達日期(time of arrival)的機率。

RNN有隱藏層(hidden cell state),,它帶有過去字詞的訊息,並在下個時間點同時輸入網路。

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

隱藏層(hidden cell state ) ,使得RNN有記憶功能。

RNN can consider history information

RNN1_F04
圖四 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是比較間接。

RNN1_F05
圖五 Elman Network vs Jordan Network

Bi-directional RNN

如圖六所示,除了考慮時間由前到後的資訊之外,還可以把兩個RNN並聯起來。

RNN1_F06
圖六 Bi-directional RNN

一個是正常時間方向,一個是反著時間方向,用順跟逆時間的資訊來預測每個時間點的輸出。這樣考慮順跟逆時間資訊的網路叫做Bidirectional RNN,可以讓每個時間的預測是參照全文的內容。而原本的RNN,只看輸入與此時刻之前的輸入資訊。

LSTM (Long Short-Term Memory)

因為記憶結構限制,RNN能夠記憶只有前後幾個時間點的資訊,為了克服這個問題,又發展出長短期記憶元(long short-term memory)來捕捉比較長時間的訊號關係。LSTM在原本的Memory cell加入閘門(gate)的機制,讓外部訊號控制memory cell是否開啟。

rnn1_f07.png
圖七 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神經元有四個輸入與一個輸出。跟一般RNN神經元是一個輸入與一個輸出不同。

RNN1_F08
圖八 Mathematical View of LSTM

圖八解釋Gate閘門的數學模型,每個控制訊號zi, zf, zo經過一個activation function f(⋅), 即f(zi), f(zf), f(zo),再跟主訊號相乘。控制訊號的activation function通常是sigmoid function,值域在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神經原運作。

RNN1_F09
圖9 Given weight and bias of LSTM neuron to examine LSTM behavior.

此例中,權重是假設給定的,i.e.,

擷取.JPG

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

考慮輸入序列為

RNN1_T01
表一 example input sequence.

此架構下的cell state與output將為

RNN1_T02
表二 example corresponding cell state and output sequences. 

以下將闡述cell state, output(如表二)的推導演算。

RNN1_F09-1
圖10 Time=1

擷取02.JPG

RNN1_F11
圖十一 Time=2

擷取03.JPG

RNN1_F12
圖十二 Time=3

擷取04.JPG

RNN1_F13
圖十三 Time=4

 

擷取05

RNN1_F14
圖十四 Time=5

擷取06.JPGsimple RNN vs LSTM

當我們想把simple RNN換成LSTM時,如圖十五跟十六所示,只是把藍色的RNN神經元換成LSTM神經元就完成了,要稍微注意的是,因為跟simple rnn比起來,LSTM多了三個gate input,所以要訓練的參數也變成原本的四倍。

RNN1_F15
圖十五 simple RNN
RNN1_F16
圖十六 LSTM neuron

Vector View of LSTM

擷取07.JPG

RNN1_F17
圖十七 Vector LSTM

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

RNN1_F18
圖十八 Reformulated LSTM

擷取08.JPG

RNN1_F19
圖十九 Seq2Seq LSTM without recurrent

擷取08

RNN1_F20
圖二十 Seq2Seq LSTM with recurrent

擷取10

RNN1_F21
圖二十一 peephole LSTM

LSTM的層數也不限於一層,如圖二十二所示,可以把多個單層的LSTM接在一起變成一個多層LSTM。

 

RNN1_F22
圖二十二 Multi-Layer LSTM

雖然LSTM數學上運算比較複雜,不過現在主流的深度學習框架(eg:keras, tensorflow)都已經支援lstm的api,只需要簡單一兩行就可以呼叫內建的LSTM,在開發上可以省不少時間。另外要注意的是,現在研究人員提到他們有使用RNN模型時,絕大部分就是指LSTM或是另外一個參數比較少的Gated Recurrent Unit(GRU),如果是最原始到RNN,則會用simple RNN來表示。

Reference

[0] ML Lecture 21-1: Recurrent Neural Network (Part I) https://www.youtube.com/watch?v=xCGidAeyS4

[1] LSTM vs RNN

https://brohrer.mcknote.com/zh-Hant/how_machine_learning_works/how_rnns_lstm_work.html

發表留言