笔者之前写过一些论文的讲解文章,都是按照论文的基本顺序:摘要、介绍、相关工作、方法、实验和总结的顺序。这星期在实验室论文分享上,分享了《Extracting Multiple-Relations in One-Pass with Pre-Trained Transformers》这篇文章,突然有了想法,如果一味的按照论文的顺序写一些类似于“翻译”的博客,也没有什么价值。不如按照自己的思路,能把别人讲懂了,比什么都强。这篇博客,我按照我自己理解的逻辑,来给大家讲解这篇文章,以后的文章也都按照这样的思路,希望对大家有所帮助,对自己也是一个学习记录和加深理解的过程!
论文链接:Extracting Multiple-Relations in One-Pass with Pre-Trained Transformers
1.背景
这篇论文是由腾讯和IBM实验室合作发表在2019年ACL会议的一篇文章,名为:《利用预训练Transformers做一次性编码抽取出多个关系》(《Extracting Multiple-Relations in One-Pass with Pre-Trained Transformers》) ,属于关系抽取类的文章。
关系抽取简单来说就是从一句话中抽取出三元组(实体1,关系,实体2),举个例子:
东北大学坐落于沈阳市。---抽取出---->(东北大学,位于,沈阳市) ps:这里类似于‘位于’这样的关系是会给出的
那么,抽取出这样的三元组会有什么作用呢?例如,我们可以根据这样的三元组,构建出基于三元组的知识图谱,如下图所示:
基于这样的知识图谱我们可以有很多的下游应用,比如说:搜索引擎、问答系统等等。
2.论文解决的问题
以上是对关系抽取概念的简单介绍,既然,该论文属于关系抽取领域,那么我们就来看一看它是从关系抽取的那个方向和问题出发的。首先,我们有如图所示的一张关系表:
关系表 |
---|
位于 |
校长 |
所属专辑 |
........ |
有这样的一句话:“赵继 担任沈阳市 东北大学 校长”。这就句话中红色字体标出的(赵继、沈阳市、东北大学)三个实体已经给出,并且已知赵继和东北大学有某种关系,东北大学和沈阳市有某种关系,论文中要做的就是说在已知一句话和东北大学、赵继有关系推断出是校长这个关系,同理,已知东北大学和沈阳市,推断出位于这个关系。简单来说是一个关系分类问题;这个任务的特点就是说一句话中有多对已知的实体,并且有多个未知的推断出的关系。
2.1以往解决方法
对于这种一句话有多对已知实体,并且需要推出对应多个未知关系的问题,以往的解决方法是:将一句话对应的多个关系,强拆分为一句话只对应一个关系。如下图所示:
如上图所示,在“赵继担任沈阳市东北大学校长”这句话中,‘(赵继、东北大学、校长)’为一个样例,‘(东北大学、沈阳市、位于)’为一个样例。分别对两个样例进行编码然后进行关系分类。这种做法被叫做SRE(Sample Relation Extract)范式,即简单关系抽取范式。
那么这种简单的关系抽取范式有什么缺点呢?首先,设想一句话中如果有10中或者100种这样的关系,那么我们就要将“赵继担任沈阳市东北大学校长”这句话存储10次或者100次,这就造成了第一个问题即:存储空间的浪费;其次,对“赵继担任沈阳市东北大学校长”这句话要编码和分类很多遍,这样又造成了另一个问题即:计算资源的浪费。
2.2理想范式
那么,我们对于以上问题的理想范式是什么样的?怎样能解决存储资源和计算资源的呢?首先该范式的存储结构应该是下图所示样子:
在上图所示的存储结构中,特点是类似于“赵继担任沈阳市东北大学校长”这种文本只在训练集中存储一次,并且存储结构包含了一句话中的所有实体对及其对应的关系。然后对改存储结构进行编码,分类出所有的范式。这种理想的范式又叫做MRE(Multiple Relation Extract)范式 ,即多关系抽取范式。
所以,综上所述,该论文要解决的问题是:如何在这种MRE范式存储的结构上,用预训练transformers通过一次性编码提取出多关系问题。
3.方法
首先,论文提出的方法整体架构如下图所示:
首先模型的输入包括:一个文本(.....in south suburbs of .....),有关系实体对的起始位置(south suburbs(3,4),bagh #dad(6,7));将这样的数据存储结构送入到类似于bert的预训练模型当中,得到每一个单词的隐藏层向量,然后每个实体进行pool(池化),池化后将有关系的实体对送到线性层进行分类,得到了关系的结果,如图中所示包含每个关系和每个实体对;
论文中提出了两点创新的地方,第一个就是图中红色框出的Structure Prediction(预测结构),另一个就是修改了bert的self-attention层,即Entity-aware Self-attention(加入实体意识的自注意力层)。接下来,我们讨论一下,这两个部分是如何实现的。
3.1Structure Prediction
预测结构比较简单,主要包括两个部分:第一是一个pool(池化)操作,第二个是线性层,如下图所示:
每一个实体不可能全是一个字,有的实体是两个字或两个字以上,那么就要经过一个平均池化操作。例如图中实体“医生”,在经过BERT后,得到了两个隐藏层向量,然后对这两个隐藏层进行加和平均,得到了实体的输出向量,同理,会得到实体的输出向量,将与两个向量进行拼接然后送入线性层中,然后做softmax操作,得到各关系的概率值,数学公式如下:
3.2 Entity-aware Self-attention
这里的实现实在Self-attetion的基础上进行修改得到的机制,那么既然是在Self-attention上的修改,我们就举一个例子来看,修改前和修改后的操作有什么不同之处:
首先有这样一句话:in south suburbs of bagh #dad and Iraqillery artillery fired
计算单词south对单词in的贡献Self-attention是如何做的呢,计算过程如下图所示:
首先,根据单词south的隐藏层向量 与一个矩阵做点乘得到矩阵,一样的办法,对单词in的隐藏层向量分别进行与矩阵的点乘,得到矩阵,然后进行最终的self-attention计算。
那么Entity-aware Self-attention是如何操作的呢?与Self-attention的对比如下图所示:
与Self-attention的对比,首先计算矩阵是不变的,在计算矩阵是,多出了红色框圈出的部分,以后的计算也是相同的,就是论文中所说的实体意识。接下来,我们就看看是如何计算出来的:
我们以为例,首先论文定义了新的position embedding:,这里k是一个超参数,代表两个单词之间的最大距离。那么问题来了,两个单词的距离应该怎么计算呢,文章给出了单词之间距离的计算函数定义:
这个函数比较简单,就是取最大然后在取最小,目的就是为了将两个单词的值域控制在(-k,k)之间,这样可以到position embedding去找到单词距离对应的位置向量。那么位置向量的作用是什么呢?它当然就是为了计算而服务的。下面这个具体的操作流程,会更形象的说明这个计算过程,如下图所示:
首先判断单词south是否属于实体,如果属于的话进行下面的赋值操作,如果单词in是实体的话,那么进行下面的赋值操作。这两个赋值操作的唯一不同之处就在于颠倒了两个单词的位置下标。如果两个单词都不属于实体的话,就将赋值成0向量。在对每个单词都做完这样的操作后,我们会得到一个正方形的矩阵,如下图所示:
我们知道Self-attention所计算出的矩阵表示每个单词对该单词的表示意义的贡献程度。而我们上图中计算出来的矩阵的意义我认为是表示了每个单词距离每个实体的距离信息,将这一信息加入到了Self-attention机制当中,在训练中得到了更好的结果。
4.实验对比
很久前文分析,我们知道论文要解决的问题是要解决存储资源浪费问题和计算资源浪费问题。这里主要介绍两个较为重要的实验:
上图的实验时基于ACE2005数据集, 这里的(bc,cts,wl)是各个领域的缩写,例如wl是weblog(微博)的缩写;首先,黑色字体粗体部分标出的所示,论文中的方法在各个领域的F1值都达到了最好的效果,并且在Multi-Relation和Single-Relation两个任务来看,模型在两个任务上没有太大的变化,并且都达到了最好的效果。而其他基于bert的模型,在Single-Relation任务上的表现都要比在Multi-Relation的表现要好。同时在时间方面:
如上图所示,在时间方面,论文的模型训练时间也较之前的模型大幅度减少。这样就解决的上文中提到的资源存储问题和计算资源问题。
另外的实验是将论文中预测结构的Linear层,分别替换为MLP,Biaff层,这两个结构都是要比Linear要复杂的结构:
我们可以看到, 结果并没有提升,也就是说,如果预训练模型足够强大的情况下,上面没有必要加更加复杂的结构,这样会增加更多的参数,提升过拟合的风险。
5.总结
对该论文总结如下:
-
基于预训练模型BERT,提出了一次编码提取出多个关系的模型;
-
模型中加入了预测结构( structured prediction)和实体意识的自注意力机制( entity-aware );
-
在多个数据集达到最佳效果,并且节省了存储空间和计算资源;