对话系统综述

初看对话系统,感觉涉及到的知识理论比较广,所以这里特意整理一下,当然限于篇幅我也只能简单谈一下,没办法做到面面俱到,也可能有所不足,欢迎交流。

首先,对话系统一般可以分为任务导向型对话系统和非任务导向型对话系统,任务导向型最经典的例子就是订票系统,除此之外,知识问答系统、乃至推荐系统我觉得都可以归类到任务导向型,因为他们都有一定的目标,提供了相关的功能,而非任务型对话系统最常见的例子就是聊天机器人。

当我们在谈论对话系统的时候,一般都在讨论任务导向型对话系统,因为我们搞一个系统出来目的还是要有一定的功能,要能帮助到我们的,而不只是为了和人类吹吹水,所以接下来就主要谈一下任务导向型对话系统。

任务导向型对话系统,从模型来看,可以分为两类,一类是pipeline,一类是end-to-end。其实很多领域的模型都可以分为这两种的了,前者的意思是一个系统包含了多个模块,数据输入到系统之后,按顺序被一个个模块处理,最终得到输出;而后者则是用一个完整的模型处理,直接输出结果。

先看pipeline,比较经典的一种模型是分为三个模块,首先是自然语言理解,然后是对话管理,最后是自然语言生成。自然语言理解一方面是为了把输入从文字转化为向量,一方面是为了让机器理解输入的浅层语义。对话管理是为了结合上下文等因素综合分析出输入的深层语义,并且根据深层语义进一步确定出系统的响应,从而进行分析得到结果。而自然语言生成则是把对话管理的结果转化为人类语言,从而得到最终的输出。

自然语言理解的目的是为了理解输入的语义,语义是一个很抽象的概念,包括我们自己也很难说清楚一句话的语义到底是什么,而对于机器来说,语义可以用domain(领域)、intent(意图)和slot(语义槽)表示,比如说"我想订一张明天去北京的机票",对于这句话来说,domain就是"机票",intent就是"订机票",slot包括"时间:明天,目的地:北京"。所以很多时候,当我们在做自然语言理解,其实就做领域/意图分析以及slot filling。领域或者意图分析本质上来说都属于文本分类,分析输入到底属于哪个领域,属于哪个意图,而slot filling则可以看成一个序列标注问题,类似于命名实体识别,从句子中提取实体,而slot filling则是从句子中找到相关的slot,两者都属于信息提取的范畴。

系统可以通过NLU确定出输入的intent、slot,但那是不足够的,因为NLU的分析过程只是基于单一的句子,所以需要对话管理,结合两轮对话进行分析(这里做了马尔可夫假设,假设当前对话最多和上一轮相关)。对话管理也包含两个过程,首先dialogue state tracking,这是为了分析出句子的真实语义,然后是dialogue policy learning,基于得到的语义进行响应得到结果,比如对一个订机票系统,DST分析出用户现在想查询一张机票,那么DPL就会进一步分析查询机票需要执行什么操作,并且完成这些操作得到最终结果。得到了结果之后,就通过NLG转化成句子,返回给用户。以上就是一个比较经典的pipeline对话系统处理流程。

除了pipeline还有end-to-end,所谓的end-to-end就是指seq2seq、transformer、bert这些复杂但有效的模型,从模型的设计上来说,他们更注重对于输入序列的分析,注重如何有效提取特征,如何避免梯度消失之类的问题,而不是注重如何用来构建一个对话系统,实现一些特定的功能。但是,正正因为他们能够有效地从句子中提取特征,所以他们不论在对话系统,还是在其他NLP各式各样的子领域都得到很好的效果。

关于pipeline和end-to-end的对比,可以从几个角度来看,首先我个人以前是一直不喜欢pipeline,不认同这些引入先验理论的模型,可以想一下,哪个人小时候学过语法,但是这完全不影响他们学会说话,学会一门新语言,说到底靠的都是多说多听,这和深度学习的思想是比较接近的。从另一角度来说,我们可以看看目标检测领域,看看R-CNN的发展,从R-CNN到fast R-CNN再到faster R-CNN,一个很重要的改进就是把模型的各个模块融合在一起,比如把边界框回归、分类器、CNN融合在一起,比如提出region proposal network,把寻找候选框的过程融入到神经网络当中,一个主要目的就是减少特征复用,提高模型推理速度。

当然,我们也不能全面否定pipeline的作用,毕竟上面说的都是我以前的想法,真正让我改观的是DST的一篇经典论文《Neural Belief Tracker: Data-Driven Dialogue State Tracking》,从本质上来说这也是一个神经网络,但是它在结构上设计得很巧妙(主要是输入设计得很好,同时也在适当的位置引入了门控结构),实现了综合两轮对话的语义分析,我想了一下,如果只是设计一个深层网络,然后直接把两轮两轮对话作为输入,应该很难达到这篇论文的效果,归根到底,就是一个良好的结构使得模型能够更有效地提取特征。所以我觉得,或许我们不是不应该过多地引入先验知识,而是应该思考一下,如何从模型的结构层面引入先验知识,使得模型能够更高效地运转起来。

当然,其实上面说了那么多,说到底都是如果需要考虑速度,pipeline或许比end-to-end更好,但是如果不考虑速度,只考虑效果,那么end-to-end或许还是目前最佳的选择。

在github写的自然语言处理入门教程,包含汇总的博客文章和相应的模型代码:NLPBeginner

最近开始研究对话系统,还在探索当中,学习笔记也会在github上整理更新:HowToCreateHomunculus

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值