让机器像人一样自由的对话,对话机器人必然要具备连续对话的能力,即多轮对话,多轮对话不用多讲,那么什么是多轮对话状态跟踪呢(DST, dialogue state tracker | belief traker)?
在会话的每一步需要去预测用户的目标,然后会话策略给于用户正确的用响应,但用户目标是一个不可观测的隐状态,所以需要通过观测用户历史utterence、系统历史响应,然后获得belief state,通过belief state来表示用户目标。
会话状态(belief state)
那么什么是会话状态(belief state): 对话的每一个时间步的状态表示,由于当前观测状态具有不确定性(asr噪声、nlu不确定、用户表达本身的不确定性),所以belief state是一个概率分布,具体为每个slot的概率,slot包含type,value,action。会话状态追踪技术就是每一个时间步的状态预测belief state,方法也较多,本文先从ACL的一篇文章NBT讲起。
NBT
2017Neural Belief Tracker- Data-Driven Dialogue State Tracking.pdf
此篇文章提出NBT框架,通过引入预训练词向量,将用户query和会话上文表征为向量,解决语义理解任务需要大量数据和手工特征的问题,更适合复杂的对话。
对于上一轮的系统输出,当前轮次的用户输入,每个slot-value对进行向量表征,转化为向量t,r,c。然后将t和r计算
将当前轮次的状态和上一轮的历史状态做合并。
用户表征
分别使用两种encoder,分别是DNN和CNN,将用户query转化为向量。拿DNN举例,设置1-3的词语窗口,将窗口内的词向量拼接获得各个位置i的向量,然后通过各个i的向量求和获得向量,进过非线性变化获得
槽位表征
对于每一个slot-value对,将槽位类型cs和槽位值cv相加之后经过一层MLP之后获得向量c,然后c和r做点乘获得获得d向量。
上文表征
有两种情况需要上文的系统表征
- 系统问下了用户某个槽位,比如用户对价格要求,这时候用户回答极有可能就是价格。
- 系统向用户发起确认某个slot-value的时候,用户回答肯定的时候,需要更新槽位。
因此编码上文表征就显得重要,通过ts,tv表示系统的请求或者确认的槽位,将分别和cs,cv计算点积作为r的门控获得m向量,公式如下:
最终经过MLP层进行一个二分类,输出当前slot-value的概率:
belief state Updates1
简单的规则,通过一个衰减系数将当前的belief state和上一个belief state相加,获得每个slot-value的概率,再通过阈值(文中为0.5)进行过滤。
优势:
- 依赖于预训练的词向量,可以做到将槽位的归一,例如"a pricey restaurant"分类为"price=expensive"
- slu和dst集成到一起,集成度高。
缺点:
- 首先要求有预先定义的ontology,slot-value对是可遍历的,不能太多。
- 其次每次预测都要和每个slot-value计算,开销比较大,不是很实用。
- 编码方法比较native。
- 丢弃了历史的状态,里面可能包含的信息有利于理解。
- 状态更新基于规则。
2018Fully Statistical Neural Belief Tracking.pdf
上一篇文章,由于通过手工规则更新belief state,导致新领域迁移需要昂贵的手动操作(我觉得也没多昂贵),这篇文章改进了belief state更新,通过联合学习的方式,将其集成到NBT中。
主要改进点在于引入了上一轮的belief state建模进行联合学习,不在使用规则,其他部分都一样就不在赘述,主要了解belief state的更新机制
Belief State Updates2
One-Step Markovian Update
只依赖域上一步的belief state和当前识别的槽位,所以当前的状态更新:
Constrained Markovian Update
改进了权重参数,每个权重矩阵只有两个参数,即对角矩阵和非对角,对角是对于同一个槽位的更新,表示倾向于使用当前槽位的权重,表示倾向于历史槽位的权重,非对角是不同的槽位的更新.
这样做的好处:parameter are tied, ensuring that the model can deal with slot values unseen in training