文章目录
- 1 Chatbot面临的问题
- 2 控制Chatbot的输出
- 2.1 直接Finetune
- 2.2 输入添加控制特征
- 2.3 只有独白
- 3 展望
本文为李弘毅老师【Controllable Chatbot】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。
下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删除。
文章索引:
上篇 - 7-11 Deep Learning for Question Answering (2/2)
下篇 - 7-13 Dialogue State Tracking (as Question Answering)
总目录
1 Chatbot面临的问题
什么是Chatbot这里就不多说了,顾名思义,就是聊天机器人。Chatbot是一个很难的问题,但我们其实可以先把它抽象得很简单,认为这就是一个seq2seq的问题。训练的时候,就找一大堆语料,分别是一个人说的前一句,和另一个人接的下一句,然后直接train。这样会有一个非常致命的问题,就是同一个句子,不同人说出来是不一样的,这也就导致了找来的语料当中,同样的输入,对应的输出有非常多种。比如问年龄的时候,不同年龄的人的回答必然是不一样的。
直接用seq2seq的方法train出来的模型产生的对话会长下面这个样子,同样的问题,换一个方式问,出来的结果就自相矛盾了。
除此之外,这样train出来的模型会偏向于用比较单调和无聊的句子来回答问题,比如"I don’t know"是一个高频的回答,因为这样的结果是合理的,但这并不是我们希望模型回答的。
总结一下,有两个问题:
- 回答的结果前后矛盾
- 回答的结果太过单调
2 控制Chatbot的输出
要控制Chatbot的输出,我们可以给Chatbot增加一些限定条件。限定条件可以是人物设定,可以是人物的情绪,也可以是某个特定的人物。
限定了之后,机器的回答会变成下面这样。下图的上半是限定情绪的结果,下半是限定了特定人物的结果,都是模型跑出来的真实例子。
那么如何训练出可以限定条件的Chatbot呢?有三种方法,下面来逐个讲述。
2.1 直接Finetune
最直接的方法就是,先用一大堆语料来预训练Chatbot,然后再找限定条件的语料来finetune。这样的问题是,我们一般没法找到大量的限定条件的语料,这会导致模型很容易过拟合。要解决这个问题的话可以参考元学习的方法,这不是本文的重点,不多做介绍。
2.2 输入添加控制特征
我们也可以在输入句子的结尾加一个控制输出的特征。举个例子,可以对同一个问题的不同回答进行一个分类,然后在输入的时候,把这个类别作为一个特征也输入进去。这样train出来的模型,就可以通过控制这个输入的特征来控制输出了。这样的语料数据可以是其他模型跑出来的,也可以是人标注的。A Persona-Based Neural Conversation Model就是这种方法的一个经典例子。
有一篇叫做CTRL: A Conditional Transformer Language Model for Controllable Generation的文章就是用的这种方法来训练一个language model。一般的language model在训练的时候,我们会找一大堆语料,然后让模型在看到给定的tokens的情况下,预测出接下来的tokens是什么。CTRL这篇文章会在句子的最前面加上这个语料的来源,来源可以是Wikipedia,可以是Books,甚至是一个网址等等。不同的来源,句子的风格是不一样的。
然后我们用这样训练得到的模型来进行句子的生成,发现模型竟然知道哪一年的美国总统是哪位。
在Chatbot的训练中,有这样给定了条件的公开数据集,比如Persona-Chat。这个就是facebook找了一堆人,然后告诉他们自己的人设是什么,然后让他们对话得到的语料库。
训练的方法也出奇地简单,直接把对人设的形容文字加到句子的开头,放进BERT去训练就可以了。TransferTransfo就是这样做的,作者在训练的时候,还会去故意打乱描述人设的句子,因为这些句子间是无序的。
2.3 只有独白
有些时候,我们只能拿到某个人设的个人独白,没法获取到他的对话。这个时候,我们也是可以训练一个Chatbot来模仿该人设对话的。方法有很多种,下面依此介绍
(1)从已有的独白当中选取最有可能的回复。这种方法就保证了,回复必然是该人设说过的某句话。
(2)用独白训练一个language model,然后用这个language model来影响 Chatbot的输出.
(3)用一个反向的模型来预测独白中的某句话,是需要问话人说怎样的句子才会说来的。用这种方法来制造数据。
(4)用有问有答的语料训练一个seq2seq模型,同时用独白训练一个auto encoder。然后在训练的时候,两个模型的decoder用的是同一个。这样可以保证输出与独白的风格类似。
(5)用Reinforce Learning或者GAN的方法,训练一个classifier来判断输出的句子和独白的风格是否相似。
3 展望
有时候,Chatbot说出来了一个positive的句子,但在整个对话中可能是讽刺的意思。我们下一步的目标应该是如果希望Chatbot的对话是positive的,那Chatbot的整个对话给人的感觉应该是postive的,而与Chatbot本身说的话是positive还是negative无关。