** 此篇文章內容,整理自李宏毅老師教學影片。
圖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)。
如圖一所示,輸入一段文字 “I would like to arrive Taipei on November 2nd.",它能自動擷取目的地是Taipei,抵達日期是November 2nd。這樣的技術稱作Slot Filling。
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為例,如圖三所示:
不同的時間把字詞依序輸入網路,輸出是該單字為目的地(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
圖四與之前舉的例子(圖二)的輸入雖然都是"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是比較間接。
Bi-directional RNN
如圖六所示,除了考慮時間由前到後的資訊之外,還可以把兩個RNN並聯起來。
一個是正常時間方向,一個是反著時間方向,用順跟逆時間的資訊來預測每個時間點的輸出。這樣考慮順跟逆時間資訊的網路叫做Bidirectional RNN,可以讓每個時間的預測是參照全文的內容。而原本的RNN,只看輸入與此時刻之前的輸入資訊。
LSTM (Long Short-Term Memory)
因為記憶結構限制,RNN能夠記憶只有前後幾個時間點的資訊,為了克服這個問題,又發展出長短期記憶元(long short-term memory)來捕捉比較長時間的訊號關係。LSTM在原本的Memory cell加入閘門(gate)的機制,讓外部訊號控制memory cell是否開啟。
如圖七所示,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神經元是一個輸入與一個輸出不同。
圖八解釋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神經原運作。
此例中,權重是假設給定的,i.e.,
這權重的物理意義是當x3 是正值時,網路傾向把記憶c值輸出。
考慮輸入序列為
此架構下的cell state與output將為
以下將闡述cell state, output(如表二)的推導演算。
simple RNN vs LSTM
當我們想把simple RNN換成LSTM時,如圖十五跟十六所示,只是把藍色的RNN神經元換成LSTM神經元就完成了,要稍微注意的是,因為跟simple rnn比起來,LSTM多了三個gate input,所以要訓練的參數也變成原本的四倍。
Vector View of LSTM
我們可以把LSTM的模型外型重新排列,從原本圖十八的右半邊,變成左半邊。
LSTM的層數也不限於一層,如圖二十二所示,可以把多個單層的LSTM接在一起變成一個多層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