论文阅读笔记:A Novel Cascade Binary Tagging Framework for Relational Triple Extraction

191 阅读6分钟

Casrel论文,感谢包括并不限于苏神的各位大牛。

其实我在Github中已经自己实现这个算法并投入使用了,但今天回看代码的时候总觉得有几个地方不对,看了眼别人的实现也是这么写的,干脆回来再通读一遍论文,以解决一些问题。

综述

在这篇论文写作的节点上,知识图谱已经开始发展,信息抽取是一项关键工作,但当时却没有一个好的办法解决共享实体、实体重叠等问题。因此本文引用了一个新的视角重新审视SPO提取,并提出了一个新的CASREL框架。

介绍

关系三元组:(主题,关系,对象)即(s, r, o),这是构成大规模知识图谱的基本构成,从自然语言中提取这些信息,也自然就是关键步骤了。

早期提取三元组的方法以Pipeline为主:首先识别句子中的所有实体,再对实体之间关联分类,这样做的缺点就是由于采用了管道连接,误差会在不同方法之间传播并放大,早期任务的错误无法在后续任务中优化修正。联合抽取因此而诞生,并取得了较好的效果。

但是现有方法大多数不能解决这样的问题:

image.png

EPO:相同的实体对之间存在多种关系 SEO:不同三元组共享相同的实体

这些问题对传统NER造成了挑战:一个标记不再只包含一个标签,也给关系分类带来了困难。虽然后来也提出了一些方法,但大体来说,这些方法都把关系当成分配给各种实体对的离散标签,就让关系分类难以学习:第一,类别分布严重不平衡,大多数实体对之间都不存在有效关系,负样本过多;第二,当同个实体参与了多个不同的关系,分类器就会混淆,除非样本足够多,分类器难以分辨实体究竟参与了哪种关系。

这样一来,所提取的三元组往往是不完整和不准确的。

CASREL框架

跳过商业互吹环节,前面提及任何尝试分布解决提取任务的方法都会遇到重叠难题,所以CASREL的目标就是直接对三元组建模,并设计训练任务,这是与以前的方法截然不同的。

形式上给定训练集DD中已标注的句子xjx_j,以及在xjx_j中由可能重叠的三元组组成的集合Tj=(s,r,o)T_j={(s,r,o)}

训练的任务目标是最大化训练集D的数据似然性:

image.png

此处稍微滥用了TjT_j这个符号,sTjs∈T_j是在三元组TjT_j中的Subject,而TjsT_j|s代表所有的subject为s的TjT_j。至于(r,o)Tjs(r,o) ∈ T_j | s则是一组在给定s的情况下的关系-object参数对。

R是全部可能的关系r的集合,R\(Tj)sR\backslash(T_j)|s表示TjT_j中所有的subject不为s的关系。

oo_{\varnothing}则表示一个“空”对象。

在上式中,(2)利用了链式法则,将原本的联合概率分布p((s,r,o)xj)p((s,r,o)|x_j)拆解为p(sxj)p((r,o)s,xj)p(s|x_j)p((r,o)|s,x_j)。 (3)较为重要,对于给定的主语s,任何与s相关的关系(即一切属于TjsT_j|s中的三元组的关系)都会在句子中产生对应的object,那么与s无关的关系就自然不会在TjsT_j|s中出现,因此为空。

这样的框架存在以下几个好处:

  • 可以看到,上述的数据似然是直接从三元组开始计算的,因此对似然函数进行优化时,等同于直接优化整个三元组,少了误差传播的问题。
  • 采用链式法则对三元组的概率联合分布拆解,可以有效应对实体重叠、共享的问题。
  • 根据公式(3),启发得到一种提取三元组的方案:先识别句子中的subject,再进而学习与之对应的关系和object,这样一来,实际上是把每个关系建模到主题,再寻找object,而不是根据多个实体对来确定关系。

接下来原文写了一点Bert的原理,显然没必要细看,直接跳过。

Cascade Decoder

以Bert为例,假定原句子已经经过了Bert的Encoding化,现在得到了编码向量hNh_N。 那么接下来,首先要从输入的句子中检测Subject:

image.png

在上式中,xix_ihNh_N中的第i个token,而pistart_sp_i^{start\_s}piend_sp_i^{end\_s}分别表示位置i成为subject的起点和终点的概率,b为偏置,σ\sigma为sigmoid激活函数。

上述的Subject Tagger相当于优化了以下似然函数,用以从句子分布x中识别主语s的范围(即起点到终点的位置和包含):

image.png

L为句子x的长度,如果z为真则I{z}=1I\{z\}=1,否则为0。 yistartsy_i^{start_s}是x中第i个token的subject起点二元标记(即仅取0,1),yiendsy_i^{end_s}则是结束位置。 θ={Wstart,bstart,Wend,bend}\theta = \{W_{start}, b_{start}, W_{end}, b_{end}\}

在取完主语之后,接下来就是这张著名的图:

image.png

对于存在多个subject的情况,采用“起点-终点之间最接近者匹配”的原则,即对每个起点token,取其右侧离他最近的终点token,这样一来,就得到了一组Subject,也要注意到,这种计算方法是无法解决subject之间存在包含关系的情况的。

接下来就是关系-Object标注器,作为更高层次的标注器,同时识别对象object以及其与更低层次的标注器所识别的subject之间的关系。实际上,在确定特定关系以后,寻找object的标注器结构与subject标注器是相同的:

image.png

与subject标注器不同的点在于:加入了vsubkv_{sub}^k,这是在前面的底层模块中检测到的第k个subject的编码表示向量,维度与句子表示的词向量相同,实际取值是第k个subject的开始和结束token的词表示向量的平均值。

image.png

和公式(8)没什么区别,只是变成了object识别。

最优化对数似然目标函数

image.png

能够看到这三项分别在(8)和(11)中得到定义,文章中采用了Adam算法优化该目标函数。

总结

总的来说Casrel的思路还是比较简单的,识别主题SPAN——对每个关系识别对象SPAN——各个部分加起来作为联合目标函数,就这么简单。

目前市面上找到的torch的Casrel代码都有一个问题,就是没有使用Subject Tagger给出的subject来计算object,反而是动用了原数据的subject,看完了论文还是没觉得这么做有道理,恐怕要再仔细看看源码,keras大法好。