原文链接:https://aclanthology.org/2022.acl-long.67.pdf
ACL 2022
介绍
问题
将命名实体识别任务作为阅读理解任务(MRC:machine reading comprehensive)来做,存在3个问题:
1)一类问题只能提取一种实体,对于句子中的多种实体需要多个类别的问题才行;
2)这样提取的不同实体之间是相互独立的,忽略了它们之间的联系;
3)问题的构建依赖于外部知识库,不使用于有多种实体类型的场景。
IDEA
因此作者提出了PIQN,该模型设置了全局可学习的实例query,不再依赖于外部知识库和人工手动构建实例query,以并行的方式来从句子中提取实体。
方法
模型包括三个部分:encoder、实体预测和动态标签分配。总体结构如下图所示:
对输入的句子和实例query进行编码后,使用Entity Pointer和Entity Classifier对每个实例query进行实体定位和实体分类。训练模型时,引入动态标签分配来将gold实体分配给实例query(因为这里的实例query并不是一个真正的问题,而是可学习的向量,也就不能提前对每个实例query分配gold实体)。
Encoder
将长度为N的句子X和长度为M的实例query进行concate后输入encoder进行编码。
Input Embedding
按如下方法计算输入两个句子的token embedding、position embedding、type embedding:
其中V表示输入句子的token embedding,I表示实例query的token embedding;和分别表示sentence和query可学习的位置向量;和分别表示sentence和query的类别向量,表示重复N次。即输出可以表示为:
One-Way Self-Attention
普通的自注意力机制会让输入的句子和所有的query进行交互,但随机初始化的query反而会打破句子的语义。因此为了保证句子语义独立于query,使用以下方法来代替bert之间的自注意力机制:
M表示注意力分数的{0,-inf}掩码矩阵,其中0表示保留原句,-inf表示需要删除。防止句子编码对实例query的关注,将M的右上角N*M的子矩阵设置为全-inf矩阵,其他元素皆为0。另外,实例query之间的自注意能够对他们之间的联系进行建模,提升他们的query语义。在BERT后,还使用了两层的Bi-LSTM和L层的transformer来对句子进行单词级别的编码。最后将分为句子编码和query编码。
Entity Prediction
包括实体定位和实体分类两个部分,分别使用Entity Pointer和Entity Classifier两个方法实现。
Entity Pointer
对于第i个实例query,首先通过两个线性层来与句子的每个单词进行交互。第i个实例query和第j个词的融合表征如下所示:
其中 分别表示左右边界,和是可学习的参数。
计算句子中第j个词是左右边界的可能性,其中和都是可学习的参数。
Entity Classifier
使用衡量每个word并将其与实例query i 进行concate,即第i个实例query的边界敏感的表征表示为(其中是可学习的参数):
第i个实例query所查询到的实体属于类别c的概率为:
最后第i个query提取出的实体表示为,其中、表示左右边界,表示实体类型。在使用实体query去并行地提取实体时,如果存在多个实体query对相同边界的实体预测不同的类型时,选择分类可能性最高的类别。
Dynamic Label Assignment for Training
Dynamic Label Assignment
任何实体都能被分配给任何实例query,产生的代价各不相同。定义将第k个实体分配给第i实例query的代价为:
为每个query分配一个实体,为每个实体最多分配一个query,以使分配代价最小化的方法分配尽可能多的实体。但这种一对一的方法不能对实例query进行充分的利用(query>>entity),许多实例query并没有分配到实体。因此作者将传统的LAP扩展到一对多(可以看作是二部图的最大匹配?使用匈牙利算法解决),即每个实体能被分配给多个实例query。一对多的LAP优化目标定义为:
表示分配矩阵,G表示实体的数量 Aik=1表示第k个实体被分配给第i个实例query,qk表示第k个实体的分配次数。由于实例query的数量比实体数量多,因此有些query就没有分配到实体,因此对分配矩阵扩展一列得到,新增一列的向量定义如下所示:
Training Objective
使用边界损失和分类损失来优化该模型。对于左右边界的预测,使用二进制交叉熵损失:
对于实体分类,使用交叉熵损失:
其中1[w]表示指标(indicator)函数,当w为真时取1,否则取0;
在每个transformer层后增加Entity Pointer和Entity Classifier,因此总loss定义为( r表示t层的分类损失和边界损失):
实验
对比实验
在5个嵌套命名实体识别数据集上的结果如下图所示:
在4个flat命名实体识别的数据集上进行实验,结果如下图所示:
与query-based的方法(Li et al.2020b)相比,我们的模型在 GENIA, ACE04, ACE05、 KBP17四个数据集上分别提升了+2.85%、+2.16%、+0.54%和+3.53%。有以下三个原因:
1)实例query不依赖于外部知识来注入语义,自适应第学习query语义,避免了因手动建造query质量参差不齐的敏感性。2)每个query不再预测一组特定类别的实体,而是只预测一个实体。这种方法将查询细化到实体层次,具有更精确的查询语义。3)实例query并行地输入到模型中进行编码和预测,不同的实例query能够利用实体之间的内在联系。
消融实验
作者对模型的部分方法进行了消融实验,结果如下所示:
作者对模型的推理速度进行了实验,结果如下所示:
可以看出我们的模型不仅效果更好,速度也更快。因为Li提出的模型,一个query对应一个特定类别的实体,而我们的模型能够将所有的query并行地提取实体。
Analysis
为了分析实例query在训练过程中学习到的query语义,随机选择了几个实例query来分析它们预测的实体位置和类型。
对实体的预测中心位置进行归一化处理,并使用内核密度估计得到不同查询预测实体位置的分布。结果如下图所示:
可以看出不同的实体query聚焦于不同位置的实体,表示实例quey能够学到与实体位置有关的query语义。例如#28、#39倾向于预测在句子前面的实体,#11、#53更倾向于句尾处的实体。
作者计算了不同实例query预测不同实体的概率,如下图所示:
可以看出不同的实例query对预测不同的实体类型有差别。例如#11和#13更偏向于预测PER实体,而#30和#43更偏向于预测VEH实体。
Case Study
下表展示了模型预测的一个实例。
case1中,对于长度为31的实体和三层嵌套实体,模型都预测正确。并且由于一对多的动态标签分配,导致一个实体可由多个实例query预测出,保证了实体预测的高覆盖率。但模型对于句子的理解有所欠缺,表现在以下方面:
1)对特殊短语的理解存在缺陷;如case2中的Yahoo!communications Services被错误的归类为ORG,实际Yahoo才是ORG。
2)过于关注于local语义;如case3中,将Venezuelan consumer(委内瑞拉消费者)错误分类为PER,忽略了semantics of the long phrase the Venezuelan consumer protection agency(委内瑞拉消费者保护机构)这个长句的ORG语义。
3)对形态变化不敏感;在case3中混淆了Venezuelan(委内瑞拉人)和Venezuela(委内瑞拉),把前者误判为GPE。
总结
将NER问题视为MRC问题来解决,并提出使用全局可学习的实例query来代替之前工作中特定的query(最开始没用理解到该模型学习的是代表query的一堆向量,还以为是对一些具体的句子进行学习,还寻思这个怎么去改变句子中的一些词吗?虽然本来具体的问题也会经过encoder后变成embeding,但感觉将具体的问题变为一堆抽象的向量来完成query还挺有意思的,),在多个数据集上达到了sota的效果。