來源商業新知網,原標題:讓聊天機器人完美回復 | 基於PaddlePaddle的語義匹配模型DAM
語義匹配
語義匹配是NLP的一項重要應用。無論是問答系統、對話系統還是智能客服,都可以認為是問題和回復之間的語義匹配問題。這些NLP的應用,通常以聊天機器人的形式呈現在人們面前,目標是通過對話的上下文信息,去匹配最佳的回復。
因而,讓聊天機器人完美回復問題,是語義匹配的關鍵目標。作為國內乃至國際上領先的NLP技術團隊,百度在NLP領域積極創新、銳意進取,在聊天機器人的回復選擇這個關鍵NLP任務上,提出了效果最優的深度注意力匹配神經網絡DAM,並開源了基於PaddlePaddle的模型實現。
本文對該模型的相關原理和應用加以介紹。
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模型,用以解決多輪對話的語義匹配問題。
DAM模型概覽(Deep Attention Matching Network)
DAM 是一個完全基於注意力機制的神經匹配網絡。DAM的動機是為了在多輪對話中,捕獲不同顆粒度的對話元素中的語義依賴,從而更好得在多輪對話的上下文語境中回復。
DAM受啟發於機器翻譯的Transformer模型,將Transformer關鍵的注意力機制從兩個方面進行拓展,並將其引入到一個統一的網絡之中。
自注意力機制(self-attention)
從單詞級的嵌入中堆疊注意力機制,逐漸捕獲不同粒度的語義表示。比如對一個句子使用注意力機制,可以捕獲句子內部詞級別的依賴關系。這些多粒度的語義表示有助於探索上下文和回復的語義依賴關系。
互注意力機制(cross-attention)
在上下文和回復之間應用注意力機制,可以捕獲不同語段對之間隱式的依賴關系,從而為文本關系提供更多的補充信息從而為多輪對話選擇更好的回復。
在實踐中,DAM將上下文和回復中的每句話的每一個單詞當做一個語段的中心語義對待,通過堆疊注意力機制,從不同級別上豐富其語義表示,進而圍繞該中心單詞,生成更多高級的語段的語義表示。這樣上下文和回復中的每句話都是在考慮了文本相關和依賴關系的情況下,且基於不同粒度進行匹配的。
DAM首先捕獲從詞級到句級的上下文和回復之間的匹配信息,然后通過卷積和最大池化操作提取最匹配的特征,最后通過單層的感知網絡得到一個匹配得分。
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個候選回復。
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