教 Chatbot 生成更有营养的对话

Sequence to Backward and Forward Sequences: A Content-Introducing Approach to Generative Short-Text Conversation

https://arxiv.org/pdf/1607.00970.pdf

用一般的 seq2seq 框架来直接生成对话,经常会有类似“哈哈”、“我不知道”的话产生,虽然很连贯,但信息量太少,没有实际意义。那么,如何根据上文来生成相关的、有信息量的、甚至包括某个关键词的对话?本文或许会给出一些启发。


阅读笔记精选


xwzhong


paper 依旧是想就生成式对话中解决通用性回复的问题,思路比较简单,在 decoder 时,预选确定一个有意义的“词”,在一定出现该词的情况下进行扩充从而得到完整的回复,关键部分如下: 

1. train:对于一个完整的 post-resp 对,将“resp”随机选取一个 word 分割,前后部分设为 head 和 tail,对 head 部分 reverse,得到 post-rehead,post-tail 对,用两个不同的 seq2seq 模型进行训练; 

2. test/eval:使用 petrain 得到的 PMI 信息,计算出当前 post 出现情况下,最“适合”出现的 word(“词”级别),再依次使用反向和正向 seq2seq 模型得到完整的回复; 

3. paper 提出的 idea 降低通用性回复,主要因为预先使用 PMI 挑出了相对“有意义”的词; 

4. 如果只是想进行实验,复现模型相对简单,可以直接套用 seq2seq 的 translate 代码,再额外写一个 PMI 相关计算; 

5. 就此模型而言,效果的好坏主要应该在于 keywords 词表以及 test/eval 部分 keyword 的选取; 

6. 在 train 部分,不知道在选取 word 进行 split 部分,使用 test/eval 一样的选取方式效果会不会更好?

Miao


本文提出的模型有三部分(看 Figure 1): a. keyword prediction, b. backward seq2seq model c. forward seq2seq model 关于 a 大家讨论了不少了;b 和 c 是两个 seq2seq model,本文使用的是将 encoder 得到的内容通过 hidden state 传递给 decoder 的 seq2seq 模型,没有使用 attention 机制,属于比较简单的模型;c 是一个标准的 seq2seq 模型,在训练过程中都不需要考虑 keyword 的问题,比较简单;我感觉本文最大的关注点和亮点在 b,有几点思考: 

1. 传统 seq2seq 模型中 decoder 产生的第一个词对于整个句子的生成是比较重要的,会影响内容的质量,也会影响多样性;而 backward seq2seq 可以使得 reply 的第一个词的多样性提升,从而提升 reply 的多样性;从 table 2 中的例子可以看到,传统的 seq2seq 模型的回答大部分是“我怎么怎么”,这种回答看上去质量也比较差,更像 general reply,而本文模型的回答第一个词多样性大,显得质量较高,我感觉这个非常有趣;

 

2. 因此,backward seq2seq 的好坏对于 reply 的生成是非常关键的; 

3. 而 backward seq2seq 需要的能力是比较强大的:需要给定一个 post,以及 reply 任意一个位置的词,然后向前生成 reply,这个能力和传统的 seq2seq model 需要的能力是有一些微妙的区别的。我感觉这个能力用本文这样的 seq2seq model 来实现有些别扭,如果能有更好的 backward seq2seq model,会不会能显著的提升 reply 的质量。

weijinfeng


本文所解决的问题跟上周的论文基本是一致的,都是通过引入先验知识到生成过程中,所不同的是,本文只是引入一个词,并且限定是名词,而且还将应用场景定位为短句对话。 模型本身相对比较简单,就只对前面这几个限定说一下个人的理解。 

首先是,1)为什么选取一个词,这应该是基于短句概念提取的一个假设,就是一个短句是以一个词(应该包括复合词)为核心,辅以描述或限定性成分以及其他成分组成。当核心概念词提取出来后,又因为open domain对话的内容开放性的特点(比如,只要回复说的是这个事,至于说什么不重要),再扩展出其他成分来就可以了。

其次是,2)为什么是名词,有同学的批注也提到了这个问题,看到没有人回复,说下自己的看法。根据1,一个短句需要映射到唯一的词作为整句的概念抽象或者核心表达词,那么词的词性就需要斟酌一下了。用排除法来做,很显然除了主谓宾的其他成分在一个句子中起核心作用的时候相对是比较少的。有同学也提到了核心词选取的重要性,所以一旦选了非主要成分作为核心词,后面再生成好回复的概率也比较小了。另外,从语法结构上来说,主语一般是名词或者代词,谓语一般是动词,宾语一般是名词或者代词。从概率角度来讲也是选名词覆盖范围更大一些。 

最后,3)为什么从一开始就定位为短对话生成,我觉得主要原因是因为reply的产生是由用PMI方式选出来的key word为中心扩展出来的,这种扩展虽然可以无限延长,但是随着跟key word距离的增加,关联性也会逐渐降低,难免会出现句子不通畅的情况,所以定位为短句的回复更为有效一些。

 Q&A 精选

Miopas

Specifically, our seq2BF model works as follows.

seq2BF model 分成两个部分: 

1. 先把 query 作为 input,经过第一个 seq2seq 的模型得到一个 output sequence,作为前半句 reply; 

2. 然后把 query 和前半句的 reply 作为 input,输入第二个 seq2seq 模型,得到后半句 reply;

3. 最终的 reply = 前半句 reply + keyword + 后半句 reply。 有个疑问,这个应该是一个 infer 的过程,train 的过程是需要切分训练集里的 reply 的吧,怎么切分 reply 的?

Miopas: 在 2.4 里写了,是随机 sample 了一个 word 作为 split word,看漏了。这样的话实际上 seq2BF 的模型在 train 的时候并没有用到 keyword noun 的信息?

wumark: 不是先生成前半句再生成后半句的。他这个生成方式比较麻烦,固定 r_k 生成 r_k+1 再前向生成 r_k-1,再后向 r_k+2(利用 rk 和 rk+1),之后再 rk-2(利用 rk-1,rk 和 rk+1),时间复杂度很高。 这个模型最开始并不是生成对话的,是生成诗歌的,百度用了同样的模型生成了诗歌,也发表在 coling2016。

Miopas: 重新读了一下,感觉你说的是对的。之前这个地方的 Equation 5 没怎么明白,对照一下应该是你说的那样。不过有个问题,这里下一段写"the forward generator is aware of the backward half sequence"看上去是在说生成后半句的时候,已经得到完整的前半句了,这里是什么意思呢?

wumark: 我也细致地看了一下,我说的是有问题。按照他的表述他应该是后向生成到头,然后再拿前向的重新再读一遍,再把前面的生成了。不是每个字交替一下,是一次生成完了,之前理解错了

mike

Because we have far more Chinese terms than English words, our seq2BF is trained in the character level out of efficiency concerns.


PMI keyword 统计模型是基于词粒度的,而 seq2BF 中的 RNN encoder 和 decoder 都是基于字粒度的。这里给出使用字粒度的理由是汉语词太多,隐含的意思是词粒度容易出现 OOV 问题,所以使用字粒度? 有没有同学对比过词粒度的 seq2seq 和字粒度的 seq2seq 生成结果的区别呢? 

另外,从 Table 1(a) 中看到,seq2BF 生成的 reply 的长度平均在 5.6 个字,而 Groundtruth 也就是实际 reply 的长度也就在 9.19,因此数据集中的回复是偏短的,会不会也因为数据集是比较短的 post-reply 才考虑选择的字粒度呢?

xwzhong: 1. 文中直接说明是出于“efficiency concerns”所以用了 char-level,当然,你提到的使用 word-level 确实是会出现 OOV 情况。2. 个人做过相关实验,同个 post,使用 seq2seq 得到的 response 其平均长度比对应训练集中 groundtruth 小 4 左右(实验进行了变量控制,post 出现次数、response 不同长度)

xwzhong: word-level 和 char-level 各有好处,可以从效率、显存占用、语义表达角度去考虑(涉及到的东西比较多),但是从使用 seq2seq 模型来做生成式对话系统,仅仅对比 word 和 char-level 的区别很小。

Miaosen

PMI prefers a word that is most “mutually informative” with the query

这样选择的 keyword,会不会在 language model 中也比较少见,导致很难生成流利的回答?(比如 keyword 是某款汽车型号)。其实很多 keyword 虽然不一样,但是其实是类似的意思。在生成 response 的时候,是不是可以选择用 embedding 来做?

mev: 这样就有点像主题信息而不是关键词信息了,可以尝试用主题词来替换关键词,但这样做的话会不会影响生成的回复的多样性呢?

cuixiankun: 限定关键词在本身上就限定了生成的多样性吧。

PaperWeekly
PaperWeekly

推荐、解读、讨论和报道人工智能前沿论文成果的学术平台。

理论理论论文NLPSeq2Seq对话系统
暂无评论
暂无评论~