共计 7631 个字符,预计需要花费 20 分钟才能阅读完成。
文本匹配工作在自然语言解决畛域中是十分重要的根底工作,个别用于钻研两段文本之间的关系。文本匹配工作存在很多利用场景,如信息检索、问答零碎、智能对话、文本甄别、智能举荐、文本数据去重、文本类似度计算、自然语言推理、问答零碎、信息检索等,这些自然语言解决工作在很大水平上都能够形象成文本匹配问题,比方信息检索能够归结为搜索词和文档资源的匹配,问答零碎能够归结为问题和候选答案的匹配,复述问题能够归结为两个同义句的匹配。
而在常识交融过程中的关键技术是实体对齐,又被称为实体匹配,其旨在推断来自不同数据汇合中的不同实体是否映射到物理世界中同一对象的处理过程。实体对齐的终极目标是将多源知识库中的实体建设映射关系,也正因如此,文本匹配算法能够在常识交融过程中针对非结构化文本进行较好的语义对齐,建设映射关系,具体计划如下图所示。
在粗选阶段 ,咱们须要依据知识库寻找类似实体对,通过精准匹配和局部匹配的形式进行实体簇的粗选。其中,精准匹配次要采纳同名召回、同音召回、别名召回三类策略。局部匹配次要采纳 jaccard 间隔等办法构建倒排,依据阈值进行筛选。
在精排阶段 ,咱们依据粗选进去的实体对,构建 Pair-wise 类特色,进行精密算分。依据特色的品种,能够划分为标签、属性、非结构化文本三类特色。在理论对齐工作中,头尾部的实体常常缺失各种要害属性,难以判断实体是否能够对齐,此时就利用非结构化文本提供要害信息,这里就能够通过应用飞桨 ERNIE-Gram 模型将依据计算的三类特色进行实体对齐。因为各畛域的 schema 不同,波及到的属性类特色也不尽相同。故依据对数据的剖析,为 schema 相差较大的畛域设计不同的 GBDT 模型,最终实现对齐。
本文次要解说精排阶段的文本匹配算法,更多计划和技术细节请参考下述我的项目。
- 我的项目链接
https://aistudio.baidu.com/aistudio/projectdetail/5456683?cha… -
我的项目合集
https://aistudio.baidu.com/aistudio/projectdetail/5427356?con…01 交融计划操作步骤
Part-1 环境版本要求
环境装置需依据 Python 和飞桨框架的版本要求进行抉择。
-
Python3 版本要求
python3.7 及以上版本,参考
https://www.python.org/ -
飞桨框架版本要求
飞桨框架 2.0+ 版本,参考 https://www.paddlepaddle.org.cn/documentation/docs/zh/install…
-
飞桨环境的装置
需首先保障 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?cha… -
我的项目合集
https://aistudio.baidu.com/aistudio/projectdetail/5427356?con…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].