参考文献:BERT+知识图谱:北大-腾讯联合推出知识赋能的K-BERT模型
地址:https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/103790278
此前两篇关于知识图谱结合预训练的文章作为了解:
ERNIE: Enhanced Representation through Knowledge Integration(百度)
a.对实体概念知识的学习来学习真实世界的完整概念的语义表示(MASK词和知识图谱中的实体)
b.对训练语料的扩展尤其是论坛对话语料的引入来增强模型的语义表示能力。
ERNIE: Enhanced Language Representation with Informative Entities(清华)
首先识别句子中的实体并与知识图谱中的实体进行匹配。然后使用一个独立的 TransE 算法获得实体向量,然后再将实体向量嵌入到 BERT 中。
当阅读特定领域文本时,普通人只能根据其上下文理解单词,而专家则可以利用相关领域知识进行推断。目前公开的 BERT、GPT、XLNet 等预训练模型均是在开放领域语料预训练得到的,其就像一个普通人,虽然能够读懂通用文本,但是对于专业领域文本时却缺乏一定的背景知识。
解决这一问题的一个方法是使用专业语料预训练模型,但是预训练的过程是十分耗时和耗计算资源的,普通研究者通常难以实现。例如,如果我们希望模型获得“扑热息痛可以治疗感冒”的知识,则在训练语料库中需要大量同时出现“扑热息痛”和“感冒”的句子。不仅如此,通过领域语料预训练的方式引入专家知识,其可解释性和可控性较差。
除了以上策略,我们还能做些什么来使模型成为领域专家?知识图谱(Knowledge Graph,KG)是一个很好的解决方案。
代码地址:https://github.com/autoliuweijie/K-BERT
1.语言模型训练阶段和原google的Bert_base完全相同,知识图谱及K-Bert的使用完全在具体下游任务的finingtuning阶段。模型参数为Bert_base 12层 1.1亿参数。
2.在CN-DBpedia知识库+KBert模型 在 MSRA-NER(微软的中文NER)任务上,进行效果复现,结果符合论文预期,但是去掉知识图谱后效果却没有降低,可能模型在通用场景的健壮性有待加强。
Dev f值 |
Test f值 |
|
论文效果 |
0.960 |
0.956 |
复现效果 |
0.965 |
0.954 |
去掉图谱(不让取出额外实体) |
0.963 |
0.957 |
去掉图谱(让加载的知识图谱实体词典为空) |
0.963 |
0.957 |
3.KBert融合知识图谱算法实现NER任务源代码分析
(1)加载中文知识图谱CN-DBpedia进入内存,构建实体字典lookup_table有两种模式,默认模式不包含关系词:{“中国”:[“国家”,“北京”],“美国”:[“国家”,“华盛顿DC”]};模式2包含关系词:{“中国”:[“属性国家”,“首都北京”],“美国”:[“属性国家”,“首都华盛顿DC”]};第一步的目的在于为后续
(2)读入NER文本数据及标签,为构建可见矩阵Visible_matrix,将文本数据进行中文分词后依次送入lookup_table判断是否存在关联词,若该词存在关联实体则将关联实体取出,并添加绝对位置和相对位置编号soft position。根据绝对位置和相对位置编号构建可见矩阵。
(3)加载Bert预训练模型,构建NER任务,将softposition embeding+token embedding+segment embedding一起进行embeding。编码层加入Visible_matrix,让进行self_attention的时候每个字符只看到自己应该看见的字符。
(4)输出字符序列的logits通过softmax到对应标签的概率,并计算损失