【Semantic Embedding】: DSSM模型

論文下載地址

代碼實現

DSSM現在應該已經算是經典的文章了,有些年頭了。網上已經有很多優秀的博客對該算法進行分析,建議去看那些文章,講的比較全面。

DSSM的思想是利用搜索點擊數據,分別將query和documents利用DNN映射到高緯語義空間,然後將query和document的高緯語義向量利用餘弦相似度,對向量進行相似度計算。

訓練階段,對於點擊數據,如果在當前query下,被點擊的document認爲是正樣本,沒有點擊的document認爲是負樣本,正常的搜索行爲,每個query會返回很多的相關documents,而用戶則會找到最需要的進行點擊查看。所以模型需要做的就是對全部的document進行排序,讓最相關document的排序分值最高。但是每個query對應的document數量比較大,所以並不需要對全部的documents,因此可以對documents進行採用,訓練的時候只報表被點擊的document(正樣本),沒有點擊的隨機採樣若干個(論文裏採樣了四個)。

後續也有人直接利用query-document樣本對來進行訓練,訓練數據格式爲(label,query,document),如果在query下,document被點擊則label爲1,如果沒有點擊則label爲0。然後對負樣本進行採樣。儘量不要讓正負樣本懸殊過大。

模型

                        

上圖爲模型結構,最下面的term vector是將query和document做詞袋模型展開,形成一個很長的稀疏向量,作爲模型的輸入。

這裏,因爲英文單次量很大,這樣做詞袋模型的話,維度太大,輸入數據很稀疏,因爲爲了解決這個問題,用了一個hash trick來解決這個問題,叫做WordHashing。就是上圖的倒數第二層。

詞hash其實就是把一個英文單詞,利用n-grams把單詞切開,比如把good用tri-gram切,切完就是(#go,goo,ood,od#),然後按切好的tri-gram對整個query或者doc做詞袋模型。這樣就能顯著降低輸入特徵的維度。就和中文一樣,中文其實字的數量並不多,可能幾萬個字就能覆蓋很多的場景了,但是一旦擴展的詞的量就會很大。

但是這個方法在中文裏,基本沒啥用,當然有能力可以把中文的字拆成各個部首也可以試試,這個之前在看NER相關文章的時候還真有這樣做的。

針對中文的話,直接分詞就可以了,然後統計query和doc的詞袋模型作爲輸入。

到這以後,輸入就傳入上圖中的multi-layer non-liner projection了,這其實就是幾層全連接層,全連接層的最後一層輸出就是我們要獲取的隱藏語義向量。也就是上圖中的semantic feature

最後就是對query和doc的semantic feature進行相似度計算,通過query和不同的doc進行相似度計算,就能獲得多個相似度值,

                                               

有了相似度值後就可以對文檔進行排序了 去求query和doc的最大似然,這裏直接用softmax來計算query和doc之間的分值,其中標籤數據爲:query和被點擊的doc相似度爲1,query和沒有點擊的doc的相似度爲0,訓練擬合:

                                              

這裏的r是平滑係數,實現定義好的。

現在損失函數有, 模型結構有,訓練數據也有了,然後就用梯度下降優化就可以了。

完。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章