您的位置:  首页 > 技术杂谈 > 正文

基于飞桨实现的特定领域知识图谱融合方案:ERNIE-Gram 文本匹配算法

2023-03-20 21:00 https://my.oschina.net/u/4067628/blog/8586015 飞桨PaddlePaddle 次阅读 条评论

文本匹配任务在自然语言处理领域中是非常重要的基础任务,一般用于研究两段文本之间的关系。文本匹配任务存在很多应用场景,如信息检索、问答系统、智能对话、文本鉴别、智能推荐、文本数据去重、文本相似度计算、自然语言推理、问答系统、信息检索等,这些自然语言处理任务在很大程度上都可以抽象成文本匹配问题,比如信息检索可以归结为搜索词和文档资源的匹配,问答系统可以归结为问题和候选答案的匹配,复述问题可以归结为两个同义句的匹配。

而在知识融合过程中的关键技术是实体对齐,又被称为实体匹配,其旨在推断来自不同数据集合 中的不同实体是否映射到物理世界中同一对象的处理过程。实体对齐的终极目标是将多源知识库中的实体建立映射关系,也正因如此,文本匹配算法可以在知识融合过程中针对非结构化文本进行较好的语义对齐,建立映射关系,具体方案如下图所示。

在粗选阶段,我们需要根据知识库寻找相似实体对,通过精准匹配和部分匹配的方式进行实体簇的粗选。其中,精准匹配主要采用同名召回、同音召回、别名召回三类策略。部分匹配主要采用 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].

展开阅读全文
  • 0
    感动
  • 0
    路过
  • 0
    高兴
  • 0
    难过
  • 0
    搞笑
  • 0
    无聊
  • 0
    愤怒
  • 0
    同情
热度排行
友情链接