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 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模型進行熱啟動訓練,適合某些場景下訓練資料量較少的情況。趕快自己動手嘗試下吧!
想與更多的深度學習開發者交流,請加入飛槳官方QQ群:796771754。
如果您想詳細瞭解更多相關內容,請參閱以下文件。
官網地址:https://www.paddlepaddle.org.cn
專案地址:
https://github.com/PaddlePaddle/models/tree/v1.5.1/PaddleNLP/similarity_net