本文来自李纪为博士的论文 Deep Reinforcement Learning for Dialogue Generation。html
1,概述算法
当前在闲聊机器人中的主要技术框架都是seq2seq模型。但传统的seq2seq存在不少问题。本文就提出了两个问题:安全
1)传统的seq2seq模型倾向于生成安全,普适的回答,例如“I don’t know what you are talking about”。为了解决这个问题,做者在更早的一篇文章中提出了用互信息做为模型的目标函数。具体见A Diversity-Promoting Objective Function for Neural Conversation Models论文阅读。网络
2)传统的seq2seq模型的目标函数都是MLE函数,用MLE做为目标函数容易引发对话的死循环。具体的看下表:框架
面对这种挑战,咱们的模型框架须要具有下面两种能力:函数
1)整合开发者自定义的回报函数,更好地模仿聊天机器人开发的真正目标。post
2)生成一个reply以后,能够定量地描述这个reply对后续阶段的影响。学习
因此,本文提出用基于互信息目标函数的seq2seq + 强化学习的思路来解决这个问题。优化
2,强化学习在开放域对话系统中的应用编码
学习系统由两个agent组成,将第一个agent生成的句子定义为$p$,第二个agent生成的句子定义为$q$。两个agent互相对话来进行模型学习。在这里agent生成的句子会做为下一轮的输入,所以能够获得一个生成的对话序列:
$p_1, q_1, p_2, q_2, ......, p_n, q_n$
咱们能够将生成的句子看做动做,所以这里的动做空间是连续且无限的。能够将seq2seq模型看做是策略函数。经过最大化指望奖励来优化模型的参数(注:在强化学习中的目标函数一般都是和奖励相关的,通常都是最大化长期奖励)。
咱们接下来介绍强化学习中四个重要元素:动做,状态,策略和奖励。
1)动做
在这里动做是生成的句子,所以动做空间是无限的(通常对于无限的动做空间,采用策略梯度会比Q网络更合适),能够生成任意长度的序列
2)状态
在这里的状态是上一轮对话中的句子对$[p_i, q_i]$,$p_i$和$q_i$会转换成向量表示,而后拼接输入到LSTM的encoder中。
3)策略
在策略梯度算法中,一般是用一个函数表示策略的,在这里就是使用seq2seq模型(LSTM的encoder-decoder模型)来做为策略函数的,在这里采用随机性的策略(也便是给定状态的动做的几率分布,相应的肯定性策略就是每一个状态对应一个动做,知道状态,则动做就是肯定的)。
4)奖励
在这里奖励能够说是本文的亮点,做者定义了三种奖励,并最终对这三种奖励进行加权平均。
一、Ease of Answering
这个奖励指标主要是说生成的回复必定是容易被回答的。本文用下面的公式来计算容易的程度:
其实就是给定这个回复以后,生成的下一个回复是dull的回复的几率大小。(这里的dull的回复是指好比“I don’t know what you are talking about”这一类的回复。做者手动给出了这样的一个dull列表。)在上面式子中最左边的$N_S$是指dull列表的大小,也就是自定义的dull回复的个数,中间的$N_s$是指dull回复$s$的序列长度。
二、Information Flow
这个奖励主要是控制生成的回复尽可能和以前的不要重复,增长回复的多样性。
这里的$h$是bot的回复的encoder编码后的向量表示,$i$和$i+1$表示该bot的先后两轮。用cos来表示两个句子的语义类似度,两个句子越类似,则奖励越小。
三、Semantic Coherence
这个指标是用来衡量生成的回复是否grammatical和coherent。若是只有前两个指标,颇有可能会获得更高的奖励,可是生成的句子并不连贯或者说不成一个天然句子。
这里采用互信息来确保生成的回复有语法连贯性。
最终的奖励是上面三个奖励的加权平均,具体的表达式以下:
在这里的加权系数是固定的,${\lambda}_1 = 0.25, {\lambda}_2 = 0.25, {\lambda}_3 = 0.5$。
3,仿真
咱们的方法背后的核心思想是模拟两个虚拟的agent轮流相互交谈的过程,这样咱们就能够去探索状态空间,并学习策略$p_{RL } (p_{i+1}|p_i, q_i)$以获得最大奖励。
1)监督学习
采用监督学习的方法在含8000万条数据的OpenSubtitles数据集上训练一个seq2seq + Attention的网络,将这个网络的参数做为以后的初始化参数。模型具体的输入上一轮的句子对,拼接在一块儿输入,输出是下一轮的回复。
2)互信息
以前的文章中提到过,直接用传统的seq2seq(即目标函数没MLE)会生成dull的回复,采用互信息能够有效的改善这种现象,在本文中做者将生成最大互信息回复的问题看成一个强化学习的问题来解决,并使用策略梯度来优化。当一条序列彻底生成后就能够得到该序列的互信息。
首先使用与训练的seq2seq模型来初始化策略模型$p_{RL}$,给定一个输入$[p_i, q_i]$,咱们能够获得一序列的回复$A = {a' | a' ~ p_{RL}}$,对于生成的每一个$a'$,咱们均可以得到其对应的互信息$m(a', [p_i, q_i])$,这个互信息值将会做为奖励,并反向传播到模型中,将互信息看做奖励,则能够获得:
上面的函数能够看做是目标函数,则梯度能够表示为:
而实际的计算中,设定一个$L$值,小于$L$的序列中的tokens(即经过$L$值将一个生成的序列分红左右两半),其损失计算时按照MLE来计算,大于$L$的tokens按照强化学习的方法,也就是互信息来计算,$L$值会在训练的过程当中衰减至0。
3)两个agent之间的对话建模
咱们模拟两个虚拟的agent之间的对话,让他们互相交谈。模拟过程以下:
1,首先从训练集中选择一条句子给第一个agent,agent会对该句子编码成一个向量,而且基于该编码的向量生成一个新的句子。
2,第二个agent会将第一个agent生成的句子和从训练集中选择的句子组成一个句子对来更新当前的状态,将该状态编码成向量,而后基于该编码的向量进行解码生成一个新的句子。
3,将第二个agent生成的句子反馈给第一个agent,依次重复该过程。
具体的以下图所示:
优化过程:
首先用互信息模型来初始化$p_{RL}$,而后使用策略梯度去找到得到最大奖励指望的参数,最大话将来的奖励,其目标函数以下:
上面式子中的$R(a_i, [p_i, q_i])$表示的时动做$a_i$对应的奖励,梯度计算以下:
用上面的梯度去进行梯度上升,来更新模型的参数。