深度學習對話系統理論篇--seq2seq入門

上篇文章我們介紹了DRL用於對話系統的應用,看完論文我們會發現,其是在一個Seq-to-Seq模型的基礎上進行重新訓練進而得到效果的提升,那麼自然我們會想到如何使用Seq-to-Seq模型構造基礎的對話系統呢,接下來我會使用幾篇文章來一步步介紹使用Seq-to-Seq構造對話系統過程中所用到的知識和代碼。首先讓我們從提出Seq-to-Seq模型的論文說起:

本文主要介紹下面幾篇Seq-to-Seq剛被提出時的幾篇文章:

  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
  4. Grammar as a Foreign Language
  5. On Using Very Large Target Vocabulary for Neural Machine Translation
  6. A Neural Conversational Model

這裡不會詳細的去介紹每一篇論文,而是從作者、時間線、模型結構、應用領域等幾個方面介紹一下,因為我在看別人博客、論文的過程中發現這幾篇論文總是會被提及,所以就簡單做一個總結,至於Seq-to-Seq模型的細節我會放在下一篇文章中進行詳細介紹。

Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation

論文地址:arxiv.org/pdf/1406.1078

發表於2014年6月份,作者是**Cho**、Bahdanau、Bengio,可以視為Seq-to-Seq的前身,目前引用量已高達1800+。

文章提出了一種RNN Encoder-Decoder的網路結構,如下圖所示:之所以說它可以看作是Seq-to-Seq的前身(個人理解),是因為本文並未實現end-to-end訓練,而是作為SMT翻譯框架中的一部分進行訓練。

從上圖可以看出,先使用一個RNN模型將輸入序列進行編碼得到最終的隱藏層狀態向量C作為輸入序列的向量表示,然後接下來使用另外一個RNN模型對C進行解碼,解碼過程中每一步的輸入是上一部的輸出yt-1、上一時刻隱層狀態ht-1和C向量,公式如下所示:

然後將所有輸出yt的概率相乘即是該序列的概率。然後計算loss、反向傳播即可完成對模型的訓練。該論文的應用場景是翻譯系統,也就是將一個源語言翻譯成另一個目標語言,「我愛你」-->「I Love You」,這恰好是Seq-to-Seq的使用場景。在一開始的時候Seq-to-Seq也是用於翻譯模型才慢慢被大家所重視,後來被應用到對話等領域中。而且,更重要的一點,本文是**GRU神經單元第一次提出的文章**,怪不得引用量這麼高==#

Sequence to Sequence Learning with Neural Networks

論文地址:arxiv.org/pdf/1409.3215

文章發表於2014年9月份,作者是**Sutskever**,就把他當做是第一篇Seq-to-Seq的論文吧,目前引用量是2640+。

文章所提出的Seq-to-Seq模型結構如下圖所示,同樣適用於翻譯模型,但是實現了end-to-end的訓練,使得模型更加簡單而且不需要特定領域知識和人工提取特徵,可以說是極大地促進了翻譯模型的發展,摒棄了SMT的框架,目前谷歌翻譯系統就是採用這種結構。

與上一篇文章不同的是,這裡Decoder部分的輸入不再是上一時刻的輸出和C向量,而是前一時刻的目標值,這樣做的好處是正確的輸入可以指導模型進行快速收斂併產生正確的輸出。當模型輸出<EOS>時,表明翻譯結束。可以看出來,模型的輸入包括三個,encoder_input:「ABC<EOS>」,decoder_input:「WXYZ」, decoder_label:「WXYZ<EOS>」。並使用下式作為目標函數進行訓練:

除此之外模型為了取得比較好的效果還是用了下面三個小技巧來改善性能:

  • 深層次的LSTM:作者使用了4層LSTM作為encoder和decoder模型,並且表示深層次的模型比shallow的模型效果要好(單層,神經元個數多)。
  • 將source進行反序輸入:輸入的時候將「ABC」變成「CBA」,這樣做的好處是解決了長序列的long-term依賴,使得模型可以學習到更多的對應關係,從而達到比較好的效果。
  • Beam Search:這是在test時的技巧,也就是在訓練過程中不會使用。一般來講我們會採用greedy貪婪式的序列生成方法,也就是每一步都取概率最大的元素作為當前輸出,但是這樣的缺點就是一旦某一個輸出選錯了,可能就會導致最終結果出錯,所以使用beam search的方法來改善。也就是每一步都取概率最大的k個序列(beam size),並作為下一次的輸入。更詳細的解釋和例子可以參考下面這個鏈接:zhuanlan.zhihu.com/p/28

最終的多層模型,結合一個具體事例來說明一下:

Neural Machine Translation by Jointly Learning to Align and Translate

論文地址:arxiv.org/pdf/1409.0473

文章同樣發表於2014年9月份,作者是**Bahdanau**(第一篇文章的二作),鼎鼎大名的NMT模型,想必大家都已經十分熟悉了吧,目前引用量是2440+。

文章所提出的Seq-to-Seq模型架構如下圖所示,亮點在於融入了Attention機制,很好的解決長序列的long-term問題,同樣用於翻譯系統,大大改善了模型的準確度。

傳統的Seq-to-Seq模型將source序列通過一個RNN模型編碼成一個固定維度的向量,但這對於長序列而言是遠遠不夠的,一個向量並沒有辦法編碼該序列所有包含的信息。所以作者提出將encoder RNN的每一個隱藏狀態都保存在一個列表中,在每次decode時,都取計算st-1與所有隱層向量之間的相關程度,然後對其進行加權求和得到ci向量,也就是說ci在每次解碼時都是不一樣的,它會自動尋找最相關的hi向量。計算公式如上圖所示。具體細節也會在下篇文章中進行介紹。

On Using Very Large Target Vocabulary for Neural Machine Translation

論文地址:arxiv.org/pdf/1412.2007

本文發表於2014年12月,作者是**Sebastien Jean**,Cho,主要是為了解決當vocab很大時計算速度慢的問題,提出了sampled softmax的方法,目前引用量是260+

首先指出當前NMT模型的兩個缺點:

  • target的vocab比較大時計算速度會很慢,因為輸出層需要計算vocab中每個詞向量與輸出向量之間的內積,非常耗時,所以一般把vocab控制在30000-80000之間。
  • 當前模型不在vocab中的單詞使用UNKNOWN符號代替,所以當target中UNKNOWN佔比較大時,效果很差,翻譯出來的結果會有很多UNKNOWN符號。

當前存在的解決方案:

  • 基於模型的方法,model-specific:這種方法減少了訓練時的計算量,但是在預測時,仍然需要計算全部的target單詞
    • 近似估計目標次詞的概率
    • 將vocab中所有目標詞進行聚類
  • 基於翻譯的方法,translation-specific:基於翻譯任務的特殊性而提出的改進方案。比如將source和target兩兩對應起來,使用OOV來表示,這樣在翻譯結果中出現OOV時,就用source所對應的target來代替。

本文提出的也是model-specific的方法,可以將計算複雜度變成常數級別。如下圖所示,計算量主要集中在Z上,因為他需要遍歷整個vocab,所以改進的思路就是採樣一部分vocab V來近似估計計算Z值,這樣就可以將計算複雜度降低到O(V)。但是V必然是不能隨便選的,不然會導致無法收斂。所以需要根據訓練數據提前劃分出很多個V,具體的劃分方案就不在這裡贅述了。感興趣的同學可以具體看論文。

Grammar as a Foreign Language

論文地址:arxiv.org/pdf/1412.7449

本文同樣發表於2014年12月份,作者是**Oriol Vinyals**,是第一篇將Seq-to-Seq運用到句法分析問題上,目前引用量是280+。

傳統的句法分析器都是使用解析樹的方法實現,但是本文使用Seq-to-Seq模型實現了端到端的訓練,將解析樹通過深度優先遍歷的方法表示成一行文本,這樣就可以作為Seq-to-Seq的輸出進行訓練。模型上到沒有什麼新奇的地方,使用的就是NTM的模型,多層LSTM+Attention+Dropout即可實現很好的效果,示意圖如下所示:

A Neural Conversational Model

論文地址:arxiv.org/pdf/1506.0586

本文發表於2015年6月份,作者還是**Oriol Vinyals**,看得出來作者是致力於推廣Seq-to-Seq到各個領域,同樣是第一篇用於對話的論文,目前引用量為250+。

其實論文很簡單,模型架構上完全沒有任何創新,短短几頁紙還全是實驗結果截圖展示,但也耐不住人家是開山之作啊。模型和結果如下圖所示,就不詳細解釋了。

總結

介紹了幾篇Seq-to-Seq模型的開山之作,主要是為了了解一下其發源,因為看論文是老是會提到這麼幾篇所以就一塊介紹下。可以看得出來Seq-to-Seq模型從一開始在機器翻譯領域被提出,到後來被廣泛應用到NLP各個領域,原因就在於其對序列數據的完美使用,而且解決了以前RNN模型輸出維度固定的難題,所以很快得到了推廣。接下來應該會介紹其他幾篇將Seq-to-Seq運用到對話系統的文章,這裡不展開,因為本文介紹的幾篇文章主要是為了引入Seq-to-Seq模型並把它帶入到對話系統領域。

參考文獻

  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
  4. Grammar as a Foreign Language
  5. On Using Very Large Target Vocabulary for Neural Machine Translation
  6. A Neural Conversational Model

推薦閱讀:

自然語言處理的智能問答(QA)和智能對話(conversation)哪一個更有前景?
Recurrent Convolutional Neural Networks for Text Classification
讓問答更自然 - 基於拷貝和檢索機制的自然答案生成系統研究 | 論文訪談間 #02
深入NLP——看中文分詞如何影響你的生活點滴
什麼是自編碼?

TAG:深度学习DeepLearning | 自然语言处理 | chatbot |