研究任务型对话系统,首先得从数据集采集说起,关于数据之前文章介绍过了,这里就不详细介绍了,参考:
用户模拟器是在任务型多轮对话场景中,用于模拟用户在指定目标下多轮对话过程,可以用于生成对话数据,以及通过强化的方式训练系统决策。在具体的任务型场景需要定义有哪些用户行为、用户意图、用户可能说的槽位等。
之前也分析过微软开源的规则版用户模拟器代码,这里就不赘述了,可以参考:
无论是规则还是模型版本用户建模,其一般输入包含:1)对话历史;2)用户profile(画像);3)任务的schema;4)数据库or API。
目前用户模拟器也面临一些挑战:
所以也有一些论文提出了基于模型的方案,例如Bootstrapped:
Bootstrapping a Neural Conversational Agent with Dialogue Self-Play, Crowdsourcing and On-Line Reinforcement Learning Domain-independent User Simulation with Transformers for Task-oriented Dialogue Systems
原谅我废话了一些(打)背(广)景(告)。下面主要介绍多轮对话状态最终的一些方法,主要包含以下内容:
对话状态定义:对话一个会话状态S_t,它包含知道前当前轮次t的对话历史的总结,S_t中包含了系统选择下一步action的所有信息。St一般都是槽位状态的分布。(意图也可以作为一种槽位状态)
会话状态跟踪就是根据所有的历史上下文信息,获得到当前轮的会话状态。
定义:dialogue state tracker(belief traker)。在会话的每一步去预测用户的目标,用户目标是一个不可观测的隐状态,所以通过观测用户utterence,通过belief state来表示用户目标。
a belief state b is a vector whose component values give the probabilities of being in each machine state.
之前也介绍过NBT,这里就不啰嗦了,参考:
glad也是计算state中每个slot-value的的概率,不同的是提出了Global-locally self-attentive encoder,希望通过共享参数的global模块,提升长尾slot-value对的识别效果。整体框架包含编码模块和打分模块:
Global-locally self-attentive encoder:通过global模块对所有的slot-value共享参数,提取公共特征,local模块提取slot-value的私有特征,所有encoder都是用了此种结构,典型的share-private结构:
类似glad,两阶段,encoder和scoring。encoder中只使用global encoder,通过使用attention机制希望能够对域不同的slot type获取到私有的特征。他的编码器模块输入阶段融入了slot type信息和utterance,解码通过attention机制希望能够更关注于句子中槽值有关的信息,如图(a),scoring阶段,context vector由于更关注于槽值,所以一和slot-value对计算得分的时候,相同槽值得分会更大,如图(b)。
从整个过程看下来,网络结构比GLAD简单,还更合理。
之前的模型使用RNN来计算每个slot-value的概率,延迟会是一个很大的问题,难以在真实对话中使用,特别是slot-value特别多的情况。g-sat就是解决延时问题(Global encoder and Slot-Attentive decoders),global编码器使用了bilistm(噗..),然后每个slot-type会有一个私有解码器,去计算其得分。
反正他快了,就是因为网络减少了(共享),没啥大优化。
slot-utterance matching belief tracker (SUMBT)引入了bert作为预训练编码器。对于value值,使用bert编码成向量,然后对于对话历史和slot-type,也通过下图的编码器转化为一个向量,然后向量相似度得分作为该slot-value对的概率。
通过span来预测context中的槽位,然后通过 per-slot classification module预测槽位值类型:{none, dontcare and span}。对于每种slot-type,都是共享的底层的编码器,然后上层的解码器是每个slot-type私有的,包括classification and span prediction模块。
输入是上一轮的系统回复和当前用户query,但是不知道为何么有输入更多的历史信息?
Slot Value Dropout: 通过以一定概率将slot-value的token改为[UNK],提升模型对于OOV实体的识别效果,让模型学习依赖句式去抽取slot,而非slot具体的值。
TripPy- A Triple Copy Strategy for Value Independent Neural Dialog State Tracking
会话状态中槽位来自于三种情况:
因此提出了使用span机制来抽取用户当前和历史会话、系统回复中的槽位,然后提出门控机制:
Auxiliary Features:除了用户当前和历史的会话,当前系统的回复,输入还包括: a_t^{inform}表示该槽位是否最近被系统问过,a_t^{ds}表示槽位是否已经被用户说过。
Partial Masking:会对历史系统回复中的槽位值替换为[UNK],目的是为了更多关注句式,避免值带来的干扰。(因为值是已知的,可以直接获得)
Dialog state tracking, a machine reading approach using Memory Network Dialog State Tracking: A Neural Reading Comprehension Approach
将状态追踪问题转化为阅读理解的QA问答,问题例如:当前对话提及的地点是?
模型包含三个主要模块,slot carryover model、slot type model、slot span model。
对于不同的slot-type,dialogue embedding只用计算一次,不同的question和e作为slot type的输入,
Selectively Overwriting Memory for Dialogue State Tracking 2020Efficient Dialogue State Tracking by Selectively Overwriting Memory.pdf
不同于之前的模型直接追踪状态,SOM会依赖于历史的mermory,然后预测会话状态的更新情况。整个过程包含两步,1)预测状态操作(包含继承、删除、更新、不在乎),2)如果是更新,就用识别新槽值来更新状态。
operation predictor:包含四种操作,{CARRYOVER, DELETE, DONTCARE, UPDATE},分别对应将槽位S^j的值设置为:
图中的Dt包含系统回复At和用户表达Ut,Bt表示在t轮时的会话状态,J是槽位类型个数,输入Xt表示为:
其中“[SLOT]”、"-"是特殊字符标记,类似于槽位分隔符,不同槽位类型之间都是一样的。
然后[SLOT]字符的输出来预测该槽位该做哪一种operation。[CLS]向量预测属于哪一域,也可以作为意图分类器。
Slot Value Generator:通过GRU来生成槽位值,初始GRU的hisden state来自于h_t^X,词向量是h_t^{[SLOT]^j},即保证生成的槽位值是槽位j的,每次解码的时候解码出[EOS]则结束。
感觉生成方式还是不太靠谱,会在整个词语空间生成,如果这里加一点限制,比如当前中出现过的槽位值,应该会更高效一些。其实如果更新槽位值,一般就是当前轮次进行了槽值纠正,更可能在当前轮次中。
NON-AUTOREGRESSIVE DIALOG STATE TRACKING
自回归的一些方法,不太实用,线上预测耗时高,本文提出一种非自回归方案,并且显示引入了domain和slot-type之间的关系。
Schema-guided multi-domain dialogue state tracking with graph attention neural networks
如果预测意图和槽位的时候,加入一些意图的槽位的说明,是不是有利于模型理解呢?一定程度上是否也能够解决某些槽位数据稀疏的问题,所以这篇文章提出了SST模型,通过引入包含槽位关系的schema graphs,将graph和句子融合(fuse),来进行状态追踪。
2020Domain-Aware Dialogue State Tracker for Multi-Domain Dialogue Systems
文中提出domain-aware dst方法,基于数据驱动,但是预测的时候能够支持dynamic service schemas,(这个有点意思,有点prompt的味道)。该方法将domain和slot信息联合抽取为向量表达(这里会用到描述,所以能够支持动态的),然后用这种向量表达来预测slot的值。
对于域、意图、slot-type、可分类的slot-value都通过分类来预测,对于非分类的槽位值,文章通过span预测来从当前系统回复和用户utterance中抽取。
这种方法会使用到slot、domain中的描述信息,作为一些先验知识输入,无论是对于冷启动还是数据稀疏问题应该一定程度上能够缓解,有点类似于prompt。
TOD-BERT: Pre-trained Natural Language Understanding for Task-Oriented Dialogue
作者认为通用的语料和多轮对话语料之间存在语义和句式上的差异,因此需要语言模型针对对话语料也做一定的daptation,所以提出了TOD-BERT,利用对话语料进行适配的预训练,主要改进在编码层。
End-to-End Multi-Domain Task-Oriented Dialogue Systems with Multi-level Neural Belief Tracker ConvLab: Multi-Domain End-to-End Dialog System Platform
个人觉得端到端在任务型会话上,达到工业级应用远远不够,而且不可控,然后一般论文不仅端到端,还要Multi-Domain,看到标题我就发憷。但是在闲聊领域应该是有很多个案例。这块了解不多,
Non-Autoregressive Dialog State Tracking
这一块确实是很热门的话题,Prompt如火如荼,上面说了太多,先留坑,后面在开篇讲吧。