1. 程式人生 > >深度文字匹配模型(一):k-nrm

深度文字匹配模型(一):k-nrm

開篇

用深度學習模型去匹配句子的相似度已經是目前句子相似度的主流方法。本質上還是句子相似度的問題。深度文字匹配模型可以提供更好的搜尋排序服務。它的基本場景就是:給一個query,模型返回排序靠前的document。是不是很像一個搜尋引擎,其實本質上是差不多的。只不過深度文字匹配更具語義上的優勢,更加智慧。公司實習是做問答系統,所以最近都在刷一些文字匹配的模型,這邊以部落格的形式記錄下來。不光是理論,我會奉上一些程式碼。本部落格沒有使用任何公司的資料,也未整合到公司的任何系統中,屬於學術型文章開源。

k-nrm

本模型來源於End-to-End Neural Ad-hoc Ranking with Kernel Pooling

下載地址,如果公司、學校沒有購買acm的庫,可以去百度搜索一下題目下載免費的。

先放上模型圖,再逐步解釋它的每一個部分。

每一步的公式也放上,便於大家復現模型,這邊先不放程式碼,後期會放上程式碼。

Embedding Layer

公式從下往上看。深度學習NLP任務中出鏡率異常高的embedding層。如圖所示,我們把文字中的每一個單詞都表示成一個300維的詞向量。這裡的詞向量可以是預訓練的,也可以是隨機初始化的。當然預訓練的詞向量往往效果更加優秀。

Translation Layer

這邊計算是的cosine,餘弦相似度,n個單詞的query和m個單詞的doc,每一個單詞的詞向量都會計算一個cosine,最後組成一個n*m的矩陣M

Kernel Pooling

這裡主要包括公式的是4,3,2,這也是文章最核心的地方,或者說創新點吧。主要是使用高斯核函式去做池化。大家有沒有發現,這裡沒有卷積,卻有池化。為什麼不用卷積去提取更加細的特徵,直接就池化了呢。原因嘛,憋著大招留給下一篇頂會。也就是我之後會寫的conv-knrm,同樣的作者,加入了卷積。不得不說cnn速度還是相當優秀的。

回到正題,(4)對M中的每一行都做了高斯核的轉換,k代表的是kernel的標號;(3)每一行的Mi都得到一個向量,向量裡面的元素代表的是不同的kernel轉換的數值;(2)每個kernel下面都Mi都要做logsum得到我們最後的soft-tf feature

全連線層

這裡就沒什麼好講的啦。