EasyNLP中的K-Global Pointer模型解析及应用

释放双眼,带上耳机,听听看~!
本文介绍了EasyNLP中的K-Global Pointer模型,该模型是基于Global Pointer模型的改进版本,支持中文信息抽取三大任务。通过使用MacBERT预训练语言模型和prompt模板,可以有效地进行命名实体识别和关系抽取任务。阅读本文了解K-Global Pointer模型的详细解析和在EasyNLP框架中的应用。

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,github.com/alibaba/Eas…)是阿⾥云机器学习PAI团队基于PyTorch开发的简单易⽤且功能丰富的中⽂NLP算法框架,⽀持常⽤的中⽂预训练模型和⼤模型落地技术,并且提供了从训练到部署的⼀站式NLP开发体验。EasyNLP提供了简洁的接⼝供⽤户开发NLP模型,包括NLP应⽤AppZoo和预训练ModelZoo,同时提供技术帮助⽤户⾼效的落地超⼤预训练模型到业务。由于跨模态理解需求的不断增加,EasyNLP也⽀持各种跨模态模型,特别是中⽂领域的跨模态模型,推向开源社区,希望能够服务更多的NLP和多模态算法开发者和研究者,也希望和社区⼀起推动NLP/多模态技术的发展和模型落地。

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

K-Global Pointer模型详解

Global Pointer模型是由苏剑林提出的解决命名实体识别任务的模型,n∗nn*n 的矩阵 AAn n为序列长度),A[i,j] A[i,j]代表的是序列ii到序列jj组成的连续子串为对应实体类型的概率,通过设计门槛值BB即可将文本中具有特定意义的实体识别出来。

K-Global Pointer模型是在Global Pointer模型的基础之上改进的。首先我们将仅支持命名实体识别的模型拓展成支持中文信息抽取三大任务的模型。然后,我们使用了MacBERT预训练语言模型来将文本序列转换成向量序列。最后我们针对不同的任务设计了一套prompt模板,其能帮助预训练语言模型“回忆”起自己在预训练时“学习”到的内容。接下来,我们将根据中文信息抽取三大任务分别进行阐述。

针对命名实体识别任务,我们有文本w1,w2,w3,…,wnw_{1},w_{2},w_{3},…,w_{n}以及需要提取的实体类型entity_type,对应的prompt为“找到文章中所有【entity_type】类型的实体?”,对应的输入模型的文本HH为“找到文章中所有【entity_type】类型的实体?文章:【w1,w2,w3,…,wnw_{1},w_{2},w_{3},…,w_{n}】”,模型经过相应的处理即可输出文本中实体类型为entity_type的实体。

EasyNLP中的K-Global Pointer模型解析及应用

针对关系抽取任务,我们有文本w1,w2,w3,…,wnw_{1},w_{2},w_{3},…,w_{n}以及需要提取的关系类型relation_type(subject_type-predicate-object_type),分为两步。第一步,对应的prompt为“找到文章中所有【subject_type】类型的实体?”,对应的输入模型的文本HH为“找到文章中所有【subject_type】类型的实体?文章:【w1,w2,w3,…,wnw_{1},w_{2},w_{3},…,w_{n}】”,模型经过相应的处理即可输出文本中实体类型为subject_type的实体e1e_{1}。第二步,对应的prompt为“找到文章中所有【e1e_{1}】的【predicatepredicate】?”,对应的输入模型的文本HH为“找到文章中所有【e1e_{1}】的【predicatepredicate】?文章:【w1,w2,w3,…,wnw_{1},w_{2},w_{3},…,w_{n}】”,模型经过相应的处理即可输出实体e2e_{2}。即可构成关系三元组(e1、predicate、e2e_{1}、predicate、e_{2})。

EasyNLP中的K-Global Pointer模型解析及应用

针对事件抽取任务,我们有文本w1,w2,w3,…,wnw_{1},w_{2},w_{3},…,w_{n}以及需要提取的事件类型classclass,每个classclass包含event_type以及role_list(r_{1},r_{2},…),分为两步。第一步,对应的prompt为“找到文章中所有【event_type】类型的实体?”,对应的输入模型的文本HH为“找到文章中所有【event_type】类型的实体?文章:【w1,w2,w3,…,wnw_{1},w_{2},w_{3},…,w_{n}】”,模型经过相应的处理即可输出的实体ee。第二步,针对role_list中不同的rxr_{x},对应的prompt为“找到文章中所有【ee】的【rxr_{x}】?”,对应的输入模型的文本HH为“找到文章中所有【ee】的【rxr_{x}】?文章:【w1,w2,w3,…,wnw_{1},w_{2},w_{3},…,w_{n}】”,模型经过相应的处理即可输出实体exe_{x}。即可构成事件{event_type:ee,role_list:{r_{1}:e_{1},r_{2}:e_{2},…}}。

EasyNLP中的K-Global Pointer模型解析及应用

K-Global Pointer模型的实现与效果

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

self.config = AutoConfig.from_pretrained(pretrained_model_name_or_path)
self.backbone = AutoModel.from_pretrained(pretrained_model_name_or_path)
self.dense_1 = nn.Linear(self.hidden_size, self.inner_dim * 2)
self.dense_2 = nn.Linear(self.hidden_size, self.ent_type_size * 2)

context_outputs = self.backbone(input_ids, attention_mask, token_type_ids)
outputs = self.dense_1(context_outputs.last_hidden_state)
qw, kw = outputs[..., ::2], outputs[..., 1::2]

pos = SinusoidalPositionEmbedding(self.inner_dim, 'zero')(outputs)
cos_pos = pos[..., 1::2].repeat_interleave(2, dim=-1)
sin_pos = pos[..., ::2].repeat_interleave(2, dim=-1)
qw2 = torch.stack([-qw[..., 1::2], qw[..., ::2]], 3)
qw2 = torch.reshape(qw2, qw.shape)
qw = qw * cos_pos + qw2 * sin_pos
kw2 = torch.stack([-kw[..., 1::2], kw[..., ::2]], 3)
kw2 = torch.reshape(kw2, kw.shape)
kw = kw * cos_pos + kw2 * sin_pos

logits = torch.einsum('bmd,bnd->bmn', qw, kw) / self.inner_dim ** 0.5
bias = torch.einsum('bnh->bhn', self.dense_2(last_hidden_state)) / 2
logits = logits[:, None] + bias[:, ::2, None] + bias[:, 1::2, :, None]
        
mask = torch.triu(attention_mask.unsqueeze(2) * attention_mask.unsqueeze(1))
y_pred = logits - (1-mask.unsqueeze(1))*1e12
y_true = label_ids.view(input_ids.shape[0] * self.ent_type_size, -1)
y_pred = y_pred.view(input_ids.shape[0] * self.ent_type_size, -1)
loss = multilabel_categorical_crossentropy(y_pred, y_true)

为了验证EasyNLP框架中K-Global Pointer模型的有效性,我们使用DuEE1.0、DuIE2.0、CMeEE-V2、CLUENER2020、CMeIE、MSRA、People’s_Daily 7个数据集联合进行训练,并在各个数据集上分别进行验证。其中CMeEE-V2、CLUENER2020、MSRA、People’s_Daily数据集适用于命名实体识别任务,DuIE2.0、CMeIE数据集适用于关系抽取任务,DuEE1.0数据集适用于事件抽取任务。结果如下所示:

数据集 DuEE1.0 DuIE2.0 CMeEE-V2 CLUENER2020 CMeIE MSRA People’s_Daily
参数设置B=0.6 0.8657 0.8725 0.8266 0.889 0.8155 0.9856 0.9933

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

K-Global Pointer模型使用教程

以下我们简要介绍如何在EasyNLP框架使⽤K-Global Pointer模型。分为三种情况,分别是①用户使用数据训练模型②用户验证训练好的模型③用户使用训练好的模型完成中文信息抽取任务。我们提供了联合DuEE1.0、DuIE2.0、CMeEE-V2、CLUENER2020、CMeIE、MSRA、People’s_Daily 7个数据集的数据,可以通过sh run_train_eval_predict_user_defined_local.sh来下载获取train.tsv、dev.tsv、predict_input_EE.tsv、predict_input_NER.tsv文件,其中train.tsv文件可用于训练、dev.tsv文件可用于验证、predict_input_EE.tsv、predict_input_NER.tsv文件可用于测试。用户也可以使用自定义数据。

⽤户可以直接参考GitHubgithub.com/alibaba/Eas…)上的说明安装EasyNLP算法框架。然后cd EasyNLP/examples/information_extraction。

①用户使用数据训练模型

数据准备

训练模型需要使用训练数据和验证数据。用户可以使用我们提供的数据,也可以使用自定义数据。数据表示为train.tsv文件以及dev.tsv文件,这两个⽂件都包含以制表符t分隔的五列,第一列是标签,第二列是上文K-Global Pointer模型详解中提到的EasyNLP中的K-Global Pointer模型解析及应用,第三列是答案的开始,第四列是答案的的结束,第五列是答案。样例如下:

People's_Daily-train-0	['找到文章中所有【LOC】类型的实体?文章:【海钓比赛地点在厦门与金门之间的海域。】']	[29, 32]	[31, 34]	厦门|金门
DuIE2.0-train-0	['找到文章中所有【图书作品】类型的实体?文章:【《邪少兵王》是冰火未央写的网络小说连载于旗峰天下】']	[24]	[28]	邪少兵王
DuIE2.0-train-1	['找到文章中【邪少兵王】的【作者】?文章:【《邪少兵王》是冰火未央写的网络小说连载于旗峰天下】']	[28]	[32]	冰火未央
DuEE1.0-train-25900	['找到文章中所有【竞赛行为-夺冠】类型的实体?文章:【盖斯利在英国大奖赛首场练习赛中夺冠】']	[41]	[43]	夺冠
DuEE1.0-train-25901	['找到文章中【夺冠】的【冠军】?文章:【盖斯利在英国大奖赛首场练习赛中夺冠】']	[19]	[22]	盖斯利
DuEE1.0-train-25902	['找到文章中【夺冠】的【夺冠赛事】?文章:【盖斯利在英国大奖赛首场练习赛中夺冠】']	[25]	[35]	英国大奖赛首场练习赛

训练模型

代码如下:

python main.py 
--mode train 
--tables=train.tsv,dev.tsv 
--input_schema=id:str:1,instruction:str:1,start:str:1,end:str:1,target:str:1 
--worker_gpu=4 
--app_name=information_extraction 
--sequence_length=512 
--weight_decay=0.0 
--micro_batch_size=2 
--checkpoint_dir=./information_extraction_model/ 
--data_threads=5 
--user_defined_parameters='pretrain_model_name_or_path=hfl/macbert-large-zh' 
--save_checkpoint_steps=500 
--gradient_accumulation_steps=8 
--epoch_num=3  
--learning_rate=2e-05  
--random_seed=42

训练好的模型保存在information_extraction_model文件夹中。

②用户验证训练好的模型

数据准备

验证模型需要使用验证数据。用户可以使用我们提供的数据,也可以使用自定义数据。数据表示为dev.tsv文件,这个⽂件包含以制表符t分隔的五列,第一列是标签,第二列是上文K-Global Pointer模型详解中提到的HH,第三列是答案的开始,第四列是答案的的结束,第五列是答案。样例如下:

People's_Daily-train-0	['找到文章中所有【LOC】类型的实体?文章:【海钓比赛地点在厦门与金门之间的海域。】']	[29, 32]	[31, 34]	厦门|金门
DuIE2.0-train-0	['找到文章中所有【图书作品】类型的实体?文章:【《邪少兵王》是冰火未央写的网络小说连载于旗峰天下】']	[24]	[28]	邪少兵王
DuIE2.0-train-1	['找到文章中【邪少兵王】的【作者】?文章:【《邪少兵王》是冰火未央写的网络小说连载于旗峰天下】']	[28]	[32]	冰火未央
DuEE1.0-train-25900	['找到文章中所有【竞赛行为-夺冠】类型的实体?文章:【盖斯利在英国大奖赛首场练习赛中夺冠】']	[41]	[43]	夺冠
DuEE1.0-train-25901	['找到文章中【夺冠】的【冠军】?文章:【盖斯利在英国大奖赛首场练习赛中夺冠】']	[19]	[22]	盖斯利
DuEE1.0-train-25902	['找到文章中【夺冠】的【夺冠赛事】?文章:【盖斯利在英国大奖赛首场练习赛中夺冠】']	[25]	[35]	英国大奖赛首场练习赛

验证模型

代码如下:

python main.py 
--mode evaluate 
--tables=dev.tsv 
--input_schema=id:str:1,instruction:str:1,start:str:1,end:str:1,target:str:1 
--worker_gpu=4 
--app_name=information_extraction 
--sequence_length=512 
--weight_decay=0.0 
--micro_batch_size=2 
--checkpoint_dir=./information_extraction_model/ 
--data_threads=5

③用户使用训练好的模型完成中文信息抽取任务

数据准备

测试模型需要使用测试数据。用户可以使用我们提供的数据,也可以使用自定义数据。

对于命名实体识别任务,数据表示为predict_input_NER.tsv文件,这个⽂件包含以制表符t分隔的三列,第一列是标签,第二列是实体类型,第三列是文本。我们支持对同一个文本识别多种实体类型,仅需要在第二列中将不同的实体类型用;分隔开。样例如下:

1	LOC;ORG	海钓比赛地点在厦门与金门之间的海域。

对于关系抽取任务,数据表示为predict_input_RE.tsv文件,这个⽂件包含以制表符t分隔的三列,第一列是标签,第二列是关系类型,第三列是文本。我们支持对同一个文本识别多种关系类型,仅需要在第二列中将不同的关系类型用;分隔开。对于一个关系类型relation_type(subject_type-predicate-object_type)表示为subject_type:predicate,样例如下:

1	图书作品:作者	《邪少兵王》是冰火未央写的网络小说连载于旗峰天下

对于事件抽取任务,数据表示为predict_input_EE.tsv文件,这个⽂件包含以制表符t分隔的三列,第一列是标签,第二列是事件类型class,第三列是文本。我们支持对同一个文本识别多种事件类型,仅需要在第二列中将不同的事件类型用;分隔开。对于一个事件类型class包含event_type以及role_list(r1,r2,……)表示为event_type:r1,r2,……,样例如下:

1	竞赛行为-夺冠:夺冠赛事,裁员人数	盖斯利在英国大奖赛首场练习赛中夺冠

测试模型

对于命名实体识别任务,代码如下:

python main.py 
--tables=predict_input_NER.tsv 
--outputs=predict_output_NER.tsv 
--input_schema=id:str:1,scheme:str:1,content:str:1 
--output_schema=id,content,q_and_a 
--worker_gpu=4 
--app_name=information_extraction 
--sequence_length=512 
--weight_decay=0.0 
--micro_batch_size=4 
--checkpoint_dir=./information_extraction_model/ 
--data_threads=5 
--user_defined_parameters='task=NER'

模型输出结果见predict_output_NER.tsv文件

对于关系抽取任务,代码如下:

python main.py 
--tables=predict_input_RE.tsv 
--outputs=predict_output_RE.tsv 
--input_schema=id:str:1,scheme:str:1,content:str:1 
--output_schema=id,content,q_and_a 
--worker_gpu=4 
--app_name=information_extraction 
--sequence_length=512 
--weight_decay=0.0 
--micro_batch_size=4 
--checkpoint_dir=./information_extraction_model/ 
--data_threads=5 
--user_defined_parameters='task=RE'

模型输出结果见predict_output_RE.tsv文件

对于事件抽取任务,代码如下:

python main.py 
--tables=predict_input_EE.tsv 
--outputs=predict_output_EE.tsv 
--input_schema=id:str:1,scheme:str:1,content:str:1 
--output_schema=id,content,q_and_a 
--worker_gpu=4 
--app_name=information_extraction 
--sequence_length=512 
--weight_decay=0.0 
--micro_batch_size=4 
--checkpoint_dir=./information_extraction_model/ 
--data_threads=5 
--user_defined_parameters='task=EE'

模型输出结果见predict_output_EE.tsv文件

在阿里云机器学习PAI-DSW上进行中文信息抽取

PAI-DSW(Data Science Workshop)是阿里云机器学习平台PAI开发的云上IDE,面向不同水平的开发者,提供了交互式的编程环境(文档)。在DSW Gallery中,提供了各种Notebook示例,方便用户轻松上手DSW,搭建各种机器学习应用。我们也在DSW Gallery中上架了使用PAI-Diffusion模型进行中文信息抽取的Sample Notebook,欢迎大家体验!

EasyNLP中的K-Global Pointer模型解析及应用

未来展望

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

Github地址:github.com/alibaba/Eas…

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. EMNLP 2022
  2. GlobalPointer:kexue.fm/archives/83…

阿里灵杰回顾

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

AI系统前沿动态:深度学习硬件、大规模分布式神经网络和COTS HPC系统

2023-12-22 10:29:14

AI教程

大模型选择困难?LLM-Blender集成框架助你拿捏

2023-12-22 10:33:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索