本篇博客仅为方便个人日后翻阅,对公式的解读代表了个人观点,希望能给大家带来一些启发。

Sequence Generative Adversarial Nets

     序列生成问题的描述:给定真实世界的结构化序列的数据集,训练一个含有参数θ的生成网络Gθ

     我们基于强化学习来解释这一问题,在第t个时间步,状态s是先前已生成的词(y1,...,yt−1),动作a是如何选择要生成的词yt,这也是生成模型的工作Gθ(yt|Y1:t−1),它通过前t-1个词以及模型参数θ来选择下一个词,确定了该词之后,状态也随之改变成s’,对应词(y1,...,yt),以此类推,最终生成的系列(y1,...,yt,...,yT),对序列的评分就是奖励r,如果生成的系列成功地骗过了判别模型D,则得1分,如果被识别出是机器生成的则得0分。

      另外,我们训练一个含有参数φ的鉴别器Dφ,Dφ(Y1:T)表示序列为真实的可能性有多大。通过提供来自真实序列数据的正例和来自生成模型Gφ生成的合成序列的反例来训练判别模型Dθ。同时,对生成模型Gθ进行了更新,采用了策略梯度和MC搜索的方法,并根据从判别模型Dφ得到的期望最终报酬对其进行了修正。奖励是根据它欺骗歧视模型Dφ的可能性来估计的。具体的提法在下一小节给出.

SeqGAN via Policy Gradient

没有中间奖励,生成器模型 (policy)Gθ(yt|Y1:t−1) 的目标是从起始状态 0 生成一个序列,以最大化其预期的最终奖励:

     怎么理解这个公式?目标函数:整个序列的奖励最大

    公式(1)可以这样理解:在初始状态下,策略函数可能选出的每个y,都对应着不同的动作价值,      把这些动作价值根据y的概率分布加权求和,就得到了初始状态的价值(状态价值)。

    公式(1)中的Q代表的是状态s0,动作y1下整个序列的动作价值

    动作价值:做该动作对于整个序列来说好不好

RT是对完整序列的奖励,奖励来自鉴别器Q..是动作价值函数:从状态s开始,执行动作a,遵循策略Gθ的预期累积回报。

     怎么估算动作价值函数:式子中给出的是判别模型对完整序列的打分

     动作价值是由鉴别器D计算的,T是最后一个时刻,公式(2)中给的是完整系列的动作价值,若判别该文本是真实文本,则奖励值最大

在生成第t个词时,如何选择(动作)涉及前期已生成的t-1个词(状态s),以及后续可能的情况,假设此时用模型Gβ生成N个备选词串(Yt:T),再用判别模型D分别对生成的N句(Y1:T)打分,此时使用了蒙特卡洛方法(MC),如下式所示:

在任意时间步t怎么计算动作价值?利用蒙特卡洛的roll-out方法,根据当前状态和动作预估未来一系列的动作,返回动作价值

这里的生成模型Gβ与前面Gθ通常使用同样的模型参数,有时为了优化速度也可使用不同模型参数。这里使用的蒙特卡洛算法,像下棋一样,不仅要考虑当前一步的最优解,还需要考虑接下来多步组合后的最优解,用于探索此节点以及此节点后续节点(Yt:T)的可能性,也叫roll-out展开,是蒙特卡洛搜索树中的核心技巧。

根据不同的时间步,采取不同的价值计算方法:在最后一个时间步t=T时,直接使用判别函数D计算价值;在其它时间步,使用生成模型Gβ和蒙特卡洛算法生成N个后续备选项,用判别函数D打分并计算分数的均值

为了减小误差,会进行N次模拟,N个模拟结果求平均。最终就可以算出每个时间步下的整个序列的价值

问题:判别器是怎么算的奖励?答:D只有两个值:1和0

训练判别器:

这是GAN的标准公式,目的是训练网络中的参数φ使其尽可能分辨不出是真实数据还是生成数据

每次获得新的鉴别器模型时,我们都准备好更新生成器。所提出的基于策略的方法依赖于优化参数化策略以直接最大化长期奖励。 跟随(Sutton et al. 1999),目标函数 J(θ) w.r.t. 的梯度。生成器的参数θ可以导出为

两个求和符号:每个时间步都会有很多动作可以选择,第一个求和是每个动作所产生的动作价值×概率分布(概率分布就是策略函数);第二个求和就是计算整个序列的状态价值

对目标函数求梯度,其实这个梯度就叫做policy gradient

公式(6)的无偏估计:下面是证明过程 

更新生成器的参数:其中αh表示第h步对应的学习率

 

算法过程:

要求:生成策略Gθ;roll-out 策略Gβ;判别器D;一个序列化的数据集S={X1:T}

  1. 随机初始化Gθ,D的参数
  2. 在数据集S上用MLE(极大似然估计)预训练Gθ
  3. β与θ设置成一样
  4. 用生成器生成用于判别器训练的负样本
  5. 通过最小化交叉熵预训练D
  6. 重复:
  7.   for g-steps do
  8.      用生成器Gθ产生一个序列Y1:T=(y1,...yT)
  9.      for t in 1:T do
  10.         利用蒙特卡洛的roll-out计算每一个时间步的动作价值(公式4)
  11.      end for
  12.      通过gradient policy更新生成器的参数(公式8)
  13.    end for
  14.    for d-steps do
  15.      利用现在的Gθ生成负样本,与数据集S中的正样本结合
  16.      用公式5训练判别器D,k次迭代
  17.    end for
  18.    β←θ
  19. 直到SeqGAN收敛

The Generative Model for Sequences

我们用LSTM作为生成模型,将输入序列x1,x2,....xT转化成隐藏向量h1,h2,...hT,然后用softmax映射出token的分布

The Discriminative Model for Sequences

在本文中我们选择CNN作为鉴别器,因为CNN在文本分类任务中是十分有效的。大多数判别模型只能对整个序列而不是未完成的序列进行良好的分类。 在本文中,我们还关注判别器预测完成序列是真实的概率的情况

Synthetic Data Experiments

为了测试有效性并增加我们对SeqGAN的理解,我们用合成数据2进行了模拟测试。为了模拟真实世界的结构化序列,我们考虑了一种语言模型来捕捉标记的依赖关系。我们用一个随机初始化的LSTM作为真实的模型,也就是oracle,来为接下来的实验生成真实的数据分布p(xt|x1,....xt-1)

随笔:

  1. 标准的GAN在处理离散数据时遇到的问题:生成器难以传递梯度更新;鉴别器难以评估非完整序列。对于前者,作者把整个GAN看作一个强化学习系统,用policy gradient更新生成器的参数;对于后者,作者借鉴了蒙特卡洛树的思想,对任意时刻的非完整序列都可以进行评估
  2. 生成器:目标函数-各个状态价值的和,状态价值怎么算?策略函数×动作价值,策略函数是用策略网络训练出来的,动作价值不知道怎么办?用roll-out估算出一整个序列的动作就能用判别器计算其动作价值了