在端到端的對話生成中,存在著生成句子「安全性回復」問題。近兩年來,關於提高生成句子多樣性的工作越來越被人們關注,其中最多的工作是如何將更多的信息進行編碼,以便在解碼過程中,可以指導多樣的、高信息量的句子生成。近期在學校工作不是很多,考慮會將相關的論文思路、可復現的代碼以及實驗效果整理一下。

這篇文章主要介紹的是一篇來自百度的工作,主要介紹瞭如何去選擇所需的知識來控制生成回復。這篇論文也作為今年2019語言與智能競賽,知識驅動對話賽道的基線。對這個比賽感興趣的,可以通過官網:2019 Language and Intelligence Challenge 報名參加,也可以私聊,一起交流~

首先介紹一下知識驅動對話這個比賽,我感覺賽題設計的比較新穎,也很有挑戰性。

競賽任務

給定對話目標g及相關知識信息M=f1,f2,...,fn。要求參評的對話系統輸出適用於當前對話序列H=u1,u2,...,ut-1的機器回復ut 使得對話自然流暢、信息豐富而且符合對話目標的規劃。 在對話過程中,機器處於主動狀態,引導用戶從一個話題聊到另一個話題。因此,對話系統為機器設定了一個對話目標,g 為「START->TOPIC_A->TOPIC_B」, 表示從冷啟動狀態主動聊到話題A,然後進一步聊到話題B, 提供的相關知識信息包括:話題A的知識信息,話題B的知識信息,話題A和話題B的關聯信息。

競賽數據

數據中的知識信息來源於電影和娛樂人物領域有聊天價值的知識信息,如票房、導演、評價等,以三元組SPO的形式組織,對話目標中的話題為電影或娛樂人物實體。數據集中共有3萬session,約12萬輪對話,其中10萬訓練集,1萬開發集,1萬測試集。

數據樣例

下面介紹一下競賽中給的生成式基線方法,以及基線方法所參考的論文。

論文鏈接

Learning to Select Knowledge for Response Generation in Dialog Systems?

arxiv.org

模型結構

模型結構

該模型主要由四部分組成,分別為句編碼器、知識管理器、解碼器。其整體架構也是帶Attention的seq2seq模型。

Encoder

模型的編碼器由兩部分組成,分別是句子編碼器和知識編碼器,句子編碼即將對話上下文X編碼為隱向量x,模型中使用裏雙向的GRU網路進行語義編碼。知識編碼與句子編碼類似,是將所提供的外部知識Ki以相同的方式編碼成隱向量ki。兩個編碼過程彼此參數不共享,是相互獨立的過程。

Knowledge Manage

模型中的知識管理模塊,最重要的作用是從所有的外部知識中,選出所需的知識。在訓練過程中,已有的生成回復也作為選擇知識的標準,是一種後驗邏輯。所以在訓練的過程中,X和Y都被用於訓練,通過以下式子來計算每條知識被選擇的概率。

但在做預測時,Y對於我們來說是未知的,所以我們只能通過輸入X來進行知識選擇。具體式子如下:

訓練和預測時的參考依據不同,肯定會影響整個系統的設計。因此在知識管理器中,設計瞭如下的損失函數KLDivLoss,目標是讓前兩式不斷接近,已達到訓練和預測時的同步。

Decoder

在上下文xt和所選擇的知識ki條件下,我們的解碼器按字順序生成響應。 與傳統的Seq2Seq解碼器不同,該模型將知識融入到響應生成中。 為此,使用了兩種解碼器。 第一個是「硬」解碼,使用標準的GRU作為解碼器,第二個是具有分級門控融合單元的「軟」解碼器(Yao等人,2017)。

損失函數

除了知識管理器中為了保證訓練預測一致所涉及的損失函數KLDivLoss以外,還包括NLL loss和BOW loss。其中NLL loss作用是最小化生成回復與原始回復之間的差異,用下式表示,其中y(<t)表示t時刻前生成的句子。

BOW loss損失函數的作用是為了保證生成句子與知識之間的相關性,來確保對知識管理模模塊對知識選擇的正確性,具體定義為:

因此該模型的綜合損失函數定義為:

實驗結果

本論文中的實驗數據不是競賽中所用的數據,論文中的結果顯示出該模型能夠生成參考外部知識的回復,且效果大大超過其他基線模型。中文實驗生成結果,感興趣的可以參加比賽,使用比賽數據集進行嘗試。後續我也會繼續把中文數據集上的效果進行更新。


推薦閱讀:
相關文章