seq2seq詳解

前言

我們通常使用RNN來對序列到序列問題建模,但是使用RNN建模,輸出序列的長度必須和輸入序列的長度相等。seq2seq框架很好地解決了這個問題。本文介紹了兩種最常見的seq2seq框架。若對RNN不熟悉,請參考我前兩篇文章:RNN詳解LSTM詳解


seq2seq介紹

seq2seq模型,全稱Sequence to sequence,由EncoderDecoder兩個部分組成,每部分都是一個RNNCell(RNN、LSTM、GRU等)結構。Encoder將一個序列編碼爲一個固定長度的語義向量,Decoder將該語義向量解碼爲另一個序列。

特點:輸入序列和輸出序列的長度是可變的,輸出序列長度可以不等於輸入序列長度。
訓練:對Encoder和Decoder進行聯合訓練,使給定輸入序列的目標序列的條件概率最大化。
應用:seq2seq模型可以在給定輸入序列的情況下生成目標序列,也可以對一對序列進行評分(以條件概率表示)。比如機器翻譯、文本摘要生成、對話生成等。


框架1

該框架由這篇論文提出:Cho et al.(2014) Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation。結構圖如下:

這篇論文另一大貢獻是提出了GRU,論文中Encoder和Decoder都是GRU。爲了表達方便,這裏我們假設Encoder和Decoder都爲RNN,來看一下seq2seq的公式:

Encoder

ht=tanh(W[ht1,xt]+b)ot=softmax(Vht+c) \begin{aligned} h_t &=tanh(W[h_{t-1},x_t]+b)\\ o_t &=softmax(Vh_t+c) \\ \end{aligned}

其中hth_t是隱藏狀態,oto_t是輸出。

Encoder輸出的語義向量:
c=tanh(UhT)c=tanh(Uh_T)

其中UU爲權重矩陣,hTh_T是Encoder最後的隱藏狀態(記錄了整個序列的信息)。

Decoder

ht=tanh(W[ht1,yt1,c]+b)ot=softmax(Vht+c) \begin{aligned} h_t &=tanh(W[h_{t-1},y_{t-1},c]+b)\\ o_t &=softmax(Vh_t+c) \\ \end{aligned}

接收到Encoder來的語義向量cc,首先輸入一個開始信號y0y_0(比如爲<START><START>),和一個初始化的隱藏狀態h0h_0,接下來就按照上面的公式一直傳遞下去。

注意:語義向量cc作用於Decoder的每一時刻。

h1=tanh(W[h0,y0,c]+b)o1=softmax(Vh1+c)h2=tanh(W[h1,y1,c]+b)o2=softmax(Vh2+c)            ...hT=tanh(W[hT1,yT1,c]+b)oT=softmax(VhT+c) \begin{aligned} h_1 &=tanh(W[h_0,y_0,c]+b)\\ o_1 &=softmax(Vh_1+c) \\ h_2 &=tanh(W[h_1,y_1,c]+b)\\ o_2 &=softmax(Vh_2+c) \\ & \ \ \ \ \ \ \ \ \ \ \ \ ...\\ h_T &=tanh(W[h_{T-1},y_{T-1},c]+b)\\ o_T &=softmax(Vh_T+c) \\ \end{aligned}

其中oto_t爲每個時刻的輸出,是一個向量,向量維度是詞表長度,向量中的每個值是對應單詞的概率。直到預測值<END><END>的概率最大時,結束預測。


框架2

該框架由這篇論文提出:Sutskever et al.(2014) Sequence to Sequence Learning with Neural Networks。這個框架也是最常用的一種,結構圖如下:

Encoder輸入序列A B C,生成語義向量cc作爲Decoder的初始隱藏狀態,Decoder中初始時刻輸入<EOS><EOS>作爲開始標誌,直至輸出<EOS><EOS>結束預測。

和框架1不同的是,該框架Encoder輸出的語義向量cc直接作爲Decoder的初始隱藏狀態,並不作用於之後的時刻。

這篇論文中使用LSTM作爲Encoder和Decoder,爲方便描述這裏用RNN作爲示範,公式爲:

Encoder

ht=tanh(W[ht1,xt]+b)ot=softmax(Vht+c) \begin{aligned} h_t &=tanh(W[h_{t-1},x_t]+b)\\ o_t &=softmax(Vh_t+c) \\ \end{aligned}

Encoder輸出的語義向量:
c=hTc=h_T

論文作者發現將輸入序列反轉後再輸入Decoder中效果會好很多,以下是由此得出的結論。
We conclude that it is important to find a problem encoding that has the greatest number of short term dependencies, as they make the learning problem much simpler.

Decoder

ht=tanh(W[ht1,yt1]+b)ot=softmax(Vht+c) \begin{aligned} h_t &=tanh(W[h_{t-1},y_{t-1}]+b)\\ o_t &=softmax(Vh_t+c) \\ \end{aligned}
其中h0=ch_0=c


總結

seq2seq框架先用Encoder將輸入序列編碼成一個固定大小的語義向量,這個過程是對信息壓縮的過程,不可不免地會損失很多信息,而且Decoder在解碼時無法關注到輸入序列的更多細節,這就引出了注意力機制,下篇文章講Attention。


References

[1] Cho et al.(2014) Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
[2] Sutskever et al.(2014) Sequence to Sequence Learning with Neural Networks
[3] seq2seq學習筆記

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章