从搭建两类机器人的难度上来看,任务驱动型聊天机器人主要应用于特定、封闭的场景,如订餐、订票服务等;而开放领域聊天机器人的要求则更接近于开放场景下真人的漫无边际的聊天。
因此,开放型机器人的难度要远高于任务驱动型。在实现方法上,任务驱动型机器人的模型主要分为四个模块:用户语言理解(SLU)→对话状态追踪(DST)→对话策略学习(DPL)→回复语言生成(NLG);开放领域型机器人则主要有基于检索和基于生成两种方法,其中,基于检索的方法类似于任务驱动型机器人。此外,在建模时引入注意力模型,往往都能对模型的效果产生较好的提升。
一、任务驱动型聊天机器人
1.1建模步骤
课程中详细讨论了任务驱动型聊天机器人的技术细节,并以【Wen et al., “A Network-based End-to-End Trainable Task-oriented Dialogue System”. EACL 2017】论文中的工作为例进行了讲解。
任务驱动型机器人的模型主要分为四个模块:用户语言理解(SLU)→对话状态追踪(DST)→对话策略学习(DPL)→回复语言生成(NLG)。各个模块所执行的任务分别如下:SLU将自然语言转换为用户意图和slot-value,并输出结构化的用户行为;DST追踪并输出当前的对话状态;DPL以对话状态为输入,来决定输出何种系统行为;NLG将系统行为转化为自然语言并输出。
课程选取了Wen等人的论文,详细讲解了四大模块的工作原理。选取该论文的原因是Wen等人在这一领域做了较多突出的工作,且其研究具有较好的连续性。
在SLU步骤,首先对用户的输入进行delexicalisation以需要找到食物类别。比如用户输入“Can I have Korean”,可以将其中的Korean韩国菜成功识别出来,并将其替换成对应的slot-value。Slot-value又分为两类,Informable slot是用户的输入,需要用户提供足够的信息,系统会不断提示用户提供有用的信息;Requestable slot则作为输出,slot中包括了餐厅的地址、电话、菜单等的详细信息。随后我们使用知识图或字典的方式来匹配食物类别和slot-value,就能找到食物的类别。
我们可以根据模型的任务来搭配使用不同的知识图(如订餐、订机票等,这也是任务驱动的含义所在)。得到这些类别信息后,再使用intent network输出用户意图,intent network可以选用LSTM或CNN,它和belief tracker一起承担用户意图理解的功能,将用户意图转换为神经网络可以计算的表达或向量。
对于不熟悉对话系统但熟悉神经网络的人来说,可以将这一部分看作一个encoder。论文中使用了正向和反向的两个LSTM并把两者的结果拼接起来,使得一些偏后的信息不至于被忽略。
在DST步骤,我们主要进行belief tracking,也就是得到具体食物类别的概率分布。这也可以看成是在将用户的输入转换成另一种表达,即概率分布的形式,这种形式称为belief state。论文中使用了Jordan RNN,在这种RNN中,上一层RNN的输出直接输入到下一层RNN的隐藏层。同时论文中还使用了CNN作为特征提取器,因为语言中有些特征是局部存在、按空间分布的,因此可以发挥出卷积操作的作用。同时,像处理图像一样,我们也需要在句子中加入一些padding来使得卷积更为方便。经过卷积后我们就能得到输入句子的一个特征表示。论文中使用了一些技巧性的操作,如下图所示,把卷积中间层的输出、用户的输入,系统的输出全部拼接在一起,最后再输入RNN。此外,这里还有一种被称为weight tying的trick,可以解决belief tracker分布稀疏的问题。
在DPL步骤,我们根据DST中belief tracker最大概率的输出,前往数据库寻找用户需要的信息,并在policy network中进行决策。数据库可以返回多个选择供用户备选。
在NLG步骤,DPL中的policy network返回一个action vector给NLG中的generation network。Generation network最终生成给用户的回复。
1.2注意力机制
注意力机制就是对整个生成过程中的每一步都进行动态的加权平均,从而决定把注意力放在哪里。随着用户和机器对话的进行,每一次用户有了新的输入,belief tracker都会更新,用户的需求不断变的清晰。使用注意力机制就可以帮助模型捕获到用户不断变化的需求。
1.3其它
Dataset介绍:论文使用的是真实订餐对话的数据集,包含676个对话,约2750句话。数据对每一句话都有slot-value的标签,包括3个Informable slot和3个Requestable slot。数据的评价指标采用BLEU。
训练细节:论文中使用SGD优化器。训练过程分为两部分,一部分训练tracker,训练完毕后固定tracker参数,再训练系统的其它部分。
最终结果:将CNN作为语义特征提取器,其效果与传统的特征提取器ngram比较,两者在准确率上都表现良好。但子recall率上,传统ngram低于CNN,这说明传统特征提取方法的泛化性不如CNN。
二、开放领域聊天机器人
与任务驱动型机器人不同,开放领域机器人更像是闲聊机器人。实现它的技术主要有两种,一种是基于检索技术,一种是基于生成技术。目前95%的闲聊机器人都是基于检索模型。据说,基于检索模型输出的句子会有句号,基于生成模型输出的句子则会缺少标点符号。这也说明基于生成模型的技术目前还远远不成熟,达不到产品级的要求。因此现阶段也更为推荐使用基于检索的技术。
2.1基于检索的方法retrieval-based
这种方法会考虑模型输入和输出的相似性,因此只需定义一种matching的函数,决定输入和输出之间匹配的分值,自己定义什么叫matching,来衡量输入和输出之间的匹配度即可。要实现这种匹配,首先我们需要进行特征工程,也就是不将原始句子作为输入,而是将提取出的特征作为输入。
特征工程的方法有:关键词字典、tf、idf统计词频加权、神经网络word2vector,word embadding等等,也可以使用CNN、RNN 来提取特征。特征可以是数字、向量等。特征工程的设计跟matching步骤是联动的,我们需要根据matching score 函数确定需要什么样的特征。
最终,有了特征工程和matching函数,基于检索的模型就基本完成。最后只要将matching分数最高的回复作为输出即可,或者将输出按matching分数排列,再选用其它特征进行二次筛选。
关于特征工程,除了上述方法外,课程中还介绍了一些其它方法。其中Average concatenate方法将不同属性的词加权拼接,作用比较好。另外模糊匹配字符串(主要适用于英文)方法可以实现模糊语义的匹配,比精准匹配更加准确,直接调用fuzzywuzzy包即可使用。此外,在抽取特征时,应该同时输入和输出的特征,而不是仅仅抽取输入的特征。
关于matching score,事实上我们通过设置matching score的函数来比较输入和输出的相似性,传统的matching score函数是cosine,而现在还有使用CNN的方法。
中科院团队分享了他们在Quora问题语义相似度判别竞赛中进行特征工程的过程,如下图所示。可以看出,特征工程在模型中的地位是很重要的。课程中也建议我们不要过多关注深度模型部分,而要多关注数据预处理和特征工程的部分。
对于更复杂的检索模型而言,因为聊天是复杂场景,需要考虑上下文。在这样的环境下,首先将连续对话的输入做特征工程,得到特征向量,并在一开始就将每一个输入和回复匹配。然后对特征进行卷积,将特征进一步压缩。接下来,使用GRU来获取上下文的序列信息。GRU具有记忆功能,可以记住重要信息,遗忘不重要信息,因此可以处理这种考虑上下文的复杂对话场景。
检索模型的另一个特定是,数据量多了以后检索速度会变慢。课程中也给出了一些解决思路,如弹性搜索、二次检索(在部分数据库中检索,缩小检索范围)等。
2.2基于生成的方法
这种方法的模型基本都基于编码器-解码器的框架,直接使用RNN等神经网络进行端到端的输入输出,而不必进行特征提取等步骤。RNN对于特别长的序列,效果并不太好,因此推荐使用GRU或LSTM。GRU的效果与LSTM持平,甚至比LSTM好,因为GRU的参数比LSTM少,更容易训练好。
在实际的模型中,可以使用LSTM/GRU做编码器,使用另一套LSTM/GRU做解码器,两个网络的结构不必一样,因为其功能也不一样,一个是编码器,一个是解码器。
正如上文所述,这种生成模型的效果并不好。比如,在回复时,对于句子开始词的选择比较少,形成了类似万能回复这样的尴尬场面,降低用户体验。
2.3注意力机制
开放领域聊天机器人同样也可以用注意力机制来提升性能。因为模型中的卷积等操作将输入全部压缩到一个向量中,会使得输入的信息损失过重,而注意力机制则在解码的每一个时刻都提供一个动态的向量,也就是告诉解码器要注意输入的哪一个部分,而不是通盘考虑输入整体的压缩,这样的效果好的多。也正因如此,注意力机制现在也成了生成式网络的标配。
此外,课程中还提到了NRM模型,对使用怎样的编码器信息组合传输给解码器提出了三种范式:全局、局部、综合考虑。
三、总结
通过比较任务驱动和开放领域两种不同的聊天机器人,我也能深深的感觉到,目前我们所能实现的聊天机器人,大多是封闭场景下的,由人类手动提取特征的,进行简单匹配回复的“伪人工智能”。我也不禁感慨,自然语言这一领域的发展实在是慢于计算机视觉,其难度也大于计算机视觉。而这也正是人类面对人工智能的另一座堡垒,等待着研究者们前去攻克。