Casrel论文,感谢包括并不限于苏神的各位大牛。
其实我在Github中已经自己实现这个算法并投入使用了,但今天回看代码的时候总觉得有几个地方不对,看了眼别人的实现也是这么写的,干脆回来再通读一遍论文,以解决一些问题。
综述
在这篇论文写作的节点上,知识图谱已经开始发展,信息抽取是一项关键工作,但当时却没有一个好的办法解决共享实体、实体重叠等问题。因此本文引用了一个新的视角重新审视SPO提取,并提出了一个新的CASREL框架。
介绍
关系三元组:(主题,关系,对象)即(s, r, o),这是构成大规模知识图谱的基本构成,从自然语言中提取这些信息,也自然就是关键步骤了。
早期提取三元组的方法以Pipeline为主:首先识别句子中的所有实体,再对实体之间关联分类,这样做的缺点就是由于采用了管道连接,误差会在不同方法之间传播并放大,早期任务的错误无法在后续任务中优化修正。联合抽取因此而诞生,并取得了较好的效果。
但是现有方法大多数不能解决这样的问题:
EPO:相同的实体对之间存在多种关系 SEO:不同三元组共享相同的实体
这些问题对传统NER造成了挑战:一个标记不再只包含一个标签,也给关系分类带来了困难。虽然后来也提出了一些方法,但大体来说,这些方法都把关系当成分配给各种实体对的离散标签,就让关系分类难以学习:第一,类别分布严重不平衡,大多数实体对之间都不存在有效关系,负样本过多;第二,当同个实体参与了多个不同的关系,分类器就会混淆,除非样本足够多,分类器难以分辨实体究竟参与了哪种关系。
这样一来,所提取的三元组往往是不完整和不准确的。
CASREL框架
跳过商业互吹环节,前面提及任何尝试分布解决提取任务的方法都会遇到重叠难题,所以CASREL的目标就是直接对三元组建模,并设计训练任务,这是与以前的方法截然不同的。
形式上给定训练集中已标注的句子,以及在中由可能重叠的三元组组成的集合。
训练的任务目标是最大化训练集D的数据似然性:
此处稍微滥用了这个符号,是在三元组中的Subject,而代表所有的subject为s的。至于则是一组在给定s的情况下的关系-object参数对。
R是全部可能的关系r的集合,表示中所有的subject不为s的关系。
则表示一个“空”对象。
在上式中,(2)利用了链式法则,将原本的联合概率分布拆解为。 (3)较为重要,对于给定的主语s,任何与s相关的关系(即一切属于中的三元组的关系)都会在句子中产生对应的object,那么与s无关的关系就自然不会在中出现,因此为空。
这样的框架存在以下几个好处:
- 可以看到,上述的数据似然是直接从三元组开始计算的,因此对似然函数进行优化时,等同于直接优化整个三元组,少了误差传播的问题。
- 采用链式法则对三元组的概率联合分布拆解,可以有效应对实体重叠、共享的问题。
- 根据公式(3),启发得到一种提取三元组的方案:先识别句子中的subject,再进而学习与之对应的关系和object,这样一来,实际上是把每个关系建模到主题,再寻找object,而不是根据多个实体对来确定关系。
接下来原文写了一点Bert的原理,显然没必要细看,直接跳过。
Cascade Decoder
以Bert为例,假定原句子已经经过了Bert的Encoding化,现在得到了编码向量。 那么接下来,首先要从输入的句子中检测Subject:
在上式中,是中的第i个token,而和分别表示位置i成为subject的起点和终点的概率,b为偏置,为sigmoid激活函数。
上述的Subject Tagger相当于优化了以下似然函数,用以从句子分布x中识别主语s的范围(即起点到终点的位置和包含):
L为句子x的长度,如果z为真则,否则为0。 是x中第i个token的subject起点二元标记(即仅取0,1),则是结束位置。 。
在取完主语之后,接下来就是这张著名的图:
对于存在多个subject的情况,采用“起点-终点之间最接近者匹配”的原则,即对每个起点token,取其右侧离他最近的终点token,这样一来,就得到了一组Subject,也要注意到,这种计算方法是无法解决subject之间存在包含关系的情况的。
接下来就是关系-Object标注器,作为更高层次的标注器,同时识别对象object以及其与更低层次的标注器所识别的subject之间的关系。实际上,在确定特定关系以后,寻找object的标注器结构与subject标注器是相同的:
与subject标注器不同的点在于:加入了,这是在前面的底层模块中检测到的第k个subject的编码表示向量,维度与句子表示的词向量相同,实际取值是第k个subject的开始和结束token的词表示向量的平均值。
和公式(8)没什么区别,只是变成了object识别。
最优化对数似然目标函数
能够看到这三项分别在(8)和(11)中得到定义,文章中采用了Adam算法优化该目标函数。
总结
总的来说Casrel的思路还是比较简单的,识别主题SPAN——对每个关系识别对象SPAN——各个部分加起来作为联合目标函数,就这么简单。
目前市面上找到的torch的Casrel代码都有一个问题,就是没有使用Subject Tagger给出的subject来计算object,反而是动用了原数据的subject,看完了论文还是没觉得这么做有道理,恐怕要再仔细看看源码,keras大法好。