《SeqGAN: Sequence Generative Adv
该论文发表在AAAI 2017会议,如果要把GANs应用到序列数据生成上,则必须参考一下该文章。本人是强化学习相关领域的小白,因此对论文的某些地方还不是很清晰,如果我的理解有所偏差,欢迎指出。
GANs的思想是使用判别器指导生成器生成出以假乱真的数据,在最近图像生成领域中获得了很好的效果,十分火热。但是其却不能很好地应用在序列数据生成上(如诗句生成,文章生成),一个主要的原因是因为序列生成是离散的(不同于在图片生成能够连续调整生成器的输出),难于从判别式网络更新梯度到生成式网络中。而本文提出了利用强化学习的策略梯度来解决这个问题,把生成器构建为随机参数化策略(stochastic parametrized policy),实现在序列数据生成上应用GANs,同时也解决了GANs只能给予一个完整句子评分的缺陷,实现了在每一个中间决策(state-action steps)都能返回奖励信号。总体上来看,该模型是基于策略搜索的强化学习方法。
和往常的一些GANs模型一样,设置有生成器G和判别器D。G的任务是生成判别器判别不出真假的序列,以达到欺骗判别器的效果。在强化学习的角度中,该任务被形容为:在时间步t,状态s为已经生成的序列,动作a则是下一个要选择的token(也就是该时间步输出的单词)。而D的任务是输出给定的序列与真实的序列数据有多像的概率,也就是能判别输入的序列是否来自真实序列数据。
G的任务,生成长度为T的序列Y1 : T。整体的模型框架如下图,左:使用正类数据(真实序列数据)和负类数据(生成器产生的数据)去训练判别器。右:使用策略梯度去训练生成器G,该策略梯度的奖励是由判别器D提供的,并且通过蒙特卡洛搜索传回到每一中间步的动作值(intermediate action value,用来表示该状态下执行该动作能得到的奖励)。
整体的框架如果没有中间奖励,我们的目标是最大化下式:
最大化目标 Gθ(action | state)是随机参数化的策略,代表该状态s0下执行该动作y1的概率。(实际上就是生成器) 该式是动作-值函数(action-value function),表示开始于s0状态下,执行动作y1后,在策略Gθ下能得到多少积累的奖励 。现在问题来了,如何估计动作-值函数呢?很简单,本论文使用判别器D给出的该序列为真实序列数据的概率来作为奖励,也就是下式:
但是注意到,我们上面给出的动作-值函数只能为生成完整的序列提供奖励。而在每一个时间步t,我们只能得到1 : t的tokens,未能得到一个完整的1 : T序列,那么如何去为每一个时间步的中间状态-动作都估计出动作-值函数呢?本文的做法是使用N次roll-out策略Gβ(实际上和生成器Gθ相似)的蒙特卡洛搜索去抽样出剩下未知的T-t个tokens,我们也就得到一个完整的1 : T序列,再用上面给出的动作-值函数去评估出奖励,以作为该中间状态的动作-值。我们把这个N次roll-out过程表达成下式:
该N个序列的1 : t部分是已经生成出的部分,t+1 : T部分是roll-out策略抽样出来的。最终,我们的动作-值函数表示成:
可看到,在最后一个时间步,可以直接评估完整已经生成出来的序列,没有使用roll-out策略。综上所述,我们要最大化的目标的求导形式如下:(其中2-3步变换还没看懂,第3步则把该问题转换为优化期望,而期望可以用抽样方法来近似,也就不必遍历所有的动作空间)
最终的奖励函数 该遍历过程利用抽样方法近似去除了生成器Gθ的参数更新:
这是完整的训练过程:
要注意的是,本论文的生成器输出每个token的概率后,并不是用最大概率的token来作为输出,而是采用抽样的方法去抽样出token。