查看原文
其他

【源头活水】ACL2021 | 把关键词生成看成集合预测问题

“问渠那得清如许,为有源头活水来”,通过前沿领域知识的学习,从其他研究领域得到启发,对研究问题的本质有更清晰的认识和理解,是自我提高的不竭源泉。为此,我们特别精选论文阅读笔记,开辟“源头活水”专栏,帮助你广泛而深入的阅读科研文献,敬请关注。

来源:知乎—Yjc

地址:https://zhuanlan.zhihu.com/p/376803708

论文地址:https://arxiv.org/abs/2105.11134

代码地址:https://github.com/jiacheng-ye/kg_one2set

作者:叶佳成 复旦大学NLP实验室研究生


01

背景介绍
这里简单介绍一下关键词生成任务的形式。给一篇源文档(比如论文的摘要),关键词预测任务就是希望能预测出一些表达文档重点信息的关键词,或者更准确的说是关键短语。关键词有两种类型,分别是在文档里面的(present keyphrase)和不在文档里面的 (absent keyphrase)两种类型。所以,任务的训练样本是  ,  是一个包含present和absent两种类型的关键词集合。图1展示了两种类型的关键词:

图1:present和absent关键词的例子

之前做关键词生成常用的有One2One和One2Seq两种范式:
One2One[1]:在One2One范式下,我们把训练样本是  拆分成多个样本  ,每个样本对就是源文档  和一个对应的关键词  。因为在训练的时候每次只有一个目标关键词作为监督,如果需要在测试阶段生成多个关键词,就需要用beam search来生成多个关键词(如[1]中beam size取了200)。这个范式有两个很大的问题:
语义依赖:beam search生成的多个关键词之间也没有语义上的依赖性,可能生成语义重复的关键词。
动态数量:beam search数量往往给定,即不能为不同源文档  生成动态数量的关键词。
One2Seq[2]:为了解决One2One的语义依赖和动态数量这两个问题,研究者提出一种One2Seq的范式,他把所有的关键词按照一个给定的顺序(比如一般就是present在前,absent在后)连起来作为训练样本,也即训练样本为  。语义依赖问题通过看到前面预测关键词来实现,动态数量问题可以用最后的eos标签决定。
上面两种范式下的的训练样本举例图2所示。

图2:One2One和One2Seq示例


02

论文动机
从上面的分析可以看出,One2Seq范式下引入了一个先验顺序函数f,导致和原始的数据样本并不一致。用这种预定义的顺序函数会有以下几点问题:
一方面,之前有研究者[3]发现不同的顺序函数会对结果有比较大的影响。尽管他们发现Appear-Ap策略(present关键词按照在文章中出现的先后顺序以此排列,absent关键词按照作者给的顺序连接到present关键词序列后面)会相对比其他几种策略好一些。如果关键词有顺序的话,这种顺序可能也未必是最好的选择。
另一方面,训练的时候引入预定的顺序函数很可能带来错误的偏置。如图3(a)所示,上面是目标序列(即  ),下面是预测的序列。尽管模型预测对了这两个关键词本身,但是由于顺序和给定的不一样,模型还是会有很大的loss,也就是这种先验顺序会干扰模型学习真正要学的东西。
这里可能有个疑问,那为什么不可以让模型学会这个顺序函数,这样也就不会预测出topic model在前,deep learning在后的情况了?当然,如果模型真的能学会,那自然是没有问题的,但是模型实际上很难学会,原因如下:

一方面,训练集中不能保证都是topic model在前,deep learning在后,这可称之为多模式问题(multi-modality problem)。这在其他任务,比如非自回归机器翻译以及对话的回复生成中也会遇到类似问题,模型很可能学到一个错误的中间状态。

另一方面,模型确实很难学这个顺序。比如后面的absent关键词序列部分是按照作者给定的先后顺序连接的,而不同作者给的顺序依据也是不一样的,有的作者可能就是按照重要性给,有的就是按照技术、领域等topic给,有的可能就是比较随意地给,那么这也就要求模型去拟合不同作者的这一特征,而这在没有作者信息的情况下是很难的(引入作者信息是一个方向)。

图3:One2Seq与One2Set的对比

所以,既然这个顺序函数f会带来那么多问题,而且更重要的是数据本身就是没有这个东西的,那我们能不能不引人顺序函数来进行训练和预测呢?
这也就引出了我们的做法,我们希望在训练和预测的时候都和顺序无关,而只关注在每个关键词本身上。如图3(b),简单来说,在One2Set范式下,模型的训练样本就是原样本  。

03

模型介绍
在One2Set范式下,我们提出了SetTrans (Set prediction model based on Transformer) 模型(图4),该模型模型主要解决以下问题:
如何生成一个集合而不是一个序列?
生成的集合和目标集合的loss怎么算?
如何考虑到预测的依赖问题和动态数量问题?

图4:模型结构图,图中展示了N=8,K=2的情况

为了解决第一个问题,我们引入  个控制编码(Control Code),每个控制编码对应生成一个集合元素,这样我们就生成了包含  个关键词的集合。
为了解决第二个问题,也就是给定包含  个预测关键词的集合,如何与包含  个关键词的目标集合计算loss。这里我们假设预定义的  的取值始终大于等于  (即统计数据集中文档的关键词最多有几个)。然后,我们用  元素加进  中,使得两个集合元素数量相等,这样我们只需为他们进行最优的一对一匹配(匈牙利算法可解),然后匹配完之后就能计算loss了。其中,每个预测关键词与目标关键词的匹配得分可以定义为目标关键词在预测分布中的概率之和。
针对第三个问题,依赖问题可以一定程度上在训练时让control code隐式学习到,动态数量问题可以通过去掉预测的  元素解决。
此外,还有几个细节问题:
由于匹配目标前是不知道target是哪个的,于是只能自回归预测,但是开始阶段模型不会预测出<eos>,就是个冷启动的问题。这边令每个控制编码只预测  步(如图中  ),然后用这  个和每个target关键词的前  个算score。
在匹配完之后,由于每个control code都只对应自回归成了  个,如果直接给监督的话信息不完整,而且是一种student-forcing的形式,效果会很差(见消融实验倒数第二行)。这边选择在匹配完之后teacher-forcing地再过一遍算loss。
这边在匹配目标的时候present和absent两个集合的时候分开考虑(Separate Set Loss),也就是一半的control code只会和present关键词做匹配,另一半的control code只会和absent关键词做匹配。这样好处是让这两部分的control code学到present和absent预测中不同的偏置(present部分的control code会更倾向于指导模型去copy原文内容,absent部分则倾向于指导模型自己归纳生成)。这可以看成是一种在输入端而不是和常见的在输出端做区分的multi-task。(见消融实验最后一行)


04

实验与分析

主实验

我们在KP20k数据集上做训练,并在KG任务5个标准测试上做测试,在present和absent预测上的主结果如下表所示,可以看到One2Set范式下的SetTrans模型相比One2Seq下的Transformer模型还是有一定的性能提升的。

表1:Present和Absent关键词预测结果

预测多样性

多样性体现在能预测更多而且重复率更低的关键词。重复率上的优势主要源自训练时匹配的二分特性。如模型图所示,第5个和第8个control code都指导生成了重复关键词“neural model”,但是由于一对一匹配的特征,只有一个会和目标中最接近的“neural network”做匹配,另一个只能和  元素做匹配。那么当loss进行回传时,第5个和第8个control code会学到不要生成重复的关键词,同理,所有control code都朝不同的方向来指导模型生成多样的关键词。
表2:预测数量和重复率的对比

消融实验

这里比较有意思的是去掉K-step assign的情况,也就是按照One2Seq的顺序函数f进行顺序匹配。可以发现预测数量明显下降(如present关键词数量 5.10 -> 2.64),重复率明显上升(8% -> 26%),且重复率和Transformer几乎一致。
表3:消融实验

Control Code分析

这里对学好的Control Code在测试集上的预测出present关键词、absent关键词的比例进行了统计(每个Control Code只会生成present关键词、absent关键词或者  元素),从上到下依次是 去掉K-step assign、K-step assign+Single Set Loss以及K-step assign+Separate Set Loss。主要有以下几点发现:
去掉K-step assign的情况下,仅前面少数几个Control Code能生成有效的关键词,后面都是预测的  元素,而且通过前面的结果也可以发现,在只有5个左右Control Code有效的情况下还有26%的重复率,说明这些Control Code并不能学到语义上的信息。
K-step assign+Single Set Loss相比去掉K-step assign,更多的Control Code可以来指导生成,但是由于absent预测比较难,模型还是更倾向于预测present关键词。
Separate Set Loss相比Single Set Loss能将present和absent分开来,不仅有助于两者预测地更准确(消融实验最后一行),也能预测更多的absent关键词,说明这种输入端做multi-task的形式能让这两部分的Control Code一定程度上也能学到present和absent预测存在的偏置。
图5:不同模型下control code预测类型的统计对比,从上到下以此是 去掉K-step assign、K-step assign+Single Set Loss以及K-step assign+Separate Set Loss


05

总结
做个简单的总结,我们提出了一种新的训练范式One2Set来去掉顺序函数带来的诸多问题。在此范式下,我们提出了模型SetTrans,其特点是能够预测更多、更准确而且重复率更低的关键词集合。同时,我们也通过大量实验对比了顺序和没有顺序的结果,从而来证实One2Seq中的顺序函数带来的影响。我们还发现 SetTrans由于可以并行预测,在 inference 效率上是Transfomer的6.44倍,其他实验分析可移步论文查看。
欢迎大家批评指正~
[1] Rui Meng, Tong Wang, Sanqiang Zhao, Shuguang Han, Daqing He, Peter Brusilovsky, and Yu Chi. Deep keyphrase generation. In ACL 2017.
[2] Xingdi Yuan, Rui Meng, Khushboo Thaker, Peter Brusilovsky, Daqing He, and Adam Trischler. One size does not fit all: Generating and evaluating variable number of keyphrases. In Arxiv 2018. (ACL 2020)
[3] Rui Meng, Xingdi Yuan, Tong Wang, Peter Brusilovsky, Adam Trischler, and Daqing He. 2019. Does Order Matter? An Empirical Study on Generating Multiple Keyphrases as a Sequence. In arXiv:1909.03590 [Cs].

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“源头活水”历史文章


更多源头活水专栏文章,

请点击文章底部“阅读原文”查看



分享、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存