Seq2seq框架下的文本生成

前言文本生成 , 旨在利用NLP技术 , 根据给定信息产生特定目标的文本序列 , 应用场景众多 , 并可以通过调整语料让相似的模型框架适应不同应用场景 。本文重点围绕Encoder-Decoder结构 , 列举一些以文本摘要生成或QA系统文本生成为实验场景的技术进展 。
Seq2seq框架2014年NLP界有两份重要的成果 , Learning Phrase Representations using RNN Encoder–Decoder for Statistical machine Translation和Sequence to Sequence Learning with Neural Networks 。虽然在Decoder的输入上有差别 , 但结构上两者都将Encoder-Decoder结构应用在翻译场景中 , 并由此开始 , seq2seq框架在机器翻译 , 对话生成等领域中占据重要位置 。另外 , 前者首次提出GRU结构 , 后者采用Beam Search改善预测结果 , 这些都成为如今seq2seq框架的基础技术元素 。
随后 , Bahdanau在Neural Machine Translation by Jointly Learning to Align and Translate中提出了融合attention和seq2seq结构的NMT模型结构 , 至此 , 由Encoder-Attention-Decoder组成的seq2seq框架正式形成 。

Seq2seq框架下的文本生成

文章插图
 
atention-seq2seq如上图所示 , 红色部分为Encoder模块 , 用于编码输入文本 , 计算状态值作为黄色的Decoder模块的初始状态;蓝色部分是Attention机制 , 结合Encoder模块和Decoder输入计算Context向量;最终Decoder部分结合Encoder的输入状态 , Context向量 , 以及Decoder的历史输入 , 预测当前输出对应于词典的概率分布 。
融合关键输入信息了解机器翻译或生成任务的朋友都知道 , 无论Seq2seq模型多么复杂 , 最后都是用类似softmax的结构输出概率向量 , 然后映射到词典中某个词的的index , 所以词表中没有的oov是无法被预测的 。不同于机器翻译的是 , 摘要生成这类任务产生的摘要中很可能需要输入文本的信息 , 且通常会是某些关键词句 , 我们当然不希望因为词典中没有就丢失这些关键信息 , 因此需要想办法利用到输入文本中的信息 。
  • Pointer Networks
本文并没有解决上面提到的OOV问题 , 而是试图利用seq2seq处理特定的序列问题 。我们已经提到 , 传统seq2seq结构的输出由类似词汇表的某个元素映射表确定 , 这样就无法应对词汇表随输入变动的情况 , 例如凸包问题 , 给定包含一组坐标点的序列 , 预测构成凸包的点集 , 此时词汇表的元素应该完全由输入构成 , 显然传统seq2seq无法处理 。本文作者提出了一种精巧的 , 比传统attention-seq2seq更简单的pointer-net
作者的思路很简单 , 输出完全由输入决定 , 其实就是让输出指向某个输入 , 或者说就是预测输入的位置 , 这样最后预测概率向量的维数就是输入序列的长度 , 你再看attention的计算过程:
Seq2seq框架下的文本生成

文章插图
 
第一行结合了输入和输出的编码信息 , 第二行计算了输入序列的权重 , 这个权重不就是输入序列的概率向量么?没错就这么简单!对于找凸包 , Delaunay三角剖分 , 旅行商问题等这类输出序列完全依赖输入序列的问题 , pointer-net可以给出很精巧的解决方案 。
此外 , 可以看到 , 虽然pointer-net没有直接解决OOV问题 , 但针对输出依赖输入的问题给出了一个很好的思路 , 下面的模型在考虑依赖输入OOV问题时多少都受到了pointer-net的启发 。
  • Incorporating Copying Mechanism in Sequence-to-Sequence Learning
本文提出的copy-net目标非常明确 , 就是构造一种copy机制解决上面提到的与输入相关的OOV问题 。特别是摘要、对话生成这类问题 , 输入文本中一些词可以通过传统方式预测 , 另一部分词则可以直接复制在输出文本中 , 所以copy-net最终的词概率预测由两部分组成 , generate-mode和copy-mode , 分别用于传统的预测和copy词的预测 。
Seq2seq框架下的文本生成

文章插图
 
上图展示了copy-net , 左边是传统的attention-seq2seq结构 , 右边包含了copy-net全部改进思路 。红框中展示了结合generate-mode和copy-mode的输出词预测 , 下面的蓝框包含了针对Decoder编码状态值的改进 。


推荐阅读