seq2seq模型詳解
在李紀為博士的畢業論文中提到,基於生成的閑聊機器人中,seq2seq是一種很常見的技術。例如,在法語-英語翻譯中,預測的當前英語單詞不僅取決於所有前面的已翻譯的英語單詞,還取決於原始的法語輸入;另一個例子,對話中當前的response不僅取決於以往的response,還取決於消息的輸入。其實,seq2seq最早被用於機器翻譯,后來成功擴展到多種自然語言生成任務,如文本摘要和圖像標題的生成。本文將介紹幾種常見的seq2seq的模型原理,seq2seq的變形以及seq2seq用到的一些小trick。
我們使用x={x1,x2,…,xn}代表輸入的語句,y={y1, y2, …, yn}代表輸出的語句,yt代表當前輸出詞。在理解seq2seq的過程中,我們要牢記我們的目標是:

即輸出的yt不僅依賴之前的輸出{y1, y2, …, yt−1},還依賴輸入語句x,模型再怎么變化都是在公式(1)的約束之下。
seq2seq最初模型
最早由bengio等人發表在computer science上的論文:Learning Phrase Representations using RNN Encoder–Decoder
for Statistical Machine Translation。對於RNN來說,x={x1,x2,…,xt}代表輸入,在每個時間步t,RNN的隱藏狀態ht由公式(1)更新:
其中,f代表一個非線性函數。這時ht就是一個rnn_size的隱含狀態。然后需要通過一個矩陣W將其轉成一個symbol_size的輸出,並通過softmax函數將其轉化為概率,然后篩選出概率最大的symbol為輸出symbol。

以上是rnn的基本原理,接下來介紹論文中的seq2seq模型:

模型包括encoder和decoder兩個部分。首先在encoder部分,將輸入傳到encoder部分,得到最后一個時間步長t的隱藏狀態C,這就是RNNcell的基本功能。其次是decoder部分,從上述模型的箭頭中可以看出,decoder的隱藏狀態ht就由ht−1,y和C三部分構成。即:

由此我們的到了decoder的隱藏狀態,那么最后的輸出yh_{t},y_{t-1}$和C,即:

到現在為止,我們就實現了我們的目標(1)。
seq2seq的改進模型
from:http://blog.csdn.net/Irving_zhang/article/details/78889364
改進模型介紹2014年發表的論文Sequence to Sequence Learning with Neural Networks。模型圖:

可以看到,該模型和第一個模型主要的區別在於從輸入到輸出有一條完整的流:ABC為encoder的輸入,WXYZ為decoder的輸入。將encoder最后得到的隱藏層的狀態ht輸入到decoder的第一個cell里,就不用像第一個模型一樣,而一個decoder的cell都需要ht,因此從整體上看,從輸入到輸出像是一條“線性的數據流”。本文的論文也提出來,ABC翻譯為XYZ,將encoder的input變為“CBA”效果更好。即A和X的距離更近了,更有利於seq2seq模型的交流。
具體來說,encoder的過程如下圖。這和我們之前的encoder都一樣。

不同的是decoder的階段:

得到了encoder represention,即encoder的最后一個時間步長的隱層ht以后,輸入到decoder的第一個cell里,然后通過一個激活函數和softmax層,得到候選的symbols,篩選出概率最大的symbol,然后作為下一個時間步長的輸入,傳到cell中。這樣,我們就得到了我們的目標(1)。
seq2seq with attention
我們前面提到,距離decoder的第一個cell越近的輸入單詞,對decoder的影響越大。但這並不符合常理,這時就提出了attention機制,對於輸出的每一個cell,都檢測輸入的sequence里每個單詞的重要性,即論文NEURAL MACHINE TRANSLATION
BY JOINTLY LEARNING TO ALIGN AND TRANSLATE。attention在NMT基於seq2seq的改進模型再進行改進,原理如下:

上圖中,encoder和decoder都發生了變化。首先說encoder,使用了雙向RNN,因為希望不僅能得到前向的詞的順序,還希望能夠得到反向的詞的順序。使用hj→代表hj前向的隱層狀態,hj←代表hj的反向隱層狀態,hj的最終狀態為將兩者連接(concat)起來,即hj=[hj→;hj←]。
再說decoder。我們再來回顧一下我們的目標公式(1):

對於加入attention機制的seq2seq,每一個輸出為公式(6)。即對於時間步i的輸出yi,由時間步i的隱藏狀態si,由attention計算得到的輸入內容ci和上一個輸出yi-1得到。

其中si是對於時間步i的隱藏狀態,由公式(7)計算。即對於時間步i的隱藏狀態,由時間步i-1的隱藏狀態si-1,由attention計算得到的輸入內容ci和上一個輸出yi-1得到。

通過以上公式可以看出,加入attention的seq2seq比之前的seq2seq多了一個輸入內容向量ci,那么這個ci是怎么得來的呢?和輸入內容以及attention有什么關系呢?我們接着看公式(8):

即,對於decoder的時間步長i的隱藏狀態si,ci等於Tx個輸入向量[1,Tx]與其權重αij相乘求和。這個權重αij由公式(9)得到:

其中,eij由公式(10)得到:

總結一下,對於時間步i的隱藏狀態si,可以通過求時間步i-1的隱藏狀態si-1、輸入內容的編碼向量ci和上一個輸出yi-1得到。輸入內容編碼ci是新加入的內容,可以通過計算輸入句子中每個單詞的權重,然后加權求和得到ci。直觀解釋這個權重:對於decoder的si和encoder的hj的權重\alpha_{ij}$,就是上一個時間步長的隱藏狀態si-1與encoder的hj通過非線性函數得到的。這樣就把輸入內容加入到解碼的過程中,這和我們人類翻譯的過程也是類似的,即對於當前輸出的詞,每一個輸入給與的注意力是不一樣的。
seq2seq with 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的整體的結果最優。
參考文獻:
(1)Learning Phrase Representations using RNN Encoder–Decoder
for Statistical Machine Translation
(2)Sequence to Sequence Learning with Neural Networks
(3)NEURAL MACHINE TRANSLATION
BY JOINTLY LEARNING TO ALIGN AND TRANSLATE
(5) 從頭實現一個深度學習對話系統–Seq-to-Seq模型詳解
(6) seq2seq學習筆記