EasyNLP 集成 K-BERT 算法,借助知识图谱实现更优 Finetune

导读

知识图谱(Knowledge Graph)的概念⾸次出现2012年,由Google提出,它作为⼀种⼤规模语义⽹络, 准确地描述了实体以及实体之间的关系。知识图谱最早应⽤于搜索引擎,⽤于准备返回⽤户所需的知识。随着预训练语⾔模型的不断发展,将知识图谱中的知识三元组融⼊预训练模型,对提升模型的效果有重要的作⽤。经典的知识注⼊算法直接将知识图谱中实体的词嵌⼊向量注⼊预训练模型的词嵌⼊向量中;然⽽,知识图谱中实体的词嵌⼊向量和预训练模型的词嵌⼊向量的向量空间不⼀致,⽽且容易引起知识噪⾳(Knowledge Noise)的问题。K-BERT算法提出利⽤Visible Matrix在BERT模型中引⼊外部知识,具有较好的效果。 因此,我们在EasyNLP这⼀算法框架中集成了K-BERT算法,使⽤户在具有知识图谱的情况下,取得更好的模型Finetune效果。

EasyNLP(https://github.com/alibaba/EasyNLP)是阿⾥云机器学习PAI 团队基于 PyTorch 开发的易⽤且丰富的中⽂NLP算法框架,⽀持常⽤的中⽂预训练模型和⼤模型落地技术,并且提供了从训练到部署的⼀站式 NLP 开发体验。EasyNLP 提供了简洁的接⼝供⽤户开发 NLP 模型,包括NLP应⽤ AppZoo 和预训练 ModelZoo,同时提供技术帮助⽤户⾼效的落地超⼤预训练模型到业务。由于跨模态理解需求的不断增加,EasyNLP也⽀持各种跨模态模型,特别是中⽂领域的跨模态模型,推向开源社区,希望能够服务更多的 NLP 和多模态算法开发者和研 究者,也希望和社区⼀起推动 NLP /多模态技术的发展和模型落地。

本⽂简要介绍K-BERT的技术解读,以及如何在EasyNLP框架中使⽤K-BERT模型。

K-BERT模型详解

BERT等预训练语言模型从大规模语料库中捕获文本语言表示,但缺乏领域特定的知识。而领域专家在阅读领域文本时,会利用相关知识进行推理。为了实现这一功能,K-BERT提出了面向知识图谱的知识增强语言模型,将三元组作为领域知识注入到句子中。然而,过多的知识融入会导致知识噪音,使句子偏离其正确的含义。为了克服知识噪音, K-BERT引入了Soft-position和Visibel Matrix来限制知识的影响。由于K-BERT能够从预训练的BERT中加载模型参数,因此通过配备KG,可以很容易地将领域知识注入到模型中,而不需要对模型进行预训练。K-BERT的模型架构和知识注入的应用示例如下所示:

特别地,在模型的输入层,K-BERT表征层通过位置索引将语句树转换为句子,构造三种表征方式:Token表征、Soft-position表征和Segment表征。其中Soft-position表征作为位置嵌入,为重排的序列提供句子结构信息。此外,通过Visible Matrix来覆盖不应该看到的Token,避免了知识噪声问题。如下图所示,以Beijing为例,给定知识三元组(Beijing,capital,China),K-BERT通过Visible Matrix限制只有Beijing能“看到”其相关的关系词和宾语,分别为“capital”和“China”。与之相反,一个知识无关的词now则无法“看到”“capital”和“China”。

从作者论文中我们也可以看到K-BERT中的Attention Matrix的计算过程:

其中,M即为Visible Matrix,为了表示K-BERT输入Token序列能否互相“看见”,定义M如下:

因此,当两个Token互相可以“看见”,M矩阵对应的元素值为0,因此Attention Matrix的计算过程和普通BERT相同。反之,当两个Token不能互相“看见”,M矩阵对应的元素值为负无穷,对应SoftMax函数后的权重则会趋于0,这使得这两个Token在Self-Attention计算过程中互无影响。这就在计算过程中,大大缓解了知识图谱增强过程的知识噪声问题。

K-BERT模型的实现与效果

在EasyNLP框架中,我们在模型层构建了K-BERT模型的Backbone,其核⼼代码如下所示:

self.kbert = KBertModel(config, add_pooling_layer=False)
self.cls = KBertOnlyMLMHead(config)outputs = self.kbert(input_ids,attention_mask=attention_mask,token_type_ids=token_type_ids,position_ids=position_ids,head_mask=head_mask,inputs_embeds=inputs_embeds,encoder_hidden_states=encoder_hidden_states,encoder_attention_mask=encoder_attention_mask,output_attentions=output_attentions,output_hidden_states=output_hidden_states,return_dict=return_dict,
)sequence_output = outputs[0]
prediction_scores = self.cls(sequence_output)
loss_fct = CrossEntropyLoss()
masked_lm_loss = loss_fct(prediction_scores.view(-1, self.config.vocab_size), labels.view(-1))

其中,在K-BERT中,模型Backbone的Attention Mask由两个Matrix加和而成,分别为普通的Attention Mask和Visible Matrix,实现核心代码如下:

extended_attention_mask = self.get_extended_attention_mask(attention_mask, input_shape, device) + self.get_extended_attention_mask(visible_matrix, input_shape, device)

在数据预处理过程中,我们需要获得当前样本的输入文本和知识三元组,从而计算出Visible Matrix:

if self.kbert_model_prefix:encoding['input_ids'], encoding['token_type_ids'], encoding['attention_mask'], encoding['position_ids'], encoding['visible_matrix'] = self.kbert_row_data_process(encoding['input_ids'], encoding['token_type_ids'], encoding['attention_mask'])

为了验证EasyNLP框架中K-BERT模型在各种任务上的精度,我们在多个公开数据集上验证了句子分类和NER任务的效果。我们使用EasyNLP加载了BERT模型,对比复现结果和K-BERT官方论文的结果,如下所示:

数据集Dev复现结果Dev论文结果Test复现结果Test论文结果
Book_review88.588.687.0687.2
Chnsenticorp94.394.695.0895.6
MSRA-NER94.5694.594.4694.5

可以通过上述结果,验证EasyNLP框架中K-BERT算法实现的正确性。

K-BERT模型使⽤教程

以下我们简要介绍如何在EasyNLP框架使⽤K-BERT模型。

安装EasyNLP

⽤户可以直接参考GitHub(https://github.com/alibaba/EasyNLP)上的说明安装EasyNLP算法框架。

数据准备

K-BERT是一个finetune模型,需要用户准备下游任务的训练与验证数据,为tsv文件。对于文本分类任务,这⼀⽂件包含以制表符\t分隔的三列,第一列是标签,第二列是句子序号,第三列是文本句子。样例如下:

0   25  作者肯定是手头有一本年表和名册的,人物事件行动完全扣合正史,人物性格也多有《百家讲坛》为证,人物年龄的bug比红楼梦还少,叙述事件某某年某某月某某伐某某不厌其烦,可是切合历史绝不是说它是好小说的理由啊!我觉得玛丽苏都不是致命伤,关键是情节幼稚看不下去啊!

对于NER任务,同样为一个tsv文件,由\t分隔为文本和label两列,文本字与字之间用空格隔开。样例如下:

猎 豹 移 动 方 面 解 释 称 , 移 动 收 入 和 海 外 收 入 的 增 长 主 要 得 益 于 L i v e . m e 产 品 在 海 外 市 场 的 快 速 增 长 。   B-ORG I-ORG I-ORG I-ORG O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O

下列⽂件已经完成预处理,可⽤于测试:

https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/K-BERT/kbert_data.zip

K-BERT⽂本分类示例

在文本分类任务中,我们采⽤以下命令对K-BERT模型进⾏finetune,模型在finetune过程中也会自动输出评估结果。其中,用户可以在前述预处理示例文件中找到训练集chnsenticorp/train.tsv、评测集chnsenticorp/dev.tsv以及知识图谱文件kbert_kgs/HowNet.spo。kbert_cls.py位于EasyNLP项目下的examples/kbert/下。相关示例代码如下:

python kbert_cls.py \
--mode train \
--tables tmp/kbert_data/chnsenticorp/train.tsv,tmp/kbert_data/chnsenticorp/dev.tsv \
--input_schema label:str:1,sid1:str:1,sent1:str:1 \
--first_sequence sent1 \
--label_name label\
--label_enumerate_values 0,1 \
--checkpoint_dir ./tmp/kbert_classification_model/ \
--learning_rate 2e-5 \
--epoch_num 2 \
--random_seed 42 \
--save_checkpoint_steps 50 \
--sequence_length 128 \
--micro_batch_size 16 \
--app_name text_classify \
--user_defined_parameters "pretrain_model_name_or_path=kbert-base-chinese kg_file=tmp/kbert_data/kbert_kgs/HowNet.spo"

K-BERT命名实体识别示例

在NER任务中,我们采⽤以下命令对K-BERT模型进⾏finetune,其使用方式与文本分类相同:

python kbert_ner.py \
--mode train \
--tables tmp/kbert_data/financial_ner/train.tsv,tmp/kbert_data/financial_ner/dev.tsv \
--input_schema content:str:1,label:str:1 \
--first_sequence content \
--label_name label\
--label_enumerate_values B-ORG,B-PER,B-POS,I-ORG,I-PER,I-POS,O \
--checkpoint_dir ./tmp/kbert_ner_model/ \
--learning_rate 2e-5 \
--epoch_num 2 \
--random_seed 42 \
--save_checkpoint_steps 50 \
--sequence_length 128 \
--micro_batch_size 16 \
--app_name sequence_labeling \
--user_defined_parameters "pretrain_model_name_or_path=kbert-base-chinese kg_file=tmp/kbert_data/kbert_kgs/HowNet.spo"

未来展望

在未来,我们计划在EasyNLP框架中集成更多中⽂知识模型,覆盖各个常⻅中⽂领域,敬请期待。我们 也将在EasyNLP框架中集成更多SOTA模型(特别是中⽂模型),来⽀持各种NLP和多模态任务。此外, 阿⾥云机器学习PAI团队也在持续推进中⽂多模态模型的⾃研⼯作,欢迎⽤户持续关注我们,也欢迎加⼊ 我们的开源社区,共建中⽂NLP和多模态算法库!

Github地址:https://github.com/alibaba/EasyNLP

Reference

  1. Chengyu Wang, Minghui Qiu, Taolin Zhang, Tingting Liu, Lei Li, Jianing Wang, Ming Wang, Jun Huang, Wei Lin. EasyNLP: A Comprehensive and Easy-to-use Toolkit for Natural Language Processing. arXiv
  2. Weijie Liu, Peng Zhou, Zhe Zhao, Zhiruo Wang, Qi Ju, Haotang Deng, and Ping Wang. 2020. K-BERT: Enabling Language Representation with Knowledge Graph. In AAAI. 2901–2908
  3. K-BERT原作者开源代码:https://github.com/autoliuweijie/K-BERT

原文链接

本文为阿里云原创内容,未经允许不得转载。

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

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

相关文章

一种关于低代码平台(LCDP)建设实践与设计思路

背景 负责菜鸟商业中心CRM系统开发已经有1年多时间,过程中发现有一个痛点:业务线特别多,每个业务线对同一个页面都有个性化布局和不同的字段需求,而我所在的团队就3个人,在资源有限的情况下如何支撑好呢?刚…

Redis 数据类型 list 以及使用场景

数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序 list类型:保存多个数据,底层使用双向链表存储结构实现 list 类型数…

TairSearch:加速多列索引查询

互联网及传统行业应用服务的关键数据一般存储在MySQL这类的关系型数据库中。如需缓解数据库访问压力,可引入Redis等缓存系统承担热数据的查询,以此提升查询效能。然而业务场景如果是在数据库上做随意多列组合索引查询或者like模糊匹配查询,使…

如何在 Anolis 8上部署 Nydus 镜像加速方案?

在上一篇文章中详细介绍Anolis OS 是首个原生支持镜像加速 Linux 内核,Nydus 镜像加速服务重新优化了现有的 OCIv1 容器镜像格式,重新定义镜像的文件系统,数据与元数据分离,实现按需加载,本文作为使用 Nydus 的教程将详…

机器学习访存密集计算编译优化框架AStitch,大幅提升任务执行效率

近日,关于机器学习访存密集计算编译优化框架的论文《AStitch: Enabling A New Multi-Dimensional Optimization Space for Memory-Intensive ML Training and Inference on Modern SIMT Architectures》被系统领域顶会ASPLOS 2022接收。 AStitch通过编译优化的手段来…

微前端架构的几种技术选型

背景 随着SPA大规模的应用,紧接着就带来一个新问题:一个规模化应用需要拆分。 一方面功能快速增加导致打包时间成比例上升,而紧急发布时要求是越短越好,这是矛盾的。另一方面当一个代码库集成了所有功能时,日常协作绝…

真正的 HTAP 对用户和开发者意味着什么?

数据库的全称是 DBMS(Database Management System),早期是不区分 OLTP 与 OLAP 的,E.F.Codd 在 1970 年就提出了关系模型,Jim Gray 在 1976 年提出了事务模型。随着数据库的应用场景越来越丰富,单一数据库的…

const常见用法

const用法主要是防止定义的对象再次被修改,定义对象变量时要初始化变量 下面我就介绍一下几种常见的用法 1.用于定义常量变量,这样这个变量在后面就不可以再被修改 const int Val 10; //Val 20; //错误,不可被修改 2. 保护传参时参数不被修改,如果使用引用传递参数或按地址传…

微服务治理热门技术揭秘:无损上线

为什么有了无损下线,还需要无损上线?无损上线可以解决哪些问题? 本篇文章将一一回答这些问题。 无损上线功能不得不说是一个客户打磨出来的功能我们将从一次发布问题的排查与解决的过程说起。 背景 阿里云内部某应用中心服务在发布过程中出…

深度强化学习技术概述

深度强化学习介绍 强化学习主要用来学习一种最大化智能体与环境交互获得的长期奖惩值的策略,其常用来处理状态空间和动作空间小的任务,在如今大数据和深度学习快速发展的时代下,针对传统强化学习无法解决高维数据输入的问题,2013…

大屏小程序探索实践 | Cube 技术解读

所谓大屏小程序,是以 Cube 小程序技术栈 为载体,运行在智能电视或智能机顶盒等设备上的一种小程序形态。这些设备的主要特点是: 以 Android 系统为主,系统版本普遍较低,有些设备依然停留在 Android 4.2,An…

阿里云解决方案架构师张平:云原生数字化安全生产的体系建设

关于今天的分享主题——“安全生产”,内容主要分为三大部分: 第一部分是安全生产的背景,以及我们对于安全生产这个领域的理解;第二部分主要介绍阿里巴巴集团的安全生产工作到底是怎么开展的,借此给各位有作为参考和借…

从斜边之长为L的一切直角三角形中,求有最大周长的直角三角形.(多元函数的极值及其求法)

三条直线围成的直角三角形三个顶点A(16,0),B(0,8),C(0,0),设点(x,y)到AB,BC,AC的距离分别是d1,d2,d3,有: |AB|*d1|BC|*d2|AC|*d32S(ABC) 而(|AB|*d1|BC|*d2AC*d3)^24S^(ABC)/(|AB|^2|BC|^2|AC|^2)128/5 等号成立当且仅当|AB|/d1|BC|/d2|AC|/d3 就是40/|x2y-16|8/|x|16/|y| …

全链路灰度新功能:MSE上线配置标签推送

为什么需要配置标签推送 从全链路灰度谈起 在微服务场景中,应用的灰度发布迎来了新的挑战。不同于单体架构中将应用整体打包即可发布测试版本,微服务应用往往由多个服务组合而成。这些服务通常由不同的团队负责,独立进行开发。一个新功能通…

动态尺寸模型优化实践之 Shape Constraint IR Part I

在本系列分享中我们将介绍BladeDISC在动态shape语义下做性能优化的一些实践和思考。本次分享的是我们最近开展的有关shape constraint IR的工作,鉴于篇幅较长,为了提升阅读体验,我们将分享拆分为两个部分: Part I 中我们将介绍问…

云原生事件驱动引擎(RocketMQ-EventBridge)应用场景与技术解析

在刚刚过去的 RocketMQ Summit 2022 全球开发者峰会上,我们对外正式开源了我们的新产品 RocketMQ-Eventbridge 事件驱动引擎。 RocketMQ 给人最大的印象一直是一个消息引擎。那什么是事件驱动引擎?为什么我们这次要推出事件驱动引擎这个产品&#xff1f…

动态尺寸模型优化实践之 Shape Constraint IR Part II

在本系列分享中我们将介绍BladeDISC在动态shape语义下做性能优化的一些实践和思考。本次分享的是我们最近开展的有关shape constraint IR的工作,鉴于篇幅较长,为了提升阅读体验,我们将分享拆分为两个部分: Part I 中我们将介绍问…

PolarDB 助力易仓打造跨境行业生态链协同的产业链 SaaS

2022年7月,易仓ECCANG WMS东南亚版正式上线!专为东南亚海外仓业务打造,帮助东南亚海外仓企业排忧解难,实现订单、仓库、人员、财务高效管理。易仓科技是头部的跨境行业SaaS服务商,其生态涵盖了300工厂、100000卖家、17…

iLogtail 社区版使用入门 - 采集 MySQL Binlog

iLogtail是阿里云日志服务(SLS)团队自研的可观测数据采集Agent,拥有的轻量级、高性能、自动化配置等诸多生产级别特性,可以署于物理机、虚拟机、Kubernetes等多种环境中来采集遥测数据。iLogtail在阿里云上服务了数万家客户主机和…

融合数据库生态:利用 EventBridge 构建 CDC 应用

引言 CDC(Change Data Capture)指的是监听上游数据变更,并将变更信息同步到下游业务以供进一步处理的一种应用场景。近年来事件驱动架构(EDA)热度逐步上升,日渐成为项目架构设计者的第一选择。EDA 天然契合…