任务型对话(二)—— DST(对话状态追踪)
1,概述
关于任务型对话的简介看任务型对话(一)—— NLU(意识识别和槽值填充)。
首先我们来看下对话状态和DST的定义。
对话状态:在$t$时刻,结合当前的对话历史和当前的用户输入来给出当前每个slot的取值的概率分布情况,作为DPL的输入,此时的对话状态表示为$S_t$。
DST(对话状态追踪):就是根据所有对话历史信息推断当前对话状态$S_t$和用户目标。
由于在ASR和NLU这两个环节会存在误差,因此输入到DST中的内容是N-best列表(对于ASR,不是输入一条句子,而是N条句子,每条句子都带一个置信度。对于SLU,不是输入一条意图(槽值对),而是N个意图(槽值对),每个意图(槽值对)都带一个置信度)。所以DST往往也是输出各个状态的概率分布,这样的表示也方便在多轮对话中对状态进行修改。具体的情况如下图所示:
2,DST的常用方法
DST的常用方法主要有三种:基于规则的方法,生成式模型,判别式模型,目前来看判别式模型的表现最好,也是当前研究的最多的方向。
1)基于规则的方法
基于规则的方法一般是用1-best的结果作为输入,而且输出的状态也是确定型,基于规则的方法需要大量的人工和专家知识,因此在较复杂的场景适用性不强。当然基于规则的方法也有它的优点,基于规则的方法不依赖于对话数据,因此在没有对话数据的情况下很适合冷启动。基于规则的方法用N-best的结果作为输入也有研究,但总的来说实现起来很复杂。
2)生成式模型
生成式模型主要是利用贝叶斯网络推断来学得整个状态的概率分布,其通用表达式如下:
上面式子中$b(s)$代表上一时刻状态的概率分布,$b'(s')$代表当前时刻的状态分布,$u'$代表当前时刻的用户输入,$\tilde{u}'$代表当前用户输入的观测输出,$s'$代表当前时刻的状态,$s$代表上一时刻的状态,$a$代表上一时刻的动作,$\eta$是一个常数。
可以看出上面的公式还是比较复杂的,因此实现起来也比较复杂,传统的生成式方法还要列出所有可能的状态,以及状态概率转移矩阵等。
3)判别式模型
判别模型用一个最简单的公式建模,可以表示成:
$b'(s') = P(s' | f')$
其中$b'(s')$表示当前状态的概率分布,而$f'$表示对ASR/NLU的输入的特征表示,早期的判别模型会利用SVM,最大熵模型,CRF等来建模。随着神经网络的兴起,DNN,RNN等模型也越来越多的占领了这个领域。
3,DSTC数据集
DSTC全称为Dialogu State Tracing Challenge(对话状态最终挑战)。在阅读接下来的论文的时候需要对这些数据集有所了解,以DSTC2为例,一个餐馆预定的数据集,数据集中提供了N-best ASR的结果,N-best SLU的结果。还提供了槽以及对应的值的信息。具体的可以去这里下载。
4,判别式模型在DST上的相关工作
接下来我们将按照,DNN,RNN,NBT,迁移学习等模型的顺序来介绍一些相关的论文。
论文一:Deep Neural Network Approach for the Dialog State Tracking Challenge
在判别模型中是把DST当作一个分类问题,并且对ASR/NLU提取相关的特征作为模型的输入,这篇论文提出了一种特征工程来提取N-best NLU的一系列特征,然后用一个前向的DNN来作为分类器,具体的模型结构如下:
接下来看下整个输入输出流程:
在$t$论对话中给定一个槽$s$,$S_{t, s}$表示在这$t$论对话中每一轮NLU的N-best列表中关于槽$s$所对应的值$v$,为了应对未知的值,还额外给定了一个Unknow来表示未知的值,我们将这$|S_{t, s}| + 1$个值作为模型的输入,那么问题来了我们该怎么去提取这些槽值的特征呢?如上图所示,$f_1, f_2, ......, f_M$就是表示不同的特征,论文中给出了12中特征,为了保证阅读感(主要翻译的不到位),就直接截图了:
但是论文的输入并不是对前$t$轮同样的方式处理,而是有区分的处理,从$t$往前数前$T$轮直接用上面12中特征来表示,但是对于$t-T$轮之前的全部相加作为一个整体。那么问题来了,如果$t < T$怎么办,对于$t - T < 0$的情况下,$f_i(t', v) = 0$。
对一个slot的不同的值,模型的参数是共享的,而对于不同的slot之间参数是不共享的,也就是说每个slot都有一个属于它自己的分类器。
最后的输出结果如下:
上面的式子其实类似于softmax,唯一不同的是对于不属于$s$的槽统一用一个参数$B$来处理,而对于属于槽$s$中的值$v$输出是$E(t, v)$。
论文二:Word-Based Dialog State Tracking with Recurrent Neural Networks
上面的论文是用NLU的结果作为输入,但从这篇文章开始的后几篇文章都直接用ASR(语音识别)的结果作为输入,那这样做的结果有什么好处呢?主要有两个优点:
1)NLU单独作为一个子模块的时候,也会产生误差,这样ASR+NLU的误差传递会导致在进入到DST的时候就已经存在较大误差了,因此合并NLU和DST可以减少这种误差传递的影响。
2)在对任务型对话系统做评测时,无法判断真个系统产生的错误时来源于哪个子模块的,也就无法有效的定位错误的来源,因此减少子模块可以提高错误定位的准确率。
这篇论文时基于词级的对话状态追踪,因为它的输入时N-best ASR的结果,使用RNN模型来序列建模,采用n-grams来提取ASR的特征。同样本篇论文也是对每个slot单独建模,每个模型都是一个多分类器,类别的个数和该slot下对应的value的个数相等。
1)特征表示
首先来看下是如何利用n-grams来表征输入的,具体的见下图所示:
模型的输入除了当前轮的ASR,还有上一轮的对话动作(对话动作表示为act-type (slot = value)),对这两者分别取1-gram,2-gram,3-gram。
从上图可以看出,主要包含$f,f_s,f_v$这三种特征,$f$是直接对ASR的结果和对话动作取n-grams的结果,$f_s$和$f_v$都是对$f$中的词进行$tag$(对slot用<slot>替换,对value用<value>)替换得到的模板泛化特征,其中$f_s$是对槽提取的特征,适用于该槽下对应的所有的值,而$f_v$对每个value都进行提取,属于每个值的特有特征,这样做有助于模型泛化。
然后$f,f_s,f_v$都是有ASR和对话动作两部分连接而成。ASR是N-best列表,分别提取分别取1-gram,2-gram,3-gram,然后对于重合的n-gram就按照置信度相加;对话动作也是同样,不过概率置1;具体可以参考上图,其实本质上就是对ASR和对话动作提取n-gram,进行各种组合,目的是通过这种低阶的多维组合,可以在高层重构出各种特征组合的可能性,来模拟甚至超越人工提取的各种特征。那么每个n-gram怎么用向量表示的呢,我猜应该是类似于one-hot,以$f$为例,将整个训练集提取相应的n-grams,然后将$f$组成一个大的n-gram词汇表$M$,先初始化一个长度为$|M|$的0向量,然后对于当前的输入提去n-gram,再用相应的n-gram的分数去填充那个0向量(以上一段个人猜测,主要是论文中没有提到,不过论文中提到了$f$的维度是高维,达到3500,再加上在计算的过程中一系列的向量拼接操作,所以这也符合这种情况)。
2)模型结构
输入的表征确定好之后就要看看模型的结构了,模型的结构如下图所示:
上图中的$m$是一个记忆向量,$p$是某个slot下对应的value的概率分布,用一个$h$向量来表示特征$f$的低维表示$f, p, m$中的操作符是拼接的意思。
然后为了利用$f_s, f_v$的特征,提出了下面的表达式:
$g$向量保证了模型的泛化性能,更新$m, p$。
论文三:Neural Belief Tracker: Data-Driven Dialogue State Tracking
这篇论文提出了NBT这个模型,本论文也是合并了NLU和DST,直接用ASR的结果作为输入,并且引入了词向量来进行表征,整体上理解较上面两篇论文要简单。
话不多说,先上一张模型结构图:
上图中的最上一层是输入,可以看到总共有三个输入,分别是当前用户的输入$r$,当前的槽值对候选集$c$,上一时刻系统的对话动作$t$。首先我们来看下用户的输入怎么表征:
1)用户的输入表征
本文对用户的输入$r$分别提出了两种表征方法:NBT-DNN,NBT-CNN。
NBT-DNN的结构图如下:
具体的表达式如下:
上面式子中$u_i$表示句子中第$i$个词的词向量,$V_i^n$表示从第$i$个位置开始取的n个词的向量拼接的结果。其实就是n-gram的方式取词。
这里取了1-gram,2-gram,3-gram的结果,最后相加得到用户输入的向量表示$r$。
NBT-CNN的模型结构图:
其表达式如下:
其实这里用卷积替代了n-gram,上面式子中的$n$表示卷积核的大小,$n = 1, 2, 3$,然后用最大赤化获得最终的向量表示:
这样就得到了最终的用户输入的向量表示。
2)语义解码
从第一幅图可以看到,用户的输入$r$和候选的槽值对是有相互作用的,这个相互作用该怎么表示呢?
上面$c_s$是槽$s$的词向量,$c_v$是对应的值的词向量,$r$ 和$c$之间是element-wise相乘的。
3)上下文建模
也是第一幅图中描述的,用户的输入$r$和系统对话动作$t$之间的关系。
作者在这里定义了两种系统的动作:一是系统请求用户告知某个槽的值,如“what proce range would you like”,这种请款系统会提到一个槽的信息,用$t_q$表示;二是系统向用户确认槽值对是否正确,如“how about Turkish food ”,在这种请款下用户会提到一对槽值的信息,其中槽用$t_s$表示,值用$t_v$表示。
在上面如$(c_s . t_q)$是计算点积得到一个相似度可以作为门控机制用来控制对$r$的选择,这种做法在系统问“how about Turkish food”,用户回答“yes”的时候特别有用,因为此时用户并没有传递任何槽值的信息进来。这样就可以利用上一个系统对话动作的信息。
因为候选槽值对每次只选一个,因此最后做一个二分类的决策:
其中$\phi_dim = \sigma(Wx + b)$, $dim$表示输出的维度。
4)信念状态更新机制
上面只是对某个槽值对做了二分类,那该怎么更新整个状态概率呢?本文定义了一个基于规则的信念状态更新机制。
在$t$轮对话时,用$h^t$表示ASR的N-best集合,$h^n_i$表示第$i$条句子,$p^n_i$表示第$i$个句子的置信度,$sys^{t-1}$表示系统在上一时刻的动作。则对于槽$s$更新其所有的值的概率分布:
结合之前所有的对话历史,可以表示为:
之后取概率大于0.5的槽值对出来更新当前的状态值,没有的话就依然保留上一时刻的值。这句话怎么理解呢?也就是下面的式子成立了才执行上面的式子,否则就不对上一时刻的信念状态做修改。
论文:Fully Statistical Neural Belief Tracking
这篇论文是在上一篇论文的基础上做了改进的,在上篇论文中提出了一个基于规则的信念状态更新机制,对于这种基于规则定义的机制迁移到新的任务时需要大量的修改,因此本文提出了新的信念状态更新机制。
同样先上模型结构图:
首先定义一下问题:在一个给定的$s \in V_s$,让$b_s^{t -1 }$ 表示$t-1$时刻的信念状态(一个长度为$|V_s| + 2$的向量,这里的2是指还包含两个值:None和“dont care”)。在上一篇文章中更新信念状态的机制如下:
作者认为这种机制并没有学到$b_{s, v}^{t-1}$的内容,只是简答的相加而已,而且还要在$b_{s,v}^t ≥ 0.5$的时候才执行更新。因此这种方法并不好。作者也就提出了两种新的方法:
1)One-Step Markovian Update
其表达式如下,直接用softmax生成概率分布:
上面式子中给出的两个矩阵的每一行都是对一个槽值对的操作。因此这种方式有一个问题,训练样本的稀疏性,每个对话中可能只包含一个槽值对,在训练的时候无法更新$W_{curr}$和$W_{past}$,因此作者提出了第二种方法。
2)Constrained Markovian Update
在这里作者构造了一种不同的矩阵,其表达式如下:
让对角线的元素相同,其余的元素相同,这样就可以起到训练的时候能更新到所有的参数。结果也表明这种方法的性能更好。
论文:INCREMENTAL LSTM-BASED DIALOG STATE TRACKER
这篇文章提出了一个简单的方法,直接用LSTM来表示ASR的1-best的输入,然后对每个slot做多分类,整体来说效果也还行。
模型结构图如下:
其表达式如下:
上面式子中$a$为ASR的输出,$r$为对应的置信度。利用一个网络来进行表征,然后倒入到LSTM中,并softmax多分类。
最终在DSTC2上的结果对比:
在做了一些小处理之后的结果还行,不过这篇文章是15年的,但是实现起来简单。
参考文献:
MACHINE LEARNING FOR DIALOG STATE TRACKING: A REVIEW
The Dialog State Tracking Challenge Series: A Review
任务型对话(二)—— DST(对话状态追踪)的更多相关文章
- Java Thread系列(二)线程状态
Java Thread系列(二)线程状态 一.线程的五种状态 新建状态(New):新创建了一个线程对象,尚未启动. 就绪状态(Runnable):也叫可运行状态.线程对象创建后,其他线程调用了该对象的 ...
- Java 设计模式系列(二十)状态模式
Java 设计模式系列(二十)状态模式 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式.状态模式允许一个对象在其内部状态改变的时候改 ...
- 利用WPF建立自己的3d gis软件(非axhost方式)(二)基础状态切换
原文:利用WPF建立自己的3d gis软件(非axhost方式)(二)基础状态切换 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew 密 ...
- BERT生成能力改进:分离对话生成和对话理解
NLP论文解读 原创•作者 | 吴雪梦Shinemon 研究方向 | 计算机视觉 导读说明: NLP任务大致可以分为NLU(自然语言理解)和NLG(自然语言生成)两种,NLU负责根据上下文去理解当前用 ...
- (二十一)状态模式详解(DOTA版)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本次LZ给各位介绍状态模式, ...
- (二)无状态的web应用(单py的Django占位图片服务器)
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 阅读本文建议了解Django框架的基本工作流程,了解WSGI应用,如果对以上不是很清楚,建议结 ...
- Java经典23种设计模式之行为型模式(二)
本文接着介绍行为型模式里的解释器模式.迭代器模式.中介者模式. 一.解释器模式Interpret 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言的中的句子. 1 ...
- 行为型模式(二) 命令模式(Command)
一.动机(Motivate) 在我们的现实生活中有很多例子可以拿来说明这个模式,我们还拿吃饺子这个事情来说.我的奶奶说了,今天想吃饺子,发出了命令,然后我奶奶就去看电视去了.我们夫妻俩收到命令就开始和 ...
- SpringCloud 教程 (二) 服务链路追踪(Spring Cloud Sleuth)
一.简介 Add sleuth to the classpath of a Spring Boot application (see below for Maven and Gradle exampl ...
随机推荐
- 微信小程序入门笔记
目录的作用: 1. pages目录: 该目录下存放所有的定义页面 2. utils目录: 该目录下存放定义的一些小功能组件 3. 根目录下app.js文件: 定义小程序对象, 执行小程序生命周期内的各 ...
- [LeetCode] 450. Delete Node in a BST 删除二叉搜索树中的节点
Given a root node reference of a BST and a key, delete the node with the given key in the BST. Retur ...
- springcloud2.x之management.security.enabled=false报错处理
1. springcloud1.5.x的消息总线配置是 # RabbitMq的地址.端口,用户名.密码 spring.rabbitmq.host=localhost spring.rabbitmq.p ...
- vue + element 文件上传 并将文件转 base64
当时有一个需求 是需要用到上传文件这个功能,并且需要将文件转为 base64 给到后台.网上找的全是啥图片转base64 肯定是因为这类需求比较常见.当时有点懵了.后面一想,都他娘是文件啊.然后就找到 ...
- Ubuntu 16 PPA源管理(查询、添加、修改、删除)
查询 在Ubuntu中,每个PPA源是单独存放在/etc/apt/sources.list.d/文件夹中的,进入到该文件夹,使用ls命令查询即可列出当前系统添加的PPA源. 添加 sudo add-a ...
- Docker 部署ELK
1.安装docker前安装pip sudo yum -y install epel-release sudo yum install python-pip 2.安装docker #安装依赖包 yum ...
- CEF4Delphi初识
代码模块与职责 所有的代码都在src目录下,这会导致一上手的时候无法快速划分模块,不便于理解,如果分类然后放文件夹就会好一些. 最关键的部分在于uCEFApplication,是和dll链接的部分 u ...
- JavaIO学习:字符流
JavaIO流之字符流 字符流 Reader InputStreamReader FileReader:专门用于处理文件的字符读取流对象. Writer OutputStreamWriter File ...
- CSS实现水平垂直居中的数种方法整合
CSS实现水平垂直居中可以说是前端老生常谈的问题了,一般面试官问的时候面试者都会回答出来,但是继续追问还有没有其他方法的时候有可能就说不出来了. 本着学习知识的目的,特在此纪录CSS实现水平垂直居中的 ...
- XmlExtensions帮助类
public static class XmlExtensions { static Lazy<XmlWriterSettings> _settings = new Lazy<Xml ...