上一篇文章寫到了SMN模型,如果有興趣的話大家可以看看,先放上鏈接~

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

zhuanlan.zhihu.com
圖標

今天和大家分享的是百度在2018年ACL上的一篇論文,同樣是檢索式對話系統領域上一篇很棒論文,下面就開始進入主題吧~

DAM(Deep Attention Matching Network)

18年一件很火的事件就是bert的出現,其中bert的結構用的是Transformer的Encoder層,而Transformer同樣出自於一篇很出名的論文:Attention is all you need,為什麼要提到這個,因為DAM就是用到Transformer的部件去實現的,如果大家對Transformer不太熟悉,強烈建議看看這個博客(這個博客寫得真的好,可視化的教學,真心安利一波),熟悉了Transformer之後再看DAM會快許多~

DAM的論文全稱為:Multi-Turn Response Selection for Chatbots with Deep Attention Matching Network ,首先放出該論文及其源碼:

https://aclweb.org/anthology/P18-1103?

aclweb.org

baidu/Dialogue?

github.com
圖標

除此之外,大家可以去2018ACL的官網找下,裡面有作者分享這篇論文的視頻~看完論文後有一種很純粹的感覺,因為論文用了純注意力機制去做檢索式的Chatbots

Introduction

文章的靈感來自於Transformer,它把Transformer裡面的注意力機制運用到模型之中。文章中談到,捕獲response和utterances之間不同粒度的匹配信息是檢索式多輪對話的關鍵,但是在這之前的模型,只考慮了表面的文本關聯性(surface text relevance),而且之前的模型用RNN去抽取特徵。

而文章中用Transformer的部件替代RNN,去抽取文本的更多層次,更多粒度的信息,從而得到response和utterances之間潛在的語義上的關聯。那具體怎麼做呢?文章將Transformer裏的注意力機制拓展成兩種方式:

  • self-attention
  • cross-attention

在這裡默認大家熟悉Transformer結構,self-attention其實就是Transformer的Encoder層(沒有用Multi-Head),其中 QKV 都是一樣的,要麼都是response、要麼都是utterance。從word embedding開始堆疊self-attention層,每一層self-attention層抽取一種粒度的表示,不同層就抽取了不一樣的表示,從而獲得句子多粒度的表示。

cross-attention結構上還是Transformer的Encoder層,只不過輸入不一樣了。其中 Q 是response(utterance),而KV是utterance(response)。這樣做的話,其實就像用response去表示utterance,用utterance去表示response,從而為response和utterance做匹配提供更多的信息。

Model Overview

DAM的結構

上圖就是DAM的模型結構,第一次看這個圖感覺好好看,我記得在dstc7的Workshop裏,有篇論文的圖也好好看,emmm,貌似偏題了。說回正題,模型結構如圖所示。

首先response和context中每個utterance通過self-attention層獲得不同的表示,拿結構圖來說,堆疊了兩層self-attention層,即每句話都有兩種不同粒度的表示,加上一開始的word embedding表示,每句話一共有三種表示。接著和SMN模型的框架相似,response和每個utterance做匹配,形成2D的匹配矩陣。

而匹配矩陣有兩種,分別是 M_{self}M_{cross} ,其中M_{self}就是用剛剛得到的三種表示分別匹配形成的;而M_{cross}就相對複雜點,先將三種表示分別輸入cross-attention層,從而得到另外三種不同的表示,再用這新的表示分別做匹配。所以在結構圖中可以看到,每個utterance和response匹配後,總共得到六種匹配矩陣~

緊接著就是將得到的所有矩陣進行組合,然後進行3d卷積和池化操作,在連接線性層得到一個最終的匹配分數,以上就是整個DAM模型的大致流程。

模型可以劃分為RepresentationMatchingAggregation這三個部分,接下來將按該順序詳細講述模型的公式,因為attention層在模型中有著舉足輕重的地位,也為了在講述RepresentationMatching的時候更清晰,首先具體介紹下attention層。

Attentive Module

這就是self-attention層和cross-attention層的真面目了~是的,在前面我也說過,self-attention層和cross-attention層的結構都是相同的,只是輸入不一樣。將圖中的query、key、value用 QKV表示:

Q=[e_{i}]_{i=0}^{n_{Q}-1}K=[e_{i}]_{i=0}^{n_{K}-1}V=[e_{i}]_{i=0}^{n_{V}-1} ,其中 e_{i} 表示句子裡面詞的維度表示,在具體實驗當中,詞的維度為200。不同於Transformer的Encoder層,這個attentive module沒有用到Multi-Head結構(可以看成用了One-Head),所以一開始不用做維度的變化。

接下來的話就和Transformer的Encoder很像了,首先就是做Scaled Dot-Product Attention(圖中藍色的Attention),然後做Weighted Sum操作,具體公式如下:

Att(Q,K)=[softmax(frac{Q[i]cdot K^{T}}{sqrt{d}})]^{n_{Q}-1}_{i=0} (Attention操作)

V_{att}=Att(Q,K)cdot V (Weighted Sum操作)

接著就是圖中的Sum&Norm操作,Sum就是將 V_{att}Q 做加和(類似於殘差連接),然後通過一層layer normalization層,以防止梯度消失或梯度爆炸,因為論文中沒有具體公式,我就用類似的表達,相關公式如下:

V_{norm}=LayerNorm(V_{att}+Q) (Sum&Norm操作)

然後將 V_{norm} 輸入到feed-forward層裏,feed-forward層(FFN)的具體公式如下:

FFN(x)=max(0,xW_{1}+b_{1})W_{2}+b_{2} (Feed-Forward操作)

在這裡,我將feed-forward層的輸出表示為 V_{ffn} ,最後,繼續做Sum&Norm操作(殘差連接加layer normalization),因為論文中也沒有具體公式,我同樣用類似的表達,相關公式如下:

Output=LayerNorm(V_{ffn}+V_{norm}) (第二個Sum&Norm操作)

至此,就能得到最後的輸出,有了以上Attentive Module的介紹,以後將會用:AttentiveModule(Q,K,V) 表示整個attention層。

Representation

首先,將response和utterances分別用 ru_{i} 表示,經過word embedding後,則分別表示為:

R^{0}=[e^{0}_{r,0},...,e^{0}_{r,n_{r}-1}]

U^{0}_{i}=[e^{0}_{u_{i},0},...,e^{0}_{u_{i},n_{u_{i}}-1}]

其中 e 代表句子中每個詞的維度表示,在實際試驗中,作者用了word2vec去生成詞向量,詞向量的維度為200。接著就用上了剛剛介紹的Attentive Module,這裡又可以稱為self-attention層,因為 QKV 都是相同的。通過堆疊self-attention層,從而獲得不同粒度的表示。具體的公式如下:

R^{l+1}=AttentiveModule(R^{l},R^{l},R^{l})

U^{l+1}=AttentiveModule(U^{l},U^{l},U^{l})

最後每個句子(response和utterances)都會獲得L+1種表示,即[R^{0},...,R^{L}][U^{0}_{i},...,U^{L}_{i}]。其中L是self-attention的層數,+1是算上一開始word embedding的表示。

Utterance-Response Matching

得到[R^{0},...,R^{L}][U^{0}_{i},...,U^{L}_{i}]後,就可以做response和utterance之間的匹配了。response和utterance之間的匹配矩陣有兩種,分別是 M_{self}M_{cross}M_{self}是直接用[R^{0},...,R^{L}][U^{0}_{i},...,U^{L}_{i}]分別做匹配形成的,具體公式如下:

M^{u_{i},r,l}_{self}={U^{l}_{i}[k]^{T}cdot R^{l}[t] }_{n_{u_{i}}	imes n_{r}}

M_{cross} 則需要將[R^{0}_{i},...,R^{L}_{i}][U^{0}_{i},...,U^{L}_{i}]輸入cross-attention層,得到[	ilde{R}^{0}_{i},...,	ilde{R}^{L}_{i}][	ilde{U}^{0}_{i},...,	ilde{U}^{L}_{i}] ,再分別做匹配形成,具體公式如下:

	ilde{R}^{l}=AttentiveModule(R^{l},U_{i}^{l},U_{i}^{l})

	ilde{U}_{i}^{l}=AttentiveModule(U_{i}^{l},R^{l},R^{l})

M^{u_{i},r,l}_{cross}={	ilde{U}^{l}_{i}[k]^{T}cdot 	ilde{R}^{l}[t] }_{n_{u_{i}}	imes n_{r}}

Aggregation

在得到M_{self}M_{cross}後,就需要將它們聚合起來,文章的做法是將所有的2D匹配矩陣聚合成一個大的3D匹配圖像 Q ,具體的聚合方法就是將M_{self}M_{cross}所有的矩陣排列起來,所以就增加了一個維度,新的維度(可以稱之為深度)大小是 2(L+1) ,具體公式如下:

Q={ Q_{i,k,t}}_{n	imes n_{u_{i}}	imes n_{r}} ,其中 Q_{i,k,t} 可以表示為:

Q_{i,k,t}=[M^{u_{i},r,l}_{self}[k,t]]^{L}_{l=0}oplus [M^{u_{i},r,l}_{cross}[k,t]]^{L}_{l=0}

聚合成3D匹配圖像後,文章中採用了兩次的3D卷積和最大池化去提取特徵,在實際試驗中,第一次3D卷積的輸入通道數為2(L+1),輸出通道數為32,卷積核的大小是[3,3,3],步幅為[1,1,1],最大池化層的核大小是[3,3,3],步幅為[3,3,3];第二次3D卷積的輸入通道數為32,輸出通道數為16,卷積核的大小是[3,3,3],步幅為[1,1,1],最大池化層的核大小是[3,3,3],步幅為[3,3,3]。

通過卷積和池化提取到特徵後(用 f_{match}(c,r) 表示提取後的特徵),後面接一層線性層將維度轉化成1,用來表示匹配的分數,具體公式如下:

g(c,r)=sigma (W_3f_{match}(c,r)+b_3)

到此為止,已經將整個模型的具體公式介紹完畢了,整個模型的結構和流程也可以通過公式去慢慢了解。


後續會補充下論文的實驗和對模型的相關分析~


推薦閱讀:
相關文章