导读
预训练语言模型在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团队自研的中文预训练模型,结合了两种知识类型(外部知识图谱,内部语言学知识)对模型进行知识注入,同时使得知识注入的方式方便模型可扩展。针对实际的业务需求,我们提供了三种不同规模参数量的模型,详细配置如下所示:
模型配置 |
alibaba-pai/pai-ckbert-base-zh |
alibaba-pai/pai-ckbert-large-zh |
alibaba-pai/pai-ckbert-huge-zh |
参数量(Parameters) |
151M |
428M |
1.3B |
层数(Number of Layers) |
12 |
24 |
24 |
注意力头数(Attention Heads) |
12 |
16 |
8 |
隐向量维度(Hidden Size) |
768 |
1024 |
2048 |
文本长度(Text Length) |
128 |
128 |
128 |
FFN 层维度 |
3072 |
4096 |
8192 |
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数据集实验效果
模型 |
Text Classification |
Question Answering |
Total Score |
|||||||
AFQMC |
TNEWS |
IFLYTEK |
OCNLI |
WSC |
CSL |
CMRC |
CHID |
C3 |
||
BERT |
72.73 |
55.22 |
59.54 |
66.53 |
72.49 |
81.77 |
73.40 |
79.19 |
57.91 |
69.72 |
MacBERT |
69.90 |
57.93 |
60.35 |
67.43 |
74.71 |
82.13 |
73.55 |
79.51 |
58.89 |
70.28 |
PERT |
73.61 |
54.50 |
57.42 |
66.70 |
76.07 |
82.77 |
73.80 |
80.19 |
58.03 |
70.18 |
ERNIE-Baidu |
73.08 |
56.22 |
60.11 |
67.48 |
75.79 |
82.14 |
72.86 |
80.03 |
57.63 |
69.83 |
Lattice-BERT |
72.96 |
56.14 |
58.97 |
67.54 |
76.10 |
81.99 |
73.47 |
80.24 |
57.80 |
70.29 |
K-BERT |
73.15 |
55.91 |
60.19 |
67.83 |
76.21 |
82.24 |
72.74 |
80.29 |
57.48 |
70.35 |
ERNIE-THU |
72.88 |
56.59 |
59.33 |
67.95 |
75.82 |
82.35 |
72.96 |
80.22 |
56.30 |
69.98 |
CKBERT-base |
73.17 |
56.44 |
60.65 |
68.53 |
76.38 |
82.63 |
73.55 |
81.69 |
57.91 |
71.36 |
CKBERT-large |
74.75 |
55.86 |
60.62 |
70.57 |
78.89 |
82.30 |
73.45 |
82.34 |
58.12 |
72.23 |
CKBERT-huge |
75.03 |
59.72 |
60.96 |
78.26 |
85.16 |
89.47 |
77.25 |
97.73 |
86.59 |
78.91 |
CKBERT-huge (ensemble) |
77.05 |
61.16 |
61.19 |
82.80 |
87.14 |
94.23 |
80.40 |
97.91 |
87.26 |
81.02 |
NER数据集实验效果
模型 |
MSRA |
Onto. |
Resu. |
|
BERT |
95.20 |
54.65 |
81.61 |
94.86 |
MacBERT |
95.07 |
54.93 |
81.96 |
95.22 |
PERT |
94.99 |
53.74 |
81.44 |
95.10 |
ERNIE-Baidu |
95.39 |
55.14 |
81.17 |
95.13 |
Lattice-BERT |
95.28 |
54.99 |
82.01 |
95.31 |
K-BERT |
94.97 |
55.21 |
81.98 |
94.92 |
ERNIE-THU |
95.25 |
53.85 |
82.03 |
94.89 |
CKBERT-base |
95.35 |
55.97 |
82.19 |
95.68 |
CKBERT-large |
95.58 |
57.09 |
82.43 |
96.08 |
CKBERT-huge |
96.79 |
58.66 |
83.87 |
97.19 |
上述结果说明,首先在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
阿里灵杰回顾
- 阿里灵杰:阿里云机器学习PAI开源中文NLP算法框架EasyNLP,助力NLP大模型落地
- 阿里灵杰:预训练知识度量比赛夺冠!阿里云PAI发布知识预训练工具
- 阿里灵杰:EasyNLP带你玩转CLIP图文检索
- 阿里灵杰:EasyNLP中文文图生成模型带你秒变艺术家
- 阿里灵杰:EasyNLP集成K-BERT算法,借助知识图谱实现更优Finetune
- 阿里灵杰:中文稀疏GPT大模型落地 — 通往低成本&高性能多任务通用自然语言理解的关键里程碑
- 阿里灵杰:EasyNLP玩转文本摘要(新闻标题)生成
- 阿里灵杰:跨模态学习能力再升级,EasyNLP电商文图检索效果刷新SOTA
- 阿里灵杰:EasyNLP带你实现中英文机器阅读理解