论文标题:

POINTER: Constrained Text Generation via Insertion-based Generative Pre-training

论文作者:

Yizhe Zhang (MSR), Guoyin Wang (Duke), Chunyuan Li (MSR), Zhe Gan (MSR), Chris Brockett (MSR), Bill Dolan (MSR)

论文链接:

arxiv.org/pdf/2005.00558


非自回归生成有着更高的效率,但是,当前鲜有研究针对非自回归生成模型的预训练方法。

本文提出一种新的基于插入的非自回归预训练方法,用动态规划构造训练数据,并使用新的beam search方法,实现log级别的非自回归生成。在两个硬约束数据集上的实验表明,该方法比起基线模型有大幅提高

硬约束文本生成与非自回归预训练

约束性文本生成(Constrained Text Generation)是文本生成中非常重要的部分,可以分为两类:软约束生成(Soft-Constrained)和硬约束生成(Hard-Constrained)。

软约束生成就是给定一些关键词(或关键信息),生成的文本要包含给定的关键内容,但不一定要完全包括。

硬约束生成就是要完全包含给定的词汇,不允许删除。

结合这两年得到广泛研究的基于插入的非自回归生成,我们可以很容易把这种方法应用到硬约束文本生成上,因为基于插入的非自回归方法有两个优点:

  • 它不删除给定的词汇,而是不断增加新词,符合硬约束的要求;

  • 它可以有log级别的生成效率。

下图是硬约束插入式非自回归生成的一个例子。给定的关键信息是,经过4次迭代,每次迭代新插入的词为蓝色,模型最终生成了期望的句子

此外,由于这种插入的方法非常类似BERT的掩码预训练方法,所以,我们完全有可能像BERT那样,为插入式非自回归模型进行类似的预训练,从而利用大规模无监督语料,提高硬约束生成的效果。这就是本文的主要创新点。

总的来说,本文有以下贡献:

  • 提出POINTER——一种插入式非自回归预训练模型,并能用BERT初始化;

  • 基于POINTER使用一种简单但有效的Beam Search方法,进一步提高效果;

  • 在两个硬约束生成数据集上,POINTER实现了显著的效果,并且有着最高的生成效率。

非自回归预训练

本节介绍POINTER的模型、训练及推理方法。首先介绍符号。记原始输入的硬约束为,第轮模型生成的句子是,最后生成的句子是。由于模型是以插入的方法生成的,从而前一轮的句子是下一轮生成句子的子序列。

模型建模最终句子的概率可以表示为:

所以,在每一轮,模型就是要根据前一轮生成的句子去选择要在哪里插入哪些词。在介绍生成步骤之前,首先来介绍一下如何构造训练数据。

训练数据构造

对于一个完整的句子,我们想要构造一个生成序列,相邻每一对就是一个训练实例。

由于我们想要让动词、名词等实词首先生成,而形容词、副词、助词等词最后生成,我们首先就要构造出符合这个模式的训练实例。

为此,我们对句子的每个词给一个重要性得分(importance score),它通过如下方式计算:

其中,是词的TF-IDF得分,是词的Part-of-Speech得分,是词的YAKE得分。YAKE是一种无监督关键词抽取方法。

在这个得分公式中,越高,表示词就越重要,它就要首先生成。注意到每个得分都归一化到[0,1]之间。

在得到句子中每个词的重要性得分之后,我们就可以逆序构造训练实例了。

具体来说,首先对源句子,从中抹去得分较低的一部分词,得到

然后再对中剩下的词,再抹去一部分得分较低的词,得到,以此类推,得到初始句子。这里停止的标准是只剩不到个词。

那么,现在的问题是,怎么决定每次要抹去哪些词。换句话说,要选择保留哪些词,它们要满足某些条件,要达到怎样的优化目标。本文使用下面的公式计算:

这里是当前句子的长度,表示第个词被抹去,表示这个词被保留,并且约束是,不能有连续两个词被抹去。

为了求解上述公式,本文使用了一种动态规划算法。

注意到,原文上述公式中的max是min,笔者认为是笔误,否则上述公式就有一组平凡解。这个公式既鼓励重要的词首先生成,又鼓励尽可能多地生成词(越多越好)。

然而,根据文本描述,笔者在此处有一个疑问:对于约束“不能有连续两个词被抹去”。

原文给出的解释是“The reason for this constraint is that the insertion-based generation only allows maximally one new token to be generated between two existing tokens”。

也就是说,由于插入式模型一次只能在相邻词之间插入一个字符,所以在这里我们也不能一次抹去相邻两个字符。

但是实际上,即使抹去连续的词,这些词仍然可以在对数时间内以插入的方式生成。

训练

在得到训练实例后,就作为模型的输入,让模型去生成。回忆插入式生成,首先选择一个槽(slot,即相邻词之间的那个空位),然后生成该槽的词。

重新组织一下,就可以统一为:对当前输入的每个词,去预测“紧跟在”它后面是否要插入一个词,要插入哪个词。

这又可以进一步统一为:去预测词典中的一个词,这里是一个特殊词,表示实际上不插入。

为了表示就是最后的句子,额外构造一个训练实例,其中的长度和相同,而且每个词都是[NOI]。

也就是说,当作为输入的时候,模型需要为每个词输出[NOI],也就表示在每个词后面我们不再插入新词了,也就表示生成结束。

下图是模型生成的一个例子。

由于这个插入的过程和BERT预训练的方式一样,我们可以首先用BERT去初始化POINTER,然后再使用其他语料去预训练POINTER。

训练目标就是对每个训练实例,优化它的对数似然。

推理

在推理的时候,如果一个词后面生成了[NOI]且生成过程没有结束,那么在下一轮,这个[NOI]就不必再插入进去,因为它实际上表示的是没有插入。

在解码的时候,对每个位置,可以选择用Greedy Decoding或者Beam Decoding。本文提出Inner-Layer Beam Search (ILBS),进一步提高生成的效果。

具体来说,从左到右,对每个词,首先得到它预测的top-B个词,然后rank当前B个候选句子的得分,取其中最大的一大作为当前插入的词,然后继续往右走到下一个位置,直到最后一个位置,保留B个候选句子。

实验

本文在数据集EMNLP2017 WMT News和Yelp English Review上实验,预训练数据集为12.6G的Wikipedia,实验细节详见原文。

实验过程大致是首先按照预训练数据集的构造方法构造训练、验证和测试集,以此评估模型的硬约束生成能力。

下面两个表分别是在News和Yelp上的实验结果,可以看到,在NIST、BLEU、METEOR、PPL得分上,POINTER相比基线模型取得了显著的提升,而Dist评估的是模型生成的多样性,且基线模型CGMH和NMSTG是基于采样的方法,自然在Dist得分上也就比POINTER高。

另外一个值得关注的点是,POINTER生成的生成的句子长度更加接近人类。最后,使用POINTER预训练可以显著提高生成文本的流畅度。

下表是人工测评的结果。在语义度、流畅度和信息度上,POINTER都显著好于基线模型,但仍然和人工写作的文本有所差异。

下图是数据集Yelp上的两个具体例子。和基线模型相比,POINTER生成的句子不但考虑了所有的硬约束,并且句子更加通顺流畅,也更加符合硬约束的原义。

在推理时间方面,在1000个句子上,CGMH需要33小时,NMSTG需要487秒,而POINTER只需要67秒,具体显著的速度优势。

小结

本文提出POINTER——一种用于硬约束生成的插入式非自回归生成的预训练方法。使用BERT初始化、POINTER预训练和Inner-Layer Beam Search,POINTER在两个数据集上取得了显著的效果提升,而且具有效率优势。

未来关于非自回归模型预训练的研究可以有以下方向:

  • 更加通用的预训练:不仅仅是插入式的预训练,而且是适用于各种任务的预训练方法,还可以探索适用在NMT上的预训练方法;

  • 更加高效的预训练:POINTER是对数级别的预训练,未来可以像BERT那样将其降低到常数级;

  • 更加简单的预训练:POINTER的预训练需要人工构造训练数据,本质也是用规则指定了训练的方向,如何设计像BERT一样简单有效的自动预训练方法,是今后非自回归预训练研究的一大重点。

????

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

关于PaperWeekly

PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。

非自回归也能预训练:基于插入的硬约束生成模型预训练方法相关推荐

  1. 【发展史】自然语言处理中的预训练技术发展史—Word Embedding到Bert模型

    目录 自然语言处理中的预训练技术发展史-Word Embedding到Bert模型 1 图像领域的预训练 2 Word Embedding考古史 3 从Word Embedding到ELMO 4 从W ...

  2. 《预训练周刊》第40期: 量子预训练、千层BERT与GPT

    No.40 智源社区 预训练组 预 训 练 研究 观点 资源 活动 周刊订阅 告诉大家一个好消息,<预训练周刊>已经开启"订阅功能",以后我们会向您自动推送最新版的&l ...

  3. 《预训练周刊》第55期:中文预训练进展、大模型泛化、模型下游性能预测

    No.55 智源社区 预训练组 预 训 练 研究 观点 资源 活动 周刊订阅 告诉大家一个好消息,<预训练周刊>已经开启"订阅功能",以后我们会向您自动推送最新版的&l ...

  4. 预训练语言模型(四):ELMo模型

    目录 ELMo模型 模型结构 公式 参考一个很全的总结: 预训练语言模型的前世今生 - 从Word Embedding到BERT ELMo也参考了这个: [NLP-13]ELMo模型(Embeddin ...

  5. LLM-大模型训练-步骤(二)-预训练/Pre-Training(1):全参数预训练(Full-Param Pre-Training)【对LLaMA等模型进一步全量参数预训练】【中文无监督学习语料】

    GitHub项目:KnowLM 一.全参数预训练(Full-Param Pre-training) 使用中文语料对LLaMA等模型进行进一步全量预训练,在尽可能保留原来的英文和代码能力的前提下,进一步 ...

  6. JCIM| 基于双向RNN的分子生成模型

    今天给大家介绍的是被誉为"欧陆第一名校"苏黎世联邦理工学院(ETH Zurich)化学与应用生物科学系博士生Francesca Grisoni和制药行业顾问Gisbert Schn ...

  7. 如何利用gradio部署基于bert4keras的小说随机生成模型

    from __future__ import print_functionimport os os.environ['TF_KERAS'] = '1' # 必须使用tf.keras import gl ...

  8. ACM SIGKDD | MoFlow:基于流的分子图生成模型

    今天给大家介绍的是康奈尔大学医学院(Weill Cornell Medicine)健康科学系(Department of Population Health Sciences)的博士后研究助理臧承熙于 ...

  9. 预训练语言模型整理(ELMo/GPT/BERT...)

    预训练语言模型整理(ELMo/GPT/BERT...)简介 预训练任务简介# 自回归语言模型# 自编码语言模型 预训练模型的简介与对比 ELMo 细节# ELMo的下游使用# GPT/GPT2# GP ...

最新文章

  1. 服务器何时取得客户端信息,HttpRequest获得服务端和客户端的详细信息
  2. 德国再出颠覆性发明,这次要安排我们的快递
  3. 【javascript】javascript设计模式mixin模式
  4. 洛谷 P1340 兽径管理
  5. js 页面所有超链接后加随机数 基于jquery
  6. SQL count和case when配合统计给定条件下不重复的记录数
  7. redis系列:通过队列案例学习list命令 1
  8. 我们分析了50万条拼多多商品数据,告诉你到底是消费升级还是降级?
  9. 解决复杂多数据源报表的5种通用办法
  10. python调用接口获取文件_python接口文件使用说明
  11. 如何使用Action.Invoke()触发一个Storyboard
  12. Mybatis_day2_Mybatis的参数深入
  13. Java 反射机制 是什么
  14. 【排序(C++实现)】:二分归并排序
  15. 计算机辅助机械设计a卷,二维CAD工程师(机械设计)考试A卷
  16. 饥荒联机版服务器重置,饥荒联机版服务器重置世界 | 手游网游页游攻略大全
  17. uni-app引入阿里云矢量图标库
  18. UWP开发入门(八)——聊天窗口和ItemTemplateSelector
  19. Cabbage教学(2)——类型转换与字符串操作
  20. C++ XML操作类

热门文章

  1. 前端常见知识点一之HTTP
  2. 详解css样式处理的优先级
  3. u3d:强大的dotween。使用dotween处理延时问题,最最最最简单的办法
  4. pyenv 让 python 版本完美切换
  5. 【可持久化线段树?!】rope史上最全详解
  6. 退出循环:break 跳过当前的这次循环,直接开始下一次循环:continue
  7. 步步为营-72-asp.net简单练习(通过webForm实现一些简单实例)
  8. 性能测试篇 :Jmeter监控服务器性能
  9. C#实现异步消息队列
  10. Screen会话命令 Linux