0. introduction
GAN模型最早由Ian Goodfellow et al于2014年提出,之后主要用于signal processing和natural document processing两方面,包含图片、视频、诗歌、一些简单对话的生成等。由于文字在高维空间上不连续的问题(即任取一个word embedding向量不一定能找到其所对应的文字),GAN对于NLP的处理不如图像的处理得心应手,并且从本质上讲,图片处理相较于NLP更为简单(因为任何动物都可以处理图像,但只有人类可以处理语言)。因而将GAN与NLP结合,具有很深远的影响。Bengio也说,这将是让计算机获得更高智能的关键一步。
在开始之前,有一些先验知识,已经懂的可以跳过。
信息量:“中国队进入了2018世界杯决赛圈”显然比“巴西队进入了2018世界杯决赛圈”发生概率p(x)要低,信息量 I(x)=−log(p(x))要大。
熵(Entropy):为事件发生所有概率p(xi)的信息量,即
KL(Kullback-Leibler)散度,也叫相对熵,用来衡量真实分布P与预测分布Q之间的差异,即
交叉熵(cross entropy),为KL散度拆解后的一部分内容,公式是
由于p的熵不变,故在机器学习中只需要优化交叉熵作为损失函数即可,以下m为当前batch中样本数,n为标签数。
在单分类问题中(一个节点属于一个类别,使用softmax计算预测数据,每个label累积和为1),损失函数为
在多分类问题中(一个节点可以属于多个类别,使用sigmoid计算预测数据,每个label独立分布),交叉熵写法可以简化为
JSD(Jensen-Shannon)散度,优化了KL散度中p与q不能换方向的限制,
1. 与VAE对比
Autoencoder的主要思想是,生成内容尽可能和原内容一致。如下图所示,一开始随机生成一个向量作为code,之后通过NN Decoder解码看是否生成对应图片。即原图片input为x,code为z,经过Decoder后output为生成图片x',其中z要相较于x更小,压缩更多内容。其损失函数由下面所示。VAE是加入高斯噪声的Autoencoder更进一步,进而可以生成更多样的结果。关于Autoencoder和VAE具体可以参见之前文章https://www.cnblogs.com/rucwxb/p/8056144.html (不参见也可以。。)
但是能够生成多样化结果的VAE有一个问题是,它并不是真正的模拟生成真实图片,比如对于同样的7来说,下图的左右和原图都是1个像素点的不同,但右边就是非真实图片,而VAE对于这两个生成图片的处理方法是相同的。
因而与VAE一步到位、非黑即白的使用重构损失函数的判别方法不同,GAN的判别器对生成器的指导是一步一步地,逐步优化生成器。
2. GAN的原理
一般来说,GAN分为Generator和discriminator,它们有不同的目标,Generator的目标是尽可能train,discriminator是not train。起初Generator和VAE类似,随机生成一个向量,再由discriminator判断真假(0/1),之后固定discriminator,使用gradient descent来更新Generator的参数,使得discriminator的输出尽可能接近1。
原始GAN的原理是最大似然估计,总体损失函数为
损失函数V可以看做真实数据分布P_data与生成数据分布P_G的交叉熵(文章开头有详细介绍),即
在训练时,先固定G不动,经过k次迭代后找到最优的D。由于对于式子f(D) = alogD + blog(1-D)来说,当D*=a/(a+b)时f(D)有最大值,所以对于上面的函数V来说,D*(x) = Pdata(x) / (Pdata(x)+PG(x)) 时,V(G,D)有最大值,此时
同时,对于discriminator来说,应该做到输入为真实数据xi时接受,为生成数据x*i时拒绝,V还可以写成这样的形式
对于Generator来说,只需考虑生成数据x*i的情况,因此Generator的损失函数为
最终总结下GAN每轮迭代的步骤:
a. 从P_data(x)中采样m个 {x1,x2, … xm}
b. 通过高斯分布P_prior(z)生成m个{z1, … , zm}
c. 通过x*i=G(zi)获得生成数据 {x*1, … , x*m}
d. 更新discriminator的参数,以最大化
更新方法为梯度下降法θd = θd + ηΔV’(θd)
a-d重复k次学得discriminator
e. 通过高斯分布P_prior(z)重新生成m个{z1, … , zm},并由此生成x*i=G(zi)
f. 更新generator的参数,以最小化
更新方法为梯度下降法θg = θg − ηΔV’(θg)
e-f只需重复1次学得Generator
3. 训练GAN中遇到的问题
问题1 —— JS散度=0
discriminator很快就准确度很接近1,too strong,由于此时还没有训练出很好的Generator(即P_data(x)与P_G(x)在高维空间上几乎没有交叠),生成数据与真实数据完全不同,JSD(P_data||P_G)=0。这样 discriminator估计的JS散度几乎不会给Generator提供任何信息,使其停止优化。
某种程度上可以通过添加噪声来解决,这样增大P_data(x)与P_G(x)重合面积,使得discriminator不能完美将P_data(x)与P_G(x)区分开。并且噪声随着时间逐渐减少。
问题2 —— Mode Collapse
这个即为只生成一种类型生成数据的情形。如下图所示,红色是生成数据,蓝色是真实数据,由于discriminator只能提供判断是否生成了正确数据,而对遗失了什么数据不得而知,最终模型会拟合到单一情形中。
而对于以上两个问题,WGAN都可以解决。
关于WGAN的介绍,知乎上的这篇文章https://zhuanlan.zhihu.com/p/25071913写的很好。
简言之,其修改损失函数,不使用不稳定的JS散度,而是使用Wasserstein距离,即EM(earth-mover)距离
主要在模型上做了四点变化,由于不再使用交叉熵,因而discriminator最后一层无需sigmoid函数,G与D的损失函数也不取log,另外加入损失函数务必Lipschitz连续的要求,即每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c,使用适合梯度不稳定情况的RMSProp优化器。
——————— END ———————
之后会继续写出seqGAN等引入强化学习方法将GAN用于NLP领域的文章,敬请期待。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。