EasyNLP 发布融合语言学和事实知识的中文预训练模型 CKBERT
导读
预训练语言模型在 NLP 的各个应用中都有及其广泛的应用;然而,经典的预训练语言模型(例如 BERT)缺乏对知识的理解,例如知识图谱中的关系三元组。知识增强预训练模型使用外部知识(知识图谱,字典和文本等)或者句子内部的语言学知识进行增强。我们发现,知识注入的过程都伴随着很大规模的知识参数,下游任务 fine-tune 的时候仍然需要外部数据的支撑才能达到比较好的效果,从而无法在云环境中很好的提供给用户进行使用。CKBERT(Chinese Knowledge-enhanced BERT)是 EasyNLP 团队自研的中文预训练模型,结合了两种知识类型(外部知识图谱,内部语言学知识)对模型进行知识注入,同时使得知识注入的方式方便模型可扩展。我们的实验验证也表明 CKBERT 的模型精度超越了多种经典中文模型。在本次的框架升级中,我们将多种规模的 CKBERT 模型贡献给开源社区,并且这些 CKBERT 模型与 HuggingFace Models 完全兼容。此外,用户也可以在阿里云机器学习平台 PAI 上方便地利用云资源使用 CKBERT 模型。
EasyNLP(https://github.com/alibaba/EasyNLP)是阿⾥云机器学习 PAI 团队基于 PyTorch 开发的易⽤且丰富的中⽂NLP 算法框架,⽀持常⽤的中⽂预训练模型和⼤模型落地技术,并且提供了从训练到部署的⼀站式 NLP 开发体验。EasyNLP 提供了简洁的接⼝供⽤户开发 NLP 模型,包括 NLP 应⽤ AppZoo 和预训练 ModelZoo,同时提供技术帮助⽤户⾼效的落地超⼤预训练模型到业务。由于跨模态理解需求的不断增加,EasyNLP 也⽀持各种跨模态模型,特别是中⽂领域的跨模态模型,推向开源社区,希望能够服务更多的 NLP 和多模态算法开发者和研 究者,也希望和社区⼀起推动 NLP /多模态技术的发展和模型落地。
本⽂简要介绍 CKBERT 的技术解读,以及如何在 EasyNLP 框架、HuggingFace Models 和阿里云机器学习平台 PAI 上使⽤CKBERT 模型。
中文预训练语言模型概览
在这一节中,我们首先简要回顾经典的中文预训练语言模型。目前中文预训练语言模型主要包括了两种类型:
通用领域的预训练语言模型,主要包括了 BERT、MacBERT 和 PERT 等模型;
知识增强的中文预训练模型,主要包括了 ERNIE-baidu,Lattice-BERT,K-BERT 和 ERNIE-THU 等模型。
通用领域的预训练语言模型
BERT 直接使用 Google 发布的基于中文维基文本语料进行训练的模型。MacBERT 是 BERT 的改进版本,引入了纠错型掩码语言模型(MLM as correction,Mac)预训练任务,缓解了“预训练-下游任务”不一致的问题。在掩码语言模型(MLM)中,引入了[MASK]标记进行掩码,但[MASK]标记并不会出现在下游任务中。在 MacBERT 中,使用相似词来取代[MASK]标记。相似词通过 Synonyms toolkit 工具获取,算法基于 word2vec 相似度计算。同时,MacBERT 也引入了 Whole Word Masking 和 N-gram Masking 技术。当要对 N-gram 进行掩码时,会对 N-gram 里的每个词分别查找相似词;当没有相似词可替换时,将使用随机词进行替换。由于一定程度的乱序文本不影响语义理解,PBERT 从乱序文本中学习语义知识。它对原始输入文本进行一定的词序调换,从而形成乱序文本(因此不会引入额外的[MASK]标记),其学习目标是预测原 Token 所在的位置。
知识增强的中文预训练模型
BERT 在预训练过程中使用的数据仅是对单个字符进行屏蔽,例如下图所示,训练 BERT 时通过“哈”与“滨”的局部共现判断出“尔”字,但是模型其实并没有学习到与“哈尔滨”相关的知识,即只是学习到“哈尔滨”这个词,但是并不知道“哈尔滨”所代表的含义。ERNIE-Baidu 在预训练时使用的数据是对整个词进行屏蔽,从而学习词与实体的表达,例如屏蔽“哈尔滨”与“冰雪”这样的词,使模型能够建模出“哈尔滨”与“黑龙江”的关系,学到“哈尔滨”是“黑龙江”的省会以及“哈尔滨”是个冰雪城市这样的含义。
与 ERNIE-Baidu 类似,Lattice-BERT 利用 Word-Lattice 结构整合词级别信息。具体来说,Lattice-BERT 设计了一个 Lattice 位置注意机制,来表达词级别的信息,同时提出了 Masked Segment Prediction 的预测任务,以推动模型学习来自丰富但冗余的内在 Lattice 信息。
除了语言学知识,更多的工作利用知识图谱中的事实性知识丰富中文预训练模型的表征。其中,K-BERT 提出了面向知识图谱的知识增强语言模型,将三元组作为领域知识注入到句子中。然而,过多的知识融入会导致知识噪音,使句子偏离其正确的含义。为了克服知识噪音, K-BERT 引入了 Soft-position 和 Visibel Matrix 来限制知识的影响。由于 K-BERT 能够从预训练的 BERT 中加载模型参数,因此通过配备 KG,可以很容易地将领域知识注入到模型中,而不需要对模型进行预训练。EasyNLP 框架也集成了 K-BERT 的模型和功能(看这里)。
ERNIE-THU 是一种融入知识 Embedding 的预训练模型。它首先使用 TAGME 提取文本中的实体,并将这些实体链指到 KG 中的对应实体对象,然后获得这些实体对象对应的 Embedding。实体对象的 Embedding 由知识表示方法(例如 TransE)训练得到。此外,ERNIE-THU 在 BERT 模型的基础上进行改进,除了 MLM、NSP 任务外,重新添加了一个和 KG 相关的预训练目标:Mask 掉 Token 和 Entity (实体) 的对齐关系,并要求模型从图谱的实体中选择合适的 Entity 完成对齐。
自研 CKBERT 模型技术详解
由于当前的知识增强预训练模型大都使用外部知识(知识图谱,字典和文本等)或者句子内部的语言学知识进行增强,同时知识注入的过程都伴随着很大规模的知识参数,下游任务 fine-tune 的时候仍然需要外部数据的支撑才能达到比较好的效果,从而无法在云环境中很好的提供给用户进行使用。CKBERT(Chinese Knowledge-enhanced BERT)是 EasyNLP 团队自研的中文预训练模型,结合了两种知识类型(外部知识图谱,内部语言学知识)对模型进行知识注入,同时使得知识注入的方式方便模型可扩展。针对实际的业务需求,我们提供了三种不同规模参数量的模型,详细配置如下所示:
CKBERT 的模型架构如下图所示:
为了方便模型进行扩展参数,模型只在数据输入层面和预训练任务层面进行了改动,没有对模型架构进行改动。因此,CKBERT 的模型结构与社区版的 BERT 模型对齐。在数据输入层,一共要处理两部分的知识,外部图谱三元组和句子级内部的语言学知识。针对语言学知识,我们使用了哈工大 LTP 平台进行句子数据的处理,进行语义角色标注和依存句法分析等,然后根据规则,将识别结果中重要的成分进行标注。针对外部三元组知识是根据句子中出现的实体构造实体的正负三元组样本,正样本是根据图谱中 1-hop 实体进行的采样,负样本是根据图谱中 multi-hop 进行的采样,但负样本的采样过程只能在规定的多跳范围内,而不能在图谱中距离太远。
CKBERT 采用两种预训练任务进行模型的预训练,语言学感知的掩码语言模型和多跳知识对比学习:
语言学感知的掩码语言模型(Linguistic-aware MLM):在语义依存关系中的主体角色(施事者 AGT 和当事者 EXP )部分用[MASK]进行遮掩,同时在词的前后都加上[SDP][/SDP],附加上词汇的边界信息。在依存句法关系中,将主谓冰关系,定中关系,并列关系等按照上述 mask 机制进行处理为[DEP][/DEP]。整体进行预训练的 token 数量是整句话的 15%,其中 40%进行随机 MASK,30%和 30%分配到语义依存关系和依存句法关系词汇上来。损失函数如下:
多跳知识对比学习:将上述构造的正负样本数据针对该注入的实体进行处理,每一个句中实体构造 1 个正样本,4 个负样本,通过标准的 infoNCE 损失任务进行外部知识的学习。损失函数如下:
其中,是预训练模型产生的上下文实体表示,表示正样本的三元组表示结果,表示负样本的三元组表示结果。
CKBERT 模型的实现
在 EasyNLP 框架中,我们的模型实现分为三个部分:数据预处理,模型结构微调和损失函数的设计。首先,在数据预处理环节,主要由以下两个步骤组成:1.NER 实体及语义关系的提取;2.知识图谱的信息注入。关于 NER 实体及语义信息的提取,主要采用 LTP(Language Technology Platform)对原始句子进行分词和句法分析,该部分的核心代码如下所示:
该部分完成之后需要基于原始句子中的语义依存关系对相应的词进行整体的 mask,该部分的 mask 策略参考 BERT 的 mask 策略的设计,给不同类型的关系分配特定的概率,并基于该概率对不同类型关系进行 mask,该部分的核心代码如下:
在完成对原始句子的预处理之后,在模型的 dataloader 里需要对数据进行知识注入,由于模型中引入了对比学习,因此该部分需要在数据转换阶段同时生成 positive 和 negative 的样本数据。实现这一过程的核心代码如下:
在完成知识注入之后,模型的数据预处理环节就实现了。紧接着,由于知识注入需要额外添加特殊的 Token,因此,在模型的 Embedding 层需要重新调整大小,该部分的实现代码如下:
在对模型结构进行微调之后,最后就是修改原始的 loss 函数,由于引入了对比学习,这里需要在原来 loss 的基础之上新加一个对比学习的 loss(CKBert 采用 SimCLS 作为对比学习的 loss 函数),该部分的核心代码实现如下:
CKBERT 加速预训练
由于 CKBERT 的预训练需要耗费大量时间和计算资源,我们有必须对 CKBERT 的预训练进行加速。由于 CKBERT 采用 PyTorch 框架实现,与 Tensorflow 1.x Graph Execution 方式相比,PyTorch 采用 Eager Execution 的方式运行,具有很好的易用性、容易开发调试等特点。但是,Pytorch 缺少模型的 Graph IR(Intermediate Representation)表达,因此无法进行更深度的优化。受到 LazyTensor 和 Pytorch/XLA(https://github.com/pytorch/xla)的启发,PAI 团队在 PyTorch 框架中开发了 TorchAccelerator,旨在解决 PyTorch 上的训练优化问题,在保证用户易用性和可调试行的基础上,提升用户训练速度。
由于 LazyTensor 在 Eager Execution 到 Graph Execution 转化过程中还存在很多缺陷。通过将 Custom Operation 封装进 XLA CustomCall、对 Python 代码进行 AST 解析等手段,TorchAccelerator 提升了 Eager Execution 到 Graph Execution 的完备性和转化性能,通过多 Stream 优化、Tensor 异步传输等手段提升编译优化效果。
从实验结果来看,将 TorchAccelerator 和 AMP(Automatic Mixed Precision,混合精度训练)结合起来使用,训练速度将会有 40%以上的提升,说明在 AMP 和 TorchAccelerator 进行相互作用下有比较好的加速效果。
CKBERT 实验效果评测
为了验证 CKBERT 模型在各种任务上的精度,我们在多个公开数据集上验证了句子分类和 NER 任务的效果,如下所示:
上述结果说明,首先在 CLUE 数据集上:(1)知识增强预训练模型的性能相较于 BERT 均有较大提升,在一定程度说明了知识的注入能帮助模型进行更好的语义推理;(2)跟先前的较好的 baseline 模型相比,CKBERT 的性能进一步得到了提升,这也说明了异构知识的注入有利于模型性能的提升;(3)模型参数量越大,异构知识的的注入所带来的提升越明显,这在我们的 huge 模型和 base 模型之间的对比上可以看出。其次,在 NER 数据集上:(1)知识增强预训练模型的性能相较于 BERT 也有一定的提升;(2)CKBERT 模型相较于其他 baseline 模型的提升较大,这进一步说明了异构知识的注入对于模型性能的提升是有帮助的。
CKBERT 模型使⽤教程
以下我们简要介绍如何在 EasyNLP 框架使⽤CKBERT 模型。
安装 EasyNLP
⽤户可以直接参考GitHub(https://github.com/alibaba/EasyNLP)上的说明安装 EasyNLP 算法框架。
模型预训练
以下介绍 CKBERT 模型的预训练调用过程,如果用户没有自行预训练的需求可以跳过此部分。
数据准备
CKBERT 是一个知识嵌入的预训练模型,需要用户自己准备相应的原始训练数据(xxx.json)和知识图谱(xxx.spo),其中数据分隔均使用\t 分隔符。训练数据的格式为{'text':['xxx'], 'title':'xxx'},样例如下:
知识图谱数据格式为三列数据,从左到右分别是实体关系的描述,样例如下:
数据预处理
可以使用提供的数据预处理脚本(preprocess/run_local_preprocess.sh)来对原始数据进行一键处理,在经过 LTP 处理之后,数据样例如下:
紧接着,调用相应的 mask 策略对数据进行处理,处理后的数据样例如下:
预训练脚本
数据处理完毕之后,就可以调用预训练脚本进行模型的预训练,脚本如下:
模型 Finetune
CKBERT 模型与 BERT 是同样的架构,只需要使用通用的 EasyNLP 框架命令就可以进行调用。以下命令分别为 Train 和 Predict 状态的例子,使用的模型为 ckbert-base。
当前在 EasyNLP 框架中也可以调用 large 和 huge 模型进行测试,只需要替换命令中的参数即可
pretrain_model_name_or_path=alibaba-pai/pai-ckbert-large-zh
pretrain_model_name_or_path=alibaba-pai/pai-ckbert-huge-zh
在 HuggingFace 上使用 CKBERT 模型
为了方便开源用户使用 CKBERT,我们也将三个 CKBERT 模型在 HuggingFace Models 上架,其 Model Card 如下所示:
用户也可以直接使用 HuggingFace 提供的 pipeline 进行模型推理,样例如下:
或者也可以使用 Pytorch 加载模型,样例如下:
在阿里云机器学习平台 PAI 上使用 CKBERT 模型
PAI-DSW(Data Science Workshop)是阿里云机器学习平台 PAI 开发的云上 IDE,面向不同水平的开发者,提供了交互式的编程环境(文档)。在 DSW Gallery 中,提供了各种 Notebook 示例,方便用户轻松上手 DSW,搭建各种机器学习应用。我们也在 DSW Gallery 中上架了使用 CKBERT 进行中文命名实体识别的 Sample Notebook(见下图),欢迎大家体验!
未来展望
在未来,我们计划在 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. EMNLP 2022
Taolin Zhang, Junwei Dong, Jianing Wang, Chengyu Wang, Ang Wang, Yinghui Liu, Jun Huang, Yong Li, Xiaofeng He. Revisiting and Advancing Chinese Natural Language Understanding with Accelerated Heterogeneous Knowledge Pre-training. EMNLP 2022
Yiming Cui, Wanxiang Che, Ting Liu, Bing Qin, Shijin Wang, Guoping Hu. Revisiting Pre-Trained Models for Chinese Natural Language Processing. EMNLP (Findings) 2020
Yiming Cui, Ziqing Yang, Ting Liu. PERT: Pre-training BERT with Permuted Language Model. arXiv
Yu Sun, Shuohuan Wang, Yukun Li, Shikun Feng, Xuyi Chen, Han Zhang, Xin Tian, Danxiang Zhu, Hao Tian, Hua Wu. ERNIE: Enhanced Representation through Knowledge Integration. arXiv
Yuxuan Lai, Yijia Liu, Yansong Feng, Songfang Huang, and Dongyan Zhao. Lattice-BERT: Leveraging Multi-Granularity Representations in Chinese Pre-trained Language Models. NAACL 2021
Weijie Liu, Peng Zhou, Zhe Zhao, Zhiruo Wang, Qi Ju, Haotang Deng, Ping Wang. K-BERT: Enabling Language Representation with Knowledge Graph. AAAI 2020
Zhengyan Zhang, Xu Han, Zhiyuan Liu, Xin Jiang, Maosong Sun, Qun Liu. ERNIE: Enhanced Language Representation with Informative Entities. ACL 2019
评论