導讀:飛槳PaddlePaddle致力於讓深度學習技術的創新與應用更簡單。飛槳開源的百度自研SimNet-BOW-Pairwise語義匹配模型,在真實的FAQ問答場景中,比其他基於字面的相似度方法AUC提升了5%以上。在公開語義匹配數據集(LCQMC)進行評測準確率也達到了0.7532,性能超越同等複雜的CBOW基線模型。SimNet 顯著改善了長冷 query 的搜索效果,提升了搜索智能化的水平,在百度搜索以及其它產品線廣泛應用。
1.文本語義匹配
文本語義匹配是自然語言處理中一個重要的基礎問題,NLP領域的很多任務都可以抽象為文本匹配任務。例如,信息檢索可以歸結為查詢項和文檔的匹配,問答系統可以歸結為問題和候選答案的匹配,對話系統可以歸結為對話和回復的匹配。如何提升文本匹配的準確度,是自然語言處理領域的一個重要挑戰。
讓我們來看一個簡單的例子,比較各候選句子哪句和原句語義更相近
原句:「車頭如何放置車牌」
比較句1:「前牌照怎麼裝」比較句2:「如何辦理北京車牌」比較句3:「後牌照怎麼裝」
使用文本匹配(這裡使用SimNet)分別計算原句與三個比較句的相似度,結果如下。
(1)比較句1與原句,雖然句式和語序等存在較大差異,但是所表述的含義幾乎相同,所以SimNet給出了較高的相似度,為0.761517;
(2)比較句2與原句,雖然存在「如何」 、「車牌」等共現詞,但是所表述的含義完全不同,所以SimNet給出了很低的相似度,為0.486205;
(3)比較句3與原句,二者討論的都是如何放置車牌的問題,只不過一個是前牌照,另一個是後牌照。二者間存在一定的語義相關性,所以SimNet給出了介於比較句1和比較句2之間的相似度得分,為0.697181。
通過這個例子我們不難窺探出語義匹配的強大的能力,它在搜索優化、推薦系統、快速檢索排序、智能客服上都有著極大的用武之地!
信息檢索:在信息檢索領域的很多應用中,都需要根據原文本來檢索與其相似的其他文本,使用場景非常普遍。除純文本檢索外,SimNet還適用於通過標籤來檢索圖片、視頻等場景,大大提高檢索效率。新聞推薦:通過用戶剛剛瀏覽過的新聞標題,自動檢索出其他的相似新聞,個性化地為用戶做推薦,從而增強用戶粘性,提升產品體驗。智能客服:用戶輸入一個問題後,自動為用戶檢索出相似的問題和答案,節約人工客服的成本,提高效率。
2.SimNet表現出眾
SimNet 在語義表示上沿襲了隱式連續向量表示的方式,但對語義匹配問題在深度學習框架下進行了 End-to-End 的建模,將詞語的 Embedding 表示與句篇的語義表示、語義的向量表示與匹配度計算、文本對的匹配度計算與 pair-wise 的有監督學習全部統一在一個整體框架內。
在實際應用場景下,海量的用戶點擊行為數據可以轉化大規模的弱標記數據,搭配我們研發的高效並行訓練算法,大數據訓練的 SimNet 顯著超越了主題模型類算法的效果,並首次實現了可完全取代基於字面匹配的策略,而且可以直接建模非相似度類的匹配問題。在網頁搜索任務上的初次使用即展現出極大威力,帶來了相關性的明顯提升。
我們基於百度海量搜索數據訓練的SimNet-BOW-Pairwise語義匹配模型,在一些真實的FAQ問答場景中,比其他基於字面的相似度方法AUC提升了5%以上。
基於百度自建測試集(包含聊天、客服等數據集)和公開語義匹配數據集(LCQMC)進行評測,結果如下表所示。
其中,LCQMC數據集以Accuracy為評測指標,而pairwise模型的輸出為相似度,因此採用0.958作為分類閾值。相比於基線模型中網絡結構同等複雜的CBOW模型(準確率為0.737),SimNet-BOW-Pairwise模型將準確率提升到了0.7532。
總結來說,SimNet有三大特點:
算法效果好:百度搜索等海量用戶數據為SimNet相似度算法提供了豐富的指導信息,模型效果優於已公開的主流算法。語義級匹配:利用詞向量技術解決關鍵詞匹配失敗的問題,可以有效得到同義詞、近義詞之間的相似度,泛化能力好。深度學習技術:基於深度神經網絡,對單詞語義到短文本語義到組合過程進行建模,模型更強大,表達效果更好。
3.SimNet模型原理介紹
如下圖所示,SimNet模型主要分為輸入層、表示層和匹配層三個部分。
(1)輸入層
該層通過 look up table 將文本詞序列轉換為 word embedding 序列。
(2)表示層
該層主要功能是由詞到句的表示構建,或者說將序列的孤立的詞語的 embedding 表示,轉換為具有全局信息的一個或多個低維稠密的語義向量。最簡單的是 Bag of Words(BOW)的累加方法,除此之外,我們還在 SimNet 框架下研發了對應的序列卷積網絡(CNN)、循環神經網絡(RNN)等多種表示技術。當然,在得到句子的表示向量後,也可以繼續累加更多層全連接網絡,進一步提升表示效果。
(3)匹配層
該層利用文本的表示向量進行交互計算,根據應用的場景不同,我們研發了Representation-based Match和Interaction-based Match兩種匹配算法。
1)Representation-based Match
該方式下,更側重對表示層的構建,儘可能充分地將待匹配的兩端都轉換到等長的語義表示向量裡。然後在兩端對應的兩個語義表示向量基礎上,進行匹配度計算,我們設計了兩種計算方法:一種是通過固定的度量函數計算,實際中最常用的就是 cosine 函數,這種方式簡單高效,並且得分區間可控意義明確;還有就是將兩個向量再過一個多層感知器網絡(MLP),通過數據訓練擬合出一個匹配度得分,這種方式更加靈活擬合能力更強,但對訓練的要求也更高。
2)Interaction-based Match
該方式更強調待匹配兩端更充分的交互,以及交互基礎上的匹配。所以不會在表示層將文本轉換成唯一的一個整體表示向量,而一般會保留和詞位置相對應的一組表示向量。下面介紹該方式下我們實際應用的一種的 SimNet 模型變體。
首先基於表示層採用雙向 RNN 得到的文本中間位置表示,和詞位置對應的每個向量體現了以本詞語為核心的一定的全局信息;然後對兩段文本按詞對應交互,由此構建兩段文本之間的 matching matrix(當然也可以構建多組 matrix,形成 tensor),這裡面包括了更細緻更局部的文本交互信息;基於該局部匹配特徵矩陣,我們進一步使用卷積來提取高級的從單詞到 N-Gram 多層次的匹配特徵,再經過 pooling 和 MLP 得到最終匹配得分。
Interaction-based Match 匹配方法匹配建模更加細緻、充分,一般來說效果更好一些,但計算成本會增加非常多,適合一些效果精度要求高但對計算性能要求不高的應用場景。大部分場景下我們都會選擇更加簡潔高效的 Representation-based 匹配方式。
訓練階段採用上圖所示的 pair-wise RankingLoss框架,以網頁搜索任務為例,假設搜索查詢文本為 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 的不同設定,來調節模型得分的區分度。
4.飛槳SimNet快速上手
4.1 克隆項目
使用git命令克隆工具集代碼庫到本地。
git clone https://github.com/PaddlePaddle/models.git
cd models/PaddleNLP/similarity_net
4.2 數據準備
下載經過預處理的數據。
wget--no-check-certificate https://baidu-nlp.bj.bcebos.com/simnet_dataset-1.0.0.tar.gz
tar xzf simnet_dataset-1.0.0.tar.gz
運行上述命令後,data目錄下會生成訓練集數據示例、測試集數據示例,以及對應詞索引字典(term2id.dict)。
4.3 模型準備
我們開源了基於大規模數據訓練好的pairwise模型(基於bow模型訓練),並提供兩種下載方式。
方式一:基於PaddleHub命令行工具(PaddleHub安裝方式)
mkdir model_files
hub download simnet_bow_pairwise --output_path ./
tar xzf simnet_bow-pairwise-1.0.0.tar.gz-C ./model_files
方式二:直接下載
mkdir model_files
wget--no-check-certificate https://baidu-nlp.bj.bcebos.com/simnet_bow-pairwise-1.0.0.tar.gz
tar xzf simnet_bow-pairwise-1.0.0.tar.gz -C ./model_files
模型將保存在./model_files/simnet_bow_pairwise_pretrained_model/下。
4.4 模型評估
我們公開了自建的測試集,包括百度知道、ECOM、QQSIM和UNICOM四個數據集。
下面基於上面的預訓練模型,來評估模型的效果。
首先進入evaluate目錄。
cd evaluate
依次執行以下命令,獲取測試集評估結果。
sh evaluate_ecom.sh
sh evaluate_qqsim.sh
sh evaluate_zhidao.sh
sh evaluate_unicom.sh
也可以指定./run.sh中的TEST_DATA_PATH的值,通過下列命令評估自己指定的測試集。
sh run.sh eval
4.5 模型推測
基於上面的預訓練模型,運行下面的命令,進行推測並將推測結果保存到本地。
sh run.sh infer
4.6 訓練自己的模型
可以基於示例數據構建訓練集和開發集,重新訓練自己的模型。命令如下:
sh run.sh train
開發者還可以指定run.sh中train函數裡的INIT_CHECKPOINT的路徑,載入開源的bow-pariwise模型進行熱啟動訓練,適合某些場景下訓練數據量較少的情況。趕快自己動手嘗試下吧!