机器如何生成文本?

2020 年 4 月 20 日 AINLP

Tips:本文对应着代码食用效果更佳,大家可以在我共享的colab上把玩,

📌  https://colab.research.google.com/drive/1csEB1DLXSOvpugz0kmKsEdEZ8qPzGABz

或者老规矩,NewBeeNLP后台回复「decoder」获取

写在前面

最近,由于在大规模语料集上训练的大型Transformer-based语言模型的兴起(如著名的OpenAI-GPT2模型),社区对开放式语言生成的兴趣日益增加。GPT2、XLNet、CTRL这些开放式语言生成的结果令人印象深刻,除了得益于优化的transformer架构和大量无监督的训练数据外,「更好的解码方法」也发挥了重要作用。

这篇文章我们简要概述了不同的解码策略,更重要的是代码演示了如何使用huggingface开源的「transformers库」轻松实现它们!

语言模型

自回归(auto-regressive)语言生成是基于这样一个假设,即整个序列的概率分布可以分解为下一个词条件分布的乘积,

其中 为初始上下文序列, 为你想要生成序列的长度(可调整)。

接下去我们将会详细介绍目前主流的解码方法,包括

  • Greedy search
  • Beam search
  • Top-K sampling
  • Top-p sampling

此外,为了防止枯燥的原理讲解,我们还会给出对应的实践代码。那就先让我们加载模型吧,这里以GPT2为例,

Greedy Search

「贪婪搜索」简单地选择具有最高概率的单词作为它的下一个单词,在每一步考虑,

下面的示意图清晰展示了贪婪搜索的工作原理,从单词「The」开始,该算法贪婪地选择下一个概率最高的单词「nice」,依此类推,最终生成的单词序列为 { “ The”,“ nice”,“ woman”},其总体概率为

接下去我们以初始上下文,("I", "enjoy", "walking", "with", "my", "cute", "dog")为例,来看看GPT2的贪婪解码效果。

haha,仅仅使用两行代码我们就可以利用GPT2生成一个简短文本。从生成结果可以看到,根据上下文生成的单词是合理的,但是模型很快就会开始重复。一般来说,这是语言生成中一个非常普遍的问题,尤其是在greedy search和beam search中。如果你想更深入了解,可以参考

  • Diverse Beam Search: Decoding Diverse Solutions from Neural Sequence Models [1]
  • Generating High-Quality and Informative Conversation Responses with Sequence-to-Sequence Models [2]

贪婪搜索的主要缺点是,它直接忽略了隐藏在低概率词后面的高概率词,如上图所示:

具有高条件概率0.9的单词{“ has”}隐藏在单词{“ dog”}后面,后者仅具有第二高的条件概率,因此贪婪搜索错过单词序列{“ The”,“ dog”,“ has”}。

为了缓解上面这个问题,我们可以使用beam search!

Beam Search

「Beam Search」 通过在每个时间步保留最可能的几个假设数,并最终选择总体概率最高的一组假设,从而降低了丢失隐藏的高概率单词序列的风险。举个栗子,我们设定num_beams = 2:

  • ,除了最可能的假设 {“ The”,“ woman”}外,beam search还跟踪第二个最可能的{“ The”,“ dog” };
  • ,beam search发现单词序列{“ The”,“ dog”,“ has”}的概率为 ,比{ “ The”,“ nice”,“ woman”}的概率大。

beam search将始终找到比greedy search具有更高概率的输出序列,但不能保证找到最可能的输出。让我们看看如何在transformers中使用beam search,可以看出,虽然结果相较于greedy search更流畅,但输出仍包含重复的相同单词序列。

一种简单可用的补救方法是引入「n-gram penalty」 。最常见的「n-gram penalty」 是通过将可能创建已经看到的n-gram的下一个单词的概率设置为0,来确保没有n-gram出现两次,可以参考

  • OpenNMT: Open-Source Toolkit for Neural Machine Translation [3]
  • A Deep Reinforced Model for Abstractive Summarization [4]

让我们通过设置no_repeat_ngram_size = 2来尝试一下,以免2-gram重复出现:Nice,看起来好多了!我们可以看到重复序列没有再出现。但是,必须谨慎使用「n-gram penalty」,例如在生成有关New York相关的文章不应使用「2-gram penalty」,否则城市名称在全文中只会出现一次。

beam search的另一个重要功能是,我们可以比较生成后的所有top beams序列,并选择最适合我们要求的已生成序列。

transformers中,我们只需将参数num_return_sequences设置为应返回的最高得分序列的数量即可。确保num_return_sequences <= num_beams

从结果可以看出,五个生成序列彼此之间只有些许不同,这在仅使用num_return_sequences=5时并不奇怪。

在开放式生成任务中,beam search可能并不是最佳选择,主要有以下几个原因:

  • beam search在机器翻译或摘要生成任务中表现较好,这是因为这些任务所生成的长度或多或少可预测的。但是,对于开放式生成任务而言,情况并非如此,在这种情况下,所需的输出长度会发生很大变化,例如对话和故事生成;
  • 我们已经看到,beam search严重受到重复生成的困扰。这很难用n-gram或其他惩罚来控制,因为要在强制的“不重复”和相同n-gram的重复循环之间找到良好的trade off,需要进行很多微调;
  • 在ICLR2019的一篇论文The Curious Case of Neural Text Degeneration [5]指出,高质量的人类语言不会遵循高概率的下一个单词的分布。换句话说,作为人类,我们希望生成的文本使我们感到惊讶,而不是无聊或者可预测的,作者通过绘制概率图很好地证明了这一点。

哈哈,既然这样,那让我们停止无聊并加入一些随机性!

Sampling

「采样」意味着随机选择下一个单词,主要考虑其条件概率分布:

以上面的示例为例,下图是采样时语言生成的可视化。很明显,使用采样生成语言已不再是确定的了, 从条件概率分布 中采样单词出单词“ car”,然后从 中采样出单词“ drives”。

transformers中,我们设置do_sample = True并通过top_k = 0停用Top-K采样(稍后会详细介绍)。在下文中为了方便说明,我们设置random_seed = 0,可以随意更改random_seed来尝试不同的生成效果。尝试读一遍文本,会发现似乎还不错,但是仔细观察时,这并不太连贯和通顺。(怎么突然就"kill anybody"了,害怕) 在对单词序列进行采样时,会有一个大问题:这些模型经常产生语无伦次的胡言乱语,参考ICLR2020的一篇论文The Curious Case of Neural Text Degeneration[6]

一个技巧是使分布 通过降低softmax temperature来提高锐度,即增加高概率单词的可能性并降低低概率单词的可能性。

对上面示例添加temperature后的可视化如下图,让我们来看看代码吧,看到了吗,奇奇怪怪的n-gram变少了,现在输出更加连贯了。使用temperature可以使分布的随机性降低,当将temperature设置为0 时,温度缩放的采样将等于贪婪解码,并且将遭受与以前相同的问题。

Top-K Sampling

来自FAIR的论文Hierarchical Neural Story Generation[7]介绍了一种简单但十分有效的采样策略,称为Top-K Sampling。在Top-K Sampling中,将挑选出K个最有可能的下一个单词,并且仅在这K个下一个单词之间重新为它们分配概率。GPT2就是采用了这种采样方案,这也是其生成故事效果不错的原因之一。

我们将上面示例中两个采样步中使用的单词范围从3个扩展到10个,以更好地说明Top-K采样。上述设置 ,将采样最有可能的6个单词,记为 。在第一步采样中, 包含了整体的2/3,第二步采样则包含了几乎全部,但是有效地去除了一些奇奇怪怪的单词。哇!这个结果可以说是我们一路下来最真实的文本生成。但是在使用Top-K采样时需要注意的一个问题是,它不会动态适应从下一个单词概率分布 。这可能是有问题的,因为某些单词可能是从非常尖锐的分布中采样的(上图右侧的分布),而另一些单词则是从更平坦的分布中采样的(上图左侧的分布)。

  • 在第一步采样中, Top-K Sampling策略排除了对 {“ people”,“ big”,“ house”,“ cat”}进行采样的可能性 ,这些似乎是合理的候选单词;
  • 另一方面,在第二步采样中,在单词样本池中包括可能不合适的下一个单词{“down”,“ a”}。因此,将样本池限制为固定大小 可能会危害模型以产生乱序的尖峰分布,并限制模型用于平坦分布的创造力。这一motivation激发了 Top-p-samplingnucleus-sampling,来自论文The Curious Case of Neural Text Degeneration [8]

Top-p (nucleus) sampling

在Top-p采样中,不是从仅最可能的K个单词中采样,而是从其累积概率超过一个阈值 的最小可能单词集中进行选择,然后将这组单词重新分配概率。这样,单词集合的大小(也就是集合中单词的数量)可以根据下一个单词的概率分布动态地增加或减少。上面的介绍有点枯燥,让我们来看看可视化图。上图示例设置 ,定义为 ,所有单词累计概率超过0.92的最小单词子集。在第一步采样中,包括了9个最有可能的单词,而在第二步采样中,只需选择前3个单词即可超过92%。其实很简单!上述过程可以看成,当下一个单词的可预测性不确定时,保留了较多的单词,例如 ;而当下一个单词看起来比较可预测时,只保留几个单词,例如 "car")。

Okay,code time!从理论上讲,Top-p似乎比Top-K更为优雅,但两种方法在实践中均能很好地work, Top-p也可以与Top-K结合使用,这可以避免排名很低的单词,同时可以进行一些动态选择。让我们来看看综合使用Top-K和Top-P的生成效果,

随便唠唠

  • 从我们上述实验看起来,Top-K和Top-P采样的方式似乎比传统的greedy search和beam search在开放式语言生成上效果要好;
  • 不过,有研究表明NEURAL TEXT DEGENERATION WITH UNLIKELIHOOD TRAINING [9],greedy search和beam search的明显缺陷(产生重复的单词序列)主要是由模型训练方式而不是由解码方法引起的,当调整模型训练目标后,beam search可以生成比Top-P更流畅的文本;
  • 在论文Consistency of a Recurrent Language Model With Respect to Incomplete Decoding [10]中指出,Top-K和Top-P采样策略也会存在生成重复序列的缺陷;
  • 最后,开放语言生成是一个快速发展的研究领域,通常情况下没有一种千篇一律的方法,因此必须了解哪种方法在特定的用例中最有效。

本文参考资料

[1]

Diverse Beam Search: Decoding Diverse Solutions from Neural Sequence Models: https://arxiv.org/abs/1610.02424

[2]

Generating High-Quality and Informative Conversation Responses with Sequence-to-Sequence Models: https://arxiv.org/abs/1701.03185

[3]

OpenNMT: Open-Source Toolkit for Neural Machine Translation: https://arxiv.org/abs/1701.02810

[4]

A Deep Reinforced Model for Abstractive Summarization: https://arxiv.org/abs/1705.04304

[5]

The Curious Case of Neural Text Degeneration: https://arxiv.org/abs/1904.09751

[6]

The Curious Case of Neural Text Degeneration: https://arxiv.org/abs/1904.09751

[7]

Hierarchical Neural Story Generation: https://arxiv.org/pdf/1805.04833.pdf

[8]

The Curious Case of Neural Text Degeneration: https://arxiv.org/abs/1904.09751

[9]

NEURAL TEXT DEGENERATION WITH UNLIKELIHOOD TRAINING: https://arxiv.org/pdf/1908.04319.pdf

[10]

Consistency of a Recurrent Language Model With Respect to Incomplete Decoding: https://arxiv.org/abs/2002.02492

- END -


推荐阅读

AINLP年度阅读收藏清单

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

当当的羊毛,快薅,这一次要拼手速!

数学之美中盛赞的 Michael Collins 教授,他的NLP课程要不要收藏?

自动作诗机&藏头诗生成器:五言、七言、绝句、律诗全了

From Word Embeddings To Document Distances 阅读笔记

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

这门斯坦福大学自然语言处理经典入门课,我放到B站了

可解释性论文阅读笔记1-Tree Regularization

征稿启示 | 稿费+GPU算力+星球嘉宾一个都不少

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


登录查看更多
0

相关内容

近期必读的5篇顶会WWW2020【推荐系统】相关论文-Part2
专知会员服务
69+阅读 · 2020年4月7日
机器学习速查手册,135页pdf
专知会员服务
340+阅读 · 2020年3月15日
【Amazon】使用预先训练的Transformer模型进行数据增强
专知会员服务
56+阅读 · 2020年3月6日
BERT进展2019四篇必读论文
专知会员服务
67+阅读 · 2020年1月2日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
【综述】关键词生成,附10页pdf论文下载
专知会员服务
52+阅读 · 2019年11月20日
注意力机制介绍,Attention Mechanism
专知会员服务
168+阅读 · 2019年10月13日
强化学习最新教程,17页pdf
专知会员服务
174+阅读 · 2019年10月11日
【LinkedIn报告】深度自然语言处理的搜索系统,211页pdf
专知会员服务
107+阅读 · 2019年6月21日
论文浅尝 | 通过文本到文本神经问题生成的机器理解
开放知识图谱
10+阅读 · 2019年6月30日
如何使用注意力模型生成图像描述?
AI研习社
9+阅读 · 2018年8月6日
如何匹配两段文本的语义?
黑龙江大学自然语言处理实验室
7+阅读 · 2018年7月21日
精进 | BooNik使用人工智能生成有趣的东西
商业周刊中文版
3+阅读 · 2018年6月5日
实践 | 如何使用深度学习为照片自动生成文本描述?
七月在线实验室
10+阅读 · 2018年5月21日
教程 | 如何使用深度学习执行文本实体提取
机器之心
4+阅读 · 2018年4月8日
【教程】如何使用深度学习为照片自动生成文本描述?
GAN生成式对抗网络
20+阅读 · 2017年11月19日
一种基于Sequence-to-Sequence的高质量对话生成方法
科技创新与创业
9+阅读 · 2017年11月13日
利用深度强化学习进行对话生成
PaperWeekly
9+阅读 · 2017年8月23日
Arxiv
5+阅读 · 2019年10月31日
Arxiv
5+阅读 · 2019年8月22日
Sparse Sequence-to-Sequence Models
Arxiv
5+阅读 · 2019年5月14日
Arxiv
7+阅读 · 2018年1月30日
Arxiv
5+阅读 · 2015年9月14日
VIP会员
相关VIP内容
近期必读的5篇顶会WWW2020【推荐系统】相关论文-Part2
专知会员服务
69+阅读 · 2020年4月7日
机器学习速查手册,135页pdf
专知会员服务
340+阅读 · 2020年3月15日
【Amazon】使用预先训练的Transformer模型进行数据增强
专知会员服务
56+阅读 · 2020年3月6日
BERT进展2019四篇必读论文
专知会员服务
67+阅读 · 2020年1月2日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
【综述】关键词生成,附10页pdf论文下载
专知会员服务
52+阅读 · 2019年11月20日
注意力机制介绍,Attention Mechanism
专知会员服务
168+阅读 · 2019年10月13日
强化学习最新教程,17页pdf
专知会员服务
174+阅读 · 2019年10月11日
【LinkedIn报告】深度自然语言处理的搜索系统,211页pdf
专知会员服务
107+阅读 · 2019年6月21日
相关资讯
论文浅尝 | 通过文本到文本神经问题生成的机器理解
开放知识图谱
10+阅读 · 2019年6月30日
如何使用注意力模型生成图像描述?
AI研习社
9+阅读 · 2018年8月6日
如何匹配两段文本的语义?
黑龙江大学自然语言处理实验室
7+阅读 · 2018年7月21日
精进 | BooNik使用人工智能生成有趣的东西
商业周刊中文版
3+阅读 · 2018年6月5日
实践 | 如何使用深度学习为照片自动生成文本描述?
七月在线实验室
10+阅读 · 2018年5月21日
教程 | 如何使用深度学习执行文本实体提取
机器之心
4+阅读 · 2018年4月8日
【教程】如何使用深度学习为照片自动生成文本描述?
GAN生成式对抗网络
20+阅读 · 2017年11月19日
一种基于Sequence-to-Sequence的高质量对话生成方法
科技创新与创业
9+阅读 · 2017年11月13日
利用深度强化学习进行对话生成
PaperWeekly
9+阅读 · 2017年8月23日
Top
微信扫码咨询专知VIP会员