本文是2017年发表于AAAI的论文《SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient》的阅读笔记。
想要解决的问题(动机)
GAN模型的两个缺点:
- GAN是设计用来生成实值连续数据的,在直接生成离散序列方面有些困难,表现不好;
- GAN只能给生成的完整序列打分,对于生成的部分序列,平衡现在的好坏和将来作为整个序列的得分是很重的。
原因
:我们知道,GAN中生成网络参数的优化是需要依赖于判别网络的,如果输出是离散序列的话,就很难将梯度更新从判别网络传给生成网络。
怎么理解这个离散序列?即输出不是一个值域里所有的值(例如),而是可枚举的数值(例如)。
由于生成模型的核心是拟合数据的密度分布,而只有连续的数据才有密度分布,离散的数据是没有密度分布的。
解决的方法
- 问题:梯度更新无法从判别网络传给生成网络
- 解决方法:将序列生成过程看成序列决策过程,引入强化学习,将生成网络看成强化学习机,所生成的部分离散序列看成是当前的状态(state),动作(action)就是决定下一个字符是什么。
- 这样一来,生成网络只需要接受由判别网络对生成的输出序列打分的分数作为奖励(reward)来进行参数调整,而不需要通过梯度计算。
- 问题:GAN只能给生成的完整序列打分
- 解决方法:使用Monte Carlo Search(蒙特卡洛搜索)方法来从当前的序列状态搜索得到完整序列,然后由判别网络打分,得到的分值作为奖励(reward)
上述两种方案的结合,就是所谓的SeqGAN
模型架构。
模型
目标函数
- 生成网络的目标函数
由于生成网络现在使用的是强化学习来实现的,而强化学习的目标就是使得奖励(reward)尽可能大。于是,生成网络的目标函数如下:
这里,action-value函数(即上式中的Q函数)也至关重要。我们知道,reward是将完整序列输入到判别网络D中所得到的,因此:
这里只是讨论了完整序列的情况,还有非完整序列的情况,此时就需要用到Monte Carlo Search(蒙特卡洛搜索)来从当前非完整序列状态搜索得到完整的序列状态,其搜索过程定义如下(一共搜索了N次,得到了N个完整的序列):
中间状态序列的reward是这N个搜索得到的完整序列的reward均值,从而得到完整的action-value函数定义:
- 判别网络的目标函数
判别网络的目标不变(还是GAN中的那一套),还是最小化交叉熵:
这里的目标函数并不像GAN中的一样可以结合成为一个整体的目标函数,因为两个目标函数的梯度是不互通的
算法
图中的公式(8)如下:
由于作者发现来自预训练的判别器的监督信号能够很有效地调整生成网络,在实现过程中,先预训练了判别网络;而且为了使得生成的负样本更可靠,在预训练判别器之前,使用极大似然估计(MLE)先预训练了生成器。
评价生成模型
当训练得到最终的生成模型,我们就需要评价其性能。
在本文中,采用了一个能够捕获到字符依赖关系的语言模型作为真实数据的模型(称为oracle),使用该模型生成SeqGAN的训练数据,并且能够用该模型评价SeqGAN中生成模型的性能。
评价采用的指标是负对数似然:
其中 和 分别表示生成模型和oracle模型。
上式其实是一个熵,当生成模型生成一个序列的概率是时,我们计算一下oracle模型生成该序列的概率是,然后计算一下熵,所有可能生成的序列的熵之和为,即为,当熵越小,说明p和q的散度越小,p和q的分布就越相似。
越小就说明生成模型性能越高,越接近数据的真实分布。
讨论
本文还对算法中一些超参(g-step,d-step,k等)的设置。
实验结果如下:
从这个实验中可以得出:
- 设置g-step比d-step和k值大很多(花更多时间用来训练生成网络)时,能够快速收敛,但是它会导致判别网络没训练好,从而会误导生成网络进行更新,收敛性会不稳定;(图3.a)
- 增大d-step和k的设置(d-step相较于g-step比值有提升)时,收敛性会稳定很多;(图3.b)
- 将d-step k 设置的略大于g-step时,意味着我们一直保证判别网络的准确性(在判别网络被混淆之前就使用更真实的负例来训练它),此时SeqGAN会比较稳定;(图3.c)
- 将d-step k进一步增大,发现其收敛的更快;(图3.d)
上面的实验证明了:在训练过程中将判别网络的性能训练得略高于生成网络是有利于模型的收敛。