一、序言
文字匹配是自然語言處理中一個重要的基礎問題,自然語言處理中的許多工都可以抽象為文字匹配任務。例如網頁搜尋可抽象為網頁同使用者搜尋 Query 的一個相關性匹配問題,自動問答可抽象為候選答案與問題的滿足度匹配問題,文字去重可以抽象為文字與文字的相似度匹配問題。
傳統的文字匹配技術如資訊檢索中的向量空間模型 VSM、BM25 等演算法,主要解決詞彙層面的匹配問題,或者說詞彙層面的相似度問題。而實際上,基於詞彙重合度的匹配演算法有很大的侷限性,原因包括:
1)語言的多義同義問題
相同的詞在不同語境下,可以表達不同的語義,例如「蘋果」既表示水果,也表示一家科技公司。同理,相同的語義也可由不同的詞表達,例如「的士」、「taxi」都表示計程車。
2)語言的組合結構問題
相同的片語成的短語或句子,不同的語序可表達不同的語義,例如「深度學習」和「學習深度」。更進一步,還存在句法結構問題,例如「從北京到上海高鐵」和「從上海到北京高鐵「雖然含有的詞語完全相同,但其語義完全不同。而「北京隊打敗了廣東隊」和「廣東隊被北京隊打敗了」又語義完全相同。
3)匹配的非對稱問題
文字匹配類的任務,並不單單是文字相似度問題。一方面不一定要求語言上的相似,例如網頁搜尋任務中 query 端的語言表述形式和網頁端往往具有很大的差別,至少在長度上就差距很大。另一方面也不一定要求語義上的相同,例如問答任務中,待匹配的兩段文字並不要求同義,而是看候選答案是否真正回答了問題。
這表明,對文字匹配任務,不能只停留在字面匹配層面,更需要語義層面的匹配,不僅是相似度匹配,還包括更廣泛意義上的匹配。
針對前述問題,有各種改進工作。比如基於統計機器翻譯方法,挖掘同義詞或同義片段來解決 mismatch 問題;從語義緊密度、詞語間隔等度量出發來規避結構轉義問題;從對網頁打關鍵詞標籤、點選關聯計算等來一定程度解決非對稱匹配問題等。這些方法,都有一定效果,但整體上造成策略邏輯非常複雜,還是沒有完全解決具體任務下語義層面的匹配問題。
而語義層面的匹配,首先面臨語義如何表示、如何計算問題。
上世紀 90 年代流行起來的潛在語義分析技術(Latent Semantic Analysis,LSA),開闢了一個新思路,將詞句對映到等長的低維連續空間,可在此隱式的「潛在語義」空間上進行相似度計算。此後又有 PLSA(Probabilistic Latent Semantic Analysis)、LDA(Latent Dirichlet Allocation)等更高階的概率模型被設計出來,逐漸形成非常火熱的主題模型技術方向。這些技術對文字的語義表示形式簡潔、運算方便,較好的彌補了傳統詞彙匹配方法的不足。不過從效果上來看,這些技術都無法替代字面匹配技術,只能作為字面匹配的有效補充。
深度學習技術興起後,基於神經網路訓練出的 Word Embedding 來進行文字匹配計算引起了廣泛的興趣。Word Embedding 的訓練方式更加簡潔,而且所得的詞語向量表示的語義可計算性進一步加強。但是,只利用無標註資料訓練得到的 Word Embedding 在匹配度計算的實用效果上和主題模型技術相差不大,它們本質上都是基於共現資訊的訓練。另外,Word Embedding 本身沒有解決短語、句子的語義表示問題,也沒有解決匹配的非對稱性問題。
我們於 2013 年設計研發了一種有監督的神經網路語義匹配模型 SimNet,大幅度提升了語義匹配計算的效果。SimNet 在語義表示上沿襲了隱式連續向量表示的方式,但對語義匹配問題在深度學習框架下進行了 End-to-End 的建模,將詞語的 Embedding 表示與句篇的語義表示、語義的向量表示與匹配度計算、文字對的匹配度計算與 pair-wise 的有監督學習全部統一在一個整體框架內。在實際應用場景下,海量的使用者點選行為資料可以轉化大規模的弱標記資料,搭配我們研發的高效並行訓練演算法,大資料訓練的 SimNet 顯著超越了主題模型類演算法的效果,並首次實現了可完全取代基於字面匹配的策略,而且可以直接建模非相似度類的匹配問題。在網頁搜尋任務上的初次使用即展現出極大威力,帶來了相關性的明顯提升。
近年來,學術界相關的研究也逐漸增多。像 Microsoft Research 提出的 DSSM 模型(Deep Structured Semantic Model)即和 SimNet 初版在模型框架上非常類似,只是在訓練手段上有所區別。華為 NOAH'S ARK LAB 也提出了一些新的神經網路匹配模型變體,如基於二維互動匹配的卷積匹配模型。中科院等研究機構也提出了諸如多視角迴圈神經網路匹配模型(MV-LSTM)、基於矩陣匹配的的層次化匹配模型 MatchPyramid 等更加精緻的神經網路文字匹配模型。
與此同時,我們也在 SimNet 基礎上進行了持續優化改進,模型效果持續提升,適用場景不斷擴大。除網頁搜尋產品外,還成功應用到了廣告、新聞推薦、機器翻譯、深度問答等多個產品線和應用系統中,並取得了顯著效果。特別需要指出的是,與學術界的一些研究工作相比,我們除了模型演算法本身的優化改進之外,還特別注重了深度學習模型與自然語言處理基礎技術的結合,尤其深入考慮了中文的語言特性,更多從實用性角度提升了神經網路語義匹配技術的應用效果。
下面,首先整體介紹一下 SimNet 框架及模型演算法變體,然後著重從文字特性出發和 NLP 方法更好結合的角度介紹一些改進策略,最後談一下實際應用中需要考量的一些因素。
二、SimNet 框架
圖 1 SimNet 框架
SimNet 框架如上圖所示,主要分為輸入層、表示層和匹配層。
1.輸入層
該層通過 look up table 將文字詞序列轉換為 word embedding 序列。
2.表示層
該層主要功能是由詞到句的表示構建,或者說將序列的孤立的詞語的 embedding 表示,轉換為具有全域性資訊的一個或多個低維稠密的語義向量。最簡單的是 Bag of Words(BOW)的累加方法,除此之外,我們還在 SimNet 框架下研發了對應的序列卷積網路(CNN)、迴圈神經網路(RNN)等多種表示技術。當然,在得到句子的表示向量後,也可以繼續累加更多層全連線網路,進一步提升表示效果。
3.匹配層
該層利用文字的表示向量進行互動計算,根據應用的場景不同,我們研發了兩種匹配演算法。
1)Representation-based Match
該方式下,更側重對錶示層的構建,儘可能充分地將待匹配的兩端都轉換到等長的語義表示向量裡。然後在兩端對應的兩個語義表示向量基礎上,進行匹配度計算,我們設計了兩種計算方法:一種是通過固定的度量函式計算,實際中最常用的就是 cosine 函式,這種方式簡單高效,並且得分割槽間可控意義明確;還有就是將兩個向量再過一個多層感知器網路(MLP),通過資料訓練擬合出一個匹配度得分,這種方式更加靈活擬合能力更強,但對訓練的要求也更高。
2)Interaction-based Match
該方式更強調待匹配兩端更充分的互動,以及互動基礎上的匹配。所以不會在表示層將文字轉換成唯一的一個整體表示向量,而一般會保留和詞位置相對應的一組表示向量。下面介紹該方式下我們實際應用的一種的 SimNet 模型變體。首先基於表示層採用雙向 RNN 得到的文字中間位置表示,和詞位置對應的每個向量體現了以本詞語為核心的一定的全域性資訊;然後對兩段文字按詞對應互動,由此構建兩段文字之間的 matching matrix(當然也可以構建多組 matrix,形成 tensor),這裡麵包括了更細緻更區域性的文字互動資訊;基於該區域性匹配特徵矩陣,我們進一步使用卷積來提取高階的從單詞到 N-Gram 多層次的匹配特徵,再經過 pooling 和 MLP 得到最終匹配得分。
圖 4 Interaction-based match 方法
Interaction-based Match 匹配方法匹配建模更加細緻、充分,一般來說效果更好一些,但計算成本會增加非常多,適合一些效果精度要求高但對計算效能要求不高的應用場景。大部分場景下我們都會選擇更加簡潔高效的 Representation-based 匹配方式。
圖 5 Pair-wise 的 SimNet 訓練框架
我們採用了 pair-wise Ranking Loss 來進行 SimNet 的訓練。以網頁搜尋任務為例,假設搜尋查詢文字為 Q,相關的一篇文件為 D+,不相關的一篇文件為 D-,二者經過 SimNet 網路得到的和 Q 的匹配度得分分別為 S(Q,D+) 和 S(Q,D-),而訓練的優化目標就是使得 S(Q,D+)>S(Q,D-)。實際中,我們一般採用 Max-Margin 的 Hinge Loss:
max{0,margin-(S(Q,D+)-S(Q,D-))}
這種 loss 簡潔、高效,還可以通過 margin 的不同設定,來調節模型得分的區分度。
三、文字任務下的特色改進
SimNet 的匹配框架非常普適。特別是 Representation-based 模式,其實很早在影像中就有類似應用。九十年代即有利用 Siamese Networks 來進行簽名真偽匹配的工作。但對於文字任務來講,語言的一些特殊性還是需要我們有一些更多針對性的考慮。
針對文字的一維序列的特性,在表示層需要有更針對性的建模。比如我們實現的一維序列卷積網路和長短時記憶網路 LSTM,都充分考慮到了文字的特性。
此外,從輸入訊號角度我們也充分考慮到文字的特點。SimNet 作為一種 End-to-End 的語義匹配框架,極大地降低了特徵設計的代價,直接輸入文字的詞序列即可。但對中文而言,由於基本語言單位是字,所以仍需要切詞這個步驟,但切詞本身就是個難題,而且詞語的粒度本身也沒有嚴格的定義,所以 SimNet 框架下需要降低對精準切詞的依賴,或者說要考慮如何從切詞角度來進一步提升匹配效果。另一方面,雖然不再需要進一步的複雜的特徵設計,但一些基本的 NLP 技術的產出,如高頻共現片段和句法結構資訊,能否作為先驗知識融入 SimNet 框架發揮作用,也是值得探索的方向。
1. 中文字粒度匹配和多切分粒度融合
我們首先驗證了字粒度的匹配。由於中文字的數量遠小於詞的數量(可達百萬量級),即使將 embedding 的維度適當擴充,整個模型的大小也會大大降低。我們在 SimNet-RNN 模式下,經過精緻設計,字粒度輸入是可以比較接近詞粒度下的匹配效果的。當然在大部分 SimNet 變體下,字粒度較詞粒度效果上有一定的差距,但是差距並不太大。這就使得,在一些記憶體緊張或者沒有切詞模組的場景下,可以直接使用字粒度模型,也可以達到較好的效果。
此外,我們還發現字粒度下有很好的泛化性,能很好的彌補詞粒度輸入的不足,如切詞的錯誤和未登入詞 OOV 問題。這也提示我們可以將字粒度和詞粒度進行融合互補。另一方面,由於切詞自身不存在唯一客觀標準,實際上不同的切分方式也可以實現互補,比如可以同時使用大粒度切詞和細粒度切詞。這樣一來,我們對單一切詞的精度要求就可以不那麼高了。這也從某種意義上降低了語義匹配任務對切詞的高度依賴。
從最終結果上來看,多切分粒度的融合帶來了實際應用中的顯著效果提升。但是,多切分粒度如何融合,並沒有一個唯一模式。在 SimNet 框架下,多切分粒度融合在輸入層、表示層和匹配層都可以設計實現。
圖 6 多切分粒度在 SimNet 框架下融合方式
輸入層的融合要考慮到表示層網路的特點。對於 BOW 這種無序的表示結構,我們可以把多種切分粒度直接當輸入灌入模型。而對於 CNN/RNN 這些有序的表示結構,輸入層的融合則需要一些「技巧」,比如說需要考慮粒度在字層面對齊的問題。
表示層的融合會更加靈活方便些。神經網路有非常多有效的方式能把多個定長向量融合為一個,簡單的如拼接或者逐位相加,複雜的也可以加入 Gate 機制。那麼,我們可以容易地把多切分粒度生成的多表示向量進行融合,再通過融合後的語義表示層得到最終的匹配相似度。
匹配層的融合可以用最簡單直觀的方式實現,即不同表示粒度的匹配得分上做加權和。這樣有些像不同粒度的匹配模型的 Ensemble,區別是這裡所有粒度是同時訓練的。此種模式下引數量和計算量也是最大的。
經驗表明,越早進行粒度融合,最終的效果會越好。這也應該是因為使得粒度之間的互補效能更早更充分地發揮作用。
2. 高頻 Bigram 和 Collocation 片段引入
比基本切詞更大的短語片段粒度會不會進一步提升效果?理論上越大的文字片段,表義越精確,但也越稀疏。詞語粒度下的詞表已可達百萬量級,再增加更大片段壓力太大,而且還會面臨訓練不充分問題。我們設計了一種巧妙的統計量度量方式,基於大資料只挑選少量對匹配任務有很好資訊量的高頻共現 Term 組合,作為 Bigram 詞加入字典,進一步顯著提升了模型效果。
舉個例子,我們輸入語料「汽車藍芽自動連線」,利用基本分詞工具,可以把序列分割為「汽車 藍芽 自動 連線」四個 Term。此時,我們依據大資料下的統計分析,可以發現「汽車-藍芽」的統計量得分最高,「自動-連線」次之,「藍芽-自動」最小,那麼依照設定的統計量閾值,我們就得到了基於 Bigram 粒度的輸出。
以上方式比較適合於連續 Term 共現組合,而對文字語義來講,有時候一些跨詞的 Collocation 搭配也非常重要。我們使用依存句法分析工具來獲得相應的 Collocation 片段。還是上面的例子,輸入語料「汽車藍芽自動連線」。此時,我們對輸入語料構建依存分析樹,統計父節點和子節點共現頻率,最終認為「藍芽-連線」顯得比「自動-連線」重要,因此最終輸出就成了「汽車-藍芽 藍芽-連線」。
不論是 Bigram 還是 Collocation,都相當於使用 NLP 基礎技術,用簡潔地方式引入了一些先驗資訊到模型裡面,降低了模型學習的難度,在很多場景下都較明顯地提升了語義匹配的效果。
以上探索表明,針對文字任務的特點、語言本身特色,我們除了從神經網路模型更好地設計選型之外,也可以將一些基礎 NLP 分析技術更好地和模型融合,以更高效地獲取更好的效果。
四、實際應用中的考量因素
在實際應用中,除了模型演算法之外,還有很多因素會對最終效果產生很大的影響。其中最重要的就是資料,還有就是應用場景的特點。
對深度學習模型來講,資料的規模是非常關鍵的。在網頁搜尋應用上的成功,有個很重要的因素就是有海量的使用者點選資料。但是光有數量還不夠,還要看資料如何篩選,正例負例如何設定,特別是負例如何選擇的問題。例如在網頁搜尋應用中,如果不考慮頻次問題,可能訓練資料的絕大部分構成都是高頻 Query 資料,但高頻 Query 的搜尋效果一般是比較好的了。另外,有的 Query 有點選的網頁很多,有的很少,能組成的正負 pair 數差別會很大,這時候如何處理?而對於負例,數量和質量上還應該考慮哪些因素?這些問題都至關重要,不同的資料設計方式會極大地影響最後效果。
應用場景同樣很重要。比如最終匹配度得分就是最終的結果,還是作為下一層模型的特徵輸入?如果作為下一層輸入的話,對得分的可比性有沒有要求?最終的任務是分類還是排序,是排序的話排序的優化目標和訓練中的優化目標如何可以做的更一致?這其中有一些會影響到對資料的組織方式,有一些需要針對性的對一些模型超引數做調整。例如前文 loss 中 margin 的具體設定,會影響到準確率指標和得分割槽分性之間的一些折中變化。
當然,訓練中諸如學習率等因素對任務成敗也有很大影響,但這些設定和調整的難易也取決於具體的訓練程式和平臺。
百度NLP專欄擴充套件閱讀:
「百度NLP」專欄主要關注百度自然語言處理技術發展程式,報導前沿資訊和動態,分享技術專家的行業解讀與深度思考。