关系无处不在,无论是与你的家人、你的爱人、你的朋友或者你的宠物、植物。又或者在特殊的情况下,比如在文本的段落中提到的实体。现实生活中的关系是非常明确的(例如母女、父子等),而文本段落中实体之间的关系需要更多的思考才能提取出来,因此,这将是本文的重点。
能够在自由文本中自动提取实体之间的关系是非常有用的——不是让学生自动完成他的英语作业——而是让数据科学家更好地完成他们的工作,构建知识图谱等等。这一直是Google等人工智能巨头的重点研究领域之一,他们最近发表了一篇关于这个主题的论文《匹配空白:关系学习的分布相似性》。在本文中,我将详细介绍本文背后的一些核心概念,并且由于它们的实现代码不是开源的,我还将在示例数据集和开源代码上实现一些模型和培训管道。
预训练任务-匹配空白
如何准备一个人工智能模型来提取文本实体之间的关系,而不给它任何特定的标签(无监督)?好吧,你首先要把任务或者问题框起来,让模型理解。
考虑上面的两个关系语句。这里,关系语句指的是一个句子,其中两个实体被标出来进行关系提取分类。在数学上,我们可以表示如下关系语句:
这里,x是标记化的句子,s1和s2是句子中两个实体的跨度。虽然上面的两个关系语句r1和r2由两个不同的句子组成,但它们都包含相同的实体对,被“[空白]”符号代替。现在,直觉是如果r1和r2包含相同的实体对(s1和s2),它们应该具有相同的s1-s2关系。
因此,人工智能模型的预训练任务是给定任意一个r1和r2,计算它们的词向量,使它们的内积在r1和r2都包含相同的实体对(s1和s2)时为高,当它们的实体对不同时,内积为低。由于在训练过程中不可能显式地比较r1和r2对,因此在该学习过程中实现噪声对比估计。
这样做的好处是,你可以在任何文本块上预先训练它,从WhatsApp消息中的个人数据到Wikipedia上的开放源代码数据,只要你使用spaCy NER或依赖解析工具来提取和注释每个句子中的任何两个实体。
为什么要用“[空白]”符号呢?关系语句中的实体被有意地以一定的概率用“[空白]”符号遮住,这样在预训练过程中,模型不能仅仅依靠实体名称本身来学习关系(如果这样做,模型将只是记忆,而不是实际学习任何有用的东西),但也需要考虑它们的上下文(关联token)。
预训练模型——BERT
这里使用的模型是标准的BERT架构,下面稍作修改,对输入关系语句进行编码,并提取其预先训练的输出表示,用于损耗计算和下游微调任务。
以上就是本文所说的实体标记——实体开启(或EM)表示。在输入关系语句x中,“[E1]”和“[E2]”标记用于标记它们各自实体的位置,以便BERT确切地知道您对哪些实体感兴趣。
将“[E1]”和“[E2]”token位置处的BERT的输出隐藏状态串联起来作为x的最终输出表示,然后与来自其他关系语句的输出表示一起用于损失计算,这样,具有相同实体对的两个关系语句的输出表示应具有较高的内积。
一旦BERT模型以这种方式进行了预先训练,它的任何x的输出表示就可以用于任何下游任务。
下游任务——关系分类
假设现在我们要做关系分类,即给定一个句子中的任意两个关系,对它们之间的关系进行分类(如因果关系、实体位置等)。在MTB任务中使用预先训练的BERT模型,我们可以做到这一点!
如上所述,只需在其上堆叠一个线性分类器(输出隐藏状态表示),并在标记的关系语句上训练该分类器。然后,我们可以对一些句子进行推理。我用SemEval2010 Task8数据集训练它的输出看起来像下图:
在这种情况下,模型成功地预测了实体“喉咙痛”是由“吃了鸡肉后”的行为引起的。
下游任务——单样本学习
现在,你可能想知道,如果为每个关系类只提供一个带标签的关系语句进行训练,模型是否仍然能够很好地预测关系类。事实证明,它可以,或者至少比BERT原始模型做得更好。
对于预测,假设我们有5个关系类,每个类只包含一个带标签的关系语句x,然后用它来预测另一个未标记的x的关系类(称为5向1-shot),我们可以继续采用这个带有EM表示的BERT模型(无论是否使用MTB进行预训练),在这个模型中运行所有6个x(5个标记,1个未标记)以获得相应的输出表示。
然后我们简单地比较了未标记x的输出表示与所有其他5个标记x的输出表示之间的内积,并将具有最高内积的关系类作为最终预测。
我的测试结果
谷歌研究团队使用了整个英文维基百科进行BERT MTB的预训练,并使用谷歌云自然语言API对实体进行了注释。我妻子现在只允许我购买一个8GB RTX2070个人笔记本电脑GPU(对作者表示同情),所以虽然我试图实现他们的模型,但我只能在相当小的CNN/DailyMail数据集上预先训练它,使用免费的spaCy NLP库来注释实体。
所以自然,预测结果并没有那么令人印象深刻。然而,基于EM表示的基线BERT仍然可以很好地对关系分类进行微调,并产生合理的结果。而且,由于现在所有形式的BERT无处不在,并且使用相同的基线架构,我也为ALBERT和BioBERT实现了这一点。
(源自:Towards Data Science)