文章链接:https://arxiv.org/pdf/1909.07606.pdf
代码链接: https://github.com/autoliuweijie/K-BERT
Reference: https://zhuanlan.zhihu.com/p/215229044
https://mp.weixin.qq.com/s/adDlczWM5ZVQz9EDJEtjng
https://blog.csdn.net/Coding_1995/article/details/106203269
本论文是由北京大学、腾讯实验室和北京师范大学的七位作者于2020年3月在AAAI2020会议上提出的。文章把知识图谱(KG)应用在BERT中创建了K-BERT模型,用以解决BERT模型在专业领域表现不佳的问题,一举解决了异构嵌入空间(HES)和知识噪声(KN)两大问题。
近年来,像BERT(Devlin et al. 2018)这样的无监督的预训练语言表示模型在多个NLP任务中都取得了令人鼓舞的结果。 这些模型在大规模开放域语料库上进行了预训练,以获得通用的语言表示形式,然后在特定的下游任务中进行微调以吸收特定领域的知识。 但是,由于预训练和微调之间的领域差异,这些模型在知识驱动的任务上表现不佳。 例如,在医疗领域处理电子病历(EMR)分析任务时,经过维基百科预训练的BERT无法充分发挥其价值。
对于特殊领域的文本,一般人只能理解字面上表达的,但是专家能够根据相关领域知识进行推理。像BERT这种公共模型就像普通人一样,对于通用领域表现优秀,但是垂直领域表现不佳,除非在垂直领域进行训练,但是非常耗时耗力。
目前已经构建了大量知识图谱,将知识图谱整合到语言表示中,领域知识将能提升垂直领域的任务,并且模型具有更好的可解释性。
预训练模型能够捕捉常见的语言表示,但是缺少领域知识,为了实现这种能力提出了一种具有知识图谱的语言表示模型(K-BERT),将三元组作为领域知识注入句子中。
如何将外部知识整合到模型中成了一个关键点,这一步通常存在两个难点:
为了解决这些问题,文章提出一种基于知识图谱的语言表示模型——Knowledge-enabled Bidirectional Encoder Representation from Transformers (K-BERT)。K-BERT能够与BERT模型兼容,加载任何预先训练好的BERT模型;并且通过配置KG可以很容易地将领域知识注入到模型中,而不需要预训练。另外,该模型引入了软位置和可见矩阵来限制知识的影响以克服知识噪音。
英语中的token是在word-level,而中文中的token是在char-level。
将句子 s s s 表示成token序列,即 s = { w 0 , w 1 , … , w n } s=\{w_0,w_1,\dots,w_n\} s={w0,w1,…,wn},其中 n n n 是句子长度;
所有的 w i w_i wi 均存在于词表 V \mathbb{V} V ,即 w i ∈ V w_i\in\mathbb{V} wi∈V ;
知识图谱表示为 K \mathbb{K} K ;
图谱 K \mathbb{K} K 中的三元组表示为 ε = ( w i , r i , w k ) \varepsilon=(w_i,r_i,w_k) ε=(wi,ri,wk), ε ∈ K \varepsilon \in \mathbb K ε∈K。其中 w i w_i wi 和 w k w_k wk 是实体的名称, r j ∈ V r_j\in\mathbb{V} rj∈V 是两个实体的关系;
K-BERT模型主要包括四部分:知识层(Knowledge layer)、嵌入层(Embedding layer)、可见层(Seeing layer)和 Mask-Transformer编码层(Mask-Transformer Encoder)
其模型结构如图:
图 1 K − B E R T 的 模 型 结 构 图1 \space K-BERT的模型结构 图1 K−BERT的模型结构
K-BERT模型的每一部分都有着不可或缺的作用。对于输入的句子,知识层首先从KG向其注入相关的三元组,将原始句子转换为知识丰富的句子树。然后将句子树同时馈送到嵌入层和视觉层,然后将其转换为符号级嵌入表示和可视矩阵。可见矩阵用于控制每个符号的可见区域,防止由于注入过多的知识而改变原句的意思
。
知识层负责将知识图谱中的知识注入到句子中,形成句子树。更正式的来说,给定一个句子 s = { w 0 , w 1 , w 2 , … , w n } s = \{ w_0 , w_1 , w_2 , \dots , w_n \} s={w0,w1,w2,…,wn} 和一个知识图谱 K \mathbb{K} K,知识层输出的矩阵树为: t = { w 0 , w 1 , … , w i { ( r i 0 , w i 0 ) , … , ( r i k , w i k ) } , … , w n } t=\{w_0,w_1,\dots,w_i\{(r_{i0},w_{i0}),\dots,(r_{ik},w_{ik})\},\dots,w_n\} t={w0,w1,…,wi{(ri0,wi0),…,(rik,wik)},…,wn}。
上面转换句子树可以分为两个步骤K-Query(知识查询)和K-Inject(知识注入)。
K-Query:负责从知识图谱中找出 s s s 中所有实体所涉及到的三元组,即 E = K _ Q u e r y ( s , K ) E=K\space \_ Query(s,K) E=K _Query(s,K)。其中, E = { ( w i , r i 0 , w i 0 ) , … , ( w i , r i k , w i k ) } E=\{(w_i,r_{i0},w_{i0}),\dots,(w_i,r_{ik},w_{ik})\} E={(wi,ri0,wi0),…,(wi,rik,wik)} 是对应三元组的集合。
K-Inject:负责将三元组集合 E E E 加到句子 s s s 中,构造句子树 t t t,即 t = K _ I n j e c t ( s , E ) t=K\space \_Inject(s,E) t=K _Inject(s,E)
由于传统的BERT模型只能处理序列结构的句子输入,而句子树无法直接输入,如果强行把句子树转换成序列就会丢失结构信息。因此,在转换过程中要保留树结构的结构信息,这是K-BERT模型的关键。K-BERT的Embedding层类似于BERT的Embedding层,也是由token embedding、position embedding和segment embedding组成。而与Bert不同的是K-BERT引入了soft-position embedding。
图 2 K − B E R T 流 程 图2\space K - BERT流程 图2 K−BERT流程
与BERT完全相同。每个token转换为 H H H 维的向量,并且使用 [CLS] \text{[CLS]} [CLS] 作为分类标签 [MASK] \text{[MASK]} [MASK]作为掩码。特别地是,这里需要将句子树拉平。具体的作法是,将分支拼接在对应token的后面,其后的原始token依次后移。而这样的方式导致了句子不可读并且丢失了结构信息,但是可以通过后面的soft-position和visible matrix来解决该问题
。具体原理见图二。
对于BERT来说,如果没有位置嵌入,那么它的作用就会仅仅如同一个词袋模型。对于重排后的句子,由于丢失了结构信息,作者希望可以利用软位置嵌入来补充结构信息。位置信息的编写方式是,主干持续编号,支节继续编号。该方法仍然遗留的一个问题是作者不希望实体对应三元组的内容影响到句子中其他词的表示(KN 问题,比如说:[is] 和 [CEO] 的位置编号都是 3,这使得它们在计算 self-attention 时位置接近,但实际上它们之间没有联系),因此需要后面的Mask-Self-Attention来解决
。
和BERT一样,K-BERT也使用Segment embedding 来表示不同的句子。比如,对于句子 { w 00 , w 01 , … , w 0 n } \left\{w_{00}, w_{01}, \dots, w_{0 n}\right\} {w00,w01,…,w0n} 和 { w 10 , w 11 , … , w 1 m } \left\{w_{10}, w_{11}, \dots, w_{1 m}\right\} {w10,w11,…,w1m},把他们整合为一个句子: { [ C L S ] , w 00 , w 01 , … , w 0 n , [ S E P ] , w 10 , w 11 , … , w 1 m } \left\{[C L S], w_{00}, w_{01}, \dots, w_{0 n},[S E P], w_{10}, w_{11}, \dots, w_{1 m}\right\} {[CLS],w00,w01,…,w0n,[SEP],w10,w11,…,w1m},为了标记出每个句子,需要标签 { A , A , A , A , … , A , B , B , … , B } \{A, A, A, A, \ldots, A, B, B, \ldots, B\} {A,A,A,A,…,A,B,B,…,B}。
Seeing layer是K-BERT与BERT之间最大的不同,也是K-BERT有效的原因。由于句子树中的三元组可能影响原始句子的含义
。例如,图2中的 C h i n a China China是用来修饰 B e i j i n g Beijing Beijing的,其与 A p p l e Apple Apple完全没有关系,因此单词 A p p l e Apple Apple不应该被 C h i n a China China所影响。类似的 [ C L S ] [CLS] [CLS]也不应该获取单词 A p p l e Apple Apple的信息。因此,为了防止知识噪音,K-BERT引入了可见矩阵(visible matrix) M 来限制句子树中token的相互可见性
。可见矩阵的定义为:
可视区域:
从某种程度上来说,可见矩阵 $M$ 包含了句子树中的结构化信息,但是BERT中的Transformer无法直接利用这些信息
。因此,论文提出了Mask-Transformer,其能够根据 $M$ 来限制自注意机制的可见区域
。Mask-Transformer是多个mask-self-attention堆叠而且。像BERT那样,其层数为 L L L,隐藏层输出的大小为 H H H,mask-self-attention的头数量为 A A A。
为了解决知识噪音,在self-attention的基础上提出了mask-self-attention。具体形式为
如图所示,Apple对[cls]是没用的,因为它们之间是不可见的,但是[cls]可以间接从apple获得信息,因为[cls]和cook可见,cook和apple可见,这样做的好处是,apple能够enrich单词cook的representation,但是没有直接改变原始句子的含义
。
作者把K-BERT应用在12个中文NLP任务上, 其中8个是开放领域,4个是特定领域。
本文采用两种中文语料库进行预训练,即WikiZh2和WebtextZh3:
本文使用了三个中国知识图谱,CN-DBpedia,HowNet和MedicalKG。
本文将K-BERT与两个基线进行比较:
为了能和BERT进行对比,K-BERT的参数设置和BERT一样,即:L=12,A=12,H=768。其中L代表自注意力的层数,A代表多头的头数,H代表隐含层的层数。
对于K-BERT预训练,所有设置均与(Devlin et al. 2018)一致。需要强调的一件事是,在预训练阶段我们不会向模型中添加任何知识图谱。由于知识图谱将两个相关的实体名称绑定在一起,因此使两者的预训练词向量非常接近甚至相等,从而导致语义损失。因此,在预训练阶段,K-BERT和BERT是等效的,后者的参数可以分配给前者。 KG将在微调和推断阶段启用。
本文首先比较KBERT和BERT在8个中文开放域NLP任务上的性能。
在这八项任务中,书评,Chnsenticorp,购物和微博属于单句分类任务:
XNLI(Conneau et al. 2018),LCQMC(Liu et al. 2018)是两句分类任务,NLPCC-DBQA12是问答匹配任务,MSRA-NER(Levow 2006)是命名实体识别(NER)任务 :
K-BERT真正发挥作用的任务是在特定领域。 因为KG善于提供具有领域知识的LR模型。
总的来说,我们可以得出结论,soft-position 和 visible matrix可以使 K-BERT 对 KN 干扰更加鲁棒,从而更有效地利用知识。