©作者 | 眼睛里进砖头了
单位 | 东华大学
研究方向 | 自然语言处理
最近在做关系抽取的任务,就花了些时间把关系抽取的经典范式全部 cover 了一遍,总结对比了一下,7 篇文章带你一览关系抽取范式。
下面以关系抽取的存在场景问题以及模型本身存在的问题,来看这个关系抽取这个任务存在哪些问题。
1.1 抽取的场景问题
不同的模型往往在不同的场景下表现出不同的优越性,关系抽取可以分为实体识别及关系抽取两个任务来看,这其中分别存在以下场景问题:
example: 李明在南京
entity: 李明(Person) 南京(Location)
example: 李明在南京大学
entity: 李明(Person) 南京(Location) 南京大学(Institution)
example: 芯片设计、制造、生产服务
entity: 芯片设计服务(Service)、芯片制造服务(Service)、芯片生产服务(Service)
例子如上图,关系识别的场景也分为三种:1)Normal;2)EntityPairOverlap;3)SingleEntityOverlap。
1.2 模型本身存在的误差问题
1. 误差累积(error accumulation): 指的是实体识别阶段,识别漏掉、不准的问题会累积到关系抽取任务阶段;
2. 暴露误差(exposure bias): 指的是在关系抽取任务中,训练阶段输入的是gold entity(ground truth entity),而在预测阶段是实体识别模型预测的实体。
误差累积、暴露误差这个问题主要存在于下文中的 pipeline 及共享参数的联合抽取模型中(也就是共享 encoder,不同 decoder 过程)。
模型结构一览
上面说的是关系抽取这个任务的一些场景问题及现在模型存在的误差问题。下面就带着以上这些个场景问题+模型误差问题,去逐个看看下面关系抽取一些经典模型分别针对以上问题做出的优化。
在解决关系抽取这个任务时,按照模型的结构分为两种,一种是 Joint Model,另一种是 Pipeline, 这个大家应该比较熟悉了,其实可以把它再细化一下。
2.1 Joint Model
2.1.1 多任务学习(共享encoder参数的联合抽取模型)
实体与关系共享同一个 encoder 网络编码,解码仍然是两个 decoder,本质上是采取 pipeline 的编码方式,即是先解码出实体,再去解码关系,这种方式是存在误差累积的。
这种一个 encoder 编码,两个 decoder 解码的模型是以下面这三种经典方式作为一个代表。
论文标题:
A Novel Cascade Binary Tagging Framework for Relational Triple Extraction
论文作者:
Zhepei Wei, Jianlin Su, Yue Wang, Yuan Tian, Yi Chang
https://arxiv.org/abs/1909.03227
https://github.com/weizhepei/CasRel
这篇文章是苏剑林有参与提出的,在当时关系抽取任务上提出了一个新的方式,采用一个层叠式的指针方式分别去预测 subject 实体与 object 实体。
1. 文章构建一层 PointerNet(也就是两个二分类层)识别 subject 的头尾位置;
2. 然后再采用遍历每一个识别出的 subject, 去预测对应的 object 头尾位置。
这里给每一种关系都构建一个二分类层网络,N 个关系则是 2N*Max_Squence_Len 指针网络。
这文章主要针对同一实体,存在多种关系的问题,也就是解决关系识别的三种场景问题 。
将关系分类蕴含到多个指针网络内,采用多次分类同时预测出 object 实体与关系类别。熟悉 NER 的任务的应该知道,这种单层的 PointerNET 是没办法解决嵌套实体问题的,同时这种方式就是上文提的一个 encoder,两个 decoder 方式,这是存在误差累积的。
论文标题:
Joint entity recognition and relation extraction as a multi-head selection problem
论文作者:
Giannis Bekoulis, Johannes Deleu, Thomas Demeester, Chris Develder
https://arxiv.org/abs/1804.07847
https://github.com/bekou/multihead_joint_entity_relation_extraction
论文标题:
BERT-Based Multi-Head Selection for Joint Entity-Relation Extraction
论文作者:
Weipeng Huang, Xingyi Cheng, Taifeng Wang, Wei Chu
https://arxiv.org/abs/1908.05908
重点在于构建一个
[batch_size, seq_len, seq_len, hidden]
的矩阵,相当于每一个 token embedding 都逐个乘以 sequence 中的其他 token embedding,得到多个 logits feature 表达,进而通过 sigmoid 判别实体关系及关系类型。
实体识别之Multi-Head多头选择方法 [9]
文章中的图不易理解,在此将其画了更容易理解思想的图,仅供参考。
1. 输入是一个 batch 的句子,维度=[batch, seq_len];
2. 经过 encoder(bert 或者 BiLSTM),得到 token 的 embedding 表征,维度=[batch, seq_lenl, hidden];
3. 此时将 seq_len 的 token 复制 seq_len 份,得到维度=[batch, seq_len, seq_len, num_label] 的表征矩阵 M;
4. 将 M 转置得到另一个矩阵 M^T,
对应位置相加即可,再通过一个 linear layer + sigmoid 进行分类;
5. 最后输出一个维度=[batch, seq_len, seq_len, num_label] 的 label 矩阵,此为实体识别矩阵;
6. 关系矩阵则也类似,在第 4 步得到的表达矩阵基础上,一般采用两实体 pair 的 tail token(或 head token),concat 做特征表达进行关系分类即可得到实体 pair 的关系。
这里为什么要进行 3、4 步?这就是 multi-head 的思想,将每个 token 与其他每个 token 进行一个特征的拼装,得到此 token 与其他每个 token 的一个交互特征(有点类似 attention 的 Q*K 交互),以此来得到最后的 [seq_len, seq_len, num_label] 的结果矩阵。
每个 token 都会去和其他 token 组合,然后判断这两个 token 是不是一个实体的头尾字符。
若是则输出实体类型,若不是则输出 0。
那么很自然的想法就是把 bert 输出的每个 token 的 hidden 与其他 token 的 hidden 进行拼接。
具体实现时,先对数量为 seq_len 的 token 复制 seq_len 份。
然后再与其转置的矩阵对应位置相加即可。
最后输出得到一个 [batch, seq_len, seq_len, num_label]。
多头指的就是为每个 token 与 token 间都有一个 feature 表达,作为实体的 embedding 表达或关系 pair 的表达,从而输入到后续的网络中进行判别,主要针对 Overlapped NER + SingleEntityOverlap 问题。
论文标题:
Span-based Joint Entity and Relation Extraction with Transformer Pre-training
论文作者:
Markus Eberts and Adrian Ulges
https://arxiv.org/abs/1909.07755
SpERT:也是采用一个 encoder,两个 decoder 分别解码实体及实体 pair 间的关系,可以看图最清楚了。
1. 采用span方式的生成所有潜在的span(例:
eat a apple ,生成片段:
eat, eat a, eat a apple, a, a apple, apple也就是一句话T个字,会生成T*(T+1)/2个片段),对每个span进行实体的判别。
2. 实体分类(span-entity classification):
通过 concat (maxpool(span_len) || width_embedding || cls),以此向量代表实体的特征,从而进行分类。
3. 关系分类(span-classification),若有 S 个 entity,则进行 S*(S-1)次实体 pair 分类。
实体 pair 特征为 concat(e(s1) || maxpooling(local_context) || e(s2))。
最后两个 loss 叠加作为总体 loss 一起进行优化。
Loss = loss(span-entity classification) + loss(span-classification)。
SpERT 主要适用于嵌套的实体问题,同时也适用于 multi-relation 问题,但是两个 decoder 的 pipeline 解码方式也是存在误差累积问题的。
2.1.2 结构化预测(联合解码的联合抽取模型,共享encoder及decoder)
全局优化,联合解码实体与关系,一个 encoder,一个 decoder,由于一个 decoder 需要同时完成两个任务的解码,通常会造成解码方式复杂。这种方式在理论上是不存在误差传播的。
论文标题:
Joint Extraction of Entities and Relations Based on a Novel Tagging Scheme
论文作者:
Suncong Zheng, Feng Wang, Hongyun Bao, Yuexing Hao,Peng Zhou, Bo Xu
https://arxiv.org/abs/1706.05075
主要方式: 文章中采用“BIES”(Begin,Inside,End,Single)标注方式,标注中将文本词汇分为两类,与抽取结果无关的词用 O 标注,与抽取结果相关的词,标注由三部分构成,即 当前词在 entity 中的位置 + 关系类型 + entity 在关系中的角色(如图中 B-CP-1,B 表示 entity head,关系的类型 CP 由预先定义的 scheme 定义,entity 在关系中的角色用“1”,“2”表示头或尾) 。
Novel-Tagging 用标注的方法把两种任务合并成了一种任务,每个 token 进行分类得到最后的关系结果。由于合并成了一个任务,因此模型只有一个 encoder 与一个 decoder,这样就成功避免了误差积累。
Novel-Tagging 采用标注的方式进行关系的抽取,基于 schema 设计满足不同场景,文中讨论的是 Normal NER + SingleEntityOverlap 的情形,但通过设计 schema,同时将分类器改为多标签多分类,也是可以满足 overlapped + multi-relation 任务的。
论文标题:
Entity-Relation Extraction as Multi-Turn Question Answering
Xiaoya Li, Fan Yin, Zijun Sun, Xiayu Li, Arianna Yuan, Duo Chai, Mingxin Zhou, Jiwei Li Shannon.AI
https://arxiv.org/abs/1905.05529
采用机器阅读的方式,结合多轮的 Question 的方式,将实体类别或关系类别这种信息蕴含在 Question 文本里,将输入变为 Question+Context,从而进行实体的抽取及关系的抽取。 给个文中的例子:
通过 Question 提示,每种实体和每种关系都用一个问答模板进行刻画,从而这些实体和关系可以通过回答这些模板化的问题来进行抽取,问题的答案就是文本的一段(span,预测文本的起始与结束位置标签,采用 BMEO 标记)。 大体流程上就是:
1. 先抽取头实体的片段;
2. 再抽取为实体的片段;
3. 接下来构造含有这两个实体 slot 的 Question 文本,询问这实体 pair 间的关系类型。
将实体类别信息与关系信息蕴含于问题中,文中还定义了一系列模板,每种实体都和其相应的问题联系,如下图所示:
通过以上方式,将实体类别信息与关系信息蕴含于问题中,成功的将实体识别+关系识别合并成同一个阅读理解的任务。因此该模型下也是只含有一个 encoder + 一个 decoder,避免了误差积累问题。
2.2 Pipeline
pipeline 模式,即流水线式的抽取,这种就是实体识别+关系判别两个任务,分别由两个模型来做不同的任务,因此这种方式是存在误差累计与暴露偏差问题的。也因为这个原因,当时学界一直觉得 pipeline 的方式是不如 joint model 效果的,这里就看最近刷榜的陈丹琦组的一篇,也是 pipeline 的方式,达到了关系抽取的 SOTA。
论文标题:
A Frustratingly Easy Approach for Entity and Relation Extraction
Zexuan Zhong, Danqi Chen
https://arxiv.org/abs/2010.12812
实体识别部分: 是基于 span 的方式,也就是上面介绍过的 span-based 抽取中的 NER 方式。 同时,加了一个分词的小 trick,采用最小分词的方法,即将一个英文词会再进行切分,分成词根的方式。
1. 在实体识别完毕的基础上,会将句子重新构造,在实体前后加上对应的表示该实体类别及头尾信息的标签,如 [S:md] 表示头实体-subject,实体类别为 method。
2. 重新构造的句子同时通过 bert encoder 后,拿到实体 pair 的头标签 token embedding 进行 concat 后,从而进行关系分类的判别,公式表达就是 softmax(concat([S:md] | [O:Tk]))。
以上,就是它的全部方法。
这篇文章主要 trick 就是在关系识别阶段加入了实体的类别以及头尾标识信息,简单明了,就这样达到了 SOTA,确实刷新了认识 。
文中也提出了一种 approximate 近似中和的方法,加速训练及推理过程。
这篇文章证实了实体的类别信息与头尾信息对关系抽取有巨大的帮助,但回到上面的误差累计问题,该 pipeline 的模型依旧是存在的,并没有解决,但在解决这个误差累计的问题上,仍有不少 joint 方式在此做进一步的努力,如百度的 TPLinker 以及苏剑林在 CasRel 进一步改进的 GPLinker,通过将实体的标签矩阵与关系的 label 矩阵融合到一个矩阵中,最后一步得到实体及实体 pair 间的关系,从而有效避免误差累计问题,可以参考看看。
最后再说一下Discontinuous NER
example: 芯片设计、制造、生产服务
entity: 芯片设计服务(Service)、芯片制造服务(Service)、芯片生产服务(Service)
Discontinuous NER 属于一个非常规的 NER 问题,目前方法研究的不多,还没办法很好的融合的到 joint model 中解决。
1. 采
用标注的方式解决,如
Novel-tagging,拓展 BIO 标签,重新设计标注标签;
2. 当做一个属性/关系抽取问题,即当做关系抽取的任务,把实体与实体间的关系建模成有没有关联的关系,进行再判别;
3. 模仿句法解析器的做法,设置 shift-reduce parser,具体可参见 HIT: Nested Named Entity Recognition via Head-Tail Pair and Token Interaction .
最近也有一篇统一了三种 NER 场景的方法通过将实体间的关系融入实体的标签类型中,进行标签的设计,达到统一的目的。
论文标题:
Unified Named Entity Recognition as Word-Word Relation Classification
Jingye Li, Hao Fei, Jiang Liu, Shengqiong Wu, Meishan Zhang, Chong Teng, Donghong Ji, Fei Li
https://arxiv.org/abs/2112.10070
NNW (Next-Neighboring-Word): 表示当前 Word 下一个连接接的 Word;
THW (Tail-Head-Word): 同一实体的 tail-Word 到 head-Word 的连接,并附带实体类型的 label 信息。
最后得到上图这个结果矩阵,解析出来就能得到实体的结果。
具体的标注方式可看这个图,其实本质上还是把非连续任务当做一种关系抽取的任务在做,但将三种场景统一在一个框架中,可以参考。
[1] A Novel Cascade Binary Tagging Framework for Relational Triple Extraction
[2] Joint entity recognition and relation extraction as a multi-head selection problem
[3] BERT-Based Multi-Head Selection for Joint Entity-Relation Extraction
[4] Span-based Joint Entity and Relation Extraction with Transformer Pre-training
[5] Joint Extraction of Entities and Relations Based on a Novel Tagging Scheme
[6] Entity-Relation Extraction as Multi-Turn Question Answering
[7] A Frustratingly Easy Approach for Entity and Relation Extraction
[8] Unified Named Entity Recognition as Word-Word Relation Classification
[9] https://zhuanlan.zhihu.com/p/369784302
独家定制 炼丹中/Fine-Tuning
超超超超超大鼠标垫
限量 200 份
扫码回复 「鼠标垫」
立即免费参与领取
👇👇👇
🔍
现在,在「知乎」 也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」 订阅我们的专栏吧