数据
研究任务型对话系统,首先得从数据集采集说起,关于数据之前文章介绍过了,这里就不详细介绍了,参考:任务型多轮对话数据集和采集方法
用户建模
用户模拟器是在任务型多轮对话场景中,用于模拟用户在指定目标下多轮对话过程,可以用于生成对话数据,以及通过强化的方式训练系统决策。在具体的任务型场景需要定义有哪些用户行为、用户意图、用户可能说的槽位等。
之前也分析过微软开源的规则版用户模拟器代码,这里就不赘述了,可以参考:【多轮对话】从微软源码看用户模拟器构建。
无论是规则还是模型版本用户建模,其一般输入包含:1)对话历史;2)用户profile(画像);3)任务的schema;4)数据库or API。
目前用户模拟器也面临一些挑战:
- 开发更通用的用户模拟器,他的输入可以包含数据库或者API,这些数据库和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一般都是槽位状态的分布。(意图也可以作为一种槽位状态)
会话状态跟踪就是根据所有的历史上下文信息,获得到当前轮的会话状态。
The dialog state tracking challenge series: A review
Static Ontology DST Models
定义:dialogue state tracker(belief traker)。在会话的每一步去预测用户的目标,用户目标是一个不可观测的隐状态,所以通过观测用户utterence,通过belief state来表示用户目标。
- belief state: 对话的每一个时间步的状态表示,由于当前观测状态具有不确定性(asr噪声、nlu不确定、用户表达本身的不确定性),所以belief state是一个概率分布,具体为每个slot的概率,slot包含type,value,action。
a belief state b is a vector whose component values give the probabilities of being in each machine state.
NBT
2017Neural Belief Tracker- Data-Driven Dialogue State Tracking
此篇文章提出NBT框架,通过引入预训练词向量,将用户query和会话上文表征为向量,解决语义理解任务需要大量数据和手工特征的问题,更适合复杂的对话。
之前也介绍过NBT,这里就不啰嗦了,参考:【多轮对话】任务型多轮对话状态跟踪-NBT原理
GLAD
2018Global-Locally Self-Attentive Dialogue State Tracker
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结构:
GCE
2018Toward Scalable Neural Dialogue State Tracking Model
类似glad,两阶段,encoder和scoring。encoder中只使用global encoder,通过使用attention机制希望能够对域不同的slot type获取到私有的特征。他的编码器模块输入阶段融入了slot type信息和utterance,解码通过attention机制希望能够更关注于句子中槽值有关的信息,如图(a),scoring阶段,context vector由于更关注于槽值,所以一和slot-value对计算得分的时候,相同槽值得分会更大,如图(b)。
从整个过程看下来,网络结构比GLAD简单,还更合理。
G-SAT
之前的模型使用RNN来计算每个slot-value的概率,延迟会是一个很大的问题,难以在真实对话中使用,特别是slot-value特别多的情况。g-sat就是解决延时问题(Global encoder and Slot-Attentive decoders),global编码器使用了bilistm(噗..),然后每个slot-type会有一个私有解码器,去计算其得分。
反正他快了,就是因为网络减少了(共享),没啥大优化。
SUMBT
slot-utterance matching belief tracker (SUMBT)引入了bert作为预训练编码器。对于value值,使用bert编码成向量,然后对于对话历史和slot-type,也通过下图的编码器转化为一个向量,然后向量相似度得分作为该slot-value对的概率。
Dynamic Ontology DST Models
BERT-DST
BERT-DST: Scalable End-to-End Dialogue State Tracking with Bidirectional Encoder Representations from Transformer
通过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
TripPy- A Triple Copy Strategy for Value Independent Neural Dialog State Tracking
会话状态中槽位来自于三种情况:
- 用户当前轮次会话
- 当前系统回复给用户中提及的槽位
- 用户历史会话
因此提出了使用span机制来抽取用户当前和历史会话、系统回复中的槽位,然后提出门控机制:
- slot getes是对每个domain-slot进行分类(注意没有value),包含五个类别:{none,dontcare,span,inform,refer},span表示槽位来自于用户当前轮,inform表示来自于系统当前回复,refer表示来自于来自于已有的会话状态。
- Boolean slots:两类型的slot会单独分类,包含类别为{none, dontcare, true, false}。
Auxiliary Features:除了用户当前和历史的会话,当前系统的回复,输入还包括: $a_t^{inform}$表示该槽位是否最近被系统问过,$a_t^{ds}$表示槽位是否已经被用户说过。
Partial Masking:会对历史系统回复中的槽位值替换为UNK,目的是为了更多关注句式,避免值带来的干扰。(因为值是已知的,可以直接获得)
Reading Comprehension
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 carryover: 判断该槽位是否从上一轮状态中继承,如果否,继续第二步。对于每个slot-type会有一个specific的分类器。
- slot type:输入是$q_i$和e,预测当前槽位属于哪一种类型:{Yes, No, DontCare, Span},yes/no对应二值类型槽位,dontcare表示槽值无所谓,如果是span,那么会继续第三步骤。
- slot span:输入是$q_i$和会话历史,预测当前slot-type下的槽位值,类型MRC-NER思想。
对于不同的slot-type,dialogue embedding只用计算一次,不同的question和e作为slot type的输入,
SOM-DST
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则结束。
感觉生成方式还是不太靠谱,会在整个词语空间生成,如果这里加一点限制,比如当前中出现过的槽位值,应该会更高效一些。其实如果更新槽位值,一般就是当前轮次进行了槽值纠正,更可能在当前轮次中。
NADST
NON-AUTOREGRESSIVE DIALOG STATE TRACKING
自回归的一些方法,不太实用,线上预测耗时高,本文提出一种非自回归方案,并且显示引入了domain和slot-type之间的关系。
SG-DST
Schema-guided multi-domain dialogue state tracking with graph attention neural networks
如果预测意图和槽位的时候,加入一些意图的槽位的说明,是不是有利于模型理解呢?一定程度上是否也能够解决某些槽位数据稀疏的问题,所以这篇文章提出了SST模型,通过引入包含槽位关系的schema graphs,将graph和句子融合(fuse),来进行状态追踪。
DA-DST
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
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如火如荼,上面说了太多,先留坑,后面在开篇讲吧。
reference
- A Network-based End-to-End Trainable Task-oriented Dialogue System
- Bootstrapping a Neural Conversational Agent with Dialogue Self-Play, Crowdsourcing and On-Line Reinforcement Learning
- 2021Conversational Semantic Parsing for Dialog State Tracking
- Building a conversational agent overnight with dialogue self-play, git
- Dialogue Learning with Human Teaching and Feedback in End-to-End Trainable Task-Oriented Dialogue Systems
- 2018Fully Statistical Neural Belief Tracking
- 2017Neural Belief Tracker- Data-Driven Dialogue State Tracking
- 2018Global-Locally Self-Attentive Dialogue State Tracker
- 2018Toward Scalable Neural Dialogue State Tracking Model
- Scalable neural dialogue state tracking
- SUMBT: Slot-utterance matching for universal and scalable belief tracking
- 2019BERT-DST- Scalable End-to-End Dialogue State Tracking with Bidirectional Encoder Representations from Transformer
- 2020TripPy- A Triple Copy Strategy for Value Independent Neural Dialog State Tracking
- Dialog state tracking, a machine reading approach using Memory Network
- Dialog State Tracking: A Neural Reading Comprehension Approach
- 2018scalable multi-domain dialogue state tracking
- 2018Flexible and Scalable State Tracking Framework for Goal-Oriented Dialogue Systems.pdf
- 2019Scalable and Accurate Dialogue State Tracking via Hierarchical Sequence Generation.pdf
- An End-to-end Approach for Handling Unknown Slot Values in Dialogue State Tracking.pdf
- 2020MA-DST- Multi-Attention-Based Scalable Dialog State Tracking.pdf
- 2020Find or Classify? Dual Strategy for Slot-Value Predictions on Multi-Domain Dialog State Tracking.pdf
- https://aclanthology.org/W18-5045.pdf
- https://zhuanlan.zhihu.com/p/27470864
- https://www.jiqizhixin.com/articles/2017-08-30-22
- A Survey on Dialog Management: Recent Advances and Challenges
- Neural Approaches to Conversational AI(