人机对话(2)-基于Data-drive的task-DM系统
什么是基于数据驱动
前面有说过基于目标/任务/流程驱动的DM系统,这些方法其实都属于手动设计特征,复杂的对话逻辑是由人来设计处理逻辑去完成的。这样的方法在小范围内其实表现会更好,但是随着对话业务越来越复杂,构建与维护成本也会越来越高,当然距离我们理想的人机对话那是远远不够的;所以DM系统可否交于深度学习来完成呢?
将对话逻辑交给深度学习来处理,就是以数据驱动的对话
接下来看看如何炼丹了~~
基本结构
人机对话1、SLU/NLU 模块
将用户语言转为用户意图,同时识别对实体进行标注用于填槽; 这部分模块基本上非常成熟了,不论采用什么DM设计的系统,NLU模块都差不多是通过字典以及上下文语料进行意图分类任务以及实体的序列标注任务;使得系统明白”是什么“
例如
user:我想要吃火锅 → intent:find_food [我 想要 吃 V.food]
intent识别ut即意图类别
像之前提到过的BERT模型就可以用来处理NLU的分类任务,效果已经非常好了。
NLU模块会应用到小型的知识图谱,我们需要对意图进行分类就是为了应用这个意图下的知识,明确该任务所依赖的槽。这部分仍旧是通过手工设计的,毕竟算法的作用目前只是用于识别,知识仍然需要人为添加。
2、DST:对话状态跟踪模块
跟踪当前对话状态,并输出对话状态
DST模块依赖于前面的NLU模块+知识图谱;使得系统明白”在哪儿“
3、DPL:对话策略模块
根据当前的对话状态、外部数据、用户输入等决定下一步应该采取什么动作
DPL模块依赖NLU与DST模块,使得系统明白”要干什么“
4、NLG:自然语言生成
将DPL的action转化为自然语言给用户
比如: action→“为您推荐 v.hotel,价格实惠交通便利” 这样的语义模板,再将槽值填入返回给用户
以上任务型对话机器人的通用结构,通常所说的DM部分就包括DST(对话状态) DPL(策略学习);接下来主要阐述这两个模块
DST
DST模块儿主要确定用户对话的状态,也叫做belief state:置信状态;由belief tracking模块进行处理,最终输出槽值的概率分布。 比如 S.food 【中国菜 0.88 越南菜0.12 韩国菜 0.08】这样子的表示形式;所以belief tracking同样承担了NLU的任务
在具体的对话任务里,对话状态指的就是指不同的slot-value对的情况,
DST它的输入是Un(n时刻的意图和槽值对,也叫用户Action)、An-1(n-1时刻的系统Action)和Sn-1(n-1时刻的状态),输出是Sn(n时刻的状态)。
belief tracker如图所示,belief tracker 网络输出了槽位的槽值分布;
主要对语句进行了特征处理、置信度计算以及上下文处理三个部分
特征提取
特征提取用户t时刻的输入以及系统t-1时刻的回复经过CNN完成了特征抽取,得到两个向量作为上方神经元的输入。(用CNN可能是因为模型局部特征处理稳定的特点,向量不会损失太多信息;恩、纯瞎猜~~~)
置信度计算
置信度计算上一步中的用户与系统的语句向量再加上知识图谱中的slot-value对加入到神经网络中进行计算,最终输出就是slot以及值的概率分布
之所以同时计算用户与系统的向量是因为往往信息蕴含在这一组对话中,比如
系统请求:上一时刻系统要求用户提供某种信息,例如“您大概需要什么价位的呢?
系统确认:上一时刻系统要求用户确认某种信息,例如“您是需要土耳其食物是吗?”
整个过程考虑上下文
image.png在前面模型中会有一个RNN模型,而且前序y值作为下一个神经元的输入;
这是因为考虑到对话过程中用户对需求表达的模糊甚至更改,所以模型将整个context通过RNN进行考虑,毕竟RNN模型本身就对整个对话序列全局考虑。context的接入在置信度计算的附图中也可以看到。
外部数据
通过belief tracker 完成slot值分布后,我们取max slot值前往数据库进行业务查询;比如置信度最高的火锅,从数据库可以查到对应的商家,从而可以获取 商家地址 商家电话 等信息。这类信息也会作为槽值进行处理(槽值确定),区别于通过用户语言获取的槽;
DPL
DPL基于当前状态(state)决定系统需要采取action。它的输入是Sn,输出是An。
DPL这是一个典型的强化学习场景,需要系统产出一个action,每一步action之后,用户会返回用户action,从而使得状态S发生跳转,而Sn-1与Sn之间会有信息更新,比如槽填充。推动了对话进行;我们可以定义S变化时的reward奖励(比如根据信息填槽),通过训练模型累计reward的数值最高,从而使得系统action的准确性;
reward定义上图就是对槽值填写与否定义了一个score(reward) table,通过强化学习训练使得全局策略最优,最终将每次的action通过NLG处理后返回给用户。
总结
基于数据驱动的TASKBOOTintent network+Belief Tracker+知识图谱 承载了NLU的任务
Belief Tracker维护了对话的状态
policy network 根据当前状态以一定的策略采取了 系统action;
一次次系统action和用户action 推动对话进行,与外部数据共同推动任务信息完善;最终完成任务;
基于数据驱动的问题
目前行业普遍应用仍然是手动设计的DM系统,而不是深度学习方法
1、训练语料,数据驱动的深度学习DM需要大量语料;冷启动产品特别不适合用data_trave的方式;
2、深度学习的黑箱,导致业务交互不可控,即风险不可控,这个影响很大。
3、生成语句可能有语法问题,体验不可控
相信随着技术与业务探索,这些问题都可以解决。要想实现真正的CUI ,这是必须要走的一步!
(笔者正寻求NLP、人机对话方向产品职位 微信:cheng390552021)