目錄
- Seq2Seq介紹
- 原理解析和進化發展過程
- Seq2Seq的預處理
- seq2seq模型預測
一句話簡介:2014年提出的Seq2Seq(Sequence to Sequence), 就是一種能夠根據給定的序列,通過特定的方法生成另一個序列的方法。 一般用於機器翻譯,圖片描述,對話等場景。早期基本上基於LSTM,后面發展使用attention。
一、Seq2Seq介紹
來源:所謂最早由兩篇文章獨立地闡述了它主要思想,分別是Google Brain團隊的論文【2】和Yoshua Bengio團隊的論文【1】。這兩篇文章不謀而合地提出了相似的解決思路,Seq2Seq由此產生。
應用場景:
- 機器翻譯(當前最為著名的Google翻譯,就是完全基於Seq2Seq+Attention機制開發出來的)。
- 聊天機器人(小愛,微軟小冰等也使用了Seq2Seq的技術(不是全部))。
- 文本摘要自動生成(今日頭條等使用了該技術)。
- 圖片描述自動生成。
- 機器寫詩歌、代碼補全、生成 commit message、故事風格改寫等。
二、原理解析和進化發展過程
2.1 論文【1】和【2】的基礎版本
首先,我們要明確Seq2Seq解決問題的主要思路是通過深度神經網絡模型(常用的是LSTM)將一個作為輸入的序列映射為一個作為輸出的序列,這一過程由編碼輸入(encoder)與解碼輸出(decoder)兩個環節組成。這里我們必須強調一點,Seq2Seq的實現程序設計好之后的輸入序列和輸出序列長度是不可變的。
圖1. 論文[1] 模型按時間展開的結構
論文[1]Cho et al. 首次提出了 Gated Recurrent Unit (GRU)這個使用頻率非常高的 RNN 結構。還提出 Encoder-Decoder 這樣一個偉大的結構以外,其中 Encoder 部分應該是非常容易理解的,就是一個RNNCell(RNN ,GRU,LSTM 等,當然也可以是比如CNN/RNN/BiRNN/Deep LSTM等) 結構。每個 timestep, 我們向 Encoder 中輸入一個字/詞(一般是表示這個字/詞的一個實數向量),直到我們輸入這個句子的最后一個字/詞 XT ,然后輸出整個句子的語義向量 c
(一般情況下, 是最后一個輸入)。因為 RNN 的特點就是把前面每一步的輸入信息都考慮進來了,所以理論上這個 c 就能夠把整個句子的信息都包含了。
論文[1] 中的公式表示如下:
yt的條件概率
f 函數結構應該是一個 RNNCell 結構或者類似的結構(論文[1]原文中用的是 GRU);g函數一般是 softmax (或者是論文 [4] 中提出的 sampled_softmax 函數)
注意到這里的c 不僅僅作用在第一個詞,而是作用到所有的詞,對比論文[2]只作用在第一個詞上,其Decoder 預測第 t 個 timestep 的輸出時可以表示為:
圖2. 論文[2] 模型結構
論文 [2]Sutskever et al. 也是我們在看 seq2seq 資料是最經常提到的一篇文章, 在原論文中,上面的Encoder 和 Decoder 都是 4 層的 LSTM,但是原理其實和 1 層 LSTM 是一樣的。原文有個小技巧:應用在機器翻譯中的,作者將源句子順序顛倒后再輸入 Encoder 中,比如源句子為"A B C",那么輸入 Encoder 的順序為 "C B A",經過這樣的處理后,取得了很大的提升,而且這樣的處理使得模型能夠很好地處理長句子。此外,Google 那篇介紹機器對話的文章(論文[5] )用的就是這個 seq2seq 模型。
在 CS224n lecture1 中, 也介紹了論文[2]的這個模型,下圖是該課件中展示的模型結構。原文中提到的模型是 4 層的,課件上只是展示了三層,但是已經足夠幫助我們理解模型結構了。
圖3. 多層LSTM的 seq2seq 模型結構(來自 CS224n lecture1)
2.2 論文【3】和【4】的升級版本
論文[3] Bahdanau et al. (已經被應用千次)是在 Encoder 和 Decoder 的基礎上提出了注意力機制。在上面提到的結構中,有個缺點:如果句子很長的話,c 未必能把所有的信息都保留好,所以就有了 Attention Model 這樣一種東西出現了,它的出現讓機器翻譯的效果大大地提升了。引入注意力機制的原理其實還是挺好理解的:
圖4. 論文[3] 模型結構
在論文[1] 的 decoder 中,每次預測下一個詞都會用到中間語義 c,c主要就是最后一個時刻的隱藏狀態。在論文[3] 中,我們可以看到在Decoder進行預測的時候,Encoder中每個時刻的隱藏狀態都被利用上了。這樣子,Encoder 就能利用多個語義信息(隱藏狀態)來表達整個句子的信息了。關於Attention后續文章將繼續討論,這里不展開描述。
此外,在論文[3] 中,Encoder用的是雙端的 GRU,這個結構其實非常直觀,在這種 seq2seq 中效果也要比單向的 GRU 要好。至於模型的細節可以看原論文來進行理解,在這里我就不做展開,也可以參考文末的【10】。
論文【3】中,
解釋:對於時間步i的隱藏狀態si,可以通過求時間步i-1的隱藏狀態si-1、輸入內容的編碼向量ci和上一個輸出yi-1得到。輸入內容編碼ci是新加入的內容,可以通過計算輸入句子中每個單詞的權重,然后加權求和得到ci。直觀解釋這個權重:對於decoder的si和encoder的hj的權重,就是上一個時間步長的隱藏狀態si-1與encoder的hj通過非線性函數得到的。這樣就把輸入內容加入到解碼的過程中,這和我們人類翻譯的過程也是類似的,即對於當前輸出的詞,每一個輸入給與的注意力是不一樣的。
圖5. 引入AM模型的Encoder-Decoder框架
論文[4]介紹了機器翻譯在訓練時經常用到的一個方法(小技巧)sample_softmax ,主要解決詞表數量太大的問題。
三、Seq2Seq的預處理
最后,我們要說的還有一點關鍵的預處理工作。NLP乃至人工智能處理的數據都是數字,那么這里的文字該怎么處理呢?我們都知道OneHot,TF-IDF,詞袋法等等都可以將文檔數值化處理。我們通常的預處理步驟如下:
- 首先我們假設有10000個問答對,統計得到1000個互異的字以及每個字對於出現的次數。
- 根據統計得到的這1000個字,按照次數從多到少進行排序,序號從0開始到999結束(得到我們的字典表ids)。
- 對於問答對,進行One-Hot編碼。
- 由於One-Hot編碼的維度較大且0較多,因此我們進行embedding降維(具體維數自定義)得到我們的特征矩陣。
四、seq2seq模型預測
在准備訓練數據集時,我們通常會在樣本的輸入序列和輸出序列后面分別附上一個特殊符號"<eos>"(end of sequence)表該序列的終止。為了便於討論,設輸出本詞典Y(包含特殊符號"<eos>")的大小為|Y|,輸出序列的最大長度為T′。所有可能的輸出序列共有 種 ,下面討論三種方式:
圖6. 預測模型
使用全局搜索將會得到最優解,ACB。
4.1 窮舉搜索
就是所有的輸出詞典單詞進行組合,這樣有 種可能性,雖然能得到最優解,但是隨着輸出的增大,將呈現指數增長形式。
4.2 貪婪搜索
在每個時間步,貪婪搜索選取條件概率最大的詞,其復雜度 。因此圖7中使用貪婪搜索,將只能得到ABC這種序列。
5.3 束搜索
束搜索(beam search)是對貪婪搜索的一種改進算法。它有束寬(beam size)超參數。我們將它設為 k。在時間步 1 時,選取當前時間步條件概率最大的 k 個詞,分別組成 k 個候選輸出序列的詞。在之后的每個時間步,基於上個時間步的 k 個候選輸出序列,從 k |Y| 個可能的輸出序列中選取條件概率最大的 k 個,作為該時間步的候選輸出序列。
圖7. 束搜索
上圖中束寬為2,輸出序列最大長度為3。候選輸出序列有A、C、AB、CE、ABD和CED。我們將根據這6個序列得出最終候選輸出序列的集合。在最終候選輸出序列的集合中,我們取以下分數最大的序列作為輸出序列:
其中 L 為最終候選序列長度,α 一般可選為0.75。分母上的 Lα 是為了懲罰較長序列在以上分數中較多的對數相加項。分析可知,束搜索的計算開銷介於貪婪搜索和窮舉搜索的計算開銷之間。此外,貪婪搜索可看作是束寬為 1 的束搜索。束搜索通過靈活的束寬 k 來權衡計算開銷和搜索質量。
備注:后續再考慮細讀論文和實現問題。
參考文獻
【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】Bahdanau et al., 2014. Neural Machine Translation by Jointly Learning to Align and Translate
【4】 Jean et. al., 2014. On Using Very Large Target Vocabulary for Neural Machine Translation
【5】 Vinyals et. al., 2015. A Neural Conversational Model[J]. Computer Science
【6】EMNLP 2015 [1509.00685] A Neural Attention Model for Abstractive Sentence Summarization
【7】基礎學習: https://blog.csdn.net/qq_32241189/article/details/81591456
【9】趣味閱讀-神經網絡和seq2seq: http://www.dataguru.cn/article-9779-1.html?utm_source=tuicool&utm_medium=referral
【10】自然語言處理中的Attention Model:是什么及為什么 https://blog.csdn.net/malefactor/article/details/50550211
【11】最新代碼和理論:https://zhuanlan.zhihu.com/p/57155059 和