【深度学习】Neural Response Generation——关于回复生成工作的一些总结


一、背景1、两类方法
如前言所述 , 目前解决对话问题的方法是基于检索式的和基于生成式的两种 。 就检索式方法而言 , 其致力于建立模型刻画对话中的上文和下文之间的对应关系 , 通常的做法是先利用检索系统以对话上文为输入 , 得到一定数量的下文候选集 , 再对上下文进行大量的特征抽取 , 然后训练排序模型(Learning to rank)对候选集进行重排 。 由于这些对话都是数据集中真实存在的 , 所以检索式方法最终返回的结果在语言流畅性、语法正确性上有极高的保证 , 但由于数据集本身大小的限制 , 面对一个新的用户输入 , 可能无法得到一些合适的候选回复 , 从而无法做出合适的回答 。
而生成式方法则不同 , 借助于深度学习的相关研究 , 模型可以对对话本身进行学习 , 从而在面对用户输入时 , 生成新的回复 。 生成式方法大多使用的是Seq2seq的模型框架 , 即将对话的上下文看作两个序列 , 通过对上文序列进行编码 , 再解码出下文 。 借助于GAN和VAE等生成式模型的研究 , 有学者将其应用于对话系统 , 也取得了较好的效果 。
2、基础模型
本文之后介绍的论文及模型大多以Seq2seq模型为基础 , 配合以注意力机制(Attention Mechanism) , 在此进行一些简单的介绍 。
备注:本小节参考了李军毅在RUC智能情报站专栏中《从文本生成看Seq2Seq模型》一文 , 若想对Seq2seq模型有进一步了解可移步从文本生成看Seq2Seq模型 。
2.1 Seq2seq模型
该模型基本结构如下:
【深度学习】Neural Response Generation——关于回复生成工作的一些总结
本文插图

图1:Seq2seq模型的基本结构
该图摘自Google2015年在ICML Deep Learning Workshop[1] , 如图所示 , Seq2seq模型主要分为两个模块:编码模块(Encoder , 图中Context部分)和解码模块(Decoder , 图中Reply部分) 。 这两个模块通常使用RNN(包括LSTM和GRU)来实现 。 编码模块的作用是将对话的上文编码成固定长度的向量 , 而解码器的作用是利用该向量解码出对话的下文 。 图中ABC为上文句子中的三个单词 , 经过编码器编码后送入解码器中 。 解码器的第一个输入通常是一个开始标识符(或上文的结束符 , 即图中的) , 然后逐个生成下文的单词WXYZ 。
这里需要注意的是 , Seq2seq模型中的解码器在训练和预测阶段不太一样 。 在训练阶段 , 我们同时使用对话的上下文 , Decoder每个时刻的输入都是我们给定的下文 , 利用每个时刻的输出与给定下文的不同来计算损失(loss) , 再用反向传播的方法对模型进行训练 。 但在预测阶段 , 我们希望给出上文让模型来生成下文 , 所以Decoder每个时刻的输入都是它自身上个时刻的输出(除了第一个开始标识符) 。
2.2 注意力机制(Attention Mechanism)
从图中也可以看到 , Decoder实际上只接受了Encoder传来的一个固定大小的向量 , 一个很自然的想法是 , 这唯一一个向量是否真的能编码上文的所有信息 , 这时 , 我们就需要介绍一下注意力机制 。
这里十分推荐关于Attention Mechanism的两大经典论文 , 即Bahdanau Attention[2]和Luong Attention[3] 。 这里我们用Bahdanau Attention来介绍一下Attention的基本思想 。
【深度学习】Neural Response Generation——关于回复生成工作的一些总结
本文插图

图2:Bahdanau Attention
该图的下半部分实际上是Encoder(这里用的是双向RNN) , 而上半部分则是Decoder(只画了两个时刻) 。 可以看到 , Decoder端在每个时刻生成输出时 , 不再只使用Encoder最后一个时刻的输出了 , 即这种方法打破了Encoder只能传一个固定长度向量的限制 。 Decoder实际上可以获得Encoder每个时刻的信息 , 通过每个时刻的信息加权求和得到的向量来进行解码 。 这样做的一大好处是 , 对每个时刻而言 , 可以使用的信息是不同的 。 这也非常符合直观感觉 , 在对话中 , 我们回答中的每个词肯定都是和上文中的部分词相关的 , Attention即是这种相关性的一种体现 。


推荐阅读