本文转自:作者:结构学AI
链接:https://www.jianshu.com/p/f4d8ca691397
来源:简书
引言
文本生成类任务应用场景广泛,挑战性强,随着Attention-Seq2seq,Copy-Net,GPT这类极具影响力的工作出现,以及CNN/DM,LCSTS这样大规模生成类数据集的提出,生成类任务的热度也逐渐攀升,ACL2019仅摘要生成就有20余篇(刘鹏飞博士对此做了非常详尽的总结),不过其成熟度还远不及文本匹配,实体识别这类任务,生成结果无关重复,丢失重点的现象依旧容易出现。本文基于摘要生成,重点考虑如何帮助模型生成特定领域的知识点,并简要介绍一些用于应对无关重复这类退化现象的方案。
基础生成
在语料充分时,神经网络"理解"文本句式的能力很强,生成结果也相对流畅,tensor2tensor这类成熟开源项目效果很好。但实际场景下数据量可能有限,开源项目的潜力不易发挥,Transformer也未必优于LSTM,因此,我们仍然选择基于LSTM的经典seq2seq结构。此外,受2015年pointer-net启发,2016年的copy-net让模型对文本段中的oov不再束手无策,在此基础上,google次年发布的pointer-generator大大简化了copy机制的过程,同时提出了coverage机制应对生成重复问题,CNN/DM数据集也出自本文。对比一些开源项目后,我们也以本文结构作为baseline。
Get To The Point: Summarization with Pointer-Generator Networks
本文模型结构简洁,思路清晰,与基础的seq2seq比较非常方便,在这两年很多摘要生成工作中都作为baseline出现,表现不俗。作为一个子任务工作,项目star已达1.5k+,也说明一定影响力。
文中用attention作为分布的方法,就源于2015年的pointer-net:
Pointer-net直接用attention结果a^t作为分布预测生成点,生成结果必定出现在原文中。所以这种方法可以让模型生成原文中出现的OOV词,另外还可以强化部分词在分布中的概率。从笔者的实验来看,在数据量有限时,seq2seq能力欠佳,叠加attention带来的收益相当可观。
此外,本文所用的coverage机制指的是用covloss来惩罚重复现象,即:
不难理解,c就是之前attention分布的叠加,所以之前的重复位置i会强化向量c的第i维,显然累积分布越分散covloss就越小,这样,covloss就起到了惩罚作用。
融入实体知识
知识的表示和融合可以说是几乎所有NLP任务的扩展方向,毕竟完全依赖神经网络黑箱潜力的方向即便可行,恐怕也因计算资源限制将多数团队拒之门外(例如Google最新的 T5)另外我们也认为,特别对于很多垂直领域,专业知识带来的收益是很大的。在医疗方向的摘要生成上,我们同样希望能借助实体知识提升模型能力。
其实考虑实体知识特征的生成类工作已有不少了,最容易想到的大致有实体,模版以及主题,下面将简要介绍与这三种相关的工作。
Neural Question Generation from Text- A Preliminary Study
无论是依靠知识图谱,还是借助BERT类模型在NER任务上的良好表现,实体特征的获取应该都很容易实现。在文本分类相关任务中,融合外部特征的常见做法,就是编码这些特征,然后选择不同的encoding层做concat,本文在问题生成任务中,对这类融合方式做了实验对比,模型结构上除了加入copy机制外,没有更多值得特别注意的改变。不过本文对concat各种特征做了实验比较,作者选取了word case,POS,NER,answer-tag作为额外特征,结果在下表中显示:
其中有几处指标变化值得关注,首先NQG+表示增加了copy机制,与NQG对比可见提升比较明显;此外下面与NQG对比,NER,POS,Case这三种的下降都不明显,似乎说明concat这几种特征效果并不好;最后Answer这一项效果显著,这是作者用类似NER的tag标识了问题中答案的部分,似乎这一特征起到了决定性的作用。
这样看来,直接concat特征,把麻烦交给编码器的思路并不可行,而影响巨大的answer特征也许是起到了"过滤"的作用,我们知道,生成摘要就是组织关键信息,直觉上过滤无用信息应该对生成模型有所帮助,或许借助知识特征进行过滤的思路值得试试。
BiSET: Bi-directional Selective Encoding with Template for Abstractive Summarization
模版往往是抽取式模型常用的方式,本文则是提出了利用模版过滤原文编码特征的方法。
思路和实现都很直白,就是常见的加入gate单元计算概率。图中的(b)就是(a)中的Selective模块,对输入文本段和模版分别编码,然后构造两个可训练的gate单元计算权重,最后的z就是过滤后的输入编码。
本文提供了另一个用外部特征进行过滤的思路,模型结构并不复杂,但构造模版并不轻松,需要结合应用场景考虑。相比之下,下面这种方法简单粗暴,却也能带来不错的效果。
Multi-Source Pointer Network for Product Title Summarization
当你用了pointer generator,又考虑融入实体知识特征时,就会自然想到这篇文章的做法。既然可以用attention作为分布强化原文中词的概率,那用在实体知识特征上当然也没问题。
特别对于垂直领域语料,模型准确生成一个领域实体词的价值远大于生成流畅的废话,本文是用于生成商品描述,我们则是用在医疗数据集上,目的都是让生成结果尽可能涵盖关键信息。相比于上面concat的做法,这里再用一次attention叠加的效果更明显。
<figcaption style="margin-top: 0.66667em; padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">实例-1</figcaption>
<figcaption style="margin-top: 0.66667em; padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">实例-2</figcaption>
<figcaption style="margin-top: 0.66667em; padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">实例-3</figcaption>
上面是pointer generator加实体attention叠加的生成结果,训练数据集不足时,通过抽取实体辅助生成,模型可以相对准的抓住原文的关键信息。
不过这种方法有一个麻烦,就是受实体特征的影响很大,毕竟关键词和实体词还是有差别的,基于BERT的NER模型可以覆盖相对完整的实体,但无法识别出哪些是关键词,而关键词的重要性更大于实体词,丢失了关键词很容易误导模型。因此,单纯的NER并不满足。
我们考虑主题的思路,但在pointer-generator的结构下,需要词一级的准确性,LDA并不满足,之后我们尝试了上一篇blog内介绍的方法(应用知识图谱的文本标签方法),在知识图谱和主题模型的共同帮助下,相比于仅用BERT,抽取关键词效果更好,生成结果错误生成/丢失关键词的现象也有所缓解。
退化现象
重复一直是文本生成类任务的通病,这在一些文章中被称为退化,我们也在寻找合适的应对方案,coverage机制就是一种方案,但并不足够,下面的工作介绍了另一种损失函数,在词和子句(ngram)两个点共同发力应对退化现象。
NEURAL TEXT DEGENERATION WITH UNLIKELIHOOD TRAINING
本文提出用Unlikelihood损失来惩罚重复生成(解决退化现象),其实基本通过标题就能想到,Likelihood是用来预测词表中的下一个生成词,Unlikelihood就是预测不想生成的词。
没错,最后损失函数就长这样,有一个词表表示不想生成的词,已经生成的词在里面可以缓解重复现象,还能根据不同需求加入一些词避免错误。在词级别的Unlikelihood基础上,作者还设计子句级的Unlikelihood,形式也基本一样,就是避免重复n-gram,各位感兴趣可以阅读文章附录的详细分析。
The Curious Case of Neural Text Degeneration
虽然本文相关的实验均基于续写类任务,但仍极具参考价值。该团队重点关注生成结果的多样性,并提出新生成方法,作者对比了beam search生成的概率分布与真人自然语言分布的差异,指出这种生成策略是产生重复现象的重要原因。
大家知道beam search可以看作视野更开阔的贪心搜索,即便是有窗口K,每一步仍然是选择累计概率高的词作为输出,正如图中黄线所示,这与蓝线表示的自然语言差异巨大,通常人们产生的语句是由高频日常用语和特定场景的低频词共同组成的。可以大致认为,beam search无法产生足够丰富的语句。
此外,作者还表示,倾向于最大概率的生成策略不仅在每一步丢失丰富性,还会累积地强化重复现象。不难想象,正因为重复的n-gram概率高,现有模型才容易变成结巴。
针对上述问题,作者提出用Nucleus Sampling替换主流的beam search作为生成策略。不同于之前的搜索方法,采样方法希望通过增加随机性来提高生成的丰富性,同时要注意降低生成低频词带来的语句错误。Nucleus Sampling又称Top-p Sampling,具体的,先设定一个概率阙值p ,将现有词概率由大到小排序,取累积概率值达到p的前N个词,重新计算softmax再从中采样。对比Top-k采样策略,Top-p限制了生成低频词带来的语句错误,这种方法也被应用在GPT-2生成上,感兴趣的读者可以参考其中的参数设定。
Non-Autoregressive
LevT: Levenshtein Transformer
我们一直奢望找到让生成模型更灵活的方法,传统的自回归模型,无论如何融入特征,基本框架都是编解码器提供历史向量编码,输出端计算词典概率p(x_t|x_old),能否让模型对输出端的token有更强的控制呢?本文提供了一种大胆的思路,从标题已经能看出,作者把编Levenshtein距离的操作和Transformer融合在一起做生成模型,输出端不仅要决定词本身,还要决定对词施加的操作。
LevT模型包含插入和删除两种操作,用Levenshtein距离作为回报函数指导模型选择操作。具体如上图所示,对于删除操作,模型仅需要做二分类抉择,而对插入操作,模型首先需要插入占位符,再从词典中选择插入词,下式描述了操作策略。
作者提出用模仿学习训练该策略模型。构造一个专家策略,从模型策略中采样序列作为输入,交给专家策略判断操作。专家策略有两种构造方法,一种是构造一个oracle,每次接收真实序列,返回最优操作a*,另一种可以训练一个字回归模型作为teacher,用beam search的生成结果作为真实序列。
个人认为,即便是在Non-autoregressive领域内,这应该也算是创新性非常强的工作了,可以对生成结果进行修改,操作策略也能自主学习,而且操作之间可以并行,速度并不慢。
总结
数据量有限时,pointer-generator可能比复杂的baseline或开源项目更适合,在此基础上,融合实体知识有更多可以参考的工作,此外结合实体知识后分词和词典整理之类的细节不容忽视。相比于语义匹配这类相对成熟的任务,文本生成类工作更难达到一个可以接受的结果,目前的模型都无法完全避免生成重复,生成错误,丢失关键点等问题,在应用场景中。如何应对重复问题,提高生成多样性依旧老生常谈但成效有限,另外Non-autoregressive方向有一些非常新颖的工作,除了上面提到的LevT外,还有一些从生成位置入手的工作值得学习,BERT之后的XLNet也针对Non-autoregressive有独特的设计,可见这一领域的潜力,最后评价指标一直是生成领域的弱项,也为应用。
引用
[1] Pointer Networks
[2] Incorporating Copying Mechanism in Sequence-to-Sequence Learning
[3] Get To The Point: Summarization with Pointer-Generator Networks
[4] Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
[5] Neural Question Generation from Text: A Preliminary Study
[6] BiSET: Bi-directional Selective Encoding with Template for Abstractive Summarization
[7] Multi-Source Pointer Network for Product Title Summarization
[8] 知识图谱如何应用到文本标签化算法中
[9] Neural Text Generation with Unlikelihood Training
[10] The Curious Case of Neural Text Degeneration
[11] Levenshtein Transformer