基于飛槳實(shí)現(xiàn)的特定領(lǐng)域知識(shí)圖譜融合方案:ERNIE-Gram 文本匹配算法
文本匹配任務(wù)在自然語(yǔ)言處理領(lǐng)域中是非常重要的基礎(chǔ)任務(wù),一般用于研究?jī)啥挝谋局g的關(guān)系。文本匹配任務(wù)存在很多應(yīng)用場(chǎng)景,如信息檢索、問(wèn)答系統(tǒng)、智能對(duì)話、文本鑒別、智能推薦、文本數(shù)據(jù)去重、文本相似度計(jì)算、自然語(yǔ)言推理、問(wèn)答系統(tǒng)、信息檢索等,這些自然語(yǔ)言處理任務(wù)在很大程度上都可以抽象成文本匹配問(wèn)題,比如信息檢索可以歸結(jié)為搜索詞和文檔資源的匹配,問(wèn)答系統(tǒng)可以歸結(jié)為問(wèn)題和候選答案的匹配,復(fù)述問(wèn)題可以歸結(jié)為兩個(gè)同義句的匹配。
而在知識(shí)融合過(guò)程中的關(guān)鍵技術(shù)是實(shí)體對(duì)齊,又被稱為實(shí)體匹配,其旨在推斷來(lái)自不同數(shù)據(jù)集合 中的不同實(shí)體是否映射到物理世界中同一對(duì)象的處理過(guò)程。實(shí)體對(duì)齊的終極目標(biāo)是將多源知識(shí)庫(kù)中的實(shí)體建立映射關(guān)系,也正因如此,文本匹配算法可以在知識(shí)融合過(guò)程中針對(duì)非結(jié)構(gòu)化文本進(jìn)行較好的語(yǔ)義對(duì)齊,建立映射關(guān)系,具體方案如下圖所示。

在粗選階段,我們需要根據(jù)知識(shí)庫(kù)尋找相似實(shí)體對(duì),通過(guò)精準(zhǔn)匹配和部分匹配的方式進(jìn)行實(shí)體簇的粗選。其中,精準(zhǔn)匹配主要采用同名召回、同音召回、別名召回三類策略。部分匹配主要采用 jaccard 距離等方法構(gòu)建倒排,根據(jù)閾值進(jìn)行挑選。
在精排階段,我們根據(jù)粗選出來(lái)的實(shí)體對(duì),構(gòu)建 Pair-wise 類特征,進(jìn)行精細(xì)算分。根據(jù)特征的種類,可以劃分為標(biāo)簽、屬性、非結(jié)構(gòu)化文本三類特征。在實(shí)際對(duì)齊任務(wù)中,頭尾部的實(shí)體經(jīng)常缺失各種關(guān)鍵屬性,難以判斷實(shí)體是否可以對(duì)齊,此時(shí)就利用非結(jié)構(gòu)化文本提供關(guān)鍵信息,這里就可以通過(guò)使用飛槳?ERNIE-Gram 模型將根據(jù)計(jì)算的三類特征進(jìn)行實(shí)體對(duì)齊。由于各領(lǐng)域的 schema 不同,涉及到的屬性類特征也不盡相同。故根據(jù)對(duì)數(shù)據(jù)的分析,為 schema 相差較大的領(lǐng)域設(shè)計(jì)不同的 GBDT 模型,最終完成對(duì)齊。
本文主要講解精排階段的文本匹配算法,更多方案和技術(shù)細(xì)節(jié)請(qǐng)參考下述項(xiàng)目。
??項(xiàng)目鏈接
https://aistudio.baidu.com/aistudio/projectdetail/5456683?channelType=0&channel=0
??項(xiàng)目合集
https://aistudio.baidu.com/aistudio/projectdetail/5427356?contributionType=1
01?融合方案操作步驟
Part-1?環(huán)境版本要求
環(huán)境安裝需根據(jù) Python 和飛槳框架的版本要求進(jìn)行選擇。
Python3 版本要求
python3.7 及以上版本,參考?https://www.python.org/
飛槳框架版本要求
飛槳框架 2.0 + 版本,參考
https://www.paddlepaddle.org.cn/documentation/docs/zh/install/pip/macos-pip.html
飛槳環(huán)境的安裝
需首先保證 Python 和 pip 是 64bit,且處理器架構(gòu)為 x86_64(或稱作 x64、Intel 64、AMD64)。目前飛槳暫不支持 arm64 架構(gòu)(mac M1 除外,飛槳已支持 Mac M1 芯片)。
Part-2?數(shù)據(jù)集簡(jiǎn)介
LCQMC [1] 是百度知道領(lǐng)域的中文問(wèn)題匹配數(shù)據(jù)集,以解決中文領(lǐng)域大規(guī)模問(wèn)題匹配。該數(shù)據(jù)集從百度知道的不同領(lǐng)域用戶問(wèn)題中抽取構(gòu)建數(shù)據(jù)。部分?jǐn)?shù)據(jù)集展示如下:

Part-3?模型情況
在?ERNIE-Gram 模型 [2] 發(fā)布以前,學(xué)界工作主要集中在將 BERT 的掩碼語(yǔ)言建模(MLM)的目標(biāo)從 Mask 單個(gè)標(biāo)記擴(kuò)展到 N 個(gè)標(biāo)記的連續(xù)序列,但這種連續(xù)屏蔽方法忽略了對(duì)粗粒度語(yǔ)言信息的內(nèi)部依賴性和相互關(guān)系的建模。作為一種改進(jìn)方法?ERNIE-Gram 采用了一種顯式 n-gram 掩碼方法,以加強(qiáng)對(duì)預(yù)訓(xùn)練中粗粒度信息的整合。在?ERNIE-Gram 中,n-grams 被 Mask 并直接使用明確的 n-gram 序列號(hào)而不是 n 個(gè)標(biāo)記的連續(xù)序列進(jìn)行預(yù)測(cè)。此外,ERNIE-Gram 采用了一個(gè)生成器模型,對(duì)可信的 n-gram 序列號(hào)進(jìn)行采樣,作為可選的 n-gram 掩碼,并以粗粒度和細(xì)粒度的方式進(jìn)行預(yù)測(cè),以實(shí)現(xiàn)全面的 n-gram 預(yù)測(cè)和關(guān)系建模。在論文中實(shí)驗(yàn)表明,ERNIE-Gram 在很大程度上優(yōu)于 XLNet 和 RoBERTa 等預(yù)訓(xùn)練模型。其中掩碼的流程見(jiàn)下圖所示。

ERNIE-Gram 模型充分地將粗粒度語(yǔ)言信息納入預(yù)訓(xùn)練,進(jìn)行了全面的 n-gram 預(yù)測(cè)和關(guān)系建模,消除之前連續(xù)掩蔽策略的局限性,進(jìn)一步增強(qiáng)了語(yǔ)義 n-gram 的學(xué)習(xí)。n-gram 關(guān)系建模的詳細(xì)架構(gòu)如下圖所示,子圖 (b) 中是一個(gè) n-gram 抽樣的例子,其中虛線框代表抽樣模塊,綠色的文本是原始 n-gram,藍(lán)色的斜體文本是抽樣的 n-gram。本文不一一展開(kāi),更多算法原理和技術(shù)細(xì)節(jié)請(qǐng)參考原論文。

為讓同學(xué)們快速上手,本項(xiàng)目使用語(yǔ)義匹配數(shù)據(jù)集 LCQMC 作為訓(xùn)練集,基于?ERNIE-Gram 預(yù)訓(xùn)練模型訓(xùn)練了單塔 Point-wise 語(yǔ)義匹配模型,用戶可以直接基于這個(gè)模型對(duì)文本對(duì)進(jìn)行語(yǔ)義匹配的二分類任務(wù)。(在文本匹配任務(wù)數(shù)據(jù)的每一個(gè)樣本通常由兩個(gè)文本組成 query 和 title。類別形式為 0 或 1,0 表示 query 與 title 不匹配,1 表示匹配。)同時(shí)考慮到在不同應(yīng)用場(chǎng)景下的需求,下面也將簡(jiǎn)單講解一下不同類型的語(yǔ)義匹配模型和應(yīng)用場(chǎng)景。


基于單塔 Point-wise 范式的語(yǔ)義匹配模型?Ernie_Matching 模型精度高、計(jì)算復(fù)雜度高,適合直接進(jìn)行語(yǔ)義匹配二分類的應(yīng)用場(chǎng)景?;趩嗡?Pair-wise 范式的語(yǔ)義匹配模型?Ernie_Matching 模型精度高、計(jì)算復(fù)雜度高,對(duì)文本相似度大小的序關(guān)系建模能力更強(qiáng),適合將相似度特征作為上層排序模塊輸入特征的應(yīng)用場(chǎng)景。基于雙塔 Point-Wise 范式的語(yǔ)義匹配模型計(jì)算效率更高,適合對(duì)延時(shí)要求高、根據(jù)語(yǔ)義相似度進(jìn)行粗排的應(yīng)用場(chǎng)景。
Part-4?模型訓(xùn)練與預(yù)測(cè)
以中文文本匹配公開(kāi)數(shù)據(jù)集 LCQMC 為示例數(shù)據(jù)集,可在訓(xùn)練集(train.tsv)上進(jìn)行單塔 Point-wise 模型訓(xùn)練,并在開(kāi)發(fā)集(dev.tsv)驗(yàn)證。
模型訓(xùn)練
%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:可選,保存訓(xùn)練模型的目錄;默認(rèn)保存在當(dāng)前目錄checkpoints文件夾下。 ?\# max\_seq\_length:可選,ERNIE-Gram 模型使用的最大序列長(zhǎng)度,最大不能超過(guò)512, 若出現(xiàn)顯存不足,請(qǐng)適當(dāng)調(diào)低這一參數(shù);默認(rèn)為128。 ?\# batch_size:可選,批處理大小,請(qǐng)結(jié)合顯存情況進(jìn)行調(diào)整,若出現(xiàn)顯存不足,請(qǐng)適當(dāng)調(diào)低這一參數(shù);默認(rèn)為32。 ?\# learning_rate:可選,F(xiàn)ine-tune的最大學(xué)習(xí)率;默認(rèn)為5e-5。 ?\# weight_decay:可選,控制正則項(xiàng)力度的參數(shù),用于防止過(guò)擬合,默認(rèn)為0.0。 ?\# epochs:?訓(xùn)練輪次,默認(rèn)為3。 ?\# warmup\_proption:可選,學(xué)習(xí)率warmup策略的比例,如果0.1,則學(xué)習(xí)率會(huì)在前10%訓(xùn)練step的過(guò)程中從0慢慢增長(zhǎng)到learning\_rate, 而后再緩慢衰減,默認(rèn)為0.0。 ?\# init\_from\_ckpt:可選,模型參數(shù)路徑,熱啟動(dòng)模型訓(xùn)練;默認(rèn)為None。 ?\# seed:可選,隨機(jī)種子,默認(rèn)為1000. ?\# device:?選用什么設(shè)備進(jìn)行訓(xùn)練,可選cpu或gpu。如使用gpu訓(xùn)練則參數(shù)gpus指定GPU卡號(hào)。 ?
預(yù)測(cè)結(jié)果部分展示。
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 ?
如果想要使用其他預(yù)訓(xùn)練模型如?ERNIE、BERT、RoBERTa 等,只需更換 model 和 tokenizer 即可。
#?使用?ERNIE-3.0-medium-zh?預(yù)訓(xùn)練模型 ?model?=?AutoModel.from_pretrained('ernie-3.0-medium-zh') ?
tokenizer?=?AutoTokenizer.from_pretrained('ernie-3.0-medium-zh') ?#?使用?ERNIE?預(yù)訓(xùn)練模型 ?#?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?預(yù)訓(xùn)練模型 ?#?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?預(yù)訓(xùn)練模型 ?#?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:?如需恢復(fù)模型訓(xùn)練,則可以設(shè)置 init_from_ckpt,如
init_from_ckpt=checkpoints/model_100/model_state.pdparams。如需使用?ernie-tiny 模型,則需提前先安裝 sentencepiece 依賴,如 pip install sentencepiece。
模型預(yù)測(cè)
!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' ?
預(yù)測(cè)結(jié)果部分展示:
{'query':?'這張圖是哪兒',?'title':?'這張圖誰(shuí)有',?'pred_label':?0} ?
{'query':?'這是什么水果?',?'title':?'這是什么水果。怎么吃?',?'pred_label':?1} ?
{'query':?'下巴長(zhǎng)痘痘疼是什么原因',?'title':?'下巴長(zhǎng)痘痘是什么原因?',?'pred_label':?1} ?
{'query':?'北京的市花是什么?',?'title':?'北京的市花是什么花?',?'pred_label':?1} ?
{'query':?'這個(gè)小男孩叫什么?',?'title':?'什么的撿魚(yú)的小男孩',?'pred_label':?0} ?
{'query':?'藍(lán)牙耳機(jī)什么牌子最好的?',?'title':?'什么牌子的藍(lán)牙耳機(jī)最好用',?'pred_label':?1} ?
{'query':?'湖南衛(wèi)視我們約會(huì)吧中間的歌曲是什么',?'title':?'我們約會(huì)吧約會(huì)成功歌曲是什么',?'pred_label':?0} ?
{'query':?'什么鞋子比較好',?'title':?'配什么鞋子比較好…',?'pred_label':?1} ?
{'query':?'怎么把詞典下載到手機(jī)上啊',?'title':?'怎么把牛津高階英漢雙解詞典下載到手機(jī)詞典上啊',?'pred_label':?0} ?
{'query':?'話費(fèi)充值哪里便宜',?'title':?'哪里充值(話費(fèi))最便宜?',?'pred_label':?1} ?
{'query':?'怎樣下載歌曲到手機(jī)',?'title':?'怎么往手機(jī)上下載歌曲',?'pred_label':?1} ?
{'query':?'蘋(píng)果手機(jī)丟了如何找回?',?'title':?'蘋(píng)果手機(jī)掉了怎么找回',?'pred_label':?1} ?
{'query':?'考試怎么考高分?',?'title':?'考試如何考高分',?'pred_label':?1} ?
在深度學(xué)習(xí)模型構(gòu)建上,飛槳框架支持動(dòng)態(tài)圖編程和靜態(tài)圖編程兩種方式,兩種方式下代碼編寫(xiě)和執(zhí)行方式均存在差異。動(dòng)態(tài)圖編程體驗(yàn)更佳、更易調(diào)試,但是因?yàn)椴捎?Python 實(shí)時(shí)執(zhí)行的方式,開(kāi)銷較大,在性能方面與 C++ 有一定差距。靜態(tài)圖調(diào)試難度大,但是將前端 Python 編寫(xiě)的神經(jīng)網(wǎng)絡(luò)預(yù)定義為 Program 描述,轉(zhuǎn)到 C++ 端重新解析執(zhí)行,從而脫離了對(duì) Python 的依賴,往往執(zhí)行性能更佳,并且預(yù)先擁有完整網(wǎng)絡(luò)結(jié)構(gòu)也更利于全局優(yōu)化。
同時(shí),你可以進(jìn)行基于靜態(tài)圖的部署預(yù)測(cè)和模型導(dǎo)出。使用動(dòng)態(tài)圖訓(xùn)練結(jié)束之后,可以使用靜態(tài)圖導(dǎo)出工具 export_model.py 將動(dòng)態(tài)圖參數(shù)導(dǎo)出成靜態(tài)圖參數(shù)。實(shí)現(xiàn)方式可參考如下指令:
!python?export\_model.py?--params\_path? ?
checkpoints/model\_4000/model\_state.pdparams?--output_path=./output ?#?其中params\_path是指動(dòng)態(tài)圖訓(xùn)練保存的參數(shù)路徑,output\_path是指靜態(tài)圖參數(shù)導(dǎo)出路徑。 ?
#?預(yù)測(cè)部署 ?#?導(dǎo)出靜態(tài)圖模型之后,可以基于靜態(tài)圖模型進(jìn)行預(yù)測(cè),deploy/python/predict.py 文件提供了靜態(tài)圖預(yù)測(cè)示例。執(zhí)行如下命令: ?!python?deploy/predict.py?--model_dir?./output ?
02?結(jié)論
Part-1 ?項(xiàng)目小結(jié)
該項(xiàng)目中還涉及部分對(duì)無(wú)監(jiān)督模型以及有監(jiān)督模型的對(duì)比內(nèi)容,如下圖所示。

結(jié)論如下:
SimCSE 模型適合缺乏監(jiān)督數(shù)據(jù),但是又有大量無(wú)監(jiān)督數(shù)據(jù)的匹配和檢索場(chǎng)景。
相比于 SimCSE 模型,DiffCSE 模型會(huì)更關(guān)注語(yǔ)句之間的差異性,具有精確的向量表示能力。DiffCSE 模型同樣適合缺乏監(jiān)督數(shù)據(jù)又有大量無(wú)監(jiān)督數(shù)據(jù)的匹配和檢索場(chǎng)景。
明顯看到有監(jiān)督模型中?ERNIE-Gram 比之前所有模型性能的優(yōu)秀。
受篇幅限制影響,這里不詳細(xì)展開(kāi)模型的對(duì)比詳情,感興趣的同學(xué)可以點(diǎn)擊下方鏈接詳細(xì)了解。同時(shí)歡迎同學(xué)們?cè)陲w槳?AI Studio 平臺(tái)發(fā)揮自己的創(chuàng)造力和想象力。
項(xiàng)目鏈接
https://aistudio.baidu.com/aistudio/projectdetail/5456683?channelType=0&channel=0
項(xiàng)目合集
https://aistudio.baidu.com/aistudio/projectdetail/5427356?contributionType=1
Part-2?未來(lái)展望
本項(xiàng)目主要圍繞著特定領(lǐng)域知識(shí)圖譜 (Domain-specific Knowledge Graph,DKG) 融合方案中的一環(huán)講解了基于?ERNIE-Garm 的文本匹配算法。希望看到這篇項(xiàng)目的開(kāi)發(fā)者們,能夠在此基礎(chǔ)上共同努力共建知識(shí)圖譜領(lǐng)域,走通知識(shí)抽取、知識(shí)融合、知識(shí)推理和質(zhì)量評(píng)估的完整流程。
參考文獻(xiàn)
[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].
更多學(xué)習(xí)資料盡在有軟官網(wǎng)
https://www.jiaruvip.com
https://www.jiaruvip.com/software
https://www.jiaruvip.com/hacker
https://www.jiaruvip.com/phone
https://www.jiaruvip.com/game
https://www.jiaruvip.com/technical
https://www.jiaruvip.com/news
https://www.jiaruvip.com/author