深度RNN解决语义搜索难题
深度RNN解決語義搜索難題
2016-08-15 22:34 轉載 CSDN 0條評論雷鋒網(搜索“雷鋒網”公眾號關注)按:本文作者張俊林,主要介紹了3種基于深度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可能也是不一樣的。
在這個框架下,我們給出一個最簡單易行的做語義搜索的方法,在上述框架下,只需要做兩點:
1. 如何獲得文檔的Word Embedding表示以及如何獲得查詢的Word Embedding表示?直接把單詞的Word Embedding表示累加或者求個平均即可,簡單吧。其實這種方法效果并不一定就差,在有些場合直接累加效果還是挺好的,實現起來又異常簡單;
2. 文檔和查詢的相似性度量函數如何取?直接用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,轉載請聯系授權,并注明作者和出處,不得刪減內容。
總結
以上是生活随笔為你收集整理的深度RNN解决语义搜索难题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运用深度学习教机器人理解自然语言
- 下一篇: 解密:面部特征点检测的关键技术