RNN與LSTM網路簡述

一夜了發表於2018-06-10

**最近看到一個blog,對LSTM模型介紹的很全面,所以我在這裡記錄一下。後續會逐漸補充公式推導的部分。
**RNN關鍵點之一是連線先前的資訊到當前的任務中,而LSTM模型是一種特別的RNN。不幸的是RNN對長期依賴資訊的學習能力不足,會出現梯度消失等問題。而LSTM網路就是解決長短時的資訊依賴問題。

1.簡介

LSTM網路全稱為 Long Short-Term Memory,長期短期記憶模型,被設計用來學習長期依賴資訊。與RNN模型對比,所有 RNN 都具有一種重複神經網路模組的鏈式的形式。在標準的 RNN 中,這個重複的模組只有一個非常簡單的結構,例如一個 tanh 層。如下圖所示:
這裡寫圖片描述
LSTM 同樣是這樣的結構,但是重複的模組擁有一個不同的結構。不同於單一神經網路層,這裡是有四個,以一種非常特殊的方式進行互動。
這裡寫圖片描述
在上面的圖例中,每一條黑線傳輸著一整個向量,從一個節點的輸出到其他節點的輸入。粉色的圈代表 pointwise 的操作,諸如向量的和,而黃色的矩陣就是學習到的神經網路層。合在一起的線表示向量的連線,分開的線表示內容被複制,然後分發到不同的位置。

2.詳述

LSTM 的關鍵就是Cell狀態,水平線在圖上方貫穿執行。上方的橫線被用來記憶長期依賴資訊,而下方的橫線我的理解是儲存短期的依賴資訊。
這裡寫圖片描述

2.1LSTM網路中忘記資訊功能

LSTM網路中,資訊的遺忘主要是使用一個sigmoid函式和一個pointwise乘法。
這裡寫圖片描述
在上圖中,xt

x_t
ht1
h_{t-1}
作為輸入,學習一層網路,並通過sigmoid函式使之處於(0,1)之間。

2.2決定哪些資訊被記憶

記憶部分稍微複雜,主要是對輸入做sigmoid函式以及tanh函式並做pointwise乘法,最後加到cell中去。
這裡寫圖片描述
這裡寫圖片描述
把舊狀態Ct1

C_{t-1}
ft
f_t
相乘,丟棄掉我們確定需要丟棄的資訊。接著加上 it
i_t
*C~t
\tilde{C}_t
。這就是新的候選值,根據決定更新每個狀態的程度進行變化。

2.3決定哪些資訊被輸出

最終,我們需要確定輸出什麼值。這個輸出將會基於我們的Cell狀態,但是也是一個過濾後的版本。首先,我們執行一個 sigmoid 層來確定Cell狀態的哪個部分將輸出出去。接著,我們把細胞狀態通過 tanh 進行處理(得到一個在 -1 到 1 之間的值)並將它和 sigmoid 門的輸出相乘,最終我們僅僅會輸出我們確定輸出的那部分。
這裡寫圖片描述

2.4公式推導

以後有待補充

3tanh與sigmoid函式的區別

3.1sigmoid函式

這裡寫圖片描述

3.2tanh函式

這裡寫圖片描述

4.RNN網路

本該先介紹RNN網路,不過比較懶放在了後面。

4.1具體流程

step1, raw text: 接觸LSTM模型不久,簡單看了一些相關的論文,還沒有動手實現過。然而至今仍然想不通LSTM神經網路究竟是怎麼工作的。
step2, tokenize (中文得分詞): sentence1: 接觸 LSTM 模型 不久 ,簡單 看了 一些 相關的 論文 , 還 沒有 動手 實現過 。
sentence2: 然而 至今 仍然 想不通 LSTM 神經網路 究竟是 怎麼 工作的。
step3, dictionarize: sentence1: 1 34 21 98 10 23 9 23 sentence2: 17 12 21 12 8 10 13 79 31 44 9 23
step4, padding every sentence to fixed length: sentence1: 1 34 21 98 10 23 9 23 0 0 0 0 0 sentence2: 17 12 21 12 8 10 13 79 31 44 9 23 0
step5, mapping token to an embeddings: sentence1: ,每一列代表一個詞向量,詞向量維度自行確定;矩陣列數固定為time_step length。
step6, feed into RNNs as input: 假設 一個RNN的time_step 確定為 ,則padded sentence length(step5中矩陣列數)固定為 。一次RNNs的run只處理一條sentence。每個sentence的每個token的embedding對應了每個時序 的輸入 。一次RNNs的run,連續地將整個sentence處理完。
step7, get output:看圖,每個time_step都是可以輸出當前時序 的隱狀態 ;但整體RNN的輸出 是在最後一個time_step 時獲取,才是完整的最終結果。
step8, further processing with the output:我們可以將output根據分類任務或迴歸擬合任務的不同,分別進一步處理。比如,傳給cross_entropy&softmax進行分類……或者獲取每個time_step對應的隱狀態 ,做seq2seq 網路。

4.2介紹

RNN的一個特點是所有的隱層共享引數,整個網路只用這一套引數。
這裡寫圖片描述
**RNNs包含輸入單元(Input units),輸入集標記為x0,x1,...,xt,xt+1,...

{x_0,x_1,...,x_t,x_{t+1},...}
,而輸出單元(Output units)的輸出集則被標記為o0,o1,...,ot,ot+1.,..
{o_0,o_1,...,o_t,o_{t+1}.,..}
。RNNs還包含隱藏單元(Hidden units),我們將其輸出集標記為s0,s1,...,st,st+1,...
{s_0,s_1,...,s_t,s_{t+1},...}
,這些隱藏單元完成了最為主要的工作。你會發現,在圖中:有一條單向流動的資訊流是從輸入單元到達隱藏單元的,與此同時另一條單向流動的資訊流從隱藏單元到達輸出單元。在某些情況下,RNNs會打破後者的限制,引導資訊從輸出單元返回隱藏單元,這些被稱為“Back Projections”,並且隱藏層的輸入還包括上一隱藏層的狀態,即隱藏層內的節點可以自連也可以互連。

**上圖將迴圈神經網路進行展開成一個全神經網路。例如,對一個包含5個單詞的語句,那麼展開的網路便是一個五層的神經網路,每一層代表一個單詞。對於該網路的計算過程如下:

**xt

x_t
表示第t,t=1,2,3…步(step)的輸入。比如,x1
x_1
為第二個詞的one-hot向量(根據上圖,x0
x_0
為第一個詞);
PS:使用計算機對自然語言進行處理,便需要將自然語言處理成為機器能夠識別的符號,加上在機器學習過程中,需要將其進行數值化。而詞是自然語言理解與處理的基礎,因此需要對詞進行數值化,詞向量(Word Representation,Word embeding)[1]便是一種可行又有效的方法。何為詞向量,即使用一個指定長度的實數向量v來表示一個詞。有一種種最簡單的表示方法,就是使用One-hot vector表示單詞,即根據單詞的數量|V|生成一個|V| * 1的向量,當某一位為1的時候其他位都為零,然後這個向量就代表一個單詞。缺點也很明顯:
1.由於向量長度是根據單詞個數來的,如果有新詞出現,這個向量還得增加,麻煩!(Impossible to keep up to date);
2.主觀性太強(subjective),這麼多單詞,還得人工打labor並且adapt.。
現在有一種更加有效的詞向量模式,該模式是通過神經網路或者深度學習對詞進行訓練,輸出一個指定維度的向量,該向量便是輸入詞的表達。如word2vec。
**st
s_t
為隱藏層的第t步的狀態,它是網路的記憶單元。 st
s_t
根據當前輸入層的輸出與上一步隱藏層的狀態進行計算。st=f(Uxt+Wst1)
s_t=f(Ux_t+Ws_{t−1})
,其中f一般是非線性的啟用函式,如tanh或ReLU,在計算s0
s_0
時,即第一個單詞的隱藏層狀態,需要用到s1
s_{−1}
,但是其並不存在,在實現中一般置為0向量;
ot
o_t
是第t步的輸出,如下個單詞的向量表示,ot=softmax(Vst)
o_t=softmax(Vs_t)
.
**需要注意的是:
你可以認為隱藏層狀態st
s_t
是網路的記憶單元. st
s_t
包含了前面所有步的隱藏層狀態。而輸出層的輸出ot
o_t
只與當前步的st
s_t
有關,在實踐中,為了降低網路的複雜度,往往st
s_t
只包含前面若干步而不是所有步的隱藏層狀態;
**在傳統神經網路中,每一個網路層的引數是不共享的。而在RNNs中,每輸入一步,每一層各自都共享引數U,V,W。其反應了RNNs中的每一步都在做相同的事,只是輸入不同,因此大大地降低了網路中需要學習的引數;這裡並沒有說清楚,解釋一下,傳統神經網路的引數是不共享的,並不是表示對於每個輸入有不同的引數,而是將RNN是進行展開,這樣變成了多層的網路,如果這是一個多層的傳統神經網路,那麼xt
x_t
st
s_t
之間的U矩陣與xt+1
x_{t+1}
st+1
s_{t+1}
之間的U是不同的,而RNNs中的卻是一樣的,同理對於s與s層之間的W、s層與o層之間的V也是一樣的。
**上圖中每一步都會有輸出,但是每一步都要有輸出並不是必須的。比如,我們需要預測一條語句所表達的情緒,我們僅僅需要關係最後一個單詞輸入後的輸出,而不需要知道每個單詞輸入後的輸出。同理,每步都需要輸入也不是必須的。RNNs的關鍵之處在於隱藏層,隱藏層能夠捕捉序列的資訊。

4.3梯度消失現象

tanh函式及其導數的影像:
這裡寫圖片描述
可見tanh導數的值域是(0,1],兩端都非常平緩並趨於0。
再看我們的梯度公式:
用的就是tanh導數,在訓練的後期,梯度會變得比較小,如果幾個趨於0的值相乘的話,乘積就會變得非常小,就會出現梯度消失現象。同樣的情況也會出現在sigmoid函式。
由於遠距離的時刻的梯度貢獻接近於0,因此很難學習到遠距離的依賴關係。

也很容易想象到當導數都很大的時候,就會出現梯度爆炸的情況,但是它的受重視程度不如梯度消失問題,原因有二:
- 梯度爆炸很明顯,梯度值會變成NaN,程式會崩潰。
- 用一個預定義值來裁剪梯度值是解決梯度爆炸的一個非常簡單實用的辦法,而梯度消失問題則很難解決。
幸好還有一些辦法來解決梯度消失問題。
- 合適的引數初始化可以減少梯度消失的影響。
- 使用ReLU啟用函式
- LSTM和GRU架構。

4.4RNN前向傳播與反向傳播演算法推導

4.4.1前向傳播推導

這裡寫圖片描述

4.4.2反向傳播推導

有了RNN前向傳播演算法的基礎,就容易推匯出RNN反向傳播演算法的流程了。RNN反向傳播演算法的思路和DNN是一樣的,即通過梯度下降法一輪輪的迭代,得到合適的RNN模型引數U,W,V,b,c。由於我們是基於時間反向傳播,所以RNN的反向傳播有時也叫做BPTT(back-propagation through time)。當然這裡的BPTT和DNN也有很大的不同點,即這裡所有的U,W,V,b,c在序列的各個位置是共享的,反向傳播時我們更新的是相同的引數。
    為了簡化描述,這裡的損失函式我們為對數損失函式,輸出的啟用函式為softmax函式,隱藏層的啟用函式為tanh函式。
這裡寫圖片描述
  但是W,U,b的梯度計算就比較的複雜了。從RNN的模型可以看出,在反向傳播時,在在某一序列位置t的梯度損失由當前位置的輸出對應的梯度損失和序列索引位置t+1時的梯度損失兩部分共同決定。對於W在某一序列位置t的梯度損失需要反向傳播一步步的計算。我們定義序列索引t位置的隱藏狀態的梯度為:
  這裡寫圖片描述

引用blog:
https://www.cnblogs.com/pinard/p/6509630.html
https://blog.csdn.net/heyongluoyao8/article/details/48636251
https://www.jianshu.com/p/9dc9f41f0b29

相關文章