導讀:飛槳PaddlePaddle致力於讓深度學習技術的創新與應用更簡單。飛槳開源的百度自研SimNet-BOW-Pairwise語義匹配模型,在真實的FAQ問答場景中,比其餘基於字面的類似度方法AUC提高了5%以上。在公開語義匹配數據集(LCQMC)進行評測準確率也達到了0.7532,性能超越同等複雜的CBOW基線模型。SimNet 顯著改善了長冷 query 的搜索效果,提高了搜索智能化的水平,在百度搜索以及其它產品線普遍應用。javascript
1.文本語義匹配java
文本語義匹配是天然語言處理中一個重要的基礎問題,NLP領域的不少任務均可以抽象爲文本匹配任務。例如,信息檢索能夠歸結爲查詢項和文檔的匹配,問答系統能夠歸結爲問題和候選答案的匹配,對話系統能夠歸結爲對話和回覆的匹配。如何提高文本匹配的準確度,是天然語言處理領域的一個重要挑戰。git
讓咱們來看一個簡單的例子,比較各候選句子哪句和原句語義更相近github
原句:「車頭如何放置車牌」算法
比較句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 的不一樣設定,來調節模型得分的區分度。
使用git命令克隆工具集代碼庫到本地。
git clone https://github.com/PaddlePaddle/models.git
cd models/PaddleNLP/similarity_net
下載通過預處理的數據。
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)。
咱們開源了基於大規模數據訓練好的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/下。
咱們公開了自建的測試集,包括百度知道、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
基於上面的預訓練模型,運行下面的命令,進行推測並將推測結果保存到本地。
sh run.sh infer
能夠基於示例數據構建訓練集和開發集,從新訓練本身的模型。命令以下:
sh run.sh train
開發者還能夠指定run.sh中train函數裏的INIT_CHECKPOINT的路徑,載入開源的bow-pariwise模型進行熱啓動訓練,適合某些場景下訓練數據量較少的狀況。趕快本身動手嘗試下吧!
想與更多的深度學習開發者交流,請加入飛槳官方QQ羣:796771754。
若是您想詳細瞭解更多相關內容,請參閱如下文檔。
官網地址:https://www.paddlepaddle.org.cn
項目地址:
https://github.com/PaddlePaddle/models/tree/v1.5.1/PaddleNLP/similarity_net