原始的GAN提出用于图像生成,其在实数值生成上可以很好的work,但是当目标是生成序列化离散token时就会有限制,主要原因文中说了两点:
- 这主要是因为离散输出的生成模型使得很难将梯度更新从判别模型传递到生成模型。根据Ian Goodfelllow说的,GANs是通过训练生成器来合成数据,然后在合成数据上使用判别器,判别器的输出梯度将后告诉生成器,如何略微改变合成数据使其更加真实。一般来说,只有在数据连续时,生成器才能略微的改变合成数据,如果数据是离散的,那么就不能简单通过略微改变离散数据来使数据真实。比如,在生成图像时,生成器可以从生成像素值20,调整为生成20.16,但是如果是生成文本,比如单词"dog",可能我们使用词“30”表示,那么生成器不可能生成30.16,因为没有这个词。
- 判别器只能评估整个生成序列,不能对当前单个生成的token进行评估。
解决,提出SeqGAN:
- 解决第一个问题,直接将生成器作为强化学习中的随机策略,生成器的更新通过策略梯度来更新。
- 解决第二个问题,强化学习的奖赏信号来自判别器对完整序列的判别,并且通过MCT搜索方式传给中间状态-动作步。当产生一个单词时,我们可以使用MCT搜索立即评估当前单词的好坏,而不需要等到整个序列结束再来评价这个单词的好坏。
SeqGAN将序列生成问题看成序列决策过程,将目前已经生成的token看为状态(state),将下一个将要生成token看为动作(action),使用判别器来对整个序列做出评估指导生成器学习。为了解决梯度很难传递给生成器的问题,我们将生成器看为随机策略。在策略梯度中,我们使用MCT搜索来近似状态-动作对的值.
SeqGAN:
文本序列生成模型可以表示为,给定真实世界的训练数据集,训练一个生成器Gθ,通过Gθ来产生序列Y1:T=(y1,...,yt,...,yT),yt∈Y,这里Y表示备选单词的词典. 在时间步t,状态s是当前已经生成的单词序列(y1,y2,..,yt−1),动作a是下一个将要选择的单词yt,也就是动作空间就是备选单词词典.
因此策略模型Gθ(yt∣Y1:t−1)是随机策略,但是状态转移是确定的,也就是在当前状态s=Y1:t−1,选择动作a=yt,那么状态一定转移到s′=Y1:t,也就是状态转移概率δs,s′a=1,而对于其他后继状态,状态转移概率为0.
同时,我们训练了一个判别模型Dϕ. 判别器实际上是一个概率估计,也就是估计一个序列Y1:T来自真实世界的概率. 如下图所示。判别器的训练是通过真实样本数据(正样本)和生成器合成数据(负样本)来训练的. 同时,基于从判别模型Dϕ接收的预期结束奖励,通过采用策略梯度和MC搜索来更新生成模型Gθ。奖赏是这个序列可能迷惑判别器的程度Dϕ

序列生成模型Gθ
文中使用RNN模型作为生成模型。RNNs将输入嵌入表示x1,...,xT映射为序列隐层h1,..,hT,通过递归地使用更新函数(也是网络)g:ht=g(ht−1,xt)(1),然后一层softmax神经网络层z,将隐层映射到输出单词分布(token distribution,也是就是词典中每个单词概率):p(yt∣x1,...,xt)=z(ht)=softmax(c+Vht)(2)其中c是偏置,V是权重矩阵.为了避免梯度消失和梯度爆炸,这里式(1)实际上使用LSTM神经单元. 文中说GRU和软注意力机制都可以用在生成模型中。
判别器Dϕ
文中判别器选用的是CNN,生成的序列长度是固定的T,并且CNN通过使用max-over-time池化操作(论文,博客)这样可以适用于变长序列判别。max-over-time池化操作,也就是对每个feature map选取最大值,这样只需要filter个数固定那么池化后得到的向量长度就是固定的,就自然适应于变长的序列.

我们首先将输入序列x1,...,xT表示为: ε1:T=x1⨁x2⨁...⨁xT这里⨁表示并置(concatenation),也就并置为一个矩阵。其中xt∈Rk,是k维的向量,得到的矩阵是ε1:T∈RT×k,如上图所示. 然后使用一个核w∈Rl×k做一个窗口大小为l个单词的卷积操作,产生一个feature map:ci=ρ(w⨂εi:i+l−1+b)这里⨂表示度对应元素相乘。b是偏置,ρ是一个非线性函数。我们可以使用具有不同窗口大小的各种数量的内核来提取不同的特征。最终我们对feature map使用max-over-time池化操作得到c~=max{c1,...,cT−l+1}为了提升性能,文中还使用 highway architecture (论文). 最后使用sigmoid**函数的全连接层输出输入序列为真实的概率.
SeqGAN via Policy Gradient
根据策略梯度理论(policy gradient methods),在没有中间奖赏时(因为策略只会对完整序列进行评估),生成模型(策略)Gθ(yy∣Y1:t−1)的目标是从初始状态s0生成序列来最大化其期望最终奖赏(也就是最大化序列生成后的奖赏):J(θ)=E[RT∣s0,θ]=y1∈Y∑Gθ(y1∣s0)⋅QDϕGθ(s0,y1)(3)这里RT是完整序列的奖赏,来自判别器Dϕ. QDϕGθ(s0,y1)是序列的动作-值函数,即强化学习中从状态s开始,采取动作a后,遵循策略Gθ的期望累计奖赏,但事实上里不是累计奖赏,而是end reward,也就是完整序列的奖赏。

在本文中我们使用了REINFORCE 算法(如上图)来估计动作值函数,使用判别器的判别结果Dϕ(Y1:nn)作为奖赏. 这样我们就有:
QDϕGθ(a=yT,s=Y1:T−1)=Dϕ(Y1:T)
注意判别器只对完整序列提出奖赏. 事实上因为我们只考虑长期奖赏,在每一个时间步,我们不仅会考虑已经拟合的单词token,也会考虑未来的结果。这类似于这类似于玩Go或Chess等游戏,玩家有时会为了长期胜利(最终)的放弃眼前利益(论文),因此为了评估中间状态-动作对的值,文中应用MCT搜索,使用一个Roll-OUT策略Gβ来抽样未知的剩余T−t个单词(已经生的序列是Y1:t,起中yt是要评估的动作).我们将N次的MCT搜索表示为:Y1:T1,...,Y1:TN=MCGβ(Y1:t;N)其中Y1:tn=(y1,...,yt),Yt+1:Tn是从当前状态开始使用roll-out策略Gβ抽样得到的.注意在本文中这个roll-out策略是和生成器一样的,如果想提升速度可以使用其他简单的策略. 我们使用roll-out策略(属于随机策略)抽样N次得到batch(批量)输出样本,因此对N个样本的end reward做一个平均:
QDϕGθ(s=Y1:t−1,a=yt)={N1∑n=1NDϕ(Y1:Tn),Y1:Tn∈MCGθ(Y1:T;N)Dϕ(Y1:t)forfort<Tt=T这里我们可以看见没有中间奖赏.
对于判别器的训练就和GAN中一样,将真实样本(正样本),和虚假样本(负样本)拿来使用公式:
minϕ−EY∼pdata[logDϕ(Y)]−EY∼Gθ[log(1−Dϕ(Y))]每次更新时先更新判别器D,再更新生成器G。
对生成器的更新使用的梯度是(3)式中目标函数的梯度,使用策略梯度理论进行计算表示为如下:▽θJ(θ)=t=1∑TEY1:t−1∼Gθ[yt∈Y∑▽θGθ(yt∣Y1:t−1)⋅QDϕGθ(Y1:t−1,yt)](4)这个式子写成这样的原因是因为状态转移确定的。策略梯度原始公式是:

文中进一步对(4)式进行无偏估计:
▽θJ(θ)≃t=1∑Tyt∈Y∑▽θGθ(yt∣Y1:t−1)⋅QDϕGθ(Y1:t−1,yt) =t=1∑Tyt∈Y∑Gθ(yt∣Y1:t−1)▽θlogGθ(yt∣Y1:t−1)⋅QDϕGθ(Y1:t−1,yt) =t=1∑TEyt∼Gθ(yt∣Y1:t−1)[▽θlogGθ(yt∣Y1:t−1)⋅QDϕGθ(Y1:t−1,yt)]这里由于期望是可以通过多次采样来逼近的,所以最终我们就可以使用上面这个梯度来更新生成器G:
θ←θ+αh▽θJ(θ)
算法
