今天分享一篇普林斯顿大学的信息抽取工作。这篇论文颠覆了联合抽取的思路,论证Pipeline的方式比联合抽取和多任务学习效果都要好。对于一直在做联合抽取工作的我来说,确实很令人沮丧。但也正因为本文的方法很简单,我认为或许会有改进之处。
A Frustratingly Easy Approach for Entity and Relation Extraction
普林斯顿大学(Princeton University)
NAACL 2021
citation: 36
近年来大部分的命名实体识别和关系抽取工作都是将二者联合完成。要么是把他们放进同一个结构预测网络,要么是共享相同的表示进行多任务学习。但在本文的工作中,我们提出的模型是pipeline的,使用相同的Encoder,我们达到了SOTA。经过分析,我们认为关键的点在于:1)对于实体和关系使用不同的表示;2)尽早将实体信息融入关系抽取模型;3)利用全局上下文。最后我们提出了一个方式来高效训练。
联合模型能够捕捉实体和关系的交互,减少错误放大。在本文的工作中,我们重新审视了此问题。我们提出了简单高效的端到端模型,做了细致的分析,并简化算法。
实体模型对输入的每一个span预测命名实体的类型。实体模型是基于前文模型的简单模型,它枚举所有可能的span(最大长度限制在L以内),首先使用BERT得到每个词的表示,然后得到span的隐层状态:(最后一项是学到的整个span的表示)
h
e
(
s
i
)
=
[
x
s
t
a
r
t
;
x
e
n
d
;
ϕ
(
s
i
)
]
h_e(s_i) = [x_{\rm{start}};x_{\rm{end}};\phi(s_i)]
he(si)=[xstart;xend;ϕ(si)]
得到的he直接放入FFN分类。
关系模型是把实体模型得到的每一个实体对都作为候选,全部加入关系模型中。加入的形式是采用marker。我们定义如下的marker:
<
S
:
e
i
>
,
<
∣
S
:
e
i
>
,
<
O
:
e
i
>
,
<
∣
O
:
e
i
>
<S:e_i>,<|S:e_i>,<O:e_i>,<|O:e_i>
<S:ei>,<∣S:ei>,<O:ei>,<∣O:ei>
它们的作用是用于提示实体的位置信息。加入marker之后,我们使用第二个encoder来得到输出表示,然后拼接两个头表示作为关系整体的表示:(这里我不理解得到的双向表示怎么回事)
h
r
(
s
i
,
s
j
)
=
[
x
s
t
a
r
t
i
;
x
s
t
a
r
t
j
]
h_r(s_i,s_j)=[x_{\rm{start}_i};x_{\rm{start}_j}]
hr(si,sj)=[xstarti;xstartj]
很难想象为什么只用头实体。除非学到了双向的信息。应该是做了一层双向的学习。
最后得到的结果用在分类上即可。
跨句的上下文在解决一些代词entity问题非常有效。我们评估了使用跨句上下文的重要性,如我们预料的一样,预训练模型能够做到捕捉长距离上下文信息,我们把句子变成了固定窗口大小W,具体来说,如果一个句子的长度是n,那么我们分别在左右两边添加了(W-n)/2d长度的上下文。
对于两个模型,我们使用独立的交叉熵来解决问题。
有效的batch计算策略。我们模型的一个痛点是,对每对可能的关系对,我们都需要预测它们之间的关系。为了缓解这个问题,我们采用了一个新的策略。因为在原来的句子表示时,我们加入marker之后get到的上下文信息是不一样的,因为marker改变了句子结构。为了能够复用单词的信息表示,我们采用如下策略:我们将marker的位置信息和span开头结尾的位置信息绑定。这样原句子的位置信息embedding就不会更改了。然后,我们限制attention层。我们强制文本token只注意文本token,而不会注意到marker token,所有这4个token对应同一个span对。这种更改使得我们能够复用token。在实践中,我们把所有的marker加到句尾。
对于命名实体识别,只有正确识别出实体的位置和标签,才算完全正确;
对于关系抽取,有两个评价指标:
Rel:只要两个span的边界正确并且关系类型正确,就算正确;
Rel+:当且仅当实体完全正确,并且关系类型也完全正确,才正确。
实现细节:
使用bert-base-uncased以及albert-xxlarge-v1作为ACE04,ACE05基本的encoder;
使用scibert-scivocab-uncased作为SciERC的encoder。
实体模型的上下文窗口W大小为300,关系模型的窗口W为100. 考虑8个单词的span
实验略。
https://zhuanlan.zhihu.com/p/414810626
https://zhuanlan.zhihu.com/p/375425216
我认为抽取实体的方法是非常愚笨的。枚举所有可能的实体的复杂度是O(NL),N是句子长度,L是窗口长度。我觉得可以稍微看一下有没有对此的改进。但其实枚举能做到O(N)复杂度看起来还可以。
抽取关系的方法在优化之前是复杂度是O(M^2),M是第一步抽取出的实体数。还是稍微有些复杂的。因此需要优化。