1. 程式人生 > >使用深度RNN模型構建語義搜尋引擎

使用深度RNN模型構建語義搜尋引擎

本文討論如何用深度學習系統來構造語義搜尋引擎的問題。這裡所謂的語義搜尋,是指的能做使用者查詢和搜尋網頁之間的語義級別匹配,比如說,使用者輸入“Iphone”,雖然某篇文章講到了“蘋果公司正在試圖做新型的手機”,但是沒有明確說iphone的字樣,那麼即使如此也能夠將這篇文章找出來。傳統的搜尋引擎對於這種情況是無能為力的,因為它們基本上還是基於字面匹配作為排序的基礎的,沒有任何字面匹配的結果是不會被搜尋出來的,即使兩者在語義上講非常相關也不行。

搜尋引擎大家平常都會用,所以這塊不必說。但是從技術角度講,搜尋是在幹什麼事情?這個需要簡單說明一下。所謂搜尋,就是說我們手頭假設有10億個網頁,形成文件集合D,使用者想找一個資訊,向搜尋引擎發出使用者查詢Query。搜尋引擎本質上就是計算文件集合D中每個網頁和使用者查詢Query之間的相關程度,越相關的排在搜尋結果前列,就形成了搜尋結果。

所以本質上搜索就是對於兩個資訊:Query 和某篇文件Di,計算兩者之間的相關程度。傳統的方法是尋找兩者之間的特徵重合程度來判斷的(此文我們不考慮連結關係等因素,純考慮文字匹配角度),比如TF.IDF啊,查詢詞是否在標題出現啊等等特徵。

也就是說,對於搜尋來說,可以將其改造成句子對匹配的問題,即可以如下理解搜尋問題:


意思是說,給定了使用者查詢和某篇文章,經過對映函式,給出兩者相關還是不相關的判斷,或者給出從1到5的不同相關程度的分類結果,1代表不相關,5代表非常相關:

就是說給定Doc和Query,利用神經網路構造對映函式,對映到1到5分值空間裡面。

之前我們歸納過對於句子匹配問題常見的幾種基於RNN的網路結構,而本文給出將搜尋問題看做是典型的句子匹配問題以及將其看做是特殊的句子匹配問題的神經網路結構。我們可以將這種基於RNN構建出的語義搜尋神經網路結構稱之為NeuralSearch結構。就我的閱讀視野範圍來看,目前看到過CNN做搜尋問題的,還沒有看到RNN結構的。當然其實神經網路做搜尋的工作相對來說不多,這可能跟查詢太短文件太長有一定關係,至於這裡介紹的方法是否有效我也不知道,本文只是把這個想法分享一下。

 在給出後續的RNN結構前,先給出一個非常簡單易行的非監督的語義搜尋模型。

|一種非監督的簡單語義搜尋模型

其實你要想通過神經網路做語義搜尋,有一種非常簡單的方式。這裡描述下其工作機制。


                  圖1 抽象的語義搜尋結構

圖1給出了一個最抽象的神經網路做語義搜尋的模型結構。它的核心思想是:把文件集合D中的每個網頁通過一定對映方法表示為Word Embedding的表達方式,同時把使用者查詢Q也對映到Word Embedding表達方式,在這裡其實已經分別將查詢和文件對映到了語義空間了。然後對兩者通過相似性函式進行匹配:

然後根據相似性得分由高到低輸出就完成了文件排序工作,給出了搜尋結果。

之前有一些結合Word Embedding和IR的工作其實都是在這個抽象框架裡覆蓋範圍裡的,區別無非在於:從文件的單詞列表如何映射出文件的Word Embedding表示可能方法(圖1中的文件WE轉換模組)是不一樣的;從使用者查詢如何映射出查詢的Word Embedding表示可能方法(圖1中的查詢WE轉換模組)是不一樣的;相似性計算函式F可能也是不一樣的。

在這個框架下,我們給出一個最簡單易行的做語義搜尋的方法,在上述框架下,只需要做兩點:

如何獲得文件的Word Embedding表示以及如何獲得查詢的Word Embedding表示?直接把單詞的Word Embedding表示累加或者求個平均即可,簡單吧。其實這種方法效果並不一定就差,在有些場合直接累加效果還是挺好的,實現起來又異常簡單;

文件和查詢的相似性度量函式如何取?直接用Cosine計算就行。

這樣,就能夠構造出非常簡單可行的語義搜尋系統了。由於採用的是Word Embedding表示,所以它肯定可以支援語義搜尋,因為即使文件裡面沒有出現過查詢詞,只要文件中包含和查詢詞語義接近的單詞,那麼他們的Word Embedding就非常像,就能算出語義相似性來。

從感覺上說,這種非監督的方法肯定能增加搜尋系統的召回率,因為原先無法匹配的文件現在可以匹配了,但是理論上說對於搜尋精度來說很可能是下降的,所以可能需要和傳統方法結合來一起用。

在圖1的抽象結構上,其實我們很容易產生一個創新性想法,就是把個性化搜尋融合進來,做個“個性化語義搜尋引擎”,改動很簡單,只需要加入一個使用者個性化建模模組即可,如圖2所示,只需要把使用者個人歷史通過“User歷史WE轉換模組”來將使用者個性模型能夠表達為Word Embedding形式,就將個性化因素融合到這個語義搜尋系統裡面來了。

            圖2 個性化語義搜尋抽象框架圖

這個結構目前好像我也沒看到過有提到的,應該是種新想法,當然,算是一種簡單的新想法。而且如何構建個性化模組可能有很多不同的方法,所以這個結構也是大有文章可作的。

|將搜尋問題看成典型的RNN句子匹配問題

在之前的文章裡面,我們從現有文獻裡面歸納抽象出了用RNN解決句子匹配問題的幾種常見神經網路結構。既然我們把搜尋問題看做是句子匹配問題,那麼完全可以套用這些模型來解決這個問題。當然,直接使用RNN累加一個文件Word Embedding未必是個很好的想法,但是這塊可以採用分句子給出Word Embedding,然後在累加等其它變體,這裡為了簡化說明,採用簡單方法描述。

                    圖3 NeuralSearch結構一

圖3是第一種可能的RNN解決語義搜尋問題的神經網路結構,我們可以稱之為NeuralSearch Model1。核心思想是:針對文件D和使用者查詢Q,分別建立一個深度RNN神經網路,用來抽取兩者的特徵,然後將兩者特徵拼接成MLP三層神經網路結構的輸入層,進行非線性變換,在這裡來探討兩者之間的關係,之後給出分類結果。圖中W代表文件中出現的單詞,而Q代表查詢中出現的單詞。與CNN模型比,RNN模型可以顯示地將單詞順序因素考慮進來。

      圖4 NeuralSearch結構二

圖4是第二種可能的RNN解決語義搜尋問題的神經網路結構,我們稱之為NeuralSearch Model2。核心思想是:將文件D和使用者查詢Q的單詞依次拼接起來作為深層RNN結構的輸入,兩者之間用特殊分隔符EOS來進行分隔,然後上面套上深層RNN結構,在此之上,可以用Mean Pooling來收集各個BLSTM單元的投票資訊,並通過SoftMax給出最終分類結果。一樣的,圖中W代表文件中出現的單詞,而Q代表查詢中出現的單詞。這種模型相對NeuralSearch Model1來說,在神經網路輸入層級就開始對D和Q中單詞之間的關係建立聯絡。

                         圖5 NeuralSearch結構三

圖5是第三種可能的RNN解決語義搜尋問題的神經網路結構,我們稱之為NeuralSearch Model3。這個模型和NeuralSearch Model2在輸入層以及之後的深度網路結構是一樣的,區別在於:在做最後分類之前,不是每個BLSTM單元各自做出投票,而是將雙向RNN的首節點和尾節點隱層狀態拼接起來作為最後分類的基礎,因為這兩個狀態儲存了文件D和使用者查詢Q之間的語義關係資訊。

我們標題說的是語義搜尋,但是好像半天沒講語義怎麼體現出來的,其實最初那個簡單語義搜尋模型已經能夠說明這個問題了,只要單詞是以Word Embedding的方式進行的,那麼其實已經能夠處理那些字面不同但是語義相同的語義匹配問題了,也就是說,它肯定是語義級別進行匹配的。

上面三種結構是將搜尋問題完全看成句子匹配問題引出的,下面看看是否可以構造具有搜尋特性的網路結構。

|將搜尋問題看成非典型的RNN句子匹配問題

因為搜尋問題和一般的句子匹配問題相比,有個明顯的特點:文件內容長,而使用者查詢短,也就是兩者資訊含量非常不同。在此基礎上看,是否採用典型的RNN句子匹配思路來做會獲得非常好的效果,帶有一定的不確定性因素,因為上面的結構中查詢很短而文件很長,拼接作為輸入是否查詢資訊會被弱化,以及LSTM是否能夠捕獲如此長距離的關係等影響都是未知數。

那麼我們是否可以根據搜尋問題的特點,來對RNN模型結構進行進一步的改造,使得神經網路結構更能符合搜尋任務的特點。

                      圖6 NeuralSearch結構四

圖6是這種經過特殊化改造的感覺更適合搜尋場景的NeuralSearch結構,我們稱之為NeuralSearch Model4。首先,第一層神經網路首先把使用者查詢和文件的每個句子根據RNN進行語義編碼,上層仍然採用經典的深層雙向RNN結構,與之前的網路結構區別在於:對於每個BLSTM單元來說,輸入由兩部分拼接而成,一個是Query 的語義編碼,另外一個是某個句子的語義編碼。兩者拼接後作為新的輸入,這樣每個BLSTM節點實際是在判斷每個句子和使用者查詢的相關程度,而通過雙向RNN結構將構成文件的所有句子按照順序串接起來,這裡的RNN結構是能體現句子之間的順序關係的。對於更深層的網路來說,不斷重複這個過程,直到最高層的BLSTM產生輸出,而對於每個句子的輸出通過Mean Pooling進行資訊融合,然後通過SoftMax產生最後的分類結果,也就是{1,2,3,4,5}幾個不同相關類別中。這個過程可以理解為判斷查詢和每個句子之間的語義相關程度,然後每個句子做出投票,根據每個句子的投票結果構造出文件整體和查詢的語義相關程度。

可以看出,上述結構把文件轉換為句子的集合,而在每一層結構中反覆使用使用者查詢,同時在每個句子處反覆拼接使用者查詢,通過這種方式,一方面可以試圖解決文件和查詢長度差異極大的情況,對使用者查詢進行了強化,另外一方面這種將查詢的語義表示在不同層級間反覆使用的思路,類似於Residual Network的那種建立輸入和深層網路中間結構之間的ShortCut直連思想。

有了上述幾種NeuralSearch神經網路結構,可以採取傳統的Learning to rank的思路,用人工標好的訓練資料去訓練神經網路。當神經網路訓練好之後,就可以整合到搜尋系統裡,來實現語義搜尋的功能。

當然,上述幾種RNN結構做搜尋是我自己拍腦袋想的,目前還沒有看到相似想法的相關文獻,而我也沒有時間精力以及訓練資料來對其效果進行驗證,所以上述的任意一種結構用來解決搜尋問題是否有效也沒有結論。很可能其中某種會有效,也許都沒有效果。所以這裡對此不能作任何結論性的假設或說明,只是將一種自己認為也許可行的思路分享出來,有興趣的且有資料的同學可以試試。

最後再補充兩句,其實如果對Learningto rank有了解的同學可以看出來,Learning to rank包含三種範型:單文件方法、文件對方法和文件列表方法。上面幾個模型本質上都是單文件方法,其實可以將RNN神經網路和文件對方法以及文件列表方法結合起來構建新的Learning to Rank模型,這塊我不確定是否已經出現,就我跟蹤的範圍看好像還沒有看到,但是很明顯的一點是,這個結合的出現只是時間問題。而這種結合如果證明有效,就是比較大的創新,所以這塊是有很多文章可以做的,我是一沒有資料二沒有精力放在這塊,否則條件允許,這個方向是值得投入較大精力去摸索的。


--------------------- 
作者:張俊林部落格 
來源:CSDN 
原文:https://blog.csdn.net/malefactor/article/details/50878936