深度强化学习在智能对话上的应用(附实例)
来源:腾讯大数据
本文约3500字,建议阅读7分钟。
本文为你介绍了深度强化学习在任务型对话上的应用。
背景
本文主要介绍深度强化学习在任务型对话上的应用,两者的结合点主要是将深度强化学习应用于任务型对话的策略学习上,目前工业界普遍使用的策略都是基于规则的,显然基于规则的方法有人力成本高、泛化能力差等缺点,而强化学习恰好能解决这些问题,而且强化学习只需要一些目标,无需大量的训练语料,避免了深度学习的一大缺点。
首先简单介绍一下强化学习和对话系统,然后再具体介绍一下深度强化学习在任务型对话中是怎么应用的,最后给出训练的结果和总结。以下举例部分都会以订餐场景为准。
强化学习
强化学习系统由智能体(Agent)、状态(state)、奖赏(reward)、动作(action)和环境(Environment)五部分组成,如下图所示。
- Agent:智能体是整个强化学习系统核心。它能够感知环境的状态(State),并且根据环境提供的奖励信号(Reward),通过学习选择一个合适的动作(Action),来最大化长期的Reward值。简而言之,Agent就是根据环境提供的Reward作为反馈,学习一系列的环境状态(State)到动作(Action)的映射,动作选择的原则是最大化未来累积的Reward的概率。选择的动作不仅影响当前时刻的Reward,还会影响下一时刻甚至未来的Reward,因此,Agent在学习过程中的基本规则是:如果某个动作(Action)带来了环境的正回报(Reward),那么这一动作会被加强,反之则会逐渐削弱,类似于物理学中条件反射原理。
- Environment:环境会接收Agent执行的一系列的动作(Action),并且对这一系列的动作的好坏进行评价,并转换成一种可量化的(标量信号)Reward反馈给Agent,而不会告诉Agent应该如何去学习动作。Agent只能靠自己的历史(History)经历去学习。同时,环境还像Agent提供它所处的状态(State)信息。
- Reward:环境提供给Agent的一个可量化的标量反馈信号,用于评价Agent在某一个时间步所做action的好坏。强化学习就是基于一种最大化累计奖赏假设:强化学习中,Agent进行一系列的动作选择的目标是最大化未来的累计奖赏。
- State:状态指Agent所处的环境信息,包含了智能体用于进行Action选择的所有信息,它是历史(History)的一个函数:St = f(Ht)。
可见,强化学习的主体是Agent和环境Environment。Agent为了适应环境,做出的一系列的动作,使最终的奖励最高,同时在此过程中更新特定的参数。实际上可以把强化学习简单理解成是一种循环,具体的工作方式如下:
- 智能体从环境中获取一个状态St;
- 智能体根据状态St采取一个动作at;
- 受到at的影响,环境发生变化,转换到新的状态St+1;
- 环境反馈给智能体一个奖励(正向为奖励,负向则为惩罚)。
对话系统
对话系统是为了某种目的设计的用以与人类对话的机器,这种目的可以是为了特定的任务,也可以是简单的与人聊天,前者就是任务型对话,后者为非任务型对话系统。
任务型的对话主要为了一个特定的目标进行对话,比如常见的订飞机票、订餐等。对于任务型对话工业界主要实现方案还是为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值,即:
当然这也会带来一些问题:
- 神经网络需要大量带标签的样本进行监督学习,但是强化学习只有reward返回值,如何构造有监督的数据成为第一个问题,而且伴随着噪声、延迟(过了几十毫秒才返回)、稀疏(很多State的reward是0)等问题;
- 神经网络的前提是样本独立同分布,而强化学习前后state状态和反馈有依赖关系——马尔科夫决策;
- 神经网络的目标分布固定,但是强化学习的分布一直变化,比如你玩一个游戏,一个关卡和下一个关卡的状态分布是不同的,所以训练好了前一个关卡,下一个关卡又要重新训练;
- 过往的研究表明,使用非线性网络表示值函数时出现不稳定等问题。
针对以上问题的具体解决方案如下:
- 构造标签:通过Q-Learning使用reward来构造标签(对应问题1),如上所述,用神经网络来预测reward,将问题转化为一个回归问题;
- 经验回放:通过experience replay(经验池)的方法来解决相关性及非静态分布问题(对应问题2、3);
- 双网络结构:使用一个神经网络产生当前Q值,使用另外一个神经网络产生Target Q值(对应问题4)。
构造标签
对于函数优化问题,监督学习的一般方法是先确定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实现方案如下图所示:
- SLU:语言理解,把用户的自然语言表述的文本处理成预先设计好的机器能够理解的形式,通常为意图和槽值对。如用户输入“我想订一个明天的位子”,则SLU的输出应该是intent=订餐,slot=date:明天(实际中提取出的槽值需要做标准化处理)。这个部分意图识别可作为分类任务或者检索任务,而槽提取一般可用作为NER问题。
- DST:对话状态跟踪,根据对话历史管理每一轮对话的输入,并且预测当前对话的状态。比如使用规则的方法:有哪些槽已经填充,哪些未填充等、哪些已经问过usr、问过多少次等等。
- DPL,对话策略学习,根据当前对话状态做出下一步的反应。比如根据DST知道有哪些槽未填充,用规则的方法选取一个优先级最高的槽提问。DPL的任务是一个序列决策的过程,因此常用的方法有规则方法、CRF,以及本文的重点:强化学习方法。
- NLG,自然语言生成,根据系统得到的动作生成客户易理解的自然语言文本。这个很容易理解,如果DPL的动作是问用户就餐人数,在系统里面可能是类似request{“num”:“UNK”},NLG的作用就是把这个转换成“请问有几个人就餐呢”。
应用
将强化学习应用于任务型对话的主要是把强化学习应用于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人的位子,什么时间有空位子?”。
- Simulator:模拟用户行为,Simulator的主要做法就是针对Agent反馈的信息,结合自身的goal进一步与Agent进行交互,比如是回答Agent问题,还是进行反问,是完成goal结束对话,还是拒绝。这相当于使用的是规则的方式,不过也有使用模型的方式构建一个world model来模型用户。
- Goal:任务的目标,在订餐任务中我们设置的目标形式如下图。强化学习能够很好的应用于任务型对话的一大原因就是这些goal本身并不需要人为一个个编写,只需要根据业务需求根据各个槽完成生成即可,这就避免了大量的训练预料。
除了以上,还需要根据实际的情况虚构一个数据库以模拟实际使用中的数据查询,如餐厅在某些条件下是不是有剩余位子等。
效果
1. 成功率
2. 奖励
3. 对话轮数
4. 举例
(此处不考虑SLU和NLG,在真正训练过程中都是使用了结构化的数据),假设我们的goal如下:
使用强化学习的的结果如下:
人工翻译过来(其实就是基于模板方法的NLG)如下:
上面的结果还是很好的,与针对这个场景精心设计的规则的方法基本上能保持一致:
总结
可以加入额外惩罚和奖励,加快收敛,比如上一章节中的效果是不加任何额外惩罚和奖励,可以看出大概在5000个epoch的时候就已经收敛,但是如果加入一些答非所问、回答重复问题等惩罚则不到1000个epoch就会收敛,另外加入这些惩罚和奖励也会让网络朝着我们想要的方向进行训练,得到更好的结果。
目前我们主要在订餐的任务上进行了试验,这个任务还比较简单,需要找一个更为复杂的场景进行验证。
训练过程中只是使用了slot是否填充等,对于已经填充的slot未利用slot的值,对此需要进一步探究slot的值对于DPL的决策是否有影响。
一旦在线上使用的槽的个数需要发生变化就必须重新进行训练,非常耗时。
Goal和Simulator还是一种比较“僵硬”的做法,需要在实际线上的使用过程中不断训练,这样可以使得对话决策更智能更符合用户预期。
参考文献
【1】Xiujun Li, Yun-Nung Chen,End-to-End Task-Completion Neural Dialogue Systems
【2】Volodymyr, Mnih, Human-level control through deep reinforcement learning
【3】https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/
【4】http://km.oa.com/group/20574/articles/show/310155
编辑:王菁
校对:林亦霖
— 完 —
关注清华-青岛数据科学研究院官方微信公众平台“THU数据派”及姊妹号“数据派THU”获取更多讲座福利及优质内容。