Dialog System and Chatbots —— DA学习笔记2

对于Seq2Seq类型的chatbot:

在意识到和MT问题的不同之后,用seq2seq的方法貌似不能解决chatbot的问题,在2015年的时候,提出了转换模型(transduction model)用于应答生成。

如果非要用seq2seq模型来解决这个问题的话,需要进行大量调整。

(1) 基本的seq2seq模型倾向于生成predictable but repetitive therefore dull response,类似于"I'm OK."或者"I don't know"那类的聊天终结者的回答。对于这个问题,可以修改seq2seq模型的目标函数,使用互信息目标函数,或者修改beam decoder来使beam中的回答更加多样化。

(2) 基本的seq2seq结构没有办法联系长时间前的对话上下文。对于这个问题,可使模型联系prior turns,例如使用层次模型来总结多轮之前的信息

(3) 基本的seq2seq关注于生成单轮对话,对进行多轮对话来说基本是无力的。对于这个问题,可用强化学习或者对抗网络来解决,选择response来使整体的对话更加自然,17年的时候有大神用对抗网络解决这个问题发了牛paper。


对于chatbot的评估:

一般来说,是由人来评估chatbot的效果。用于task-based的对话的slot-filling评估方法在这里不适用,对于词交叠的测评方法,如BLEU也不适用,这是因为对于一个用户turn来说,很多问题的回答并不一定含有某个词,可对应的回答语句太多太多了。BLEU只有在MT这种反馈域很小且lexically交叠很大的问题上是可行的。


虽然说由人来评估chatbot的效果,但是最近有提出自动评估的一些方法,如ADEM,用一个分类器来进行回答的合理性评估,训练语料是由人为标注的。另一种是用对抗评估的方式,基本想法是训练出一个类图灵分类器来区分人类生成的回答和机器生成的回答,能fool这个分类器的数据越多,chatbot效果越好。


三、基于框架的DA

现在的task-based对话系统是基于domain ontology的,所谓domain ontology就是代表系统从用户说的话中抽取到的意图的知识结构。ontology定义了很多种框架,每一个框架由一系列的槽(slot)构成,并规定了每个slot可取的值。这种框架是在1977年的时候提出来的GUS框架,当时用于travel planning这个domain。基于框架的DA大多是基于模板进行NLG,就是说已经有了预设的模板,需要根据用户的输入往里填词。


1. 基于框架的对话的控制结构(围绕frame来设计的)

个人理解这个控制结构就是一系列的flowgraph,说白了就是一个套路,先说什么,然后说什么,如果答案为是的话说什么,为否的话又该说什么,一直到结束为止。其中会空出来很多的slot,这个控制结构的目的就是为了填slot!!根据用户的回答往里填,大部分的基于框架的对话系统都是一个由对话设计者搞出来的一个有穷状态自动机(FSA)。比如说在travel planning这样一个情景下,有4个slot需要填充,出发城市、抵达城市、出发及抵达时间、单程还是往返。对于每个slot,设置对应的问题来获取想要的答案。此时,FSA中的节点代表slot问题,边代表后继操作,整个对话是由机器主导的,忽略掉那些非直接的回答然后接着问下一个问题。但是在真实的人与人之间的对话情境中,对话的主导权(initiative)并不是一直由一方掌控,而是在两个人之间来回转换的!!


这种由机器主导的对话的优点是:可以很明确地知道用户的回答是在针对什么问题,也就是说,知道这个问题的域是什么,这意味着系统可以准备一个语言模型来方便地进行NLU。对于可以在任何部分都出现的universal的问题,可以视为是回到某一预设的start state。这种简单的FSA结构的对话一般用于执行简单的任务,比如说输入信用卡卡号、姓名等。


在很多情景下,用户很可能一句话可以用来填好几个slot,而且会有frame shifting的情景。个人理解一个frame就是完成一个子操作,比如说从预定航班,随之出现的租车、预订酒店操作,这就是属于3个frame。GUS框架结构是mixed initiative的,用户可以有一定的对话主导权。该框架还可以完成自动关联多个frame自动填slot的操作。为了完成多个frame之间动态shifting,可以用一个graphical interface来将几个frame链接起来。


2.用NLU进行填slot

这部分分为三块:domain识别(个人理解是大类识别)、intent识别(个人理解是具体子任务识别,具体想完成什么任务)、填slot。其中前两个可以认为是分类问题,第三个可以认为是sequence labling的问题。针对这三个问题,有传统方法和NN方法两大类。


传统方法:

现在在工业界还是有很多在用正则的这种hand-carfted的方式来进行设计以及识别,是基于rule的实现方式。稍稍加进去一点ML算法的是用CFG进行语义拆分,形成一个树形层次结构,进而将语料中的特定部分填入slot里。这种基于规则的方式有高识别率,且若域很窄、专家知识可以简单获得,这种方法的覆盖率也会较好。但是这种方法耗时耗力,而且会出现recall problems。


稍高级一点的传统方式是使用监督ML,训练分类器来将句子map到不同的domain和intent类中,再用一个sequence model预测句子中有哪些slot要填,然后将句子map到slot fillers中。在这些分类器中,造各种特征,如用n-gram、命名实体、特定的lexicon等。


NN方法:

除了用这种分类的模型去做之外,还可以用序列模型去做,直接为句子中的每个词分配一个slot label,如MEMM、CRF、RNN等模型。同样需要标注好的训练集和测试集,采用IOB方式进行语料标注,对于每个slot label,标注I和B,再整体标注一个O,若有n个slot,则一共有2n+1个tag。对于像MEMM、CRF这种传统方法,造各种特征。NN方法不用造特征,输入是words,用word embedding或者one-hot的形式表示,输出是各个单词对应的IOB tag和domain、intent分类。然后就可以进行slot filling操作,对各个槽的内容进行规范化的话,可以用一个同义字典。


在工业界中,经常将基于规则的系统和基于ML的方法进行结合做半监督学习。


3.评估slot filling:

intrinsic:Slot Error Rate、slot precision、recall、F-score等

extrinsic:task error rate


4.其他组件:ASR(automatic speech recognition)、记录对话状态(dialog state)


四、VoiceXML —— 基于框架的DA的一个简单的XML方式实现

在VoiceXML中,每个slot叫field,每个field都有一个对应的变量名。会有特定的prompt进行错误处理。一旦一个field已经被填,则标记成filled状态。升级版的VoiceXML是有内置的data type的,而且mixed initiative。


五、评估对话系统

评估用户满意度:

直接用调查问卷的方式,但是这种基本不可行。间接的方法可以是用task完成率(maximize)和问题出现率(minimize)来进行衡量。

Task completion success:可用slot错误率或者子任务完成百分比衡量

Efficiency cost:使用对话时长或者用户correct error的时长百分比衡量

Quality cost:ASR不回答或者发生听不懂回答的次数、slot error rate


六、对话系统设计

1.理解用户意图本质、理解用户和任务

2.Wizard-of-Oz 原则:用户以为是在和软件打交道,实际上幕后操纵的是human

3.对用户进行反复迭代测试

猜你喜欢

转载自blog.csdn.net/katherine_cai_7/article/details/78930241
今日推荐