本文為 12 月 27 日,北京航空航天大學博士生、微軟亞洲研究院實習生——吳俁在第 21 期 PhD Talk 中的直播分享實錄。
本次 Talk 的主題是基於動態詞表的對話生成研究。首先,吳俁博士帶大家回顧了近幾年來聊天機器人領域的發展,並仔細對比檢索式聊天機器人和生成式聊天機器人的優點和缺點。
隨後,他還以第一作者的身份,解讀了北京航空航天大學和微軟亞洲研究院於 AAAI 2018 發表的工作 Neural Response Generation with Dynamic Vocabularies。
這篇論文致力於在對話生成時構建動態詞典,在使 decoding 速度加快的同時,還能去除不相關詞彙的幹擾。在不影響效果的前提下,本文模型將線上生成速度提升了 40%。
△ Talk 實錄回放
淺析對話系統
對話系統主要分為兩類,一類是任務型,另一類是非任務型。任務型對話系統主要應用於企業客服、訂票、天氣查詢等場景,非任務型驅動對話系統則是指以微軟小冰為代表的聊天機器人形式。
之所以強調這一點,是因為今年我在 ACL 發表了一篇論文,有同學發郵件問我為什麼參考了論文和原始碼,還是無法讓聊天機器人幫忙訂披薩。我只能說,目前聊天機器人實在種類繁多,有的機器人只負責閑聊,有的機器人可以幫你完成某些特定任務。
本次 Talk 會更側重於介紹閑聊機器人,也就是非任務驅動型對話系統。首先我想給大家推薦一篇關於聊天機器人的綜述文章 — A Survey on Dialogue Systems: Recent Advances and New Frontiers。
這篇文章來自京東資料科學團隊,是一篇較為全面的對話系統綜述,其中取用了 121 篇相關論文,並對論文進行了歸類。不僅非常適合初學者,也能讓大家對聊天機器人領域有一個更為全面的認識。
面向任務的對話系統主要分為知識庫構造、自然語言理解、狀態跟蹤和策略選擇。針對知識庫構造,假設我們的使用場景為酒店預訂,那首先我們需要構建一些和酒店相關的知識,比如酒店房型、報價以及酒店位置。
具備了這些基礎知識之後,接下來就需要展開對話,透過自然語言理解去分辨問題型別(酒店型別、房間型別等)。確認好相關型別後,我們需要藉助 policy 模組,讓系統切換到下一個需要向用戶確認的資訊。更直觀地說,我們需要循循善誘引導使用者將右表資訊填寫完整。
聊天機器人型別
普遍來說,聊天機器人主要分為兩類,我認為準確來說應該分為三類。
比較早期的研究基本屬於第一類:基於模板的聊天機器人,它會定義一些規則,對你的話語進行分析得到某些物體,然後再將這些物體和已經定義好的規則去進行組合,從而給出回覆。這類回覆往往都是基於模板的,比如說填空。
除了聊天機器人,這種基於模板的文字形成方式還可以應用於很多其他領域,比如自動寫稿機器人。
目前比較熱門的聊天機器人應該是另外兩類,一類是檢索型,另一類則是生成型。檢索型聊天機器人,主要是指從事先定義好的索引中進行搜尋。這需要我們先從網際網路上獲取一些對話 pairs,然後基於這些資料構造一個搜尋引擎,再根據文字相似度進行查詢。
生成型聊天機器人目前是研究界的一個熱點。和檢索型聊天機器人不同的是,它可以生成一種全新的回覆,因此相對更為靈活。但它也有自身的缺點,就像圖中的嬰兒那樣,它有時候會出現語法錯誤,或者生成一些沒營養的回覆。
檢索型聊天機器人首先需要構建一些文字和回覆的 pairs,然後再訓練匹配模型,上線之後先做檢索再做匹配。相似度演演算法有很多種選擇,現在一般都採用深度學習,如果是做系統的話,肯定需要融合很多相似度的特徵。
生成模型大多都是基於 Seq2Seq 框架進行修改,所謂萬變不離其宗,不管大家怎麼做,都會是以這個框架為基礎。文字生成也是如此,在 RNN 語言模型和 Seq2Seq 出來之後,幾乎所有生成模型都是基於這個框架。即使把 RNN 換成 CNN 或 Attention is All You Need,也仍然離不開這個框架。
檢索型 vs. 生成型
檢索型聊天機器人的最大優點在於它的回覆多樣且流暢,其次,這個系統對程式設計者的入門門檻較低。即使你對深度學習和自然語言處理不甚瞭解,但只要你善於寫程式碼,並且能從網上抓取一定量的資料,就可以搭建一個檢索型聊天機器人。
另外,對於研究人員來說,檢索型聊天機器人比較易於評測,藉助 MAP、MRR、NDCG 等傳統資訊檢索方法即可完成。
檢索型聊天機器人的缺點在於它過於依賴資料質量。如果你抓取的資料質量欠佳,那就很有可能前功盡棄。
就工業界來說,要評估某個檢索型聊天機器人,首先我們會看其背後的排序演演算法,其次不能忽略的則是資料質量和規模,最後再看其回覆資料是否足夠有趣,以上幾個因素共同決定著檢索型聊天機器人的整體質量。
生成模型的最大優勢在於有一套通用 code,可以忽略語言直接開跑。只要在某種語言上跑得較為順利,就可以將其應用到所有語言上。
很多人認為 safe responses 是生成式聊天機器人的一個缺點,但其實從某種角度上來說,這也是它的一個優點。相比檢索型聊天機器人,它生成的回覆質量較為穩定。
生成模型的另一個優點是,它非常容易實現多輪對話,並且能夠偏向於某種情感。假設我希望生成一句高興的話,那麼用生成模型會比檢索模型更容易實現。
對於早期的研究者來說,生成模型的最大缺點在於它的回覆較為單一。其次,由於缺乏自動評評測手段,研究人員難以對生成式聊天機器人進行評估。一個模型的好壞,更多需要靠人進行標註。此外,對工業界而言,生成式聊天機器人的門檻會相對較高。
怎樣提高生成的多樣性
第一種方法是將模型做得更複雜,比如上圖這篇論文使用了 latent variable 來解決 boring responses 這個問題。
上圖中的論文,則是在生成時將機率 bias 到一些特定的主題詞。假設某個詞是主題詞,我們就在生成過程中相應提高它被選中的機率。
第二個流派是採用重排序方法,目前最簡單有效的方法是先用生成模型生成大量回覆,再用分類器對回覆進行排序,排名越靠前效果越好。只要生成的回覆數量夠多,該方法就一定可行。
第三種方法是基於增強學習的。增強學習有兩種不同方法,一種基於策略,另一種基於價值。
基於策略的代表作來自李紀為,其基本思路是:假設已有生成模型 G,給定一個 input 並生成 20 個回覆,利用排序公式 P(S|T) + λP(T|S) 對回覆進行評分作為 reward。Reward 值越大,梯度更新則相應越大。
我們再來看看 GAN 的相關方法。李紀為對 SeqGAN 的模型加以改進,將其用在了回覆生成上。
其基本思路是,每生成一個詞的同時,用搜索的方法去搜索其最後生成的完整句子,然後用 discriminator D 對其進行評分,分值越高,意味著詞的 reward 也越高。之後的思路則跟 SeqGAN 一模一樣。
本文思路
我們做這篇論文的初衷,是為了提出一種不借助繁重工具或演演算法的回覆生成方法。因為無論是複雜模型、後排序、增強學習還是 GAN,都屬於一種用時間換精度的方法。
我們希望在避免產生大量時間開銷的同時,還能提高回覆生成的質量。提升效率的關鍵在於 Seq2Seq 的最後一層 — 投影層,這個投影往往會是一個大型矩陣。
我們認為其實沒有必要形成這個大型矩陣,因為有用詞彙僅有很小一部分,而這一小部分詞彙就足夠生成一句非常流暢、高度相關的話。比如對“的地得”這類功能詞和與 input 相關度較高的詞做一個並集,就可以僅用一個小規模字典生成極為流暢的有效回覆。
詳細來說,我們會給每一個 input 構建一個動態詞典。這麼做的目的是為了減少線上 decoding 時間,同時對不相關詞進行剔除。
本文其實是在 Seq2Seq 的基礎上加了一個動態詞表,每給一個 input,我們會生成兩類詞。
第一類詞的生成完全基於規則,即靜態詞典。靜態詞典主要包含一些功能詞,功能詞主要起潤滑劑的作用,它們能讓一句話的語法變得通暢。靜態詞典是基於詞性構建的,主要包含代詞和助詞,名詞和動詞不包含在內。
第二類詞是內容詞,即動態詞典。動態詞典是根據 input 猜測與其相關的詞,即我們可以用哪些詞對 input 進行回覆。這個詞典的構建不能再像靜態詞典那樣基於詞性,而是要藉助分類器或詞預測模型,預測哪些詞和已給定的 input 相關。
有了這兩個詞之後,我們就可以給每個 input 構建一個詞典。這個詞典的規模會很小,很小的概念是指原來的詞典規模是 3 萬,現在能縮減到 1000-2000 這個量級。
從矩陣乘法角度來看,如果能把一個矩陣從 N 乘以三萬的維度,縮減到 N 乘以一千的維度,就可以大大提升矩陣乘法的運算速度。
詞預測模型
接下來我們來看如何做詞預測,即如何對內容詞(content words)進行預測。內容詞的 input vector 是 encoder 生成的 vector。有了 vector 後,我們需要過一個回歸模型(MLP),繼而預測需要用到哪些詞。這個預測的損失就是將最後出現在回覆裡的詞作為正例(標簽為 1),再隨機取樣一些負例作為 0 標簽的詞,從而進行預測。
如何取樣負例非常關鍵。剔除掉一句話中的功能詞,大概會剩下 10-15 個正例的詞。我們需要透過頻率對負例進行取樣,如果一個詞經常出現,那麼它被取樣為負例的機率就會很大。
透過對負例進行取樣,我們在進行詞預測時,可以更準確地預測出內容詞是什麼。反之,這個詞預測模型會跟 Seq2Seq 生成回覆模型出現同樣的問題,即總是出現高頻詞。只有利用頻率對負例進行取樣,才能讓高頻詞在構建詞典時就被剔除。
時間複雜度
在介紹完詞預測方法後,我們來看時間複雜度的計算,即以什麼樣的速度進行 decoding。
首先將 Seq2Seq 和本文的 decoding 方法進行對比,可以發現二者在 GRU 和 Attention 上花費的時間完全一致,但是本文方法在 Projection 上花的時間會少很多。
原因在於 Seq2Seq 的 vocabulary size 通常都很大,比如 3 萬這種級別乘出來的數。而本文這個 T 可能只有幾千,並且我們無需為每個詞建立一個表,而是為每一句話建立一個表。因此,我們構建詞典的時間開銷要遠小於從全域性字典裡進行詞預測。
當然,這種情況的前提是回覆詞數需大於 1。當回覆詞數等於 1 時,即逐詞預測,本文方法反而會比 Seq2Seq 變得更慢。也就是說,在詞的數量越多的時候,詞典規模越小,節省的時間也就越多。
經實驗證明,這種方法相比 Seq2Seq 能節省約 40% 的時間。
模型訓練
如果只對動態詞典進行訓練,將導致訓練和預測的時候出現一些 gap。即使在訓練的時候就採用動態詞表這種方法,也依然會面臨一個問題,就是你不知道選詞這個過程會對你做回覆造成什麼影響。
為瞭解決這個問題,我們在訓練時選擇將動態詞典作為一個隱變數來處理。針對公式的詳細推導,大家可以參考論文。
由於是隱變數,假設動態詞典 T 是完全變例,即一個詞有選或者不選這兩種可能。如果有 3 萬個詞,那麼 T 就有 2 的三萬次方這麼大,因此這種方法是不可行的。那我們應該怎麼做呢?
我們可以透過蒙特卡洛取樣的方法,來估計詞典會對回覆產生什麼影響。我把變成了真正取樣,相當於取樣 S 次,且對每次所出結果都進行一次計算,然後對結果進行平均。
這樣一來,我們就可以把詞典構建和回覆生成這兩個損失串在一起,相當於放入一同一個公式裡表示,而不是將詞典和生成分開單獨訓練。利用逐次取樣得出的結果,來評估動態詞典在不同情況下,其相對應的回覆生成的損失是什麼。
由於這個損失是透過取樣得出,因此它會和 RL 一樣存在 variance。因此我們加了一個 baseline BK 用於梯度更新,從而使訓練更為穩定。
實驗
本文實驗所用資料來自我們之前的一篇文章,這些詞可以改寫約 99% 的詞。
△ 本文使用的開源 baseline
目前研究界仍未找到一個很好的自動指標,能用於回覆生成或對話評測。
現有的方法可分為四類:
第一類方法是計算 BLEU 值,也就是直接計算 word overlap、ground truth 和你生成的回覆。由於一句話可能存在多種回覆,因此從某些方面來看,BLEU 可能不太適用於對話評測。
第二類方法是計算 embedding 的距離,這類方法分三種情況:直接相加求平均、先取絕對值再求平均和貪婪匹配。
第三類方法是衡量多樣性,主要取決於 distinct-ngram 的數量和 entropy 值的大小。
最後一種方法是圖靈測試,用 retrieval 的 discriminator 來評價回覆生成。
表 1 中的前四行是 baseline,DVS2S 是將詞預測和 Seq2Seq 的損失串在一起計算,S-DVS2S 則是對這兩個 loss 分別進行計算。從結果可以看出,DVS2S 的效果均優於其他方法。
表 2 是人工標註結果,數值 0 和 2 分別代表最差效果和最優效果,Kappa 則指三者的一致性。人工標註得到的 Kappa 值通常較低,也就是說,即使讓真人來進行評測,也很難得到一致性的評價。
△ 速度對比:本文模型可節省40%的時間
△ 案例效果對比
總結
首先,我們將靜態詞典換成了動態詞典,用於聊天機器人中的回覆生成。其次,我們提出了一種全新的方法,將詞預測損失和回覆生成的損失融入到同一個損失函式,以 joint 的方式對這個函式進行最佳化。最後,我們基於一個大規模資料集,對本文模型的效率和效果進行了驗證。
>>>> 獲取完整PPT和影片實錄
關註PaperWeekly微信公眾號,回覆20171227獲取下載連結。
點選以下標題檢視往期實錄:
關於PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智慧前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號後臺點選「交流群」,小助手將把你帶入 PaperWeekly 的交流群裡。