DAM在PaddlePaddle專案的地址:https://github.com/PaddlePaddle/models/tree/develop/PaddleNLP/deep_attention_matching_net
關鍵應用—聊天機器人多輪對話的回覆選擇
基於檢索的聊天機器人最重要的一項任務是從給定的候選回覆中,選取與問題最匹配的回覆。
這一項研究的關鍵挑戰是需要去捕獲對話中不同粒度的語義依賴關係,如圖1中的對話示例所示,對話的上下文和候選回覆之間存在不同粒度上的兩種關係:
1)直接的文字相關,比如單詞“packages”和“package”,或者短語“debian package manager”和“debian package manager”,他們之間直接有重疊的詞彙。
2)語段之間隱式相關關係,比如回覆中的單詞“it”指代的是上文中的“dpkg”,回覆中的“its just reassurance”對應的是“what packages are installed on my system”。
早期研究已經表明,在多輪對話中,從不同的語義粒度上捕獲語段對之間的關係是選出最佳回覆的關鍵所在。然而現有的模型更多的要麼是考慮文字的相關關係,從而對於隱式相關的關係提取的還不夠好,要麼是使用RNN模型,在捕獲多粒度語義表示上,開銷又太大。面對這些挑戰,百度NLP團隊提出了DAM模型,用以解決多輪對話的語義匹配問題。
圖1 多輪對話的示例
DAM模型概覽(Deep Attention Matching Network)
DAM 是一個完全基於注意力機制的神經匹配網路。DAM的動機是為了在多輪對話中,捕獲不同顆粒度的對話元素中的語義依賴,從而更好得在多輪對話的上下文語境中回覆。
DAM受啟發於機器翻譯的Transformer模型,將Transformer關鍵的注意力機制從兩個方面進行擴充,並將其引入到一個統一的網路之中。
自注意力機制(self-attention)
從單詞級的嵌入中堆疊注意力機制,逐漸捕獲不同粒度的語義表示。比如對一個句子使用注意力機制,可以捕獲句子內部詞級別的依賴關係。這些多粒度的語義表示有助於探索上下文和回覆的語義依賴關係。
互注意力機制(cross-attention)
在上下文和回覆之間應用注意力機制,可以捕獲不同語段對之間隱式的依賴關係,從而為文字關係提供更多的補充資訊從而為多輪對話選擇更好的回覆。
在實踐中,DAM將上下文和回覆中的每句話的每一個單詞當做一個語段的中心語義對待,通過堆疊注意力機制,從不同級別上豐富其語義表示,進而圍繞該中心單詞,生成更多高階的語段的語義表示。這樣上下文和回覆中的每句話都是在考慮了文字相關和依賴關係的情況下,且基於不同粒度進行匹配的。DAM首先捕獲從詞級到句級的上下文和回覆之間的匹配資訊,然後通過卷積和最大池化操作提取最匹配的特徵,最後通過單層的感知網路得到一個匹配得分。
DAM技術詳解
圖2 DAM模型網路結構
DAM模型的網路結構如圖2所示。它包括表示-匹配-聚合三個主要部分,輸入是對話的資料集,由上下文的文字每一句話u和回覆r所對應的詞嵌入組成,輸出是得到一個對話中上下文與回覆之間的匹配分數。
表示模組能夠對輸入的上下文u和回覆r構建不同粒度的語義表示。通過堆疊多層相同的自注意力模組,將輸入的語義詞嵌入構建為更加高階的語義表示。得到語義表示之後,上下文與回覆以語段-語段相似矩陣的形式互相匹配。匹配有兩種,自注意力匹配和互注意力匹配,分別可以衡量上下文與回覆之間的文字關係和依賴關係。這些匹配的分數會形成一個3D的匹配圖Q,它的維度分別代表上下文中的每一句話、每句話中的每個單詞以及回覆中的每個單詞。接著,語段對之間的匹配資訊通過卷積和最大池化提取,進一步得通過單層感知網路聚合,得到匹配的分數,代表候選回覆與上下文之間的匹配程度。
圖3 注意力模組
DAM網路中使用了注意力模組實現自注意力和互注意力機制,它的結構如圖3所示。該結構借鑑了Transformer模型中的注意力機制的實現。它的輸入有三個部分,query語句、key語句和value語句,分別以Q、K和V表示。注意力模組會首先對query語句和key語句的每個單詞進行標量點積注意力(Scaled Dot Product Attention)計算,具體計算如公式(1)和(2)所示。算出的Vatt儲存了語義資訊,代表了query語句和value語句之間的相互關係。Vatt與query語句輸入會相加一起,組成了一個能夠代表它們聯合含義的語義表示。然後通過一層標準化(Normalization)的操作,可以避免梯度消失或者爆炸。再接著,使用Relu啟用函式的前饋神經網路FFN進一步處理聚合的詞嵌入,操作如公式(3)所示:
公式(3)中,x代表的是一個與query語句一樣形狀的2Dtensor,W1,W2,b1和b2都是要學習的引數。最後的輸出還會經過一次標準化操作,從而得到最後的結果。整個注意力模組的結果由公式(4)表示。
整個注意力模組可以捕獲query語句和key語句的依賴關係,利用依賴資訊可以得到語義表示,再進一步的構建多粒度的語義表示。
公式(5)和(6)就是利用了注意力模組,得到了上下文和回覆的多粒度語義表示資訊。公式(7)得到了自注意力的匹配矩陣。公式(8)和(9)通過注意力模組得到上下文與回覆之間的語義表示資訊,進一步的組成互注意力的匹配矩陣。
自注意力矩陣和互注意力矩陣聚合成了一個3D匹配圖Q。再通過帶最大池化的3D卷積,得到匹配特徵,最後通過單層感知層進行匹配分數的計算。
DAM模型在Ubuntu和豆瓣對話兩個語料庫上測試了多輪對話任務,如表1所示,相比其他模型獲得了最優的效果。
Ubuntu語料庫是英文的關於Ubuntu系統troubleshooting的多輪對話資料。它的訓練集包括50萬個多輪對話的上下文文字,每個對話文字帶有1個人類積極回答的正例回覆和1個隨機取樣的負例回覆。它的驗證集和測試集各自包括5萬個上下文文字,每個上下文文字各有1個正例回覆和9個負例回覆。豆瓣對話語料庫是中文的關於一些開放領域的對話資料集。它的驗證集包括5萬個對話例項,每個例項各有1個正例和負例回覆,測試集有1萬個例項,每個例項有10個候選回覆。
表1:DAM模型的效果對比
DAM模型PaddlePaddle實戰
環境準備:首先根據專案文件要求,下載最新版本的PaddlePaddle。Python的版本要求>=2.7.3
專案的程式碼目錄及簡要說明如下:
.
├── README.md #
文件
├── model.py #
模型
├── train_and_evaluate.py #
訓練和評估指令碼
├── test_and_evaluate.py #
測試和評估指令碼
├── ubuntu #
使用
Ubuntu
語料庫的指令碼
├── Douban #
使用
Douban
語料庫的指令碼
└── utils #
通用函式
下載專案以後,接下來以Ubuntu語料庫應用為例:
1. 進入ubuntu目錄
cd ubuntu
2. 下載預處理好的資料用於訓練。專案提供了下載資料的指令碼
sh download_data.sh
3. 執行訓練和評估的指令碼
sh train.sh
使用如下指令碼,可以瞭解更多關於arguments的使用說明。
python ../train_and_evaluate.py --help
預設情況下,訓練是在單個的GPU上執行的,使用者也可以轉到多GPU模式執行。只需要將train.sh指令碼中的可見裝置重置一下即可。比如
export CUDA_VISIBLE_DEVICES=0,1,2,3
4. 執行測試指令碼
sh test.sh
類似的,使用者可以很容易的利用Douban對話語料庫進行實驗。
傳送門:
PaddlePaddle Github專案地址:
https://github.com/PaddlePaddle
DAM模型專案地址:
https://github.com/PaddlePaddle/models/tree/develop/fluid/PaddleNLP/deep_attention_matching_net