本文包含以下内容
- 2020年刚出的大规模中文多轮对话数据集的介绍
- 多轮对话的一些常见任务
- 多轮对话的一些常见模型
基本概念
什么是对话?
- 我:你好!
- 机器人:你也好!
多轮对话呢?
- 我:你好!
- 机器人:你也好!
- 我:吃饭了伐?
- 机器人:当然没有
(来回好几回合)
任务导向多轮对话呢?
- 我:帮我订一张机票!
- 机器人:哪里呢?
- 我:北京的。
- 机器人:订好了。
(不是闲聊,有目的性的对话)
跨领域任务导向多轮对话呢?
- 我:帮我订一张机票!
- 机器人:哪里呢?
- 我:北京的。
- 机器人:订好了。
- 我:再在附近订个五星酒店。
- 机器人:北京饭店你看可以吗?
(用户有两个以上目的(订机票和酒店)要通过对话实现)
中文?突出中文是因为之前的大规模开源多轮对话数据集MultiWOZ是英文的。MultiWOZ在推动英文多轮对话诞生了很多研究。因此这次清华大学计算机系制作了中文的数据集以填补中文任务导向对话数据的空白。
论文地址:https://arxiv.org/pdf/2002.11893.pdf
数据集介绍
数据集参数
CrossWOZ包含 6K 个对话,102K 个句子,涉及 5 个领域(景点、酒店、餐馆、地铁、出租)。平均每个对话涉及 3.2 个领域,远超之前的多领域对话数据集,增添了对话管理的难度。
特点
- 用户在某个领域的选择可能会影响到与之相关的领域的选择,在跨领域上下文理解更有挑战。
- 第一个大规模中文跨领域任务导向数据集。
- 在用户端和系统端都有详细的对话状态记录,标注信息全面。
与其他数据集的对比
跨领域对话的数据样例
数据标注方法
1 基础数据库的构建。通过爬虫从网络上获取了北京市的酒店/旅游景点/饭店以及地铁和出租车信息。
比如说Attract景点有465个,景点有9个槽。Hotel和8+37个槽。比如是否要叫醒服务等。
2 目标构建。论文通过算法自动生成标注人员的对话目标。
上面的id1,2,3就是自动生成的目标。标注人员要以完成这三个目标(寻找免费旅游景点和订附近酒店以及出租车)作为目的和系统进行对话。
3 数据标注。论文雇佣大量工人分别充当用户和系统。用户向系统订酒店景点,然后系统回复用户预约的相关信息。所有的对话数据都是用户生成的。同时用户在对话过程中还需要对用户状态和系统状态进行标注。具体的过程如下图。
数据和模型下载地址:https://github.com/thu-coai/CrossWOZ
常见任务
有了多轮对话数据集,而且标注这么详细,我们就有研究多轮对话的条件了。
多轮对话有以下五个研究方向:
- 多轮对话下的自然语言理解(Natural Language Understanding)
- 对话状态追踪(Dialogue State Tracking)
- 对话策略学习(Dialogue Policy Learning)
- 自然语言生成(Natural Language Generation)
- 用户模拟器(User Simulator)
多轮对话下的自然语言理解(NLU)
多轮对话下的NLU通常是针对用户的输入语句让模型填满这样一个四元组
(intent=Inform, domain=Attraction, slot=fee, value=free)
通过意图识别和ner我们就可以完成nlu。本文提出了一种BERTNLU-context的模型来做多轮对话下的nlu。BERTNLU不必多说,就是把bert作为encoder对输入文本进行编码。然后为了利用上下文信息,BERTNLU-context会把对话历史的之前三句话用sep分割作为文本输入另一个BERT模型,取出那个模型的cls位置变量作为上下文表征。然后把该上下文表征和用户输入的语句的特征向量一一concat再进行ner和文本分类,效果很好。
对话状态追踪(DST)
DST的目地是根据用户和系统的对话历史,动态识别出用户的目地,并转为预先定义好的格式。
本文介绍了两种方法做DST
- RuleDST。设计一些规则动态识别用户状态,比如识别到用户说任意一个槽就给它填上。
- TRADE。TRADE模型需要专门的篇幅来介绍它。
TRADE模型
首先它要解决的问题是如何在一个涉及多个领域的对话中利用跨领域(domain)的信息来完成一个综合的任务。
举个例子:吴先生要去一家餐厅约会,使用智能助手订好了餐厅,其中收集了 餐厅名 时间 这些信息(slot),
而之后吴先生还需要预约一辆出租车回家,那么此时他会期望智能助手明白上车点就是餐厅。那么问题来了,
在传统的基于一个个独立领域的对话系统中,两个不同领域之间相互独立,不共享信息,你订你的餐厅,
订完了说一句“我要订餐馆回家的出租车”,好嘞进入到订车的领域,从头开始问”您从哪出发呀“。显然不够聪明。
TRADE就是试图所有的domain使用同一个模型,并利用起前面几句对话历史,来预测出当前吴先生说的这句话的
状态(state):(domain,slot,slot value)。就能判断这是【订出租车】的domain,slot是出发点,
还能从之前吴先生确认的餐馆名知道出发点就是XX大酒店。
那么,这么聪明的性能要如何做到呢?
TRADE由三部分组成:
Utterance Encoder, Slot Gate, State Genrator。
Utterance Encoder(双向GRU) :把包括当前句子的对话历史所有单词embedding拼接(l轮)编码,
得到H_t=[H_1,H_2,...,H_XL]。State Generator:首先将所有可能的domain和slot配对得到J个
(domain,slot)对,将它们用用GRU解码,解码过程中得到一个隐藏层 h_dec^jk 将他映射到词汇
空间P_vocab^jk,同时还用这个隐藏层来计算对话历史的attention P_history^jk,加权而后得到
context vector cj0. P_vocab和P_history加权相加(权值是另一个可训练sigmoid元得出)后就
是最终某个(domain,slot)对基于当前对话历史的在所有单词上的概率分布。这一过程要做J次。
考虑P_history和P_vocab的目的是能让模型同时可以从对话历史中找出信息,又有机会得到未在历史
中出现过的单词。Slot Gate G_j: 每个(domain,slot)对都有一个Gate,将它们每个都对上面由对话
历史得到的context vector cj0做一个计算Gj = Softmax(Wg ·(cj0)>) ∈R3,得到don't care,
none,ptr三个选项的概率。如果是前两者,那么无需填入特定槽值,若为ptr则将State Generator得到
的槽值填入对应槽。也即Slot Gate的工作是找出要填的哪个domain的哪个槽。而State Generator是找
出这个槽的值。至此,TRADE便利用对话历史得到了状态(domain,slot,value), 对每一段对话历史的计算
都不依赖于某一个domain。
对话策略学习(DPL)
DPL就是根据之前的对话状态和用户输入,生成一个系统action。在我们做传统的基于状态机的多轮对话中,对话策略通常是基于规则的。本论文介绍了ConvLab-2对话平台下使用SL polciy完成了监督学习下的对话策略学习模型。
自然语言生成(NLG)
我们有了用户和系统的状态和对话动作,同时又有用户生成的自然语言。那么便可以制作生成模型来生成灵活的系统回复语言。本文用两种方式做这个,一个是基于模板的TemplateNLG,一个是SC-LSTM。两个效果如下:
SC-LSTM模型参考地址:https://github.com/andy194673/nlg-sclstm-multiwoz
用户模拟器
用户模拟器是用来模拟用户说话的。最简单的模拟器就是规则型的比如约定第一句话说订酒店,第二句话说要五星的。
用户模拟器对多轮对话系统的自动化评估和对话策略学习都是很有帮助的。本文也构建了一种rule-based 用户模拟器。比如当用户的目标中有未填充的槽时,用户模拟器就会不断追问该槽值,直到所有目标的槽全部填充为止。
论文结果
总结:
1 BERTNLU部分准确率都很高。
2 DST/SL policy准确率在80以下,具有很大提高空间。
3 越是跨领域,对话状态越难追踪。