TEG数据平台部联合AiLab、Ai平台部,结合语音合成、语音识别、机器人问答、大数据能力等前沿性、高复用性的功能模块构建腾讯小知智能机器人产品,支持问答、业务办理、营销推广、回访调研、通知提醒等应用场景,降低人工服务成本、提升服务质量和转化效率,目前已在多个领域落地,如公安、零售、教育和地产等。
背景
本文主要介绍深度强化学习在任务型对话上的应用,两者的结合点主要是将深度强化学习应用于任务型对话的策略学习上,目前工业界普遍使用的策略都是基于规则的,显然基于规则的方法有人力成本高、泛化能力差等缺点,而强化学习恰好能解决这些问题,而且强化学习只需要一些目标,无需大量的训练语料,避免了深度学习的一大缺点。
首先简单介绍一下强化学习和对话系统,然后再具体介绍一下深度强化学习在任务型对话中是怎么应用的,最后给出训练的结果和总结。以下举例部分都会以订餐场景为准。
强化学习
强化学习系统由智能体(Agent)、状态(state)、奖赏(reward)、动作(action)和环境(Environment)五部分组成,如下图所示。
可见,强化学习的主体是Agent和环境Environment。Agent为了适应环境,做出的一系列的动作,使最终的奖励最高,同时在此过程中更新特定的参数。实际上可以把强化学习简单理解成是一种循环,具体的工作方式如下:
对话系统
对话系统是为了某种目的设计的用以与人类对话的机器,这种目的可以是为了特定的任务,也可以是简单的与人聊天,前者就是任务型对话,后者为非任务型对话系统。
任务型的对话主要为了一个特定的目标进行对话,比如常见的订飞机票、订餐等。对于任务型对话工业界主要实现方案还是为pipeline的方式,即按照SLU、DST、DPL和NLG的方式组织整个对话系统,在学术界上end-to-end的方式也越来越受到关注,与pipeline不同,end-to-end模型使用一个模块,并与结构化的外部数据库交互。
非任务型的对话则类似于微软小冰和人进行一些聊天。非任务型的对话主流实现方案有两种:生成式和检索式。随着seq2seq模型的越来越成熟,生成式方案也越来越受到关注,这种方法是把对话任务看成是一种翻译任务,认为Q(人说的话)和A(机器的回复)是两种语言。检索式则是系统有很多训练数据,其中包括扩展问题(每个问题都对应一个标准问)、答案(每个标准问对应一个答案),当用户说一句话时,则系统用这句话作为query在训练集中进行检索和排序得到匹配的问题,最后根据这个问题的标准问查询答案。当然也有这两种方式的结合,即使用生成式生成候选的答案,再使用检索式进行匹配和排序得到精准回答。
DQN+任务型对话
DQN
Q-learning是强化学习中的一种,在Q-learning中,我们维护一张Q值表,表的维数为:状态数S * 动作数A,表中每个数代表在态s下可以采用动作a可以获得的未来收益的折现和——Q值。我们不断的迭代我们的Q值表使其最终收敛,然后根据Q值表我们就可以在每个状态下选取一个最优策略。
DQN是深度学习与强化学习的结合,即使用神经网络代替Q-learning中Q表。在普通的Q-learning中,当状态和动作空间是离散且维数不高时可使用Q-Table储存每个状态动作对的Q值,但是当状态和动作空间是高维或者连续时,使用Q-Table不现实,而神经网络恰好擅长于此。因此将Q-Table的更新问题变成一个函数拟合问题,相近的状态得到相近的输出动作。具体来说,比如我们现在还有一个Q值表,神经网络的作用就是给定一个状态s和动作a,预测对应的Q值,使得神经网络的结果与Q表中的值接近。不过DQN的方式肯定不能继续维护一个Q表,所以将上次反馈的奖励作为逼近的目标,如下式,通过更新参数 θ 使Q函数逼近最优Q值 。因此,DQN就是要设计一个神经网络结构,通过函数来拟合Q值,即:
当然这也会带来一些问题:
针对以上问题的具体解决方案如下:
构造标签
对于函数优化问题,监督学习的一般方法是先确定Loss Function,然后求梯度,使用随机梯度下降等方法更新参数。DQN则基于Q-Learning来确定Loss Function。我们想要使q-target值和q-eval值相差越小越好。DQN中的损失函数是:
这里yi先可以认为是状态s和动作a对应的标准Q值,实际根据后面的双网络结构,yi是根据上一个迭代周期或者说target-net网络的参数计算出的q-target值,跟当前网络结构中的参数无关,yi的计算如下,然后整个目标函数就可以通过随机梯度下降方法来进行优化
经验回放
经验池的功能主要是解决相关性及非静态分布问题。具体做法是把每个时间步agent与环境交互得到的转移样本 (st, at, rt, st+1) 储存到回放记忆单元,要训练时就随机拿出一些(minibatch)来训练。(其实就是将对话的过程打成碎片存储,训练时随机抽取就避免了相关性问题),上面的代码是将每次神经网络预测的结果保存在经验池中,下面则是在每次训练的时候从经验池中随机取出一个batch进行训练。
双网络结构
双网络结构即构建两个神经网络:target_net和eval_net,eval_net用来进行参数训练和预测Q值,而target_net是eval_net的一个副本,这个网络使用来预测目标Q值(构造标签中的yi),相当于监督训练中的label。target_net是每隔一定时间更新为eval_net的参数,这样在一段时间里目标Q值使保持不变的,一定程度降低了当前Q值和目标Q值的相关性,提高了算法稳定性。
任务型对话
任务型对话的主要目标是完成一个任务如订餐、订票等,在这种场景下仅仅给用户一个回答是远远不够的,还需要真正的理解一个用户的意图,以及这个意图相关的信息,如果一个用户想订餐,那么需要知道用户的就餐具体日期、用餐人数等等,所以就需要进行槽提取等等,同时还需要关注当前的获取的信息量以及未获取的信息等,任务型对话的pipeline实现方案如下图所示:
应用
将强化学习应用于任务型对话的主要是把强化学习应用于DPL学习对话的动作决策,即强化学习中的Action对应于对话中的下一步动作,比如是回答用户的某个问题还是问用户下一个槽相关的问题等等。用强化学习的一个好处就是不需要训练数据,因为训练过程中只需要Simulator根据设置的goal进行回答和提问就可以了。实际应用中将DM作为强化学习中的Agent,反馈一些信息给用户。DQN中的reward是根据对话的结果进行提供,分为两个阶段,一个是在对话未完成的时候,每增加一轮对话就给一个-1的奖励,另外就是在对话完成时,如果完成任务则给一个(max_turn-turn)的奖励,否则奖励为-(2*max_turn)。
另外,在训练强化学习的过程中,实际上并不需要用到SLU和NLG,在Agent和User Simulator之间只需要通过结构化的数据进行交流,而不需要转换成自然语言,比如:
表示“2019年2月18日和2019年2月19还有空位置”:
则表示“我想订一个5人的位子,什么时间有空位子?”。
除了以上,还需要根据实际的情况虚构一个数据库以模拟实际使用中的数据查询,如餐厅在某些条件下是不是有剩余位子等。
效果
1. 成功率
2. 奖励
3. 对话轮数
4. 举例(此处不考虑SLU和NLG,在真正训练过程中都是使用了结构化的数据),假设我们的goal如下:
使用强化学习的的结果如下:
人工翻译过来(其实就是基于模板方法的NLG)如下:
上面的结果还是很好的,与针对这个场景精心设计的规则的方法基本上能保持一致:
总结
广告分割线
在背景中介绍的技术都已在【腾讯小知】上线,含文本与语音对话场景,目前已覆盖零售、政务、通讯、教育等行业。