1. 程式人生 > >DSSM:深度語義匹配模型(及其變體CLSM、LSTM-DSSM)

DSSM:深度語義匹配模型(及其變體CLSM、LSTM-DSSM)

引用 neu ctu dell 卷積層 Speak 別了 tin 處理

導語

在NLP領域,語義相似度的計算一直是個難題:搜索場景下Query和Doc的語義相似度、feeds場景下Doc和Doc的語義相似度、機器翻譯場景下A句子和B句子的語義相似度等等。本文通過介紹DSSM、CNN-DSSM、LSTM-DSSM等深度學習模型在計算語義相似度上的應用,希望給讀者帶來幫助。

1. 背景

以搜索引擎和搜索廣告為例,最重要的也最難解決的問題是語義相似度,這裏主要體現在兩個方面:召回和排序。

召回時,傳統的文本相似性如 BM25,無法有效發現語義類 Query-Doc 結果對,如"從北京到上海的機票"與"攜程網"的相似性、"快遞軟件"與"菜鳥裹裹"的相似性。

排序時,一些細微的語言變化往往帶來巨大的語義變化,如"小寶寶生病怎麽辦"和"狗寶寶生病怎麽辦"、"深度學習"和"學習深度"。

DSSM(Deep Structured Semantic Models) 為計算語義相似度提供了一種思路。

本文的最後,筆者結合自身業務,對 DSSM 的使用場景做了一些總結,不是所有的業務都適合用 DSSM。

2. DSSM 深度語義匹配模型

DSSM [1](Deep Structured Semantic Models)的原理很簡單,通過搜索引擎裏 Query 和 Title 的海量的點擊曝光日誌,用 DNN 把 Query 和 Title 表達為低維語義向量,並通過 cosine 距離來計算兩個語義向量的距離,最終訓練出語義相似度模型。該模型既可以用來預測兩個句子的語義相似度

,又可以獲得某句子的低維語義向量表達

DSSM 從下往上可以分為三層結構:輸入層、表示層、匹配層

技術分享圖片

2.1 輸入層

輸入層做的事情是把句子映射到一個向量空間裏並輸入到 DNN 中,這裏英文和中文的處理方式有很大的不同

(1)英文

英文的輸入層處理方式是通過Word Hashing。舉個例子,假設用 letter-trigams 來切分單詞(3 個字母為一組,#表示開始和結束符),boy 這個單詞會被切為 #-b-o, b-o-y, o-y-#

技術分享圖片

這樣做的好處有兩個:首先是壓縮空間,50 萬個詞的 one-hot 向量空間可以通過 letter-trigram 壓縮為一個 3 萬維的向量空間。其次是增強範化能力

,三個字母的表達往往能代表英文中的前綴和後綴,而前綴後綴往往具有通用的語義。

這裏之所以用 3 個字母的切分粒度,是綜合考慮了向量空間單詞沖突

技術分享圖片

以 50 萬個單詞的詞庫為例,2 個字母的切分粒度的單詞沖突為 1192(沖突的定義:至少有兩個單詞的 letter-bigram 向量完全相同),而 3 個字母的單詞沖突降為 22 效果很好,且轉化後的向量空間 3 萬維不是很大,綜合考慮選擇 3 個字母的切分粒度。

(2)中文

中文的輸入層處理方式與英文有很大不同,首先中文分詞是個讓所有 NLP 從業者頭疼的事情,即便業界號稱能做到 95%左右的分詞準確性,但分詞結果極為不可控,往往會在分詞階段引入誤差。所以這裏我們不分詞,而是仿照英文的處理方式,對應到中文的最小粒度就是單字了。(曾經有人用偏旁部首切的,感興趣的朋友可以試試)

由於常用的單字為 1.5 萬左右,而常用的雙字大約到百萬級別了,所以這裏出於向量空間的考慮,采用字向量(one-hot)作為輸入,向量空間約為 1.5 萬維。

2.2 表示層

DSSM 的表示層采用 BOW(Bag of words)的方式,相當於把字向量的位置信息拋棄了,整個句子裏的詞都放在一個袋子裏了,不分先後順序。當然這樣做會有問題,我們先為 CNN-DSSM 和 LSTM-DSSM 埋下一個伏筆。緊接著是一個含有多個隱層的 DNN,如下圖所示:

技術分享圖片

用 Wi 表示第 i 層的權值矩陣,bi 表示第 i 層的 bias 項。則第一隱層向量 l1(300 維),第 i 個隱層向量 li(300 維),輸出向量 y(128 維)可以分別表示為:

技術分享圖片

用 tanh 作為隱層和輸出層的激活函數:

技術分享圖片

最終輸出一個 128 維的低緯語義向量。

2.3 匹配層

Query 和 Doc 的語義相似性可以用這兩個語義向量(128 維) 的 cosine 距離(即余弦相似度) 來表示:

技術分享圖片

通過 softmax 函數可以把 Query 與正樣本 Doc 的語義相似性轉化為一個後驗概率:

技術分享圖片

其中 r 為 softmax 的平滑因子,D 為 Query 下的正樣本,D-為 Query 下的負樣本(采取隨機負采樣),D 為 Query 下的整個樣本空間。

在訓練階段,通過極大似然估計,我們最小化損失函數:

技術分享圖片

殘差會在表示層的 DNN 中反向傳播,最終通過隨機梯度下降(SGD)使模型收斂,得到各網絡層的參數{Wi,bi}。

2.4 優缺點

優點:
DSSM 用字向量作為輸入既可以減少切詞的依賴,又可以提高模型的範化能力,因為每個漢字所能表達的語義是可以復用的。另一方面,傳統的輸入層是用 Embedding 的方式(如 Word2Vec 的詞向量)或者主題模型的方式(如 LDA 的主題向量)來直接做詞的映射,再把各個詞的向量累加或者拼接起來,由於 Word2Vec 和 LDA 都是無監督的訓練,這樣會給整個模型引入誤差DSSM 采用統一的有監督訓練,不需要在中間過程做無監督模型的映射,因此精準度會比較高。

缺點:
上文提到 DSSM 采用詞袋模型(BOW),因此喪失了語序信息和上下文信息。另一方面,DSSM 采用弱監督、端到端的模型,預測結果不可控。

3. CNN-DSSM

針對 DSSM 詞袋模型丟失上下文信息的缺點,CLSM[2](convolutional latent semantic model)應運而生,又叫 CNN-DSSM。CNN-DSSM 與 DSSM 的區別主要在於輸入層和表示層。

3.1 輸入層

(1)英文

英文的處理方式,除了上文提到的 letter-trigram,CNN-DSSM 還在輸入層增加了word-trigram

技術分享圖片

如上圖所示,word-trigram其實就是一個包含了上下文信息的滑動窗口。 舉個例子:把<s> online auto body ... <s>這句話提取出前三個詞<s> online auto,之後再 ==分別對==這三個詞進行 letter-trigram 映射到一個 3 萬維的向量空間裏,然後把三個向量 concat 起來,最終映射到一個 9 萬維的向量空間裏。

(2)中文

英文的處理方式(word-trigram letter-trigram)在中文中並不可取,因為英文中雖然用了 word-ngram 把樣本空間拉成了百萬級,但是經過 letter-trigram 又把向量空間降到可控級別,只有 3*30K(9 萬)。而中文如果用 word-trigram,那向量空間就是百萬級的了,顯然還是字向量(1.5 萬維)比較可控。

3.2 表示層

CNN-DSSM 的表示層由一個卷積神經網絡組成,如下圖所示:

技術分享圖片

(1)卷積層——Convolutional layer

卷積層的作用是提取滑動窗口下的上下文特征。 以下圖為例,假設輸入層是一個 302*90000(302 行,9 萬列)的矩陣,代表 302 個字向量(Query 的和 Doc 的長度一般小於 300,這裏少了就補全,多了就截斷),每個字向量有 9 萬維。而卷積核是一個 3*90000 的權值矩陣,卷積核以步長為 1 向下移動,得到的 feature map 是一個 300*1 的矩陣,feature map 的計算公式是(輸入層維數 302-卷積核大小 3 步長 1)/步長 1=300。而這樣的卷積核有 300 個,所以形成了 300 個 300*1 的 feature map 矩陣。
技術分享圖片

根據論文原文也可以這樣理解:

每個英文單詞經過 word hash 之後都可以由一個30K大小的向量表示,我們的卷積可以理解為一維卷積,窗口大小為3,即將待卷積部分三個單詞拼接成一個90K的向量,而卷積核為一個 90K*300 的矩陣,每次卷積輸出一個 1*300 的向量。

(2)池化層——Max pooling layer

池化層的作用是為句子找到全局的上下文特征。池化層以 Max-over-time pooling 的方式,每個 feature map 都取最大值,得到一個 300 維的向量。Max-over-pooling 可以解決可變長度的句子輸入問題(因為不管 Feature Map 中有多少個值,只需要提取其中的最大值)。不過我們在上一步已經做了句子的定長處理(固定句子長度為 302),所以就沒有可變長度句子的問題。最終池化層的輸出為各個 Feature Map 的最大值,即一個 300*1 的向量。這裏多提一句,之所以 Max pooling 層要保持固定的輸出維度,是因為下一層全鏈接層要求有固定的輸入層數,才能進行訓練。

(3)全連接層——Semantic layer

最後通過全連接層把一個 300 維的向量轉化為一個 128 維的低維語義向量。全連接層采用 tanh 函數:

技術分享圖片

3.3 匹配層

CNN-DSSM 的匹配層和 DSSM 的一樣,這裏省略。

3.4 優缺點

優點:

CNN-DSSM 通過卷積層提取了==滑動窗口下的上下文信息==,又通過池化層提取了==全局的上下文信息==,上下文信息得到較為有效的保留。

缺點:

對於間隔較遠的上下文信息,難以有效保留。 舉個例子,I grew up in France... I speak fluent French,顯然 France 和 French 是具有上下文依賴關系的,但是由於 CNN-DSSM 滑動窗口(卷積核)大小的限制,導致無法捕獲該上下文信息。

4. LSTM-DSSM

針對 CNN-DSSM 無法捕獲較遠距離上下文特征的缺點,有人提出了用LSTM-DSSM[3](Long-Short-Term Memory)來解決該問題。不過說 LSTM 之前,要先介紹它的"爸爸""RNN。

4.1 RNN

RNN(Recurrent Neural Networks)可以被看做是同一神經網絡的多次復制,每個神經網絡模塊會把消息傳遞給下一個。如果我們將這個循環展開:

技術分享圖片

假設輸入 xi 為一個 Query 中幾個連續的詞,hi 為輸出。那麽上一個神經元的輸出 h(t-1) 與當前細胞的輸入 Xt 拼接後經過 tanh 函數會輸出 ht,同時把 ht 傳遞給下一個細胞。

技術分享圖片

不幸的是,在這個間隔不斷增大時,RNN 會逐漸喪失學習到遠距離信息的能力。因為 RNN 隨著距離的加長,會導致梯度消失。簡單來說,由於求導的鏈式法則,直接導致梯度被表示為連乘的形式,以至梯度消失(幾個小於 1 的數相乘會逐漸趨向於 0)。

4.2 LSTM

LSTM[4]((Long-Short-Term Memory)是一種 RNN 特殊的類型,可以學習長期依賴信息。我們分別來介紹它最重要的幾個模塊:

技術分享圖片

(0)細胞狀態

細胞狀態這條線可以理解成是一條信息的傳送帶,只有一些少量的線性交互。在上面流動可以保持信息的不變性。

技術分享圖片

(1)遺忘門

遺忘門[5]由 Gers 提出,它用來控制細胞狀態 cell 有哪些信息可以通過,繼續往下傳遞。如下圖所示,上一層的輸出 h(t-1) concat 上本層的輸入 xt,經過一個 sigmoid 網絡(遺忘門)產生一個從 0 到 1 的數值 ft,然後與細胞狀態 C(t-1) 相乘,最終決定有多少細胞狀態可以繼續往後傳遞。

技術分享圖片

(2)輸入門

輸入門決定要新增什麽信息到細胞狀態,這裏包含兩部分:一個 sigmoid 輸入門和一個 tanh 函數。sigmoid 決定輸入的信號控制,tanh 決定輸入什麽內容。如下圖所示,上一層的輸出 h(t-1) concat 上本層的輸入 xt,經過一個 sigmoid 網絡(輸入門)產生一個從 0 到 1 的數值 it,同樣的信息經過 tanh 網絡做非線性變換得到結果 Ct,sigmoid 的結果和 tanh 的結果相乘,最終決定有哪些信息可以輸入到細胞狀態裏。

技術分享圖片

(3)輸出門

輸出門決定從細胞狀態要輸出什麽信息,這裏也包含兩部分:一個 sigmoid 輸出門和一個 tanh 函數。sigmoid 決定輸出的信號控制,tanh 決定輸出什麽內容。如下圖所示,上一層的輸出 h(t-1) concat 上本層的輸入 xt,經過一個 sigmoid 網絡(輸出門)產生一個從 0 到 1 的數值 Ot,細胞狀態 Ct 經過 tanh 網絡做非線性變換,得到結果再與 sigmoid 的結果 Ot 相乘,最終決定有哪些信息可以輸出,輸出的結果 ht 會作為這個細胞的輸出,也會作為傳遞個下一個細胞。

技術分享圖片

4.2 LSTM-DSSM

LSTM-DSSM 其實用的是 LSTM 的一個變種——加入了peep hole[6]的 LSTM。如下圖所示:

技術分享圖片

看起來有點復雜,我們換一個圖,讀者可以看的更清晰:

技術分享圖片

這裏三條黑線就是所謂的 peephole,傳統的 LSTM 中遺忘門、輸入門和輸出門只用了 h(t-1) 和 xt 來控制門縫的大小,peephole 的意思是說不但要考慮 h(t-1) 和 xt,也要考慮 Ct-1 和 Ct,其中遺忘門和輸入門考慮了 Ct-1,而輸出門考慮了 Ct。 總體來說需要考慮的信息更豐富了。

好了,來看一個 LSTM-DSSM 整體的網絡結構:

技術分享圖片

紅色的部分可以清晰的看到殘差傳遞的方向。

5. 後記

介紹完了 DSSM 及其幾個變種,還要給讀者潑點冷水,DSSM 就一定適合所有的業務嗎?

這裏列出 DSSM 的 2 個缺點以供參考:

  1. DSSM 是端到端的模型 ,雖然省去了人工特征轉化、特征工程和特征組合,但端到端的模型有個問題就是效果不可控。對於一些要保證較高的準確率的場景,用有監督人工標註的 Query 分類作為打底,再結合無監督的 Word2Vec、LDA 等進行語義特征的向量化,顯然比較可控(至少 Query 分類的準確率可以達到 95% 以上)。

  2. DSSM 是弱監督模型,因為引擎的點擊曝光日誌裏 Query 和 Title 的語義信息比較弱。舉個例子,搜索引擎第一頁的信息往往都是 Query 的包含匹配,筆者統計過,完全的語義匹配只有不到 2%。這就意味著幾乎所有的標題裏都包含用戶 Query 裏的關鍵詞,而僅用點擊和曝光就能作為正負樣例的判斷?顯然不太靠譜,因為大部分的用戶進行點擊時越靠前的點擊的概率越大,而引擎的排序又是由 pCTR、CVR、CPC 等多種因素決定的。從這種非常弱的信號裏提取出語義的相似性或者差別,那就需要有海量的訓練樣本。DSSM 論文中提到,實驗的訓練樣本超過 1 億。筆者和同事也親測過,用傳統 CTR 預估模型千萬級的樣本量來訓練,模型無法收斂。可是這樣海量的訓練樣本,恐怕只有搜索引擎才有吧?普通的搜索業務 Query 有上千萬,可資源頂多只有幾百萬,像論文中說需要挑出點擊和曝光置信度比較高且資源熱度也比較高的作為訓練樣本,這樣就過濾了 80% 的長尾 Query 和 Title 結果對,所以也只有搜索引擎才有這樣的訓練語料了吧。另一方面,超過 1 億的訓練樣本作為輸入,用深度學習模型做訓練,需要大型的 GPU 集群,這個對於很多業務來說也是不具備的條件。

6. 引用

[1]. Huang P S, He X, Gao J, et al. Learning deep structured semantic models for web search using clickthrough data[C]// ACM International Conference on Conference on Information & Knowledge Management. ACM, 2013:2333-2338.

[2]. Shen, Yelong, et al. "A latent semantic model with convolutional-pooling structure for information retrieval." Proceedings of the 23rd ACM International Conference on Conference on Information and Knowledge Management. ACM, 2014.

[3]. Palangi, Hamid, et al. "Semantic modelling with long-short-term memory for information retrieval." arXiv preprint arXiv:1412.6629 2014.

[4]. Hochreiter, Sepp and Schmidhuber, J¨urgen. Long short-term memory. Neural Comput., 9(8):1735–1780, November 1997.

[5]. Gers, Felix A., Schmidhuber, Jrgen, and Cummins, Fred. Learning to forget: Continual prediction with lstm. Neural Computation, 12:2451–2471, 1999.

[6]. Gers, Felix A., Schraudolph, Nicol N., and Schmidhuber, J¨urgen. Learning precise timing with lstm recurrent networks. J. Mach. Learn. Res., 3:115–143, March 2003.

DSSM:深度語義匹配模型(及其變體CLSM、LSTM-DSSM)