摘要
近年来,文本生成在不同的环境中取得了显著的进展,例如从零开始生成文本以及正在出现的恢复和重写的方式。填充句子或段落中缺失的文本部分的文本填充技术在现实生活中也有很多用途,但还没有得到充分的探索。以前的工作要么一个缺失部分就是一个单词,要么就是缺失部分一定在末尾。本文研究文本填充的一般任务,其中输入文本可以有任意数量的部分要填充,每个部分可能需要任意数量的mask标记。我们研究了各种不同的方法来完成这项任务,包括一个self-attention模型,它具有segment-aware的位置编码和双向上下文模型。我们通过用不同的策略mask文本来创建大量的监督数据。实验表明,self-attention大大优于其他模式,为未来的研究创造了坚实的基础。
1 导言
文本生成跨越了一系列旨在从输入数据中生成自然语言的任务,包括机器翻译、摘要、对话等。以往的工作在不同情况下的文本生成方面取得了显著的进展。例如,最常见的设置是从头开始生成整个文本序列,最近的工作开始利用恢复的参考来帮助生成,也有一些工作通过操控给定文本的特殊方面来生成。
文本填充,即填充句子或段落中缺失的文本片段,在现实生活中也是一种常见的应用,可用于许多内容,如恢复历史或陈旧的文档、用模板撰写合同或文章、文本编辑等。文本填充的探索较少,或者在简化和受限的环境中进行过研究。 例如最近的MaskGAN和句子完成任务,只假设句子的缺失部分只有一个单词。这种假设不能满足一般的文本填充的要求,因为一般文本缺失的部分并不是定长的。其他工作假设缺失部分在句子末尾,生成的是给定句子的延续。这些技术并不能用到真实场景中,因为缺失的部分往往是随机的。
考虑到输入文本可能有任意数量的缺失部分,每一个缺失部分可能有任意数量的缺失单词。这个任务要去根据全局和周围的文本来填充缺失的部分,并且使文本完善以及具有意义。比如,给定这样一个不完整的句子(我们称之为模板)“____have a ______,please."输出可以为 Can I have a beef burger with cheddar, please."这种如此一般化,不受限的文本填充设置从未被研究过。
我们对这个问题做了一些探索,比如使用attentional seq2seq模型和基于GAN的方法。为了更好地捕捉缺失部分的全局和周围的文本,我们使用了self-attention模型。并且使用segment-aware位置编码来确保当有多段缺失部分中有变长的缺失词汇时时候的定位准确性。
我们以多种具体的设置进行了诸多的实验,数据对象是随机或者有计划地以一定比例mask掉变长数量段落的文本。
有趣的是,目前的工作与文本表示学习使用一个类似的模型和训练对象。利用预训练模型(bert)在文本填充中是我们未来的工作方向。
2 相关工作
3 文本填充
3.1 问题定义
就是给定一个段落要填充空白部分
如上图所示就是要预测两个m的部分,空白处的位置和数量都是已知的,但是缺失词的数量并不知道,我们要自己决定可以生成多少词。
3.2 Preliminary Solutions
我们用三种方法seq2seq,GAN和self-attention,主要描述self-attention方法。
我们认为self-attention最适合填充任务,因为他(与只能从左往右不同)可以注意到空白部分的左右双向,来对全局语义做一个有效的encoding。
模型就是一个简单的self-attention网络,在空白处一个词接着一个词生成。每次当要生成一个词的时候,模型会关注所有已经知道的词汇(包括本来就有的词和已*9经生成的词),然后计算要写的词汇的概率分布。当一个特殊标记<end-of-blank>生成的时候,模型就开始填充其他的空白部分。
这里我们要使用position encoding,但是在文本填充任务中,每一个空白都有一个任意的数量位置的填充词汇,很难用传统的单个单词索引一个向量的方法。我们使用每段的id和单词在段落中的位置一起来定位每一个单词。比如一个位置索引(2,1)可以表示第二段的第一个词。
更多细节已经在附录中。seq2seq模型也是逐渐生成填充词汇的。GAN模型在seq2seq上添加了一个判别器来帮助全局的语义统一。
4 Experiments
我们目的是研究以上几种方法对于文本填充的效果。我们用几种不同的策略来生成监督学习数据集,来训练模型生成原来的文本。
我们使用LSTM作为seq2seq的模型,并使用一个卷积网络作为GAN的判别器。这两个方法和self-attention一样使用position encoding。self-attention模型有6个模块。附录B中有更多细节。
4.1 Varying Mask Rates and #Blanks
我们首先研究mask rate和空白数量在模型性能上的影响,直觉来说,这个比例越大任务越难。我们选择Yelp评论数据集制作数据集,大小是104k/1k为训练集和测试集,词表大小为9k。
Quantitative and Human Evaluation
我们同时用一些评估指标和人力来评价模型性能。对于人力评估,我们分别用三个模型填充一个数据,然后让人力评价,最好为3分,接着为2分,1分。
从下表中,分别是BLUE和PPL标准还有人力标准。我们可以发现双向文本模型最好。
Samples:下面是一个例子,我们可以发现self-attention的最好。
4.2 Long Content Infilling
我们接着评估模型在只有一两个词汇下的长文本填充能力。这里我们mask文本以一定的策略来模仿真实场景。我们分别用格林童话和NBA报道作为数据集。
Quantitative and Human Evaluation
我们依旧用上面的方法来评估模型,不过用的是增加过的mask rate。因为答案过于开放,BLUE失去了意义。我们可以看到self-attention的生成文本更加有意义。结果如下图。
附录:
A more Details of Text Infilling Self-Attention Model
这里我们描述一些self-attention模型在这里的细节
A.1 Notations
我们先介绍如下符号的意思。
__m__是一个blank的placeholder,其中一行数据中会有多个词被mask掉。我们使得生成的句子和整个句子用不同的开始和结束标记,我们用<bob>和<eob>称为每个blank的开始和结束标记,<bos>和<eos>标记整个句子的开始结束标记。
对于输入序列x=(s1,s2,...,sn),si代表第i个输入segment。我们使
使
A.2 Approach
图2描述了我们模型的整体架构。我们模型的基础是一个multi-head self-attention token decoder,它可以考虑到过去和未来的信息。
A.2.1 Template
假设在一个模板中,segment i 和segment j(i<j)被mask。模板的初始状态为
A.2.2 Position Encoding
每个词的位置都由段id segid和段内位置offset id决定。我们用sin和cos函数来作为position encoding
其中i是维度,
A.2.3 Applications of Attention
本文架构如上图,attention的做法完全和谷歌论文attention is all you need一模一样。
不同的地方在于,template是一句话,然后可能有两个空白。将两个答案合在一起,做个masked的self-attention(只能看到当前预测词之前的信息),然后以这个结果作为query。另外一边,那句话(带有两个占位符)作为key和value,再做一次attention,再经过一个FF就得到了一层的输出。下一层的query来源于上一层的输出再经过一个self-attention,key和value不变。然后重复这一过程。这就是训练过程。
A.2.4 Training
在填充过程中,decoder会一个一个的进行填充。decoder自回归地填充,利用template和template中已经有的内容。为了填充第i个segment,目标是去减少交叉熵损失。
对于一个完整的句子来说损失函数是:
优化:ADAM优化器。对于第一个warmupsteps训练步骤,我们线性增加学习率,然后再减少。const=0.3,warmup_step=10000。
B.2 Training Process
B.2.1 Training Parameters
batch_size = 200
training_epoch = 150
C Other Experiments
接下来三图,分别是
表5:当mask率产生变化或者balnk有一处和两处的结果
表6,表7:长文本填充,其中表6只留名词和动词
表8:句子中只移除介词和冠词,发现基于rnn的模型很难学习到语法,而我们的模型可以。
有任何疑问或者纠错,作者随时在线哦
关注专栏