ACL2021 | 把关键词生成看成集合预测问题
作者 | 叶佳成@复旦大学NLP实验室
整理 | NewBeeNLP
今天来看看 ACL2021 「关键词生成」进展
论文地址:https://arxiv.org/abs/2105.11134
代码地址:https://github.com/jiacheng-ye/kg_one2set
背景介绍
这里简单介绍一下关键词生成任务的形式。给一篇源文档(比如论文的摘要),关键词预测任务就是希望能预测出一些表达文档重点信息的关键词,或者更准确的说是关键短语。
关键词有两种类型,分别是在文档里面的(present keyphrase
)和不在文档里面的 (absent keyphrase
)两种类型。所以,任务的训练样本是 , 是一个包含present
和absent
两种类型的关键词集合。图1展示了两种类型的关键词:
之前做关键词生成常用的有One2One
和One2Seq
两种范式:
One2One
在One2One
范式下,我们把训练样本是 拆分成多个样本对 ,每个样本对就是源文档 和一个对应的关键词 。因为在训练的时候每次只有一个目标关键词作为监督,如果需要在测试阶段生成多个关键词,就需要用beam search
来生成多个关键词(如[1]中beam size
取了200)。
这个范式有两个很大的问题:
语义依赖:
beam search
生成的多个关键词之间也没有语义上的依赖性,可能生成语义重复的关键词。动态数量:
beam search
数量往往给定,即不能为不同源文档 x 生成动态数量的关键词
One2Seq
为了解决One2One
的语义依赖和动态数量这两个问题,研究者提出一种One2Seq
的范式,他把所有的关键词按照一个给定的顺序(比如一般就是present
在前,absent
在后)连起来作为训练样本,也即训练样本为 。语义依赖问题通过看到前面预测关键词来实现,动态数量问题可以用最后的eos
标签决定。
上面两种范式下的的训练样本举例图2所示。
论文动机
从上面的分析可以看出,One2Seq
范式下引入了一个先验顺序函数f
,导致和原始的数据样本并不一致。用这种预定义的顺序函数会有以下几点问题:
一方面,之前有研究者[3]发现不同的顺序函数会对结果有比较大的影响。尽管他们发现
Appear-Ap
策略(present
关键词按照在文章中出现的先后顺序以此排列,absent
关键词按照作者给的顺序连接到present
关键词序列后面)会相对比其他几种策略好一些。如果关键词有顺序的话,这种顺序可能也未必是最好的选择。另一方面,训练的时候引入预定的顺序函数很可能带来错误的偏置。如图3(a)所示,上面是目标序列(即 ),下面是预测的序列。尽管模型预测对了这两个关键词本身,但是由于顺序和给定的不一样,模型还是会有很大的loss,也就是这种先验顺序会干扰模型学习真正要学的东西。
这里可能有个疑问,那为什么不可以让模型学会这个顺序函数,这样也就不会预测出topic model
在前,deep learning
在后的情况了?当然,如果模型真的能学会,那自然是没有问题的,但是模型实际上很难学会,原因如下:
一方面,训练集中不能保证都是
topic model
在前,deep learning
在后,这可称之为多模式问题(multi-modality problem
)。这在其他任务,比如非自回归机器翻译以及对话的回复生成中也会遇到类似问题,模型很可能学到一个错误的中间状态。另一方面,模型确实很难学这个顺序。比如后面的
absent
关键词序列部分是按照作者给定的先后顺序连接的,而不同作者给的顺序依据也是不一样的,有的作者可能就是按照重要性给,有的就是按照技术、领域等topic给,有的可能就是比较随意地给,那么这也就要求模型去拟合不同作者的这一特征,而这在没有作者信息的情况下是很难的(引入作者信息是一个方向)。
「所以,既然这个顺序函数f
会带来那么多问题,而且更重要的是数据本身就是没有这个东西的,那我们能不能不引人顺序函数来进行训练和预测呢?」
这也就引出了我们的做法,我们希望在训练和预测的时候都和顺序无关,而只关注在每个关键词本身上。如图3(b),简单来说,在One2Set
范式下,模型的训练样本就是原样本 。
模型介绍
在One2Set
范式下,我们提出了SetTrans
(Set prediction model based on Transformer) 模型(图4),该模型模型主要解决以下问题:
如何生成一个集合而不是一个序列?
生成的集合和目标集合的loss怎么算?
如何考虑到预测的依赖问题和动态数量问题?
为了解决第一个问题,我们引入 个控制编码(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
。(见消融实验最后一行)
实验与分析
主实验
我们在KP20k
数据集上做训练,并在KG任务5个标准测试上做测试,在present
和absent
预测上的主结果如下表所示,可以看到One2Set
范式下的SetTrans
模型相比One2Seq
下的Transformer
模型还是有一定的性能提升的。
预测多样性
多样性体现在能预测更多而且重复率更低的关键词。重复率上的优势主要源自训练时匹配的二分特性。如模型图所示,第5个和第8个control code
都指导生成了重复关键词“neural model”,但是由于一对一匹配的特征,只有一个会和目标中最接近的“neural network”做匹配,另一个只能和 元素做匹配。那么当loss进行回传时,第5个和第8个control code
会学到不要生成重复的关键词,同理,所有control code
都朝不同的方向来指导模型生成多样的关键词。
消融实验
这里比较有意思的是去掉K-step assign
的情况,也就是按照One2Seq
的顺序函数f
进行顺序匹配。可以发现预测数量明显下降(如present
关键词数量 5.10 -> 2.64),重复率明显上升(8% -> 26%),且重复率和Transformer
几乎一致。
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
预测存在的偏置。
总结
做个简单的总结,我们提出了一种新的训练范式One2Set
来去掉顺序函数带来的诸多问题。在此范式下,我们提出了模型SetTrans
,其特点是能够预测更多、更准确而且重复率更低的关键词集合。同时,我们也通过大量实验对比了顺序和没有顺序的结果,从而来证实One2Seq
中的顺序函数带来的影响。我们还发现 SetTrans
由于可以并行预测,在 inference 效率上是Transfomer
的6.44倍,其他实验分析可移步论文[1]查看。
欢迎大家批评指正~
一起交流
想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),名额有限,赶紧添加下方微信加入一起讨论交流吧!(注意一定要备注信息才能通过)
本文参考资料
[1]
论文: https://arxiv.org/abs/2105.11134
- END -
NLP,吹爆与落地
2021-06-13
复旦邱锡鹏组最新综述:A Survey of Transformers!
2021-06-10
聊聊2021秋招互联网薪资
2021-06-07
PET——文本分类的又一种妙解
2021-05-31
ACL2021 | 把关键词生成看成集合预测问题相关推荐
- ACL2021 | 关键词生成任务新范式 - 把关键词生成看成集合预测问题
每天给你送来NLP技术干货! 来自:FundanNLP 论文链接:https://arxiv.org/abs/2105.11134 代码链接:https://github.com/jiacheng-y ...
- 【工大SCIR论文解读】WWW20 关键词生成提升电商会话推荐
论文名称:Keywords Generation Improves E-Commerce Session-based Recommendation 论文作者:刘元兴,任昭春,张伟男,车万翔,刘挺,殷大 ...
- 【Groovy】集合遍历 ( 使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合 | 代码示例 )
文章目录 一.使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合 二.代码示例 一.使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合 调用集合的 collect ...
- java工具封装树形对象,常用于菜单 json树逆向生成list集合
package com.jiuding.adminuser.util;import com.google.common.collect.Lists; import com.google.common. ...
- 使用GAN+RL来进行关键词生成
题目: Keyphrase Generation for Scientific Articles Using GANs (Student Abstract) 网址:https://www.aclweb ...
- js输入关键词生成标签代码
转载自:http://www.lanrenzhijia.com/tab/4701.html <!DOCTYPE html> <html> <head lang=" ...
- php 关键词生成,DEDECMS实现文章tag关键词自动生成列表页的方法
本文实例讲述了DEDECMS实现文章tag关键词自动生成列表页的方法.分享给大家供大家参考.具体实现方法如下: 一般来说在dedecms中如果要页面关键词生成列表有两种办法:一种就是使用dedecms ...
- php 关键词生成,全自动无限生成关键词页面(黑帽SEO优化终极方法)
如果你是做黑帽SEO的,如果你还停留在用栏目.租域名.劫持等手段来做黑帽SEO优化,我可以肯定的告诉你,你做的再好,也赚不了多少.那么今天咱们要说的就是无限生成关键词页面用内容页来做黑帽SEO优化. ...
- 关键词生成的相关资源
一个很全的各种关键词生成模型的描述文件: PaperSurvey/KeyphraseGeneration at main · hyeseonko/PaperSurvey · GitHubList up ...
最新文章
- 利用ngxtop实时监控nginx的访问情况
- python3基础语法-Python3 - 基础语法
- Linux 信号随笔
- QuarkXPress 2020中文版
- TCP三次握手原理,你真的了解吗?
- UE4异步编程专题 - 多线程
- 国产自主可控的形式化验证代码自动生成工具ModelCoder可替代Matlab/Sumlink
- mysql5.0查询表_Mysql5.0查询表结构 | 学步园
- 2020华为软挑总结——baseline
- 打不开malloc和free函数
- Win10系统下如何安装鼠标指针主题包
- 马云创业过程中的10次失败(转)
- 最大化 LoRa 长距离,秘籍2:接收灵敏度
- adams打不开提示msc license_adams安装后打不开
- cygwin apt-cyg
- Java String类型入门 String str= abc god 中国 java反转每个单词
- “蚂蚁呀嘿” 刷屏的背后:算法工程师带你理性解构神曲
- 相约2023 | 第 20 期高级转录组分析和R数据可视化火热报名中!!!
- 安卓上利用百度输入法提供的导入词库与个性短语,批量造词方便输入
- 我的浏览器 My Brower