基於飛槳實現的特定領域知識圖譜融合方案:ERNIE-Gram 文字匹配演算法

語言: CN / TW / HK

文字匹配任務在自然語言處理領域中是非常重要的基礎任務,一般用於研究兩段文字之間的關係。文字匹配任務存在很多應用場景,如資訊檢索、問答系統、智慧對話、文字鑑別、智慧推薦、文字資料去重、文字相似度計算、自然語言推理、問答系統、資訊檢索等,這些自然語言處理任務在很大程度上都可以抽象成文字匹配問題,比如資訊檢索可以歸結為搜尋詞和文件資源的匹配,問答系統可以歸結為問題和候選答案的匹配,複述問題可以歸結為兩個同義句的匹配。

而在知識融合過程中的關鍵技術是實體對齊,又被稱為實體匹配,其旨在推斷來自不同資料集合 中的不同實體是否對映到物理世界中同一物件的處理過程。實體對齊的終極目標是將多源知識庫中的實體建立對映關係,也正因如此,文字匹配演算法可以在知識融合過程中針對非結構化文字進行較好的語義對齊,建立對映關係,具體方案如下圖所示。

在粗選階段,我們需要根據知識庫尋找相似實體對,通過精準匹配和部分匹配的方式進行實體簇的粗選。其中,精準匹配主要採用同名召回、同音召回、別名召回三類策略。部分匹配主要採用 jaccard 距離等方法構建倒排,根據閾值進行挑選。

在精排階段,我們根據粗選出來的實體對,構建 Pair-wise 類特徵,進行精細算分。根據特徵的種類,可以劃分為標籤、屬性、非結構化文字三類特徵。在實際對齊任務中,頭尾部的實體經常缺失各種關鍵屬性,難以判斷實體是否可以對齊,此時就利用非結構化文字提供關鍵資訊,這裡就可以通過使用飛槳 ERNIE-Gram 模型將根據計算的三類特徵進行實體對齊。由於各領域的 schema 不同,涉及到的屬性類特徵也不盡相同。故根據對資料的分析,為 schema 相差較大的領域設計不同的 GBDT 模型,最終完成對齊。

本文主要講解精排階段的文字匹配演算法,更多方案和技術細節請參考下述專案。

  •   專案連結

https://aistudio.baidu.com/aistudio/projectdetail/5456683?channelType=0&channel=0

  •   專案合集

https://aistudio.baidu.com/aistudio/projectdetail/5427356?contributionType=1![圖片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/639a2ca58c4b473f91bb4b7b043c8dda~tplv-k3u1fbpfcp-zoom-1.image)

01 融合方案操作步驟

Part-1 環境版本要求
環境安裝需根據 Python 和飛槳框架的版本要求進行選擇。

  • Python3 版本要求

python3.7 及以上版本,參考 https://www.python.org/

飛槳框架 2.0 + 版本,參考

https://www.paddlepaddle.org.cn/documentation/docs/zh/install/pip/macos-pip.html

需首先保證 Python 和 pip 是 64bit,且處理器架構為 x86_64(或稱作 x64、Intel 64、AMD64)。目前飛槳暫不支援 arm64 架構(mac M1 除外,飛槳已支援 Mac M1 晶片)。

Part-2 資料集簡介
LCQMC [1] 是百度知道領域的中文問題匹配資料集,以解決中文領域大規模問題匹配。該資料集從百度知道的不同領域使用者問題中抽取構建資料。部分資料集展示如下:

Part-3 模型情況
 ERNIE-Gram 模型 [2] 釋出以前,學界工作主要集中在將 BERT 的掩碼語言建模(MLM)的目標從 Mask 單個標記擴充套件到 N 個標記的連續序列,但這種連續遮蔽方法忽略了對粗粒度語言資訊的內部依賴性和相互關係的建模。作為一種改進方法 ERNIE-Gram 採用了一種顯式 n-gram 掩碼方法,以加強對預訓練中粗粒度資訊的整合。在 ERNIE-Gram 中,n-grams 被 Mask 並直接使用明確的 n-gram 序列號而不是 n 個標記的連續序列進行預測。此外,ERNIE-Gram 採用了一個生成器模型,對可信的 n-gram 序列號進行取樣,作為可選的 n-gram 掩碼,並以粗粒度和細粒度的方式進行預測,以實現全面的 n-gram 預測和關係建模。在論文中實驗表明,ERNIE-Gram 在很大程度上優於 XLNet 和 RoBERTa 等預訓練模型。其中掩碼的流程見下圖所示。

ERNIE-Gram 模型充分地將粗粒度語言資訊納入預訓練,進行了全面的 n-gram 預測和關係建模,消除之前連續掩蔽策略的侷限性,進一步增強了語義 n-gram 的學習。n-gram 關係建模的詳細架構如下圖所示,子圖 (b) 中是一個 n-gram 抽樣的例子,其中虛線框代表抽樣模組,綠色的文字是原始 n-gram,藍色的斜體文字是抽樣的 n-gram。本文不一一展開,更多演算法原理和技術細節請參考原論文。

為讓同學們快速上手,本專案使用語義匹配資料集 LCQMC 作為訓練集,基於 ERNIE-Gram 預訓練模型訓練了單塔 Point-wise 語義匹配模型,使用者可以直接基於這個模型對文字對進行語義匹配的二分類任務。(在文字匹配任務資料的每一個樣本通常由兩個文字組成 query 和 title。類別形式為 0 或 1,0 表示 query 與 title 不匹配,1 表示匹配。)同時考慮到在不同應用場景下的需求,下面也將簡單講解一下不同型別的語義匹配模型和應用場景。

基於單塔 Point-wise 正規化的語義匹配模型 Ernie_Matching 模型精度高、計算複雜度高,適合直接進行語義匹配二分類的應用場景。基於單塔 Pair-wise 正規化的語義匹配模型 Ernie_Matching 模型精度高、計算複雜度高,對文字相似度大小的序關係建模能力更強,適合將相似度特徵作為上層排序模組輸入特徵的應用場景。基於雙塔 Point-Wise 正規化的語義匹配模型計算效率更高,適合對延時要求高、根據語義相似度進行粗排的應用場景。

Part-4 模型訓練與預測

以中文文字匹配公開資料集 LCQMC 為示例資料集,可在訓練集(train.tsv)上進行單塔 Point-wise 模型訓練,並在開發集(dev.tsv)驗證。

模型訓練

%cd ERNIE_Gram  
!unset CUDA\_VISIBLE\_DEVICES  
!python -u -m paddle.distributed.launch --gpus "0" train_pointwise.py \  
        --device gpu \  
        --save_dir ./checkpoints \  
        --batch_size 32 \  
        --learning_rate 2E-5\  
        --save_step 1000 \  
        --eval_step 200 \  
        --epochs 3  


\# save_dir:可選,儲存訓練模型的目錄;預設儲存在當前目錄checkpoints資料夾下。  
\# max\_seq\_length:可選,ERNIE-Gram 模型使用的最大序列長度,最大不能超過512, 若出現視訊記憶體不足,請適當調低這一引數;預設為128。  
\# batch_size:可選,批處理大小,請結合視訊記憶體情況進行調整,若出現視訊記憶體不足,請適當調低這一引數;預設為32。  
\# learning_rate:可選,Fine-tune的最大學習率;預設為5e-5。  
\# weight_decay:可選,控制正則項力度的引數,用於防止過擬合,預設為0.0。  
\# epochs: 訓練輪次,預設為3。  
\# warmup\_proption:可選,學習率warmup策略的比例,如果0.1,則學習率會在前10%訓練step的過程中從0慢慢增長到learning\_rate, 而後再緩慢衰減,預設為0.0。  
\# init\_from\_ckpt:可選,模型引數路徑,熱啟動模型訓練;預設為None。  
\# seed:可選,隨機種子,預設為1000.  
\# device: 選用什麼裝置進行訓練,可選cpu或gpu。如使用gpu訓練則引數gpus指定GPU卡號。  


預測結果部分展示。

global step 3920, epoch: 1, batch: 3920, loss: 0.13577, accu: 0.92109, speed: 22.31 step/s  
global step 3930, epoch: 1, batch: 3930, loss: 0.15333, accu: 0.91971, speed: 18.52 step/s  
global step 3940, epoch: 1, batch: 3940, loss: 0.10362, accu: 0.92031, speed: 21.68 step/s  
global step 3950, epoch: 1, batch: 3950, loss: 0.14692, accu: 0.92146, speed: 21.74 step/s  
global step 3960, epoch: 1, batch: 3960, loss: 0.17472, accu: 0.92168, speed: 19.54 step/s  
global step 3970, epoch: 1, batch: 3970, loss: 0.31994, accu: 0.91967, speed: 21.06 step/s  
global step 3980, epoch: 1, batch: 3980, loss: 0.17073, accu: 0.91875, speed: 21.22 step/s  
global step 3990, epoch: 1, batch: 3990, loss: 0.14955, accu: 0.91891, speed: 21.51 step/s  
global step 4000, epoch: 1, batch: 4000, loss: 0.13987, accu: 0.91922, speed: 21.74 step/s  
eval dev loss: 0.30795, accu: 0.87253  


如果想要使用其他預訓練模型如 ERNIE、BERT、RoBERTa 等,只需更換 model 和 tokenizer 即可。

# 使用 ERNIE-3.0-medium-zh 預訓練模型  
model = AutoModel.from_pretrained('ernie-3.0-medium-zh')  
tokenizer = AutoTokenizer.from_pretrained('ernie-3.0-medium-zh')

  
# 使用 ERNIE 預訓練模型  
# ernie-1.0  
#model = AutoModel.from_pretrained('ernie-1.0-base-zh'))  
#tokenizer = AutoTokenizer.from_pretrained('ernie-1.0-base-zh')

# ernie-tiny  
# model = AutoModel.from_pretrained('ernie-tiny'))  
# tokenizer = AutoTokenizer.from_pretrained('ernie-tiny')

  
# 使用 BERT 預訓練模型  
# bert-base-chinese  
# model = AutoModel.from_pretrained('bert-base-chinese')  
# tokenizer = AutoTokenizer.from_pretrained('bert-base-chinese')

# bert-wwm-chinese  
# model = AutoModel.from_pretrained('bert-wwm-chinese')  
# tokenizer = AutoTokenizer.from_pretrained('bert-wwm-chinese')

# bert-wwm-ext-chinese  
# model = AutoModel.from_pretrained('bert-wwm-ext-chinese')  
# tokenizer = AutoTokenizer.from_pretrained('bert-wwm-ext-chinese')

  
# 使用 RoBERTa 預訓練模型  
# roberta-wwm-ext  
# model = AutoModel.from_pretrained('roberta-wwm-ext')  
# tokenizer = AutoTokenizer.from_pretrained('roberta-wwm-ext')

# roberta-wwm-ext  
# model = AutoModel.from_pretrained('roberta-wwm-ext-large')  
# tokenizer = AutoTokenizer.from_pretrained('roberta-wwm-ext-large')  


NOTE: 如需恢復模型訓練,則可以設定 init_from_ckpt,如

init_from_ckpt=checkpoints/model_100/model_state.pdparams。如需使用 ernie-tiny 模型,則需提前先安裝 sentencepiece 依賴,如 pip install sentencepiece。

模型預測

!unset CUDA\_VISIBLE\_DEVICES  
!python -u -m paddle.distributed.launch --gpus "0" \  
        predict_pointwise.py \  
        --device gpu \  
        --params\_path "./checkpoints/model\_4000/model_state.pdparams"\  
        --batch_size 128 \  
        --max\_seq\_length 64 \  
        --input_file '/home/aistudio/LCQMC/test.tsv'  


預測結果部分展示:

{'query''這張圖是哪兒''title''這張圖誰有''pred_label'0}  
{'query''這是什麼水果?''title''這是什麼水果。怎麼吃?''pred_label'1}  
{'query''下巴長痘痘疼是什麼原因''title''下巴長痘痘是什麼原因?''pred_label'1}  
{'query''北京的市花是什麼?''title''北京的市花是什麼花?''pred_label'1}  
{'query''這個小男孩叫什麼?''title''什麼的撿魚的小男孩''pred_label'0}  
{'query''藍芽耳機什麼牌子最好的?''title''什麼牌子的藍芽耳機最好用''pred_label'1}  
{'query''湖南衛視我們約會吧中間的歌曲是什麼''title''我們約會吧約會成功歌曲是什麼''pred_label'0}  
{'query''什麼鞋子比較好''title''配什麼鞋子比較好…''pred_label'1}  
{'query''怎麼把詞典下載到手機上啊''title''怎麼把牛津高階英漢雙解詞典下載到手機詞典上啊''pred_label'0}  
{'query''話費充值哪裡便宜''title''哪裡充值(話費)最便宜?''pred_label'1}  
{'query''怎樣下載歌曲到手機''title''怎麼往手機上下載歌曲''pred_label'1}  
{'query''蘋果手機丟了如何找回?''title''蘋果手機掉了怎麼找回''pred_label'1}  
{'query''考試怎麼考高分?''title''考試如何考高分''pred_label'1}  


在深度學習模型構建上,飛槳框架支援動態圖程式設計和靜態圖程式設計兩種方式,兩種方式下程式碼編寫和執行方式均存在差異。動態圖程式設計體驗更佳、更易除錯,但是因為採用 Python 實時執行的方式,開銷較大,在效能方面與 C++ 有一定差距。靜態圖除錯難度大,但是將前端 Python 編寫的神經網路預定義為 Program 描述,轉到 C++ 端重新解析執行,從而脫離了對 Python 的依賴,往往執行效能更佳,並且預先擁有完整網路結構也更利於全域性優化。

同時,你可以進行基於靜態圖的部署預測和模型匯出。使用動態圖訓練結束之後,可以使用靜態圖匯出工具 export_model.py 將動態圖引數匯出成靜態圖引數。實現方式可參考如下指令:

!python export\_model.py --params\_path   


checkpoints/model\_4000/model\_state.pdparams --output_path=./output  
# 其中params\_path是指動態圖訓練儲存的引數路徑,output\_path是指靜態圖引數匯出路徑。  


# 預測部署  
# 匯出靜態圖模型之後,可以基於靜態圖模型進行預測,deploy/python/predict.py 檔案提供了靜態圖預測示例。執行如下命令:  
!python deploy/predict.py --model_dir ./output  


02 結論

Part-1  專案小結

該專案中還涉及部分對無監督模型以及有監督模型的對比內容,如下圖所示。

結論如下:

  • SimCSE 模型適合缺乏監督資料,但是又有大量無監督資料的匹配和檢索場景。
  • 相比於 SimCSE 模型,DiffCSE 模型會更關注語句之間的差異性,具有精確的向量表示能力。DiffCSE 模型同樣適合缺乏監督資料又有大量無監督資料的匹配和檢索場景。
  • 明顯看到有監督模型中 ERNIE-Gram 比之前所有模型效能的優秀。

受篇幅限制影響,這裡不詳細展開模型的對比詳情,感興趣的同學可以點選下方連結詳細瞭解。同時歡迎同學們在飛槳 AI Studio 平臺發揮自己的創造力和想象力。

  • 專案連結

https://aistudio.baidu.com/aistudio/projectdetail/5456683?channelType=0&channel=0

  • 專案合集

https://aistudio.baidu.com/aistudio/projectdetail/5427356?contributionType=1

Part-2 未來展望

本專案主要圍繞著特定領域知識圖譜 (Domain-specific Knowledge Graph,DKG) 融合方案中的一環講解了基於 ERNIE-Garm 的文字匹配演算法。希望看到這篇專案的開發者們,能夠在此基礎上共同努力共建知識圖譜領域,走通知識抽取、知識融合、知識推理和質量評估的完整流程。

參考文獻

[1] Xin Liu, Qingcai Chen, Chong Deng, Huajun Zeng, Jing Chen, Dongfang Li, Buzhou Tang, LCQMC: A Large-scale Chinese Question Matching Corpus,COLING2018.

[2] Xiao, Dongling, Yu-Kun Li, Han Zhang, Yu Sun, Hao Tian, Hua Wu, and Haifeng Wang. “ERNIE-Gram: Pre-Training with Explicitly N-Gram Masked Language Modeling for Natural Language Understanding.”ArXiv:2010.12148 [Cs].