作者:汪诚愚 张涛林 黄俊
导读
常识图谱(Knowledge Graph)的概念⾸次呈现 2012 年,由 Google 提出,它作为⼀种⼤规模语义⽹络,精确地形容了实体以及实体之间的关系。常识图谱最早应⽤于搜索引擎,⽤于筹备返回⽤户所需的常识。随着预训练语⾔模型的一直倒退,将常识图谱中的常识三元组融⼊预训练模型,对晋升模型的成果有重要的作⽤。经典的常识注⼊算法间接将常识图谱中实体的词嵌⼊向量注⼊预训练模型的词嵌⼊向量中;然⽽,常识图谱中实体的词嵌⼊向量和预训练模型的词嵌⼊向量的向量空间不⼀致,⽽且容易引起常识噪⾳(Knowledge Noise)的问题。K-BERT 算法提出利⽤ Visible Matrix 在 BERT 模型中引⼊内部常识,具备较好的成果。因而,咱们在 EasyNLP 这⼀算法框架中集成了 K -BERT 算法,使⽤户在具备常识图谱的状况下,获得更好的模型 Finetune 成果。
EasyNLP(https://github.com/alibaba/Ea…)是阿⾥云机器学习 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 `
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_review | 88.5 | 88.6 | 87.06 | 87.2 |
Chnsenticorp | 94.3 | 94.6 | 95.08 | 95.6 |
MSRA-NER | 94.56 | 94.5 | 94.46 | 94.5 |
能够通过上述后果,验证 EasyNLP 框架中 K -BERT 算法实现的正确性。
K-BERT 模型使⽤教程
以下咱们简要介绍如何在 EasyNLP 框架使⽤ K -BERT 模型。
装置 EasyNLP
⽤户能够间接参考 GitHub(https://github.com/alibaba/Ea…)上的阐明装置 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/Ea…
Reference
- 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
- 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
- K-BERT 原作者开源代码:https://github.com/autoliuweijie/K-BERT
阿里灵杰回顾
阿里灵杰:阿里云机器学习 PAI 开源中文 NLP 算法框架 EasyNLP,助力 NLP 大模型落地
阿里灵杰:预训练常识度量较量夺冠!阿里云 PAI 公布常识预训练工具
阿里灵杰:EasyNLP 带你玩转 CLIP 图文检索
阿里灵杰:EasyNLP 中文文图生成模型带你秒变艺术家