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,其核⼼代码如下所示:
其中,在 K-BERT 中,模型 Backbone 的 Attention Mask 由两个 Matrix 加和而成,分别为普通的 Attention Mask 和 Visible Matrix,实现核心代码如下:
在数据预处理过程中,我们需要获得当前样本的输入文本和知识三元组,从而计算出 Visible Matrix:
为了验证 EasyNLP 框架中 K-BERT 模型在各种任务上的精度,我们在多个公开数据集上验证了句子分类和 NER 任务的效果。我们使用 EasyNLP 加载了 BERT 模型,对比复现结果和 K-BERT 官方论文的结果,如下所示:
可以通过上述结果,验证 EasyNLP 框架中 K-BERT 算法实现的正确性。
K-BERT 模型使⽤教程
以下我们简要介绍如何在 EasyNLP 框架使⽤K-BERT 模型。
安装 EasyNLP
⽤户可以直接参考GitHub(https://github.com/alibaba/EasyNLP)上的说明安装 EasyNLP 算法框架。
数据准备
K-BERT 是一个 finetune 模型,需要用户准备下游任务的训练与验证数据,为 tsv 文件。对于文本分类任务,这⼀⽂件包含以制表符\t 分隔的三列,第一列是标签,第二列是句子序号,第三列是文本句子。样例如下:
对于 NER 任务,同样为一个 tsv 文件,由\t 分隔为文本和 label 两列,文本字与字之间用空格隔开。样例如下:
下列⽂件已经完成预处理,可⽤于测试:
K-BERT⽂本分类示例
在文本分类任务中,我们采⽤以下命令对 K-BERT 模型进⾏finetune,模型在 finetune 过程中也会自动输出评估结果。其中,用户可以在前述预处理示例文件中找到训练集 chnsenticorp/train.tsv、评测集 chnsenticorp/dev.tsv 以及知识图谱文件 kbert_kgs/HowNet.spo。kbert_cls.py 位于 EasyNLP 项目下的 examples/kbert/下。相关示例代码如下:
K-BERT 命名实体识别示例
在 NER 任务中,我们采⽤以下命令对 K-BERT 模型进⾏finetune,其使用方式与文本分类相同:
未来展望
在未来,我们计划在 EasyNLP 框架中集成更多中⽂知识模型,覆盖各个常⻅中⽂领域,敬请期待。我们 也将在 EasyNLP 框架中集成更多 SOTA 模型(特别是中⽂模型),来⽀持各种 NLP 和多模态任务。此外, 阿⾥云机器学习 PAI 团队也在持续推进中⽂多模态模型的⾃研⼯作,欢迎⽤户持续关注我们,也欢迎加⼊ 我们的开源社区,共建中⽂NLP 和多模态算法库!
Github 地址:https://github.com/alibaba/EasyNLP
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
评论