寫在開頭

已經關注Retrieval-Based Chatbots一段時間了,期間也看了不少這方面的論文,以及在這些論文裡面又發現了一些很不錯的論文。這段時間一直在做相關的實驗,現在實驗效果也出來了,準備將自己的成果寫成一篇論文,並且總結下這段時間看過的論文。

目前計劃先講SMN、DAM、IMN和MRFN這四篇論文,其中SMN和DAM的作者已經將代碼放出,都是提供Tensorflow版本,為了方便實驗,我自己將兩份代碼用Pytorch改寫了,SMN的代碼我放到了自己的github上,不過感覺自己放上去的版本還需要修改下,後續將會做下補充再重新上傳代碼~(感覺給自己挖了挺多坑的,希望自己有毅力將每個坑填好)

第二篇講DAM的文章出來了,有興趣想了解DAM模型的可以看下:

LeonMao:來談談那些很棒的檢索式Chatbots論文(二)?

zhuanlan.zhihu.com
圖標

SMN(Sequential Matching Network)

講回正題,Retrieval-Based Chatbots即檢索式的聊天機器人,在人機的多輪對話中(多輪的QA)從多個候選回復中選出最優的回復,這便是我們的目標。這次講的論文是SMN,其論文全名為Sequential Matching Network: A New Architecture for Multi-turn Response Selection in Retrieval-Based Chatbots

這篇論文是吳俁大佬的,這個結構影響了後續相關的論文,不少論文都採用了這種結構,首先放出論文地址及其源碼:

https://arxiv.org/pdf/1612.01627v2.pdf?

arxiv.org

MarkWuNLP/MultiTurnResponseSelection?

github.com
圖標

Introduction

在這論文之前,有關Retrieval-Based Chatbots的做法是將context里所有的utterances都連接在一起,將這個長長的context做處理然後和response作匹配。而正如論文的名稱,該論文提出了一個新的框架,不再將utterances拼接起來,而是每個utterance都和response做匹配,然後再用RNN去構建utterance間的關係,最後的匹配分數通過RNN的隱藏層計算得出。除了提出這個新的框架外,作者還在論文里提出了一個新的數據集,這個數據集(豆瓣對話語料庫)也被後續相關的論文所使用。

關於多輪對話的例子,通過圖一可以很直觀的看出:

多輪對話的一個例子

在論文中作者也談到,不同於單輪的對話,多輪對話需要考慮到前幾輪對話中的信息,而不單單只關注於最近的那個對話,所以如何識別出context中重要的信息(例如單詞、短語、句子),哪些信息是對選擇合適的回復起關鍵作用;如何構建utterances之間的關係,這些都是需要考慮的問題。

Model Overview

SMN的結構

上面的圖就是SMN的模型結構,可以很清楚的看到,SMN讓response和每個utterance做匹配,形成2D的response-utterance相似度矩陣(similarity matrix),除了從單詞層面(word embedding)做匹配外,還在子序列層面(經過一層GRU後的隱藏狀態)做匹配,這樣就能得到兩種粒度(granularity)的匹配表示了,這也是圖中 M_{1}、M_{2} 的來源。

接著將這兩個相似度矩陣做卷積和池化操作,以抽取匹配信息。經過前面的操作,抽取出response和每個utterance的匹配信息,緊接著就是將這些信息積累起來,作者這裡用GRU,對所有的匹配信息按時間順序(chronological order)進行積累,最後用得到的隱藏狀態計算匹配程度。

文章中將模型分為三層,接下來將詳細的介紹每一層的公式:

  • Utterance-Response Matching
  • Matching Accumulation
  • Matching Prediction

Utterance-Response Matching

模型的輸入是response和context裡面的utterances,接下來用 r 代表response,用 u 代表utterance。ru 經過word embedding後,變成:

R=[e_{r,1},...,e_{r,n_{r}}]

U=[e_{u,1},...,e_{u,n_{u}}]

其中 R 的維度是 d	imes n_{r}U 的維度是 d	imes n_{u}d 就是word embedding的維度大小,在具體實驗中,作者用了word2vec方法生成詞向量, d 的大小是200。

RU 在經過一層GRU後,其隱藏狀態表示成:

H_{r}=[h_{r,1},...,h_{r,n_{r}}]

H_{u}=[h_{u,1},...,h_{u,n_{u}}]

其中 H_{r} 的維度是 t	imes n_{r}H_{u} 的維度是 t	imes n_{u}t 就是隱藏層的維度大小,在具體實驗中,作者將GRU的隱藏層大小設置為200。

在拿到了兩種表示後,就可以計算相似度矩陣了。 RU 形成的相似度矩陣 M_{1}H_{r }H_{u }形成的相似度矩陣M_{2}的元素計算如下:

e_{1,i,j}=e_{u,i}^{	op}cdot e_{r,j}M_{1} 矩陣的元素)

e_{2,i,j}=h_{u,i}^{	op} A  h_{r,j}M_{2} 矩陣的元素)

注意到 M_{1} 裡面只是普通的兩個向量相乘,而 M_{2} 中則是加入了一個線性變換的矩陣 A

得到兩個相似度矩陣後,進行卷積和池化的操作,具體公式如下:

在具體的實驗中,輸入的通道數量是2(因為有 M_{1}M_{2} ),輸出的通道數為8,用了3*3的卷積核,激活函數用了RELU。在做完最大池化後,作者還做了碾平操作,池化後張量的維度是 (B,H,W,C) ,將其轉變成 (B,H*W*C),然後經過一層線性層加tanh激活函數後,再送入另一個GRU,這個細節是在閱讀了作者的源碼獲知的。

Matching Accumulation

經過上面的處理,我們得到 [v_{1},...,v_{n}] ,n的值等於輸入的utterance的數量。然後經過一層GRU得到 H_{m}=[h_{1}^{},...,h_{n}^{}]H_{m} 的維度是q	imes nq 是GRU隱藏層的維度,在具體實驗中為50。

這層的作用是用於構建utterances之間的依賴和時間上的聯繫。

Matching Prediction

在得到H_{m}=[h_{1}^{},...,h_{n}^{}]後,應該如何利用這些信息呢?作者提出了三種方法:

1、直接用最後的隱藏狀態,即L[h_{1}^{},...,h_{n}^{}]=h_{n}^{}

2、給予每個隱藏狀態一個權重然後加和,即 L[h_{1}^{},...,h_{n}^{}]=Sigma_{i=1}^{n}w_{i}h_{i}^{}

3、參考了論文Hierarchical attention networks for document classification,具體公式為:

最後用下面的公式得到匹配分數:

上面公式就是用線性層將維度降為2,再用softmax歸一化,即將其轉化成二分類問題,表示這個候選的response是否可選。


論文還詳盡的介紹了豆瓣對話語料庫,並且做了實驗去研究應該在context中取多少個utterance,即取多少輪對話,實驗證明輪數取10的時候效果最好。

感覺除了讀論文,好好研究作者開源的代碼對自己提升也很大,因為很多細節只有看了代碼後才會清楚,後續應該會放出自己復現的pytorch代碼,下一篇文章將會寫DAM~

推薦閱讀:

相关文章