CoLAKE: 同时预训文本和知识

左心房为你撑大大i 提交于 2020-10-10 11:48:38

介绍一下我们最近在COLING'2020上的一个在预训练模型中加入实体知识的工作:

CoLAKE: Contextualized Language and Knowledge Embeddingarxiv.org

代码:https://github.com/txsun1997/CoLAKE

在这篇文章里我们主要想做两件事:

  1. 在预训练语言模型的同时也学习一套知识表示,以在需要知识的下游文本任务上表现更好,例如实体链接、关系抽取等。(由于实体数量通常很多,之前的一些工作大多使用TransE等算法预先训练好实体表示然后融入到PLM中去,之后不再随PLM一起更新)
  2. 在加入实体的同时也加入它的上下文(context),允许模型在不同语境下关注实体的不同邻居,同时学习文本和知识的上下文表示。(之前的模型只完成了文本的contextulization而没有完成知识的contextualization)

为了做成这两件事,CoLAKE把文本和知识的上下文揉在了一张graph中作为训练样本,我们叫word-knowledge graph,然后在这张graph上做MLM来同时学习文本和知识的表示。

CoLAKE

具体地,给定一段文本,我们将其视为多个单词节点全连接形成的word graph,接着我们把其中提及实体的单词节点替换为对应的实体节点(这类实体节点被称为anchor node),然后以链接到的实体为中心从知识图谱中抽出小图(knowledge subgraph)与word graph进行拼接就得到了word-knowledge graph。

word-knowledge graph的构建过程,节点上的数字表示位置索引。

这些word-knowledge graph随后被输入一个Transformer中使用MLM进行预训练,CoLAKE对Transformer的embedding和encoder层进行了简单调整来适配word-knowledge graph:

由于知识图谱中的实体数量通常很多,在实现CoLAKE时会带来两个问题:1)输出时不可能在所有实体上做Softmax操作,这一问题可以简单地通过负采样来解决;2)输入时几乎不可能在GPU上维护一个entity embedding矩阵,我们的解决方案是把entity embedding放在CPU上,把模型的其他部分放在多张GPU上,GPU上的训练进程从CPU中读出entity embedding同时向CPU写入对应的梯度,CPU上的进程根据收集的梯度对entity embedding进行异步地更新。

实验

我们在需要知识的下游文本任务上对CoLAKE进行了测试,在Open Entity, FewRel, LAMA等任务上都取得了不错的结果:

CoLAKE还能做什么?

大家可能注意到,CoLAKE实际上已经是一个预训练的GNN,因此我们也把CoLAKE拿到图任务上开发了一些玩法。

基于知识图谱补全(knowledge graph completion)任务,我们构建了一个新的任务:word-knowledge graph completion,即给定一段文本,预测该文本中出现的两个实体之间的关系。这一任务与关系抽取的目标一致, 其区别在于word-knowledge graph completion可以在文本中出现的实体之外引入其他相关的关系和实体构成的结构化知识来辅助预测。我们将这一任务划分为两个setting:1)Transductive:两个实体在训练阶段都见过;2)Inductive:两个实体中至少有一个在训练时是没有见过的,这时需要模型根据该实体的邻居节点来推断该实体的表示。

word-knowledge graph completion

在这两种setting下,我们将CoLAKE和几个知识表示方法进行了对比:

必须要指出的是,这种对比并不是公平的,因为作为对比的TransE等方法本身并没有利用文本信息,但同样要注意的是,能够同时建模文本和结构化的知识也正是CoLAKE的特点。针对这一特点,我们也在文章的最后列举了几个CoLAKE可以应用的潜在场景。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!