1. 程式人生 > >DSSM演算法-計算文字相似度

DSSM演算法-計算文字相似度

轉載請註明出處: http://blog.csdn.net/u013074302/article/details/76422551

導語

在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 矩陣。

(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 的一個變種——加入了peephole[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.