Dialog System 總結

轉自:http://blog.csdn.net/abcjennifer/article/details/53428053

本文包括對話系統分類、數據彙總、和一些目前對話系統paper的總結、評價。 
以下paper的“一句話評論”均爲個人觀念,評價標準苛刻,也有可能誇大了論文的缺點,希望與持不同意見的各位有識之士共同討論。

對話系統分類

對話系統按功能性分爲goal-driven dialog system(比如功能機器人,Contana,出門問問)和open domain dialog system(比如閒聊機器人,小冰)。

PS:個人從產品角度覺得功能性機器人才是有用的,陪你聊天的機器人是僞需求,然而事實證明我錯了,剛好相反,度祕的log分析表明能夠留下用戶聊10分鐘的都是被他們調戲的閒聊話題,而且大量流量都是來閒聊的。

本文主要從數據、模型/算法方面看一看現在paper裏的對話系統,是。。。怎樣的不靠譜。。。

Data

綜述見文章Dialog data survey 。在後面Papers一章中也會介紹每篇所用的數據,但靠譜的數據總是少的。微博、twitter、貼吧上的數據噪聲太大;人造/合成數據太容易被擬合; 
survey

Papers

Neural Responding Machine for Short-Text Conversation

一句話評論:數據靠譜;方法現在來看無創新,但易實踐; 
李航老師團隊發在ACL 15的paper。 
data: 微博數據, 每句限長140個字。每條微博有平均20條回覆,共約22w個微博,也就是約440w條問答對。 
方法:帶attention的seq2seq翻譯模型

Conversational Contextual Cues: The Case of Personalization and History for Response Ranking

一句話評論:數據很好,方法還算靠譜,不過是answer selection(因爲answer selection需要大量備選語聊,而且,看起來還ok的結果是蒙對了呢還是真ok呢? 這些都不清楚,所以認爲answer selection的做法本質上不是人工智能)。

Google的論文,對Reddit上的評論進行end-to-end的建模, 最後選用answer selection(而不是generation)的方式輸出每一次對話的sentence,出發點兩方面:對文本內容和personalization建模. 
數據:Reddit上的1.33億conversation,共21億句對話。 
模型如下圖所示:

這裏寫圖片描述

網絡輸入input:dialog[i], context: dialog[0:i-1], author: 該評論作者的feature, 
response: 正樣本,response = 真實dialog[i+1], 此時輸出final prediction=1. 負樣本,response = 隨機的一條其他地方的comment,此時輸出final prediction = 0. 其中dialog[i]表示對話過程中的第i句話。

另外,文章還提出了multi-loss的方法,旨在度量以上網絡中每個feature的有效性。分別對組合{response, input}, {response, context}, {response, author}求一個hidden layer, 將這3個hiddenlayer{h1, h2, h3} concatenate成一個總hidden layer h4, 將{h1, h2, h3, h4}分別得到的分類loss加和作爲網絡總loss進行優化,但最後prediction的時候只採用h4的輸出結果。

Building End-To-End Dialogue Systems Using Generative Hierarchical Neural Network Models

一句話評論: end2end,模型看着挺炫,但不一定好使

https://arxiv.org/pdf/1507.04808v3.pdf

seq2seq的典型方法,用前N-1句話生成第N句話。假如說現在A, B對話內容是:a1,b1,a2,b2, 其中每個都表示一句話

a1 -> [emb[word] for word in a1] -> RNN(a1
b1 -> [emb[word] for word in b1] -> RNN(b1
a2 -> [emb[word] for word in a2] -> RNN(a2
b2 -> [emb[word] for word in b2] -> RNN(b2)

本文重點是說,除了上面寫的每句一個RNN,還加了一個句子之間的RNN:

  • RNN(a1)預測 b1
  • RNN(a1b1) 預測 a2
  • RNN(a1b1a2)預測 b2
  • 這裏的箭頭表示再過一個句子之間的RNN

PS: 廣告下,這個功能已經在paddle裏實現了,可以直接調用recurrent_group層。

這裏寫圖片描述

然而,我的實驗結果中證明,醬紫做並沒有我把原始輸入串聯起來的效果好。解釋起來也可以合情合理,畢竟相比串聯,雙層RNN的信息傳遞是有損的。

A Hierarchical Latent Variable Encoder-Decoder Model for Generating Dialogues

一句話評論:數據強,方法一般

在上一篇HRED(hierarchical encoder decoder model)的基礎上,在decoder中加了一個latent variable。這個latent variable 根據當前對話的前n-1句話建立多元正態分佈,與前n-1句話&第n句話的前m-1個已生成word一起共同影響第n句話第m個word的生成。通過這個latent variable(表示隱狀態)可能可以提高整體dialog隨機性。

這裏寫圖片描述

數據:本文用了① Twitter Dialog Corpus, 含95w個對話,平均每個對話含6句話。 ② Ubuntu Dialogue Corpus, 含50w個對話,和ubuntu相關的專業問題。

End-to-End Generative Dialogue

開源了基於lua實現的代碼: 
https://github.com/michaelfarrell76/End-To-End-Generative-Dialogue

分別用hierarchy RNN(和上文一樣)和沒有hierarchy的RNN(就是純seq2seq)在電影對白數據集上做了一些實驗。論文中實驗結果可參考,但是感覺這份數據很不乾淨,結果也可能是有偏的。

此外,本文還採用了Jiwei Li 提出的,加入maximum mutual information(MMI)作爲額外度量篩選結果的方法。因爲對話系統容易生成簡單的,無區別性的回答,如“I don’t know.” 這種回答的perplexity會很小(越小越好),影響判斷, 但MMI會考慮到信息相關性。

MemN2N based dialog system

FB 的一撥人先後搞了Memory Network和End-to-End Memory Network,接着又把這個結構用到了對話,就有了paper Learning End-to-End Goal-Oriented Dialog。 爲了更好地理解,我們把這三篇文章簡單串一下。

Memory Network

Memory Network只是一個框架,不帶有任何神經網絡的實現,就類似於Alex Graves 14年的Neural Turing Machine, 只是給出瞭如何尋址、記錄、讀取、改寫memory的策略,而並沒有提及具體網絡實現和memory用在哪。

End-to-End Memory Network

End-to-End Memory Network基於Memory Network具體化出來了一個比較簡單的網絡,使其能夠end-to-end, 並通過bp訓練。具體例如在QA問題上,如下圖(a)所示。 
給定sentences(就是evidence)和query, 求answer。 
1. sentences xi表示有M個evidence,爲了將這個evidence的句子集合表示在網絡裏,對每句話的BOW分別embedding得到memory dM, d表示embedding size。 
2. u表示query的embedding,同樣size爲d。 
3. 通過attention得到query和M個memory entry中每條memory的相關性(pi=Softmax(uTmi)),並算出當前有用的memory信息(o=ipimi)。 
4. 接着讓controller結合query和有用memory信息(q2=o+u),再做個softmax得到最終predicted answer(a=Softmax(W(q2)))。 
上面這四步可以通過stack的方式重複多次,每個stack採用不同的word embedding,併疊加, 如下圖(b)所示。 
img

關於實驗部分,用的是人造的QA數據。。。不過這20類問題分類結果倒是值得一看的(見原文Table 1)。

Learning End-to-End Goal-Oriented Dialog

一句話評論:數據較弱,方法不實用。

本文就是End-to-End Memory Network的一個應用,基於End-to-End Memory Network的實驗,最終也是answer selection(而不是answer generation). 數據爲以餐館預訂爲目的地bAbI數據集,模型定義得非常個性化,難以遷移。

  1. 對話數據:文中所用數據並非全部爲真實數據,有5個task都是simulated conversation. simulation的方法是,用43種pattern生成user utterance,用20種pattern生成bot utterance。(顯然,和真實場景比還是太少了。。。)另一組真實task數據是從Dialog State Tracking Challenge的訂餐數據中轉過來的(並沒有用數據中標註的dialog state)。
  2. Database: 每個restaurant的property包括:{口味,地點,價格區間,桌子大小(int,不是list),地址,電話,打分}
  3. network:網絡結構和 End-to-End Memory Network中的網絡結構一模一樣,其中給定的sentence xi爲{user的前n-1句話和bot的前n-1句回答},query爲user的第n句話。不同之處是,End-to-End Memory Network這篇文中的output是一個word,softmax最後的embeddingq2就ok了,但dialog是要生成整句話。這裏,文中並沒有採用生成,而是用的在一些給定回答中選一個score最高的。那給定回答怎麼來的呢?給定回答是所有可能說的話和API calls。也就是說,得把Database中的7個type,填入剛纔說的那20個pattern,線下生成所有可能說的話,和API calls,可以說是。。。非常的。。。task-oriented.
  4. OOV問題:在問題中經常會有電話號碼和一個沒見過的餐廳名之類的,這種要麼成了OOV,要麼就會分不開(因爲embedding相近)。這種問題,本文的解決方法是,反正如第3點最後所說,已經生成了所有可能的utterance了,那就處理每個possible utterance yi, 求yi與當前這個對話中所有之前說的keyword(在knowledge base中的word)的交集, 然後將交集word所屬的類別(總共就7個類別,如第2點database所說)的embedding都加到yi的feature中,再求yi的score。

Evaluating Prerequisite Qualities for Learning End-to-End Dialog Systems

一句話評論:數據較靠譜,方法不實用。 
Facebook在Reddit電影板塊對話中,基於Memory Network做了QA、對話、推薦等5個任務,並與其他方法進行了比較。這裏我們僅看對話吧。 
- 任務目標:討論電影 
- 數據:Reddit 上爬的1M個對話,其中76%是單輪的,17%是兩輪的。 
- 模型:memory中包含歷史對話信息和keyword(通過過濾掉高頻詞產生的)在kb中檢索到的句子。最後出的final prediction 句子依然是選用answer selection的方式。但和上一個工作相比,這個case裏的selection更不合理。answer candidate集合是從上面1M個對話中隨機選取的1w個對話中的回答,外加一個真實回答。最終anwser也就是一個10001類的分類問題。

這裏寫圖片描述

End-to-end LSTM-based dialog control optimized with supervised and reinforcement learning

一句話評論:數據太弱,但整體結構還算靠譜。

本文結合supervised learning 和 reinforcement learning, 
1. 定義text action & API calls集合 
2. rnn訓練對話數據 
3. bot生成response, expert進行糾正 
4. bot生成response,和普通人交互,給出reward/punishment

任務:給某人打電話,如果通訊錄裏有多個電話,詢問類別,確認後再打。 
model: 如下圖所示

這裏寫圖片描述

共13步: 
1. 用戶提供Utterance(也就是一句話)。 
2. 從Utterance中提取Entity。 
3. Entity Input模塊從提取的Entity中Resolve數據庫中具體的Entity。 
4. 從(2)、(3)以及API Call,以及(10)模塊的輸出提取一組Feature Vector。 
5. Feature Vector輸入到LSTM裏,輸出一個Template Action的Distribution。 
6. 從Developer來的Code產生Action Mask,比如當電話號碼還沒Identity的時候要mask掉打電話操作。 
7. 把需要mask的action,概率置零。 
8. 重新把(7)的結果Re-normalize。 
9. 從Distribution中選出一個Action。(無RL模式下,選最大概率的action;有RL模式下,從概率分佈裏採樣) 
10. 進入Entity Output模塊,進行Entity替換。 
11. 如果現在的Action是API,那走(12)。如果是Text,就走(13)。 
12. 調用程序員寫好的API接口。 
13. 返回文字,等待用戶再次輸入。

結構清晰,符合邏輯。而且基本上只有database,action mask和API需要developer提供。 
但,在experiment中,領域專家需要提供少量對話樣本(非常少,本文中只給了21個對話樣本,對話平均長度7個turns),且文章聲明, 通過supervised learning 僅需20個對話樣本就可以把LSTM訓到per-turn accuracy達到90%。在此存疑,那應該是語法結構非常簡單吧,果不其然,如附錄所示,21個對話從語法結構和action flow方面看都很簡單,必然容易擬合住,而且文中說到,step4的feature只有112維,而且包含“有幾個名叫xxx的” & “xxx存有幾個電話”這種feature,並不含有複雜語義信息。

Reinforcement Learning部分中,本文在supervised learning基礎上進行訓練,順利完成任務的return=1, else=0。 結論是RL和SL能夠相互輔助。

Sequence to Backward and Forward Sequences: A Content-Introducing Approach to Generative Short-Text Conversation

一句話評論:數據雖大,但百度貼吧的noise太大;方法一般,只支持單輪短文本問答,也是沒有KB。 
方法:本文分類兩步:1. 提取keyword 2. seq2BF 
第一步中,通過statistical的方法(最大互信息)找出response中和query最相關的word,且要求keyword爲名詞,記爲keyword。 
第二步中,原來的response被keyword一分爲二,作者就希望通過query和keyword,分別以兩個sub網絡逆序地輸出前半部分,正序地輸出後半部分。seq2BF指seq2 backward & forward,也就是分別訓練output的正逆序輸出。

這裏寫圖片描述

數據:dialog數據:百度貼吧上爬的50w問答對。另外爲了方法中的第一步(statistical 部分),還用了100M問答對。

本文的賣點主要就在提出來keyword然後分爲前後兩部分這塊,但貼吧的數據噪聲實在太大了,而且。。。在文中給的一些examples裏我並沒有看到明顯的keyword,不過這樣做確實可以解決response中有OOV的問題,只是不夠普適。

A Network-based End-to-End Trainable Task-oriented Dialogue System

一句話評論:數據靠譜但量不大,方法靠譜。

這裏寫圖片描述

任務:找餐館 
數據:衆標,標了680輪對話,共1500個turns,都是人工寫的。db中有99家餐廳,可根據 口味/地點/價格(這三個叫informable slot) 查詢餐廳, 選定餐廳後可查詢 電話、郵編等其他6項(這6個叫requestable slot)信息。 
模型: 
① Intent network 根據source query得到user intent vector; 
② Belief Tracker 得到每個 informable slot的多元概率分佈,和每個requestable slot的二項分佈。用於在db中檢索。 
③ Database Operator 數據庫中根據 informable slot項檢索, 返回一個vector,符合的entry記爲1,其他爲0,entity指針指向vector label爲1中的一個餐廳(這個pointer到Generation Network中用到)。 
④ Policy Network 融合①,②,③中得到的vector,得到新的vector,表示當前狀態 
⑤ Generation Network 用seq2seq的方法,根據④得到的vector 生成整句話,然後用③中pointer所指向的db中的那個entity替換句中的一些項。

整個過程可追溯,出了badcase可以知道是哪個模塊可以再進行優化;文中雖然用了”Policy Network”,也不是Reinforcement Learning裏的策略,容易遷移;推薦。

發佈了36 篇原創文章 · 獲贊 39 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章