1. 程式人生 > >RNN、LSTM、Seq2Seq、Attention、Teacher forcing、Skip thought模型總結

RNN、LSTM、Seq2Seq、Attention、Teacher forcing、Skip thought模型總結

RNN

RNN的發源:

  1. 單層的神經網路(只有一個細胞,f(wx+b),只有輸入,沒有輸出和hidden state)
    single_RNN

  2. 多個神經細胞(增加細胞個數和hidden state,hidden是f(wx+b),但是依然沒有輸出)
    single_RNN
    這裡RNN同時和當前的輸入有關係,並且是上一層的輸出有關係。

  3. 初步的RNN(增加輸出softmax(Wx+b),輸出和hidden state的區別是對wx+b操作的函式不同)
    single_RNN

備註多層的神經細胞和全連線層的區別:
全連線層只有:輸入、輸出和權重矩陣, 如下圖。
初步的RNN和普通意義上的全連線層的區別是:RNN的輸出和輸入、上一層的hidden state有關。這也是RNN最大的優點,能夠利用上一時刻的輸出來修正下一時刻的輸入。
single_RNN

  1. 經典的RNN(輸入,輸出,hidden state,輸出和輸出是等長的)
    single_RNN

這是現在普遍流行的RNN神經網路

優點:將當前的輸出和上一時刻的輸出結合起來。充分模擬了人思考的過程,比如例如當你讀一篇文章的時候,你會根據對之前單詞的理解來理解後面的每一個單詞。你不會拋掉之前所知的一切而重新開始思考。思維是有永續性的。


缺點:
更長時間的資訊會隨著神經網路的層數增多而慢慢消失。
使用tanh作為啟用函式存在梯度消失的問題。


應用:在不僅僅要臨近資訊的場景,比如預測北京明天的空氣質量,明天的空氣質量受今天天氣的影響最大,不需要更長時間內的資訊,所以用RNN效果更好,但是要更長時間內的影響,則用LSTM模型效果更好。

備註:經常的使用f(wx+b)的啟用函式是tanh。

tanh_RNN


LSTM

針對RNN不能記憶長時間內容的問題,提出了LSTM(長短期記憶網路),具有對長期記憶學習的能力。

cant_RNN
LSTM完整的神經網路構造圖
cant_RNN

LSTM完整的細胞狀態

主要包含:

  • 輸入:input, 上一時刻的cell state,上一時刻的hidden state
  • 輸出:當前的cell state和hidden state
  • 內部cell:三個門:輸入門、輸出門、遺忘門

對比RNN:
輸入上增加了cell state,cell內部增加了三個門,分別控制cell state和hidden state。

RNN 對比 LSTM

tanh_RNN
上圖是RNN的神經網路圖
cant_RNN
上圖是

LSTM 核心原理:

將資訊流的狀態分成cell state和input state。主線是cell state,直接在整個細胞上執行,只有一些少量的線性互動,主要維持資訊不變。分線是gate控制的input state,向cell state新增或者刪除資訊。
main_subbanch
上圖是整個LSTM的資訊流動圖

遺忘門

本質是之前的語句對全域性的重要性。
原理:通過當前時刻的輸入和上一時刻的hidden state決定要保留多少資訊。
main_subbanch
上圖是遺忘門的示意圖

遺忘門計算公式:\(f_t=σ(W_f \cdot [h_{t-1},x_t]+b_f)\)
\(W_f\) 是遺忘門的權重矩陣,
\(b_f\) 是遺忘門的偏置項,
σ 是 sigmoid 函式。
\([h_{t-1}, x_t]\) 表示把兩個向量連線成一個更長的向量,
原先的函式形式是 \(σ(w \cdot x+b)\),轉變為現在的 \(σ(w \cdot x+w \cdot h)+b = σ (w([h,x])+b)\)

這裡的所有輸出都是hidden state拼接x形成的向量

輸入門

本質是判斷當前詞語對全域性的重要性。
原理:通過短期記憶和長期記憶控制當前的輸入進入cell state。感覺就像是控制了輸入的進入比例,和當前的cell state狀態

input_gate_1
輸入門的示意圖

輸出門

本質是判斷當前的內容對後續語句的重要性。
原理: 輸出門主要輸出cell state和hidden state。
cell state結果=保留比例\(c_{i-1}\)+輸入比例輸入內容
hidden state結果=輸出比例*tanh(cell state)

保留比例:遺忘門控制(sigmoid函式)
輸出比例:輸入門控制(sigmoid函式)
輸出比例:輸出門控制(sigmoid函式)

輸出分為兩個部分:cell state和hidden state

輸出1:cell state計算

\(c_t = f_t \cdot c_{t-1} + i_t \cdot \tilde{c_t}\)

其中:\(f_t = σ(W_f \cdot [h_{t-1},x_t]+b_f)\) (遺忘門的計算方式)
\(c_{t-1}\) 是上一時刻的細胞狀態
$i_t \(是輸入門,\)i_t = σ(W_i \cdot [h_{t-1},x_t]+b_i)$
\(\tilde{c_t}\)當前輸入的細胞狀態,\(\tilde{c_t} = tanh(W_c \cdot [h_{t-1},x_t]+b_c)\)

input_gate_2
當前\(\tilde{c_t}\) 計算示意圖

input_gate_3
當前\(c_t\)計算示意圖

輸出2:hidden state計算

input_gate_3
上圖是輸出示意圖

優點

  • 解決了RNN梯度消失的問題
    自我認為:LSTM存在梯度消失的問題,因為最後hidden state輸出: \(h_i=o_t*tanh(f_t*c_{i-1}+i_i*\sigma(w_i[h,x]+b_i))\),引起梯度消失的兩條途徑是:啟用函式和連式法則,這裡使用了tanh函式,所以存在梯度消失的可能性。
    但是網上大多數認為不存在梯度消失。因為在RNN的梯度傳導過程中,如果某次w出現極小值,再乘以sigmoid函式,w的數值會越來越小。但是在LSTM的傳導中,如果某次出現了極小值,但是下一次的cell state不一定會是極小的,因為cell state來源與兩部分:上一次的cell state和input,即使是cell state出現極小值,但是input仍然不會存在極小值,所以下一次的cell state的不一定會出現極小值,所以w不會繼續變小。

  • 具有記憶功能
    這個是在RNN就解決的問題,就是因為有遞迴效應,上一時刻隱層的狀態參與到了這個時刻的計算過程中,直白一點呢的表述也就是選擇和決策參考了上一次的狀態。

  • LSTM記的時間長
    因為gate的特點,誤差向上一個上一個狀態傳遞時幾乎沒有衰減,所以權值調整的時候,對於很長時間之前的狀態帶來的影響和結尾狀態帶來的影響可以同時發揮作用,最後訓練出來的模型就具有較長時間範圍內的記憶功能。

應用

LSTM非常適合用於處理與時間序列高度相關的問題,例如機器翻譯、對話生成、編碼、解碼等

雙向RNN

在經典的迴圈神經網路中,狀態的傳輸是從前往後單向的。然而,在有些問題中,當前時刻的輸出不僅和之前的狀態有關係,也和之後的狀態相關。我_ _ 想吃羊肉,要預測空格中的詞語要同時看前後的詞語的意思和時態、詞性。這時就需要雙向RNN(BiRNN)來解決這類問題。

雙向RNN是由兩個RNN上下疊加在一起組成的。輸出由這兩個RNN的狀態共同決定。

input_gate_3

其中,正向計算時,隱藏層的 \(s_t\)\(s_{t-1}\) 有關;反向計算時,隱藏層的 \(s_t\)\(s_{t+1}\) 有關。

Seq2Seq

設計思想

在預測中,當前字詞的預測不僅取決於前面已經翻譯的字詞,還取決於原始的輸入。這決定了cell需要將之前cell的state和output。同時,我們知道在以往的語句生成中,cell的output被當做生成的語句,那麼生成的語句就會和input語句的長度一致。但是這是違反常規的,所以提出了Seq2Seq模型,分成encoder和decoder模型,可以使輸入語句和輸出語句的長度不一樣。Seq2Seq最早被應用於機器翻譯,後來擴充套件到多種NLP任務。

原理

seq0
這是Seq2Seq的總體流程圖,把encoder最後一個時刻的cell 的hidden state 輸出到decoder的第一個cell裡,通過啟用函式和softmax層,得到候選的symbols,篩選出概率最大的symbols,作為下一個cell的輸入。彙總所有的decoder的output就是最後的預測結果。

為什麼要使用Encoder的最後一個hidden state?
在Encoder-Decoder結構中,Encoder把所有的輸入序列都編碼成一個統一的語義特徵c再解碼,因此, c中包含原始序列中的所有資訊。

seq1
這是Encoder的構造,它和普通的RNN、LSTM沒有區別。具體每個細胞接受的是每一個單詞word embedding,和上一個時間點的hidden state。輸出的是這個時間點的hidden state。

seq0
這是Decoder的構造,第一個cell是輸入是encode的最後一個cell的hidden state,並且當前的output會輸入到下一個cell中。

Attention

設計思想

由於encoder-decoder模型在編碼和解碼階段始終由一個不變的語義向量C來聯絡著,編碼器要將整個序列的資訊壓縮排一個固定長度的向量中去。這就造成了 (1)語義向量無法完全表示整個序列的資訊,(2)最開始輸入的序列容易被後輸入的序列給覆蓋掉,會丟失許多細節資訊。在長序列上表現的尤為明顯。   

引入Attention
: 相比於之前的encoder-decoder模型,attention模型最大的區別就在於它不在要求編碼器將所有輸入資訊都編碼進一個固定長度的向量之中。相反,此時編碼器需要將輸入編碼成一個向量的序列,而在解碼的時候,每一步都會選擇性的從向量序列中挑選一個子集進行進一步處理。這樣,在產生每一個輸出的時候,都能夠做到充分利用輸入序列攜帶的資訊。而且這種方法在翻譯任務中取得了非常不錯的成果。

原理

完成流程

seq1
上圖是Seq2Seq模型+Attentionmo模型的完整示意圖。

現在的解碼過程(Decoder)是:
預測當前詞\(y_i\)需要當前時刻的\(h_i\)\(c_i\)上下文向量和上一時刻的輸出\(y_i\)
預測當前詞的\(h_i\)需要上一時刻的\(h_{i-1},y_{i-1}\)\(C_i\)

計算\(c_i\)

完整過程

seq1
上圖是計算\(c_i\)的完整過程示意圖
其中:\(c_i=\sum_{j=1}^{T_x}{\alpha_{ij}h_j}\),
\(T_x\)表示Encoder輸入文字的長度,
\(i\) 表示預測的第i個字元,
\(j\) 表示Encoder中第j個字元,
\(\alpha_{ij}\) 表示:輸入Encoder中的第j個字元對預測第i個字元的影響程度,
\(h_j\) 表示輸入Encoder的第j個字元的hidden state。
這個計算公式的本質意義就是將輸入字元的hidden state加權。重點是權重的計算方式。

seq1
上圖是計算\(c_i\)的圖形過程示意圖,之前的計算過程表示成圖形就是這個樣子的。

計算\(\alpha_{i}\)(也就是權重)

seq1
\(\alpha_{ij}=\frac{exp(e_{ij})}{\sum_{k=1}^{T_x}{exp(e_{ik})}} \quad\),底下分母的意義就是歸一化

\(e_{ij}=a(y_{i-1,h_j})\),意義就是將已經得到的預測輸出和輸入Encoder的文字做匹配計算,得到i時刻的輸出和j時刻的輸入之間的注意力分配關係。最後帶入上一個公式計算\(c_i\).

Attention分類

Soft Attention

就是我們剛才舉例的模型,使用輸入Encoder的所有hidden state加權取平均。

Hard Attention

使用概率抽樣的方式,選擇某個hiddenstate,估計梯度的時候也採用蒙特卡洛抽樣的方法。

teacher forcing

一般RNN執行的兩種mode:(1). Free-running mode;(2). Teacher-Forcing mode[22]。前者就是正常的RNN執行方式:上一個state的輸出就做為下一個state的輸入,這樣做時有風險的,因為在RNN訓練的早期,靠前的state中如果出現了極差的結果,那麼後面的全部state都會受牽連,以至於最終結果非常不好也很難溯源到發生錯誤的源頭,而後者Teacher-Forcing mode的做法就是,每次不使用上一個state的輸出作為下一個state的輸入,而是直接使用ground truth的對應上一項作為下一個state的輸入。
就拿Seq2Seq模型來舉例,我們假設正輸出到第三項,準備生成第四項:

nput = ['a', 'b', 'c', 'e', 'f', 'g', 'h']
output = ['o', 'p', 's', ...]
label = ['o', 'p', 'q', 'r', 's', 't', 'u']

Free-running mode下的decoder會將第三項錯誤的輸出 output[2] = 's'(下標從0開始)作為下一個state的輸入,而在Teacher-forcing mode下,decoder則會將正確樣本的第三項 label[2] = 'q' 作為下一個state的輸入。 當然這麼做也有它的缺點,因為依賴標籤資料,在training的時候會有較好的效果,但是在testing的時候就不能得到ground truth的支援了。最好的結果是將Free-running mode的behavior訓練得儘可能接近於Teacher-forcing mode。

Beam search

在測試階段,decoder的過程有兩種主要的解碼方式。第一種方法是貪婪解碼,它將在上一個時間步預測的單詞feed給下一步的輸入,來預測本個時間步長的最有可能的單詞。
但是,如果有一個cell解碼錯了詞,那麼錯誤便會一直累加。第二種是可能解碼方式,也就是beam-search的方法。即在decoder階段,某個cell解碼時不只是選出預測概率最大的symbol,而是選出k個概率最大的詞(例如k = 5,我們稱k=5為beam-size)。在下一個時間步長,對於這5個概率最大的詞,可能就會有5V個symbols(V代表詞表的大小)。但是,只保留這5V個symbols中最好的5個,然後不斷的沿時間步長走下去。這樣可以保證得到的decode的整體的結果最優。

Skip thought

是一種利用句子之間順序的半監督模型,利用一個encoder和兩個decoder,同時預測句子的上一句和下一句,訓練目標是使預測的上一句和下一句和label資料的error最小。

難點:句子的上一句和下一句可能的搭配情況非常多,即使是對於人來說也猜測上一句和下一句也是非常困難的事情,更何況是機器。