乾貨 | 論文解讀:基於動態詞表的對話生成研究

微軟研究院AI頭條發表於2018-01-09

mmbizgif?wxfrom=5&wx_lazy=1


編者按:近年來,聊天機器人在飛速發展,很多人也對機器人的對話系統產生了很大興趣。近期,北京航空航天大學—微軟亞洲研究院聯合培養博士生吳俁應邀參加了PaperWeekly優質論文線上直播分享活動,帶大家回顧了近幾年來聊天機器人的發展,對比了檢索式和生成式聊天機器人的優缺點,並以第一作者的身份解讀了北京航空航天大學和微軟亞洲研究院在AAAI 2018上發表的有關基於動態詞表對話生成研究的論文Neural Response Generation with Dynamic Vocabularies。 一起來看看吧!文章轉載自公眾號“PaperWeekly”。


分享實錄回放


640.png?wxfrom=5&wx_lazy=1

淺析對話系統


?wx_fmt=jpeg


對話系統主要分為兩類,一類是任務型,另一類是非任務型。任務型對話系統主要應用於企業客服、訂票、天氣查詢等場景,非任務型驅動對話系統則是指以微軟小冰為代表的聊天機器人形式。 


之所以強調這一點,是因為今年我在ACL發表了一篇論文,有同學發郵件問我為什麼參考了論文和原始碼,還是無法讓聊天機器人幫忙訂披薩。我只能說,目前聊天機器人實在種類繁多,有的機器人只負責閒聊,有的機器人可以幫你完成某些特定任務。 


本次 Talk 會更側重於介紹閒聊機器人,也就是非任務驅動型對話系統。首先我想給大家推薦一篇關於聊天機器人的綜述文章 — A Survey on Dialogue Systems: Recent Advances and New Frontiers。


這篇文章來自京東資料科學團隊,是一篇較為全面的對話系統綜述,其中引用了 121 篇相關論文,並對論文進行了歸類。不僅非常適合初學者,也能讓大家對聊天機器人領域有一個更為全面的認識。

?wx_fmt=jpeg


面向任務的對話系統主要分為知識庫構造、自然語言理解、狀態跟蹤和策略選擇。針對知識庫構造,假設我們的使用場景為酒店預訂,那首先我們需要構建一些和酒店相關的知識,比如酒店房型、報價以及酒店位置。


具備了這些基礎知識之後,接下來就需要展開對話,通過自然語言理解去分辨問題型別(酒店型別、房間型別等)。確認好相關型別後,我們需要藉助 policy 模組,讓系統切換到下一個需要向使用者確認的資訊。更直觀地說,我們需要循循善誘引導使用者將右表資訊填寫完整。


640.png?

聊天機器人型別


?wx_fmt=jpeg


普遍來說,聊天機器人主要分為兩類,我認為準確來說應該分為三類。


比較早期的研究基本屬於第一類:基於模板的聊天機器人,它會定義一些規則,對你的話語進行分析得到某些實體,然後再將這些實體和已經定義好的規則去進行組合,從而給出回覆。這類回覆往往都是基於模板的,比如說填空。


除了聊天機器人,這種基於模板的文字形成方式還可以應用於很多其他領域,比如自動寫稿機器人。


目前比較熱門的聊天機器人應該是另外兩類,一類是檢索型,另一類則是生成型。檢索型聊天機器人,主要是指從事先定義好的索引中進行搜尋。這需要我們先從網際網路上獲取一些對話 pairs,然後基於這些資料構造一個搜尋引擎,再根據文字相似度進行查詢。


生成型聊天機器人目前是研究界的一個熱點。和檢索型聊天機器人不同的是,它可以生成一種全新的回覆,因此相對更為靈活。但它也有自身的缺點,就像圖中的嬰兒那樣,它有時候會出現語法錯誤,或者生成一些沒營養的回覆。


?wx_fmt=jpeg


檢索型聊天機器人首先需要構建一些文字和回覆的 pairs,然後再訓練匹配模型,上線之後先做檢索再做匹配。相似度演算法有很多種選擇,現在一般都採用深度學習,如果是做系統的話,肯定需要融合很多相似度的特徵。


?wx_fmt=jpeg


生成模型大多都是基於 Seq2Seq 框架進行修改,所謂萬變不離其宗,不管大家怎麼做,都會是以這個框架為基礎。文字生成也是如此,在 RNN 語言模型和 Seq2Seq 出來之後,幾乎所有生成模型都是基於這個框架。即使把 RNN 換成 CNN 或 Attention is All You Need,也仍然離不開這個框架。


?wx_fmt=png


檢索型VS生成型


檢索型聊天機器人的最大優點在於它的回覆多樣且流暢,其次,這個系統對程式設計者的入門門檻較低。即使你對深度學習和自然語言處理不甚瞭解,但只要你善於寫程式碼,並且能從網上抓取一定量的資料,就可以搭建一個檢索型聊天機器人。


另外,對於研究人員來說,檢索型聊天機器人比較易於評測,藉助 MAP、MRR、NDCG 等傳統資訊檢索方法即可完成。 


檢索型聊天機器人的缺點在於它過於依賴資料質量。如果你抓取的資料質量欠佳,那就很有可能前功盡棄。


就工業界來說,要評估某個檢索型聊天機器人,首先我們會看其背後的排序演算法,其次不能忽略的則是資料質量和規模,最後再看其回覆資料是否足夠有趣,以上幾個因素共同決定著檢索型聊天機器人的整體質量。 


生成模型的最大優勢在於有一套通用 code,可以忽略語言直接開跑。只要在某種語言上跑得較為順利,就可以將其應用到所有語言上。


很多人認為 safe responses 是生成式聊天機器人的一個缺點,但其實從某種角度上來說,這也是它的一個優點。相比檢索型聊天機器人,它生成的回覆質量較為穩定。


生成模型的另一個優點是,它非常容易實現多輪對話,並且能夠偏向於某種情感。假設我希望生成一句高興的話,那麼用生成模型會比檢索模型更容易實現。 


對於早期的研究者來說,生成模型的最大缺點在於它的回覆較為單一。其次,由於缺乏自動評評測手段,研究人員難以對生成式聊天機器人進行評估。一個模型的好壞,更多需要靠人進行標註。此外,對工業界而言,生成式聊天機器人的門檻會相對較高。


?wx_fmt=png


怎樣提高生成的多樣性


?wx_fmt=jpeg

?wx_fmt=jpeg

第一種方法是將模型做得更復雜,比如上圖這篇論文使用了 latent variable 來解決 boring responses 這個問題。

?wx_fmt=jpeg

上圖中的論文,則是在生成時將概率 bias 到一些特定的主題詞。假設某個詞是主題詞,我們就在生成過程中相應提高它被選中的概率。


?wx_fmt=jpeg

第二個流派是採用重排序方法,目前最簡單有效的方法是先用生成模型生成大量回復,再用分類器對回覆進行排序,排名越靠前效果越好。只要生成的回覆數量夠多,該方法就一定可行。

?wx_fmt=jpeg

第三種方法是基於增強學習的。增強學習有兩種不同方法,一種基於策略,另一種基於價值。


基於策略的代表作來自李紀為,其基本思路是:假設已有生成模型 G,給定一個 input 並生成 20 個回覆,利用排序公式 P(S|T) + λP(T|S) 對回覆進行評分作為 reward。Reward 值越大,梯度更新則相應越大。 


我們再來看看 GAN 的相關方法。李紀為對 SeqGAN 的模型加以改進,將其用在了回覆生成上。


其基本思路是,每生成一個詞的同時,用搜尋的方法去搜尋其最後生成的完整句子,然後用 discriminator D 對其進行評分,分值越高,意味著詞的 reward 也越高。之後的思路則跟 SeqGAN 一模一樣。


640.png?

本文思路


?wx_fmt=jpeg

?wx_fmt=jpeg


我們做這篇論文的初衷,是為了提出一種不借助繁重工具或演算法的回覆生成方法。因為無論是複雜模型、後排序、增強學習還是 GAN,都屬於一種用時間換精度的方法。 


我們希望在避免產生大量時間開銷的同時,還能提高回覆生成的質量。提升效率的關鍵在於 Seq2Seq 的最後一層 — 投影層,這個投影往往會是一個大型矩陣。


我們認為其實沒有必要形成這個大型矩陣,因為有用詞彙僅有很小一部分,而這一小部分詞彙就足夠生成一句非常流暢、高度相關的話。比如對“的地得”這類功能詞和與 input 相關度較高的詞做一個並集,就可以僅用一個小規模字典生成極為流暢的有效回覆。 


詳細來說,我們會給每一個 input 構建一個動態詞典。這麼做的目的是為了減少線上 decoding 時間,同時對不相關詞進行剔除。


?wx_fmt=jpeg


本文其實是在 Seq2Seq 的基礎上加了一個動態詞表,每給一個 input,我們會生成兩類詞。


第一類詞的生成完全基於規則,即靜態詞典。靜態詞典主要包含一些功能詞,功能詞主要起潤滑劑的作用,它們能讓一句話的語法變得通暢。靜態詞典是基於詞性構建的,主要包含代詞和助詞,名詞和動詞不包含在內。 


第二類詞是內容詞,即動態詞典。動態詞典是根據 input 猜測與其相關的詞,即我們可以用哪些詞對 input 進行回覆。這個詞典的構建不能再像靜態詞典那樣基於詞性,而是要藉助分類器或詞預測模型,預測哪些詞和已給定的 input 相關。 


有了這兩個詞之後,我們就可以給每個 input 構建一個詞典。這個詞典的規模會很小,很小的概念是指原來的詞典規模是 3 萬,現在能縮減到 1000-2000 這個量級。


從矩陣乘法角度來看,如果能把一個矩陣從 N 乘以三萬的維度,縮減到 N 乘以一千的維度,就可以大大提升矩陣乘法的運算速度。


640.png?

詞預測模型

?wx_fmt=jpeg


接下來我們來看如何做詞預測,即如何對內容詞(content words)進行預測。內容詞的 input vector 是 encoder 生成的 vector。有了 vector 後,我們需要過一個迴歸模型(MLP),繼而預測需要用到哪些詞。這個預測的損失就是將最後出現在回覆裡的詞作為正例(標籤為 1),再隨機取樣一些負例作為 0 標籤的詞,從而進行預測。 


如何取樣負例非常關鍵。剔除掉一句話中的功能詞,大概會剩下 10-15 個正例的詞。我們需要通過頻率對負例進行取樣,如果一個詞經常出現,那麼它被取樣為負例的機率就會很大。 


通過對負例進行取樣,我們在進行詞預測時,可以更準確地預測出內容詞是什麼。反之,這個詞預測模型會跟 Seq2Seq 生成回覆模型出現同樣的問題,即總是出現高頻詞。只有利用頻率對負例進行取樣,才能讓高頻詞在構建詞典時就被剔除。


?wx_fmt=png


時間複雜度



?wx_fmt=jpeg


在介紹完詞預測方法後,我們來看時間複雜度的計算,即以什麼樣的速度進行 decoding。


首先將 Seq2Seq 和本文的 decoding 方法進行對比,可以發現二者在 GRU 和 Attention 上花費的時間完全一致,但是本文方法在 Projection 上花的時間會少很多


原因在於 Seq2Seq 的 vocabulary size 通常都很大,比如 3 萬這種級別乘出來的數。而本文這個 T 可能只有幾千,並且我們無需為每個詞建立一個表,而是為每一句話建立一個表。因此,我們構建詞典的時間開銷要遠小於從全域性字典裡進行詞預測。


當然,這種情況的前提是回覆詞數需大於 1。當回覆詞數等於 1 時,即逐詞預測,本文方法反而會比 Seq2Seq 變得更慢。也就是說,在詞的數量越多的時候,詞典規模越小,節省的時間也就越多。


經實驗證明,這種方法相比 Seq2Seq 能節省約 40% 的時間


640.png?

模型訓練


?wx_fmt=jpeg

?wx_fmt=jpeg

?wx_fmt=jpeg


如果只對動態詞典進行訓練,將導致訓練和預測的時候出現一些 gap。即使在訓練的時候就採用動態詞表這種方法,也依然會面臨一個問題,就是你不知道選詞這個過程會對你做回覆造成什麼影響。


為了解決這個問題,我們在訓練時選擇將動態詞典作為一個隱變數來處理。針對公式的詳細推導,大家可以參考論文。 


由於是隱變數,假設動態詞典 T 是完全變例,即一個詞有選或者不選這兩種可能。如果有 3 萬個詞,那麼 T 就有 2 的三萬次方這麼大,因此這種方法是不可行的。那我們應該怎麼做呢?


我們可以通過蒙特卡洛取樣的方法,來估計詞典會對回覆產生什麼影響。我把?變成了真正取樣,相當於取樣 S 次,且對每次所出結果都進行一次計算,然後對結果進行平均。 


這樣一來,我們就可以把詞典構建和回覆生成這兩個損失串在一起,相當於放入一同一個公式裡表示,而不是將詞典和生成分開單獨訓練。利用逐次取樣得出的結果,來評估動態詞典在不同情況下,其相對應的回覆生成的損失是什麼。 


由於這個損失是通過取樣得出,因此它會和 RL 一樣存在 variance。因此我們加了一個 baseline BK 用於梯度更新,從而使訓練更為穩定。



640.png?

實驗


?wx_fmt=jpeg


本文實驗所用資料來自我們之前的一篇文章,這些詞可以覆蓋約 99% 的詞。

?wx_fmt=jpeg

本文使用的開源 baseline

?wx_fmt=jpeg


目前研究界仍未找到一個很好的自動指標,能用於回覆生成或對話評測。


現有的方法可分為四類:


第一類方法是計算 BLEU 值,也就是直接計算 word overlap、ground truth 和你生成的回覆。由於一句話可能存在多種回覆,因此從某些方面來看,BLEU 可能不太適用於對話評測。


第二類方法是計算 embedding 的距離,這類方法分三種情況:直接相加求平均、先取絕對值再求平均和貪婪匹配。


第三類方法是衡量多樣性,主要取決於 distinct-ngram 的數量和 entropy 值的大小。


最後一種方法是圖靈測試,用 retrieval 的 discriminator 來評價回覆生成。


?wx_fmt=jpeg


表 1 中的前四行是 baseline,DVS2S 是將詞預測和 Seq2Seq 的損失串在一起計算,S-DVS2S 則是對這兩個 loss 分別進行計算。從結果可以看出,DVS2S 的效果均優於其他方法。 


表 2 是人工標註結果,數值 0 和 2 分別代表最差效果和最優效果,Kappa 則指三者的一致性。人工標註得到的 Kappa 值通常較低,也就是說,即使讓真人來進行評測,也很難得到一致性的評價。


?wx_fmt=jpeg

速度對比:本文模型可節省40%的時間

?wx_fmt=jpeg

案例效果對比


640.png?

總結

首先,我們將靜態詞典換成了動態詞典,用於聊天機器人中的回覆生成。其次,我們提出了一種全新的方法,將詞預測損失和回覆生成的損失融入到同一個損失函式,以 joint 的方式對這個函式進行優化。最後,我們基於一個大規模資料集,對本文模型的效率和效果進行了驗證。


你也許還想


  乾貨 | NIPS 2017:用於序列生成的推敲網路

  乾貨 | NIPS 2017線上分享:利用價值網路改進神經機器翻譯

  書單 | NLP祕笈,從入門到進階


640.png?

感謝你關注“微軟研究院AI頭條”,我們期待你的留言和投稿,共建交流平臺。來稿請寄:msraai@microsoft.com。


640.jpeg?


相關文章