本文主要根据以下几个方面进行阐述:
01 指代消解主流模型
02 模型分析
03 数据集介绍
04 模型调研结果及调试过程记录
01 指代消解的主流模型
16年Clark等人发表 《Improving Coreference Resolution by Learning Entity-Level Distributed Representations》
论文下载:https://arxiv.org/abs/1606.01323
该文章使用4个深度学习模块实现指代消解,分别是实体表述对Encoder,实体对Encoder,表述排序模型和实体排序模型。
17年Lee等人发表 《End-to-end Neural Coreference Resolution》
论文下载:https://arxiv.org/abs/1707.07045
该文章使用端到端的神经网络模型实现指代消解,在不需要语法分析和命名实体识别的情况下,表现超过了之前的所有模型的效果,这篇文章是后面模型发展的baseline模型,包括最后结果的对比都是根据这个模型来进行比对的。
18年还是Lee等人发表 《Higher-order Coreference Resolution with Coarse-to-fine Inference》
论文下载:https://arxiv.org/abs/1804.05392v1
该文章是在之前发表的《End-to-end…》论文基础上对做了些许改进(一阶模型变成高阶模型)
19年用bert做指代消解 《BERT for Coreference Resolution: Baselines and Analysis》
论文下载:https://arxiv.org/abs/1908.09091
上文也说了就是用 Transformer的Encoder 替换 Bi-LSTM+attention 的方法,就是简单的将原来的句子向量使用Bert进行编码,当时受限与长度的问题,文章统一使用滑窗进行处理超长的文本。
19年之后还出了 Spanbert 来做指代消解 《SpanBERT: Improving Pre-training by Representing and Predicting Spans》
论文下载:https://arxiv.org/abs/1907.10529v2
只是使用spanbert了,spanbert和Bert在预训练阶段是对两个子任务上面的差异LML和NSP,spanbert在边界预测方面的效果比Bert要好。
2020年新出了一种准确且可扩展的解决指代消解任务《Coreference Resolution as Query-based Span Prediction》
论文下载:https://arxiv.org/abs/1911.01746
主要有以下的优势:span prediction策略在mention proposal stage具有很强的灵活性,可以检索出遗漏的mention;在MRC 框架下,用query明确地去encoding the mention和它的context,这样的cues embedded能够深入透彻的理解coreferent mention的context;大量现有的MRC数据集可用于数据增强,以提高模型的泛化能力
02 模型分析
主要对:
End-to-end Neural Coreference Resolution
Coreference Resolution as Query-based Span Prediction
这两个模型进行分析
第一个模型 End-to-end Neural Coreference Resolution:
想法 :通过考虑文档中所有的span【 文本中的子串/短语 】以及学习每个span的可能的指代。
方法 :通过计算span本身embedding表示和span边界的头注意力机制
训练目标 :配合上剪枝,训练得到在共指簇中可能性最大的指代的span
实验表现:在ontonote5.0上F1提升1.5,集成5个的小技巧后,F1提升3.1
算法的流程如下:
第二个模型Coreference Resolution as Query-based Span Prediction
比如这个句子: _ / 北京大学 ,简称 北大 ,成立之初为中国最高学府。中华民国建立后,校名改为 北京大学校 ,后又改名为 国立北京大学 。 她 现有六个校区。/ _
过去的共指消解模型大都分为两个步骤处理:
- 首先考虑文本中所有限定长度的文段,挑出其中可能成为共指词的那部分(称为候选指称);
- 再按照寻找前驱的方法找到下一个共指词(比如当然已经找到的共指词有{北京大学校、国立北京大学、她},那么下一个前驱共指词就是“北大”,再下一个就是“北京大学”)。
然而,这种做法有两个问题:
- 在任务层面,第一步被遗漏的共指词就会被永远遗漏,造成错误传递,比如漏选了“北大”之后,它就永远没有机会被选为共指词了;
- 在算法层面,这些模型通常给一对指称打分,然后根据得分大小判断是否这一对指称共指,这就忽略了显式的上下文信息。
用问答(QA)的方式进行共指消解:
首先,我们还是提取出一些候选指称,但是之后,我们对每个指称, 将它所在的句子作为问题 , 将整个文本作为上下文 ,把二者拼接起来,通过一个 问答模型 抽取整个文本中 该指称 的所有的共指词。
模型的主要框架:
该模型由一个 指称提取模块 和一个 指称链接模块 组成,前者从原始文本中提取出所有可能的指称,后者将指称聚类为共指词。
03 数据集介绍
目前主要的数据集ontoNotes_Release_5.0
并且官方给出了如何处理数据集 http://cemantix.org/data/ontonotes.html
整理好的数据集如下:
bc/cctv/00/cctv_0001 0 0 WW NNP (TOP(NP(NP(NP* - - - Speaker#1 (WORK_OF_ART* -
bc/cctv/00/cctv_0001 0 1 II NNP * - - - Speaker#1 * -
bc/cctv/00/cctv_0001 0 2 Landmarks NNPS *) - - - Speaker#1 * -
bc/cctv/00/cctv_0001 0 3 on IN (PP* - - - Speaker#1 * -
bc/cctv/00/cctv_0001 0 4 the DT (NP(NP* - - - Speaker#1 * -
bc/cctv/00/cctv_0001 0 5 Great NNP * - - - Speaker#1 * -
bc/cctv/00/cctv_0001 0 6 Earth NNP *) - - - Speaker#1 * -
bc/cctv/00/cctv_0001 0 7 of IN (PP* - - - Speaker#1 * -
bc/cctv/00/cctv_0001 0 8 China NNP (NP*))))) - - - Speaker#1 * (59)
bc/cctv/00/cctv_0001 0 9 : , * - - - Speaker#1 * -
bc/cctv/00/cctv_0001 0 10 Eternal JJ (NP(NP* - - - Speaker#1 * -
bc/cctv/00/cctv_0001 0 11 Memories NNPS *) - - - Speaker#1 * -
bc/cctv/00/cctv_0001 0 12 of IN (PP* - - - Speaker#1 * -
bc/cctv/00/cctv_0001 0 13 Taihang NNP (NP* - - - Speaker#1 * (74
bc/cctv/00/cctv_0001 0 14 Mountain NNP *))))) - - - Speaker#1 *) 74)
最后一个字段就是指代的span。
数据处理的具体流程可以参照:https://blog.csdn.net/weixin_44912159/article/details/105692082
04 模型调研结果及调试过程记录
这个阶段主要调试的模型:
End-to-end Neural Coreference Resolution
可以参考的代码:
https://github.com/shayneobrien/coreference-resolution 以及
https://github.com/fastnlp/fastNLP/tree/master/reproduction/coreference_resolution
其中
第一个项目代码,训练的过程中F1标签的值一直为0,原因是项目代码有bug,后期作者也没有再继续维护了。
第二个项目代码,能够成功的运行成功。训练的结果如下图所示:
f score的得分和论文的相差不远62.2%,需要2537M的GPU,耗时24小时。该模型作者发布时,最好的得分是67%。
Coreference Resolution as Query-based Span Prediction
参考的项目代码:
https://github.com/stepperL/CorefQA-pytorch
以及
https://github.com/ShannonAI/CorefQA
自己在debug pytorch版本的过程中发现复现的几个bug,主要是复现的代码需要V100勉强跑通,原论文的代码是在TPU V2-4上面训练以及推理的,可想所需资源的大小,在自己debug的过程,把能减少的参数降至最低,依然无法跑通,曾尝试过:多卡GPU训练,CPU训练。程序上的bug主要体现在,不支持GPU的多卡实现,单卡又需要超过32G的内存的刚需。需要消耗如此多的内存主要是在,进行mention linking阶段需要多次加载Bert模型,并且又Bert模型的串联情况,以及多个mention之间计算复杂度原本是O(k^2),
虽然作者再这部分有优化,但是依然还是很大的计算量。假设一篇文章有5000个字,200个句子,假设有潜在为指代消解的实体有50000个,那么在做实体连接判断不同实体之间是否存在链接关系,那么这部分的计算就有50000^2个,即使后面作者能发布2.0支持GPU上多卡的训练,最后的模型训练以及推理,乃至后期模型部署,需要的资源也是相当大的。
以上都是自己的理解,如有错误,尽情指出,留言联系我。