您當前的位置:首頁 > 攝影

遞迴神經網路RNN

作者:由 小小何先生 發表于 攝影時間:2018-08-01

傳統的神經網路(包括CNN),輸入和輸出都是相互獨立的,例如一張圖片的貓和狗是分隔開的,但是有些任務後續輸出和之前的內容是相關的,區域性的資訊不足以使得後續的任務能夠進行下去。RNN是需要之前或則之前序列的資訊才能夠使得任務進行下去的神經網路。RNN引入‘記憶’的概念,迴圈2字來源於其每個元素都執行相同的任務,但是輸出依賴於輸入和‘記憶’。其結構如下圖所示:

遞迴神經網路RNN

其中x是一個輸入,o是一個輸出,W是一個迴圈,一直在做相同的事情。將其按照時間序列展開如圖片右邊所示。例如我們訓練一個語言模型,也就是當前語言中哪個詞和哪個詞是最有可能在一起的,假設現在有一句話:我是一個大帥逼,將其分詞有:我、是、一個、大帥逼 4個詞。用RNN解決的問題是,將‘我’輸入RNN中它的輸出是‘是’,以此類推如圖片所示。也就是知道當前的輸入後需要判定輸出,也就是下一個

時刻

的東西了(將其看作一個時序的神經網路)。總結:RNN就是依據當前時刻的值,以及之前的一些經驗知識,去推斷下一個時刻的輸出。上圖中X是一個輸入,U是一個權重,需要和我們的輸入去做一個運算;S是一個狀態,需要和W去做一個運算。上述兩種輸出做運算得到當前時刻的輸出,由於有新的東西加入進來,所以同時狀態S更新。說的清楚一點的話就如下圖所示;

X_{t}

:時間

t

處的輸入。

S_{t}

:是時間

t

處的‘記憶’,

S_{t}=f(UX_{t}+WS_{t-1})

f可以是tanh等

O_{t}

:時間

t

的輸出,如:預測的下個詞,也可能是softmat輸出的屬於每個候選詞的機率。

1 .

one hot:例如輸出為8000的一個向量,當選中一個詞之後,這個詞對應的量就是1,其他的詞就是0。

2.

可以把隱狀態

S_{t}

視作‘記憶體’,捕捉了之前時間點上的資訊。

3 .

輸出

O_{t}

由當前時間輸入及之前所有的‘記憶’共同計算得到 :

O_{t} = softmax(V·S_{t})=softmax(V·f(UX_{t}+WS_{t-1}))

,但是在實際應用中,

S_{t}

並不能捕捉和保留之前所有的資訊。

4 .

不同於CNN,這裡的RNN其實整個神經網路都共享一組引數量。

5 .

圖中的

O_{t}

在有些任務下是不存在的,比如文字情感分析,其實只需要最後的output結果就行。

雙向RNN:

有些情況下,當前的輸出不只依賴於之前的序列元素,還可能依賴之後的序列元素,比如做英語完形填空。

遞迴神經網路RNN

深層雙向RNN:

和雙向RNN的區別是每一步/每個時間點我們設定多層結構。

遞迴神經網路RNN

迴圈神經網路之LSTM:

前面提到的RNN解決了,對之前的資訊儲存的問題。但是!存在長期依賴的問題。例如:在看電影的時候,某些情節的推斷需要依賴很久以前的一些細節。很多其他的任務也一樣。很可惜隨著時間間隔不斷增大時,RNN會喪失學習到連線如此遠的資訊的能力。也就是說,記憶容量有限,一本書從頭到尾一字不漏的去記憶,肯定離得越遠的東西忘得越多。

LSTM是RNN的一種,大體的結構幾乎是一樣的。但是他的‘記憶細胞’被改造過,應該被記住的東西(如新的輸入的東西)會一直傳遞下去,不該記住的東西(如舊的東西)會被截斷。上文所述RNN可表示為下圖所示結構。

遞迴神經網路RNN

在RNN的基礎上,LSTM的改進神經網路框圖如下所示:

遞迴神經網路RNN

其中最關鍵的地方在於,細胞的狀態類似在傳送帶上傳送,直接在整個鏈上執行,只有少量的線性互動。資訊在上面流傳很容易保持不變。

遞迴神經網路RNN

LSTM如何控制細胞狀態?

透過‘門’讓資訊選擇性透過,來去除或者增加資訊到細胞狀態,其中包含一個

sigmoid

神經網路層

和一個

pointwise

乘法

操作(sigmoid層輸出0到1之間的機率值,描述每個部分有多少量可以透過。0代表‘不許任何量透過’,1就指‘允許任意量透過’。)

遞迴神經網路RNN

第一步:決定從‘細胞狀態’中丟棄什麼資訊。

為什麼會有這一步?舉個例子:比如完形填空中填‘他’或者‘她’的問題。細胞狀態可能包含當前主語的類別,當我們看到新的代詞的時候,我們希望忘記舊的代詞。

我們回顧一下之前的狀態方程:

S_{t}=f(UX_{t}+WS_{t-1})

,從中可以看出狀態主要是由當前的輸入和之前的狀態所組成的。再回顧一下輸出方程:

O_{t} = softmax(V·S_{t})

可知輸出是由狀態非線性變換而來的。因此狀態可理解為與當前輸入和上個時刻的輸出相關。由此可以理解下圖中的公式,用於選擇‘細胞狀態’中的資訊。

f_{t}= \sigma(W_{f}·[h_{t-1},x_{t}]+b_{f})

其中

\sigma

可以為

sigmoid

函式,

W_{f}

為一個矩陣構成的引數向量。

遞迴神經網路RNN

第二步:決定放什麼新資訊到‘細胞狀態’中:

狀態更新的時候需要確定兩個東西:1。

sigmoid

層決定什麼值需要更新,什麼值不需要更新。2。

tanh

層建立一個新的候選值向量

\tilde{S_{t}}

。進而得到下圖所示兩個更新的必備元素。

i_{t}= \sigma(W_{i}·[h_{t-1},x_{t}]+b_{i})

\tilde{S}_{t}= \ tanh(W_{S}·[h_{t-1},x_{t}]+b_{S})

第三步:更新‘細胞狀態’。

把舊狀態與

f_{t}

相乘,丟棄掉我們確定需要丟棄的資訊,再加上

i_{t}*S_{t}

。這個就是新的候選值,依據我哦們決定更新狀態的程度進行變化。公式如下所示:

S_{t}=f_{t}*S_{t-1}+i_{t}*\tilde{S_{t}}

遞迴神經網路RNN

第四步:基於‘細胞狀態’得到輸出:

首先執行一個

sigmoid

層來確定細胞狀態的哪個部分將輸出,也就是用這個確定細胞的狀態哪個部分輸出。接著用

tanh

處理細胞狀態(得到一個在-1到1之間的值),再將它和

sigmoid

門的輸出相乘,輸出我們確定輸出的那部分。

o_{t}= \sigma(W_{o}[h_{t-1},x_{t}]+b_{o})

h_{t}=o_{t}*tanh(S_{t})

遞迴神經網路RNN

LSTM的幾個變體:

遞迴神經網路RNN

遞迴神經網路RNN

遞迴神經網路RNN

標簽: RNN  輸出  狀態  輸入  細胞