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

news2025/1/17 18:11:00

2b42eb11d9cab3bff3b953ce04202af5.jpeg

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

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

5c7189e818c10700973e4e73df5ed142.png

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

​​​​​​​

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]是百度知道领域的中文问题匹配数据集,以解决中文领域大规模问题匹配。该数据集从百度知道的不同领域用户问题中抽取构建数据。部分数据集展示如下:

西安下雪了?是不是很冷啊?    西安的天气怎么样啊?还在下雪吗?   0

第一次去见女朋友父母该如何表现?   第一次去见家长该怎么做    0

猪的护心肉怎么切    猪的护心肉怎么吃    0

显卡驱动安装不了,为什么?   显卡驱动安装不了怎么回事    1

一只蜜蜂落在日历上(打一成语)    一只蜜蜂停在日历上(猜一成语)    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等预训练模型。其中掩码的流程见下图所示。

7fefa7f18833775e22b1920abbed77b2.png

ERNIE-Gram模型充分地将粗粒度语言信息纳入预训练,进行了全面的n-gram预测和关系建模,消除之前连续掩蔽策略的局限性,进一步增强了语义n-gram的学习。n-gram关系建模的详细架构如下图所示,子图(b)中是一个n-gram抽样的例子,其中虚线框代表抽样模块,绿色的文本是原始n-gram,蓝色的斜体文本是抽样的n-gram。本文不一一展开,更多算法原理和技术细节请参考原论文。

e2a593f299d785b1a52c2015597a8b95.png

为让同学们快速上手,本项目使用语义匹配数据集LCQMC作为训练集,基于ERNIE-Gram预训练模型训练了单塔Point-wise语义匹配模型,用户可以直接基于这个模型对文本对进行语义匹配的二分类任务。(在文本匹配任务数据的每一个样本通常由两个文本组成query和title。类别形式为0或1,0表示query与title不匹配,1表示匹配。)同时考虑到在不同应用场景下的需求,下面也将简单讲解一下不同类型的语义匹配模型和应用场景。

f96a8bdff16b4d5d99e81ae3c150f536.png

cfad89d258c61e289366863b3624e2c5.png

基于单塔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 项目小结

该项目中还涉及部分对无监督模型以及有监督模型的对比内容,如下图所示。

258ff2509683144efac2a163612a6337.png

结论如下:

  • 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].

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/415360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】了解MySQL的Explain,读这一篇够了( ̄∇ ̄)/

目录 ID select_type 查询类型 table 表名 type 关联类型/访问类型 possible_keys MySQL觉得可能要用到的索引 key 实际用到的索引 key_len 用到的索引的长度(比如可用于判断使用了联合索引中的哪几个) ref 表查找值所用的列(表名.字…

Transformer在计算机视觉中的应用-VIT、TNT模型

上期介绍了Transformer的结构、特点和作用等方面的知识,回头看下来这一模型并不难,依旧是传统机器翻译模型中常见的seq2seq网络,里面加入了注意力机制,QKV矩阵的运算使得计算并行。 当然,最大的重点不是矩阵运算&…

行人车辆检测与计数系统(Python+YOLOv5深度学习模型+清新界面)

摘要:行人车辆检测与计数系统用于交通路口行人及车辆检测计数,道路人流量、车流量智能监测,方便记录、显示、查看和保存检测结果。本文详细介绍行人车辆检测,在介绍算法原理的同时,给出Python的实现代码、PyQt的UI界面…

【并发编程Python】一文详解Python并发编程,协程、线程、进程

并发编程简介和一些前缀知识 并发编程是使得程序大幅度提速的。在并发编程中,程序可以同一时间执行多个任务,这有助于提高程序的吞吐量和响应时间。并发编程设计的主要概念包括线程、锁、同步、信号量、进程间通信等。 前缀知识: IO&#x…

Linux中shell内外命令讲解(上)

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真情 前言 本章Linuxshell讲解,感谢观看,干货满满。 目录…

在windows内使用virtualbox搭建安卓x86,以及所遇到的问题解决--2.virtualbox上安卓x86的配置

目录: 简要说明: 1.配置vesa驱动: 2.启用网络连接并配置adb: 3.增强性能的方法: 简要说明: 先进行说明一点个人直接通过vbox VMware这些软件,并不能超越专业的安卓模拟器,大部分模拟器实际…

使用Pytorch实现对比学习SimCLR 进行自监督预训练

SimCLR(Simple Framework for Contrastive Learning of Representations)是一种学习图像表示的自监督技术。 与传统的监督学习方法不同,SimCLR 不依赖标记数据来学习有用的表示。 它利用对比学习框架来学习一组有用的特征,这些特征…

【创作赢红包】Java Web 实战 18 - 计算机网络之网络层协议 and 数据链路层协议

文章目录网络层协议1. IP 协议1.1 报头结构1.2 IP 协议的地址管理动态分配 IP 地址 (DHCP)IP 地址转换 (NAT)IPv61.3 IP 地址的组成2. 路由选择数据链路层1. 以太网协议2. 以太网帧格式2.1 mac 地址2.2 两个特殊的以太网数据帧DNS 域名解析系统六 . 经典面试题 : 从浏览器中输入…

微信小程序 | 基于ChatGPT实现模拟面试小程序

Pre:效果预览 ① 选择职位进行面试 ② 根据岗位职责进行回答 一、需求背景 这两年IT互联网行业进入寒冬期,降本增效、互联网毕业、暂停校招岗位的招聘,各类裁员、缩招的情况层出不穷!对于这个市场来说,在经历了互联网…

小白学Pytorch系列--Torch API (7)

小白学Pytorch系列–Torch API (7) Comparison Ops allclose 此函数检查输入和其他是否满足条件: >>> torch.allclose(torch.tensor([10000., 1e-07]), torch.tensor([10000.1, 1e-08])) False >>> torch.allclose(torch.tensor([10000., 1e-…

MATLAB | 如何自然好看的从图片中提取颜色并制作色卡

在这里研究了一下各种排序算法,写一篇如何由图片一键生成颜色条的方法。 1 关于大量颜色排序 假设有大量颜色怎么对其进行排序呢,首先想到的最简单方法就是将其按照RGB值的大小进行排序,为了方便展示颜色条,这里编写了一个颜色条…

【Pytorch】 理解张量Tensor

本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 这是目录张量Tensor是什么?张量的创建为什么要用张量Tensor呢?总结张量Tensor是什么? 在深度学习中,我们经常会遇到一个概念&#xff…

初探Redis整体架构

文章目录1、Redis为什么选择单线程2、逐步加入多线程3、Redis采用IO多路复用---epoll和Reactor架构4、Redis6/7默认是否开启了多线程?1、Redis为什么选择单线程 这种问法其实并不严谨,为啥这么说呢? Redis几个里程碑式的重要版本 理清一个事实&#…

一文带你安装opencv和常用库(保姆级教程少走80%的弯路)

0.导语 离上一个opencv安装保姆级教程发布已经过去了快一年了,这一年来我收到了来自很多C友的鼓励。打算学opencv的各位朋友都会在安装opencv和各种库过程中浪费掉60%的时间和精力;博主在这一年来尝试各种各样的安装方法,全网搜集各种资料总…

[ 云计算 | Azure ] Chapter 05 | 核心体系结构之管理组、订阅、资源和资源组以及层次关系

本文主要对如下内容进行讲解:Azure云计算的核心体系结构组件中的:资源、订阅和资源组,以及了解 Azure 资源管理器 (ARM) 如何部署资源。 本系列已经更新文章列表: [ 云计算 | Azure ] Chapter 03 | 描述云计算运营中的 CapEx 与…

元宇宙与网络安全

元宇宙是一种虚拟现实空间,用户可以在计算机生成的环境中进行互动。元宇宙的应用范围很广,比如房地产,医疗,教育,军事,游戏等等。它提供了更具沉浸感的体验,更好地现实生活整合,以及…

图像分类算法:ResNet论文解读

图像分类算法:ResNet论文解读 前言 ​ 其实网上已经有很多很好的解读各种论文的文章了,但是我决定自己也写一写,当然,我的主要目的就是帮助自己梳理、深入理解论文,因为写文章,你必须把你所写的东西表达清楚…

游戏工厂:AI(AIGC/ChatGPT)与流程式游戏开发(码客 卢益贵)

关键词:AI(AIGC、ChatGPT、文心一言)、流程式管理、好莱坞电影流程、电影工厂、游戏工厂、游戏开发流程、游戏架构、模块化开发 一、前言 开发周期长、人工成本高、成功率低等使得游戏公司融资比较困难。有的公司凭一个爆款游戏一骑绝尘之后…

奇异值分解(SVD)和图像压缩

在本文中,我将尝试解释 SVD 背后的数学及其几何意义,还有它在数据科学中的最常见的用法,图像压缩。 奇异值分解是一种常见的线性代数技术,可以将任意形状的矩阵分解成三个部分的乘积:U、S、V。原矩阵A可以表示为&#…

阿里通义千问、百度文心一言、ChatGPT与GPT-4大比拼

各个大模型的研究测试传送门 ​阿里通义千问传送门: https://tongyi.aliyun.com/chat 百度文心一言传送门: https://yiyan.baidu.com/ ChatGPT传送门(免墙,可直接注册测试): https://wowchat.cn GPT…