原文出自彼得攀的小站
本文是对论文“A Survey on Dialogue Systems: Recent Advances and New Frontiers”的阅读笔记,该文章是关于对话系统的综述,最后一次修改于2018年年初,主要对2018年之前对话系统相关技术做了一个概要性总结
论文地址
文中[45]这样的编号代表论文中参考文献的编号,可以查阅原始论文
深度学习技术是现在对话系统采用的主流技术,其可以通过大规模数据来学习有意义的特征表示,并得到较好的文本生成策略,该过程仅需要很少、或者完全不需要人工特征。
对话系统可以被分为task-oriented(任务导向)和non-task-oriented (非任务导向)
面向任务的系统旨在帮助用户完成某些任务(例如查找产品,预订住宿和餐馆)。广泛应用于面向任务的对话系统的方法是将对话回复作为一个流水线来处理。系统首先理解人类给出的信息,将其表示为一个内部状态,然后根据策略和对话状态选择一些动作,最后把动作转化为自然语言的表达形式。尽管语言理解是通过统计模型来处理的,但是大多数已部署的对话系统仍然使用人工特征或人工编写的规则来处理状态和动作空间的表示,意图检测和槽填充。这不仅使得部署真正的对话系统耗费大量时间,而且还限制了其在其他领域进行使用的能力。最近,许多基于深度学习的算法通过学习高维分布式特征表示来缓解这些问题,并在一些方面取得了显著的进步。此外,还有尝试建立端到端的面向任务的对话系统,这种对话系统可以扩展传统流水线系统中的状态空间表示,并有助于生成任务特定语料库以外的对话。
非面向任务的系统在与人类交互过程中提供合理的反应和娱乐。通常,非面向任务的系统致力于在开放域与人交谈。虽然非面向任务的系统似乎在进行闲聊,但是却在许多实际的应用程序中占有一席之地。 有研究表明,近80%在线购物场景中的对话都是闲聊消息,而处理这些信息与用户体验密切相关。一般而言,针对非面向任务的系统开发了两种主要方法:
这里主要介绍流水线方法(Pipline methods)和端到端方法(end-to-end methods)
流水线方法的示意图如下所示:
其包含四个部分:
语言理解的任务是:给定一句话,NLU将其映射到语义槽中,这些语义槽都是根据不同的对话场景预定义的。
上图是一个自然语言表示的例子,"New York"被映射到了desti这一个语义槽,在映射过程中同时确定了该对话的领域:order和对话意图:预定餐馆。
通常来说, 有两种不同类型的语言表示:
整个NLU主要包含两个部分:
由NLU生成的语义表示将有对话管理模型进一步处理,典型的对话管理模包括两个部分:对话状态追踪(Dialogue State Tracking)和策略学习(Policy learning)
对话状态追踪是保证对话系统鲁棒性的核心组成部分。它会估计每轮对话中用户的意图。对话状态 H t H_t Ht表示到时刻t时,整个对话历史的表示。
这种经典的状态结构通常被称为槽填充(slot filling)和语义框架(semantic frame)。传统方法(也是迄今为止大多数商业系统选择的方法)通常采用手工制订的规则来选择最有可能的结果。然而这样的基于规则的系统很容易出现错误,其得出的最有可能的结果往往不是理想的结果。
基于统计的对话系统在有噪声的条件和不确定的情况下,维护了对真实对话状态的多重假设的分布。在对话状态跟踪中,生成结果的形式是每轮对话中每个语义槽的值的概率分布。各种统计方法,包括复杂的手工制定规则、条件随机场、最大熵模型、网络风格排名(web-style ranking)都被应用在了对话状态跟踪的共享任务中。
当前,结合了深度学习的信念追踪表现出了更好的效果。 它使用一个滑动窗口输出任意数量的可能值的一系列概率分布。虽然它是在某一个领域的训练出来的,但它可以很容易地转移到新的领域。[48]开发了多领域RNN对话状态跟踪模型。它首先使用所有可用的数据来训练一个泛化的信念跟踪模型,然后对每一个特定领域利用这个泛化模型进行领域化,从而学习领域特定的行为。[49]提出了一个神经信念跟踪器(NBT)来检测槽-值对。它将用户输入之前的系统对话行为、用户说话本身和一个候选slot-value对作为输入,然后遍历所有候选slot-value对,以确定用户刚刚表达了哪些slot-value对
记忆状态跟踪器获得的状态表示,策略学习(policy learning)将产生下个可用的系统动作。无论是监督学习还是强化学习都可以被用于优化策略学习。通常,基于规则的智能体将被用于热启动系统[86],然后利用规则生成的动作进行监督学习。在在线购物场景中,如果对话状态是“推荐”,那么“推荐”动作将被触发,系统将会从产品数据库中检索产品。如果状态是“比较”,系统则会比较目标产品/品牌[98]。对话策略可以通过进一步端到端的强化学习进行训练,以引导系统朝着最终性能做出决策。[9]在对话策略中利用深度强化学习,同时学习特征表示和对话策略。该系统超过了包括随机、基于规则和基于监督学习的baseline方法。
自然语言生成将通过policy learning得到的抽象的对话动作转化为自然语言的浅层对话,在[78]中,提到一个好的生成器通常满足4个条件:
传统的NLG通常采用句子规划(sentence planning),其将输入的语义符号映射成表示对话的树状结构或模板结构等中间形式,然后通过表层实现(surface realization)将中间结构转换成最终结果。
[94]和[95]引入了基于神经网络的NLG方法,该方法采用了一个类似于RNNLM的LSTM-based 结构。其将对话动作类型和slot-value pair转化为一个one-hot词向量作为额外输入,来确保生成的对话能够准备表达我们所要表达的意图。[94]时使用了一个前向RNN生成器、一个CNN重排器、一个后向RNN重排器,所有的子模块共同作用,基于需要的对话动作来生成对话。为了解决在表层实现(surface realization)中槽信息缺失和重复的问题,[95]使用了额外的控制单元来门控对话动作。[83]通过利用对话动作来选择LSTM的输入向量,扩展了这一方法。这个问题后来通过多步调整扩展到多领域场景[96]。[123]采用基于encoder-decoder的LSTM-based的结构,结合问题信息,语义槽值和对话动作类型来生成正确答案。它使用注意力机制来关注解码器当前解码状态的关键信息。通过编码对话动作类型嵌入,基于神经网络的模型可以生成许多不同动作类型的回复答案。[20]还提出了一种基于seq2seq的自然语言生成器,可以被训练用于利用对话动作输入来产生自然语言和深度语法树。这种方法后来利用之间用户的话语和回复进行了扩展[19]。它使模型能够使用户适应(说话)的方式,从而提供适当的回复。
传统的面向任务的对话系统有许多领域特定的人工干预(如手工编写的规则,人为提取的特征),这导致在一个领域中表现很好的方法很难适应新的领域[7];[120]进一步指出,面向任务的对话系统中,传统流水线方法还有两个主要缺陷:
不同于传统的流水线技术,端到端的方法使用单个模块,并使用这个模块对结构化的外部数据来进行交互。
[97]和[7]引入了一个基于神经网络的端到端可训练的面向任务的对话系统。这个系统将对话系统的学习当做学习一个从对话历史到系统回复的映射,利用编码器-解码器模型训练整个系统。然而,这个系统是以监督学习方式进行训练的——不仅需要大量的训练数据,而且由于缺乏对训练数据中对话控制的探索,也很难地找到一个好的策略。
[120]首先提出了一个端到端的强化学习方法,在对话管理中共同训练对话状态跟踪和政策学习,以便更好地优化系统动作。在对话中,智能体询问用户一系列是/否问题来找到正确的答案。这种方法在任务导向的对话任务中表现良好,例如猜测用户脑海中想着的名人。
[36]将端到端系统作为task-completion neural dialogue system,其最终目标是完成一项任务,如电影票预订。
任务导向的对话系统通常还需要查询外部知识库,之前的系统通过语义分析(semantic parsing)来形成一个query,在知识库中检索,匹配得到想要的entities。这种方法有两个主要的缺点:
为了解决这样的问题:
non-task-oriented dialogue systems也被称为聊天机器人,其关注与在开放域上与人类进行交流。一般来说,聊天机器人通过生成模型和基于检索的方法实现。
神经生成模型在机器翻译中有着很成功的应用,这样的成功,激发了人们对于神经生成对话系统的研究。[64]提出了一种生成概率模型,其基于phrase-based统计机器翻译,它将回答问题视作一个翻译问题,一个post被翻译为response。但是生成回复的过程比翻译要更为困难:
神经生成模型的基础是sequence-to-sequence模型,当下神经生成模型主要关注:
Sequence-to-Sequence 模型,可以简称为seq2seq。给定一个有 T T T个词的源序列(消息): X = ( x 1 , x 2 , … , x T ) X=\left(x_{1}, x_{2}, \ldots, x_{T}\right) X=(x1,x2,…,xT), 和一个包含 T ′ T^′ T′个词的目标序列(回复): Y = ( y 1 , y 2 , … , y T ′ ) Y=\left(y_{1}, y_{2}, \dots, y_{T^{\prime}}\right) Y=(y1,y2,…,yT′)。seq2seq模型的目标是最大化,在给定X的条件下,生成Y的概率:
p ( y 1 , … , y T ′ ∣ x 1 , … , x T ) p\left(y_{1}, \ldots, y_{T^{\prime}} | x_{1}, \ldots, x_{T}\right) p(y1,…,yT′∣x1,…,xT)
Seq2seq模型是一种encoder-decoder的结构,如上图所示。相关的介绍有很多,这里就不再赘述。
可靠的对话系统应当能建立可保持的活跃对话,而考虑对话历史是建立一个这样的对话系统的关键:
[77] 通过连续表示 or 单词、短语嵌入来表示整个对话历史(包括当前消息),从而解决了上下文敏感的回复生成的挑战。
该方法的回复通过RNN语言模型生成,与[12]中的解码器相同
[68]使用层次模型,首先捕捉个别对话的含义,再将其整合在一起。[109]通过注意力机制扩展了层次模型,这样更关注句子内部和句子之间重要的部分。这里的注意力机制包括word-level和utterance-level。[82] 在现有的方法之间做了系统的比较(包括层次模型和非层次模型),并提出了一个利用查询相关度对上下文(对话历史)加权的变体。文章最后有两个结论:
在当前的seq2seq对话系统中,一个具有挑战性的问题是,它们倾向于产生意义不大的普通或不重要的、普适的回答,比如“I don’t know" 或者"I’m OK"这样的高频短语。
模型的这种表现可以归咎于训练数据中,这样普适的回答出现的频率很高,比如“I don’t know”。 而具有更多信息的回答相对更加稀疏。现有的减轻这种问题的有以下方法:
找到一个更好的目标函数,[38] 指出,模型在给定输入的情况下,优化输出的极大似然时,会倾向于给“safe response”(普适回答)赋予更高的概率。
也有一些研究表明,解码过程也是候选回复冗余的一个原因。[86]、[72]、[42] 认为beam search在解码产生候选时缺乏多样性:
[38; 77; 72] 结合了全局特征,重新执行re-ranking,从而避免生成无聊或者普适的回复
PMI:[57] 猜测问题不仅仅在于解码和 respones 的频率,而且消息本身也缺乏足够的信息。 它提出使用逐点互信息(PMI)来预测名词作为关键词,反映答复的主要依据,然后生成一个包含给定关键字的答复。
也有一些工作通过引入随机隐变量来产生更多的不同输出。他们认为自然对话不是确定性的:对于同一消息的回答会因人而异。但是当前回复是从确定性encoder-decoder模型中采样得到。通过加入隐变量 ,这些模型可以再生成时,先对隐变量的分配采样,再确定性的解码,从分布中采样得到回复
中加入随机变量z,z根据[34; 33; 75]中的自编码框架计算
显示地学习对话的内在属性是改善对话多样性,保持对话一致性的另一种方法:
人类对话与对话系统一个重要区别是它是否与现实相结合。结合外部知识库(KB)是一种有可能弥补对话系统与人类之间背景知识差距的方法。
记忆网络是利用知识库来处理问答任务的经典方法,也有在对话生成任务上应用的相关尝试:
通过交互来学习是对话系统的一个终极目标:
如何评估对话系统回复的质量是一个关键问题。对于任务导向的对话系统而言,可以根据人工生成的监督信号来进行评估,比如任务完成测试或用户满意度评分。对于非任务导向的对话系统,由于回复的多样性,自动评估其回复的质量仍然没有一个可靠的方法,当前主要是以下的几种方法:
基于检索的方法从多个候选回复中选择一个。基于检索方法的关键是message-response的匹配。匹配算法需要能克服message和response之间的语义差异
早期的相关研究主要关注单轮对话中的回复选择 [91], 其中message仅仅用来选择一个合适的回复。典型做法是将message和response candidates 编码为语义向量,然后计算这两个向量的匹配分数。设x为message的向量,而y是response的向量,那么x和y的匹配算法可以写做一个双线性匹配:
match ( x , y ) = x T A y \operatorname{match}(x, y)=x^{T} A y match(x,y)=xTAy
其中A是一个预定义的矩阵(也可能更为复杂)。
之后[49] 提出了一个同时结合本地和隐式层次结构信息的DNN-based的短文本回复选择模型。[28] 利用深度卷积神经网络学习消息与回复的表示,或是直接学习两个句子交互的表示,再利用多层感知机计算匹配分数改进了这个模型。 [92] 提取了依存树的匹配特征,利用这些特征当做one-hot向量,作为前馈神经网络的输入,从而计算message-response的匹配。[105] 结合了Twitter LDA模型生成的topic向量,送入基于CNN的结构来利用富文本提升回复性能
基于检索的多轮对话是在近期受到了比较多的关注。在多轮对话回复的选择中,当前消息和之前的对话都会被作为模型输入,模型会选择与整个文本最相关且自然的回复。由此,需要模型能识别出之前对话中的关键信息、并建模对话之间的关系来保持对话一致性:
将生成和检索方法结合起来能对系统性能起到显著的提升作用。通常来说:
深度学习已经成为对话系统的基础技术。研究人员将神经网络应用于传统的面向任务的对话系统的不同模块,包括自然语言理解,自然语言生成,对话状态跟踪。近年来,端到端框架不仅在非面向任务的聊天对话系统中,而且在面向任务的对话框架中也变得流行起来。深度学习能够充分利用大量数据,并有望建立统一的智能对话系统。它正在模糊面向任务的对话系统和非面向任务的系统之间的界限。尤其,聊天对话由seq2seq model直接建模。Task Completion model也正朝着端到端可训练方式发展,通过强化学习表示整个状态-动作空间,并结合整个流水线。
值得注意的是,目前的端到端模型还远未完善。尽管有上述成就,但问题依然存在。接下来,我们讨论一些可能的研究方向: