一文搞懂RNN和LSTM

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第1天,點選檢視活動詳情

RNN

為了引入RNN ,我們要舉的例子是Slot Filling

Slot Filling:你的系統要自動的知道這邊的的每一個詞彙,它屬於哪一個slot

image-20210803102733552

這個問題怎麼解呢?

這個問題當然也可以用一個Feedforward 的neural network來解。

input就是一個詞彙,把詞彙丟到這個neural network裡,需要先把它變成一個vector(方法有很多) 。

image-20210803103256514

但是光這樣是不夠的,沒有辦法solve 這個problem,為什麼呢?

image-20210803103338492

假設現在有一個是使用者說:arrive Taipei... 這時Taipei是目的地

另一個使用者說:leave Taipei...這時Taipei是 出發地

但是==對neural network來說,input 一樣的東西,output就是一樣的東西==。

input Taipei的時候要麼就都是出發地的機率最高,要麼就是目的地的機率最高。

沒有辦法讓他有時候出發地的機率最高,有時候目的地的機率最高。

RNN基本概念

怎麼辦呢? 如果我們的neural network 是有記憶力的,它記得它在看紅色的Taipei之前看過arrive 這個詞彙,它就可以根據上下文產生不同的結果。

這種有記憶力的 neural network就叫做 Recurrent Neural Network

==在RNN中每一次我們的hidden layer產生output的時候,這個output都會被存到memory裡面去。==

image-20210803105522042

下一次當有input的時候,這個hidden layer的neuron 不只考慮input 還會考慮memory。

==在RNN裡面,它會考慮input這個sequence 的order==。

RNN在 slot filling裡面的

image-20210803110103603

注意是同一個網路被反覆使用,不是兩個不同的網路。

image-20210803105937626

因為leave 和arrive它們的vector不一樣,所以存在memory裡面的值,也會不同

雖然x2是一模一樣的,但因為memory裡面的值不同,所以得到的結果也不同

這就是RNN的基本概念。

image-20210803110352723

RNN的架構,你是可以任意設計的,當然可以是deep的。

RNN的其它變形

image-20210803110457017

Elman Network:把hidden layer的output存起來,在下一個時間點在讀出來

Jordan Network:存的是整個network的output的值

image-20210803110514333

RNN還可以是雙向的,讀取方向可以是反過來的。

你可以同時train一個正向的,一個反向的,把input xt 正向的結果和input xt 逆向的結果都丟到另外一個output layer。

好處是它看的範圍是比較廣的。

LSTM

理論基礎

現在比較常用的memory稱之為:Long Short-term Memory

image-20210803111654151

當某個neuron的output想要被寫到memory cell裡面的時候,它必須通過一道閘門:==Input Gate== 只有當它開啟的時候才能把值寫到memory cell裡面

輸出的地方也有一個 ==Output Gate== :決定外界的其他neuron 可不可以從memory裡面把值讀出來。

==Forget Gate== : 決定要不要把過去記得的東西忘掉。

這三個閘門至於什麼時候開關,是neural network自己學到的。

整個LSTM,可以看成它有四個input ,一個output

執行過程(硬核)

如果更仔細來看它的formulation的話,它長得像這樣(絕對硬核)

image-20210803114828595

我們假設,

要被存到cell裡面的input叫做Z

操作input gate的signal 叫做Zi

操作forget gate 的signal 叫做Zf

操作output gate 的signal 叫做Zo

最後得到的output 叫做 a

所謂的signal 就是一個scalar,這三個signal 的activation function通常選擇sigmoid function,sigmoid的值是介於0~1之間的,就代表了這個gate被開啟的程度。

假設memory 再輸入這個signal之前已經存了值c ,

輸入Z 通過activation function得到 g(z), zi 通過activation function得到f(zi)

接下來我們就把g(z) 乘上f(zi)

==假設f(zi) =0 那 g(z) *f(zi) 就=0,就相當於沒有輸入一樣,f(zi) =1就等於是直接把g(z)當做輸入==

Zf 通過activation function得到f(zf)

接下來我們把存在memory裡面的值C 乘上f(zf)

==假設f(zf) =0 那C *f(zf) 就=0,過去存在memory裡面的值就會變成0,f(zf) =1,c會直接通過就等於是還記得過去的值==

把 g(z) f(zi) 和 C f(zf) 這兩項加起來得到C' C' 就是新的存在memory裡面的值。

C' 通過activation function得到h(C' ) , Zo 通過activation function得到f(zo)

把h(C' ) *f(zo)得到輸出 a

==假設f(zo) =0 那h(C' ) *f(zo) 就=0,就相當於沒有輸出一樣,f(zo) =1 就等於是直接把h(C' ) 當做輸出==

如果你還是不太瞭解,建議看一下教學視訊https://www.bilibili.com/video/BV1Wv411h7kN?p=27( 28分鐘開始人工執行),絕對硬核

看到這可能會有一個問題,這個東西跟我們原來看到的neural network感覺很不像啊,它跟原來的neural network到底有什麼樣的關係呢?

image-20210803124234623

你其實只要把那個LSTM的那個memory cell想成是一個neuron 就好

如果我們今天要用一個LSTM的network,你做的事情只是把原來一個簡單的neuron換成一個LSTM的cell。

x1 x2 乘上一組weight 去操控第一個LSTM的output gate ,乘上另外一組weight 去操控第一個LSTM的input gate...

image-20210803124517528

LSTM需要的引數量會是一般的neural network的4倍。

image-20210803124543716

==yt= h[ g(z) f(zi) +ct-1 f(zf) ] * f(zo)== 就是上面的過程

LSTM一個simplified的version:

image-20210803125118246

最終模型

==真正的LSTM它會把hidden layer的輸出接進來,當做下一個時間點的input。==

==還會加一個peephole,把存在memory cell裡面的值也拉過來==

image-20210803125438982

所以在操控LSTM的四個gate的時候,你是同時考慮的x 考慮了h 同時考慮了c

把這三個vector並在一起,乘上4個不同的transform,得到這四個不同的vector,再去操控LSTM。

LSTM通常不會只有一層,大概就是長成這個樣子

image-20210803125703432

有沒有一種很爽的感覺,這種東西居然都能看懂(狗頭)