今年暑假在北京大学参加了一个月的人工智能DeeCamp训练营培训,期间实践课题是:基于文本的图像生成,用到了各种GAN网络对比试验结果。当时只是想着实验各种GAN看效果,对于每一个GAN都有什么改进一知半解。接下来还要指导一篇基于GAN的水下图像生成本科生毕设,现在整理一下网上的资源,慢慢学习。
GAN的主要灵感来源于博弈论中零和博弈的思想,应用到深度学习神经网络上来说,就是通过生成网络G(Generator)和判别网络D(Discriminator)不断博弈,进而使G学习到数据的分布,如果用到图片生成上,则训练完成后,G可以从一段随机数中生成逼真的图像。G, D的主要功能是:
训练过程中,生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而D的目标就是尽量辨别出G生成的假图像和真实的图像。这样,G和D构成了一个动态的“博弈过程”,最终的平衡点即纳什均衡点.(纳什均衡(Nash equilibrium)及经典案例)
GAN网络训练流程图如下:
在Quora上的两个问题,Ian Goodfellow(GAN的发明人)都做了解答。
原问题1:What is the advantage of generative adversarial networks compared with other generative models?
原链接:GAN与其他生成模型相比有什么优势
生成对抗网络相比其他生成模型的优点?
Ian Goodfellow回答:
—————————————————————————————————–
相比其他所有模型,我认为
原问题2: What are the pros and cons of using generative adversarial networks (a type of neural network)?
原链接:GANs的优缺点是什么?,
生成对抗网络(一种神经网络)的优缺点是什么?
It is known that facebook has developed a means of generating realistic-looking images via a neural network. They used “GAN” aka “generative adversarial networks”. Could this be applied generation of other things, such as audio waveform via RNN? Why or why not?
facebook基于神经网络开发了一种可以生成现实图片的方法,他们使用GAN,又叫做生成对抗网络,它能应用到其他事物的生成吗,例如通过RNN生成音频波形,可以吗?为什么?
Ian Goodfellow回答:
—————————————————————————————————–
优势
劣势
待解决问题:
GAN网络输入图像为什么要求是64*64?
1) GAN(2014)
Paper:https://arxiv.org/abs/1406.2661
最初Goodfellow提出GAN思想的那篇论文。
网络结构:
GAN的表达式
怎么训练?
一、交替训练。
二、最优判别器D为:
令 关于D(x)的导数为0,得:
其中,Pr(x) 和 Pg(x) 表示真样本和假样本的比例。比如0.5, 0.5
化简得最优判别器为:
即:如果Pr(x) = Pg(x),说明该样本真假样本各一半,此时最优判别器给出的概率是0.5。
看到这,有个疑问,为什么概率是0.5还是最优判别器?
因为,分不出真假,最优的判别就是0.5 。最坏的判别是:假的被判别是真,真的被判别是假。
loss公式分析
1,首先看D的loss.
它其实就是普通的交叉熵,特殊点是:它这里是将真样本的label设置为1, 将假样本的label设置为0.
2,再看G的loss
网络G的目标是让网络D分辨不清,准确说,就是让label=0的假样本,被D认为是真(lable=1).
也就是说,对于假样本,d(x)=1时(被认为是真)loss最小,d(x)=0时loss最大。
所以,loss_g=log(1−D(xi)) ,与D网络的 lossf 相反。
网络G 的loss的改进
这里将网络G的loss从:
(公式2)
变为:
(公式3)
为什么这么改进?
从下图可以看到:
2) DCGAN(2016)
Deep Convolutional Generative Adversarial Networks。
paper:http://arxiv.org/abs/1511.06434
DCGAN是继GAN之后比较好的改进,其主要的改进主要是在网络结构上,到目前为止,DCGAN的网络结构还是被广泛的使用,DCGAN极大的提升了GAN训练的稳定性以及生成结果质量。
论文的主要贡献是:
DCGAN的生成器网络结构如上图所示,相较原始的GAN,DCGAN几乎完全使用了卷积层代替全链接层,判别器几乎是和生成器对称的,从上图中我们可以看到,整个网络没有pooling层和上采样层的存在,实际上是使用了带步长(fractional-strided)的卷积代替了上采样,以增加训练的稳定性。
DCGAN能改进GAN训练稳定的原因主要有:
DCGAN虽然有很好的架构,但是对GAN训练稳定性来说是治标不治本,没有从根本上解决问题,而且训练的时候仍需要小心的平衡G,D的训练进程,往往是训练一个多次,训练另一个一次。
3) WGAN(2017)
Paper:https://arxiv.org/abs/1701.07875
与DCGAN不同,WGAN主要从损失函数的角度对GAN做了改进,损失函数改进之后的WGAN即使在全链接层上也能得到很好的表现结果,WGAN对GAN的改进主要有:
从上面看来,WGAN好像在代码上很好实现,基本上在原始GAN的代码上不用更改什么,但是它的作用是巨大的
有关GAN和WGAN的解释,可以参考链接:https://zhuanlan.zhihu.com/p/25071913
总的来说,GAN中交叉熵(JS散度)不适合衡量生成数据分布和真实数据分布的距离,如果通过优化JS散度训练GAN会导致找不到正确的优化目标,所以,WGAN提出使用wassertein距离作为优化方式训练GAN,但是数学上和真正代码实现上还是有区别的,使用Wasserteion距离需要满足很强的连续性条件—lipschitz连续性,为了满足这个条件,作者使用了将权重限制到一个范围的方式强制满足lipschitz连续性,但是这也造成了隐患,接下来会详细说。另外说实话,虽然理论证明很漂亮,但是实际上训练起来,以及生成结果并没有期待的那么好。
注:Lipschitz限制是在样本空间中,要求判别器函数D(x)梯度值不大于一个有限的常数K,通过权重值限制的方式保证了权重参数的有界性,间接限制了其梯度信息。
4) WGAN-GP(2017)
Paper:https://arxiv.org/abs/1704.00028
WGAN-GP是WGAN之后的改进版,主要还是改进了连续性限制的条件,因为,作者也发现将权重剪切到一定范围之后,比如剪切到[-0.01,+0.01]后,发生了这样的情况,如下图左边表示。
发现大多数的权重都在-0.01 和0.01上,这就意味了网络的大部分权重只有两个可能数,对于深度神经网络来说不能充分发挥深度神经网络的拟合能力,简直是极大的浪费。并且,也发现强制剪切权重容易导致梯度消失或者梯度爆炸,梯度消失很好理解,就是权重得不到更新信息,梯度爆炸就是更新过猛了,权重每次更新都变化很大,很容易导致训练不稳定。梯度消失与梯度爆炸原因均在于剪切范围的选择,选择过小的话会导致梯度消失,如果设得稍微大了一点,每经过一层网络,梯度变大一点点,多层之后就会发生梯度爆炸 。为了解决这个问题,并且找一个合适的方式满足lipschitz连续性条件,作者提出了使用梯度惩罚(gradient penalty)的方式以满足此连续性条件,其结果如上图右边所示。
梯度惩罚就是既然Lipschitz限制是要求判别器的梯度不超过K,那么可以通过建立一个损失函数来满足这个要求,即先求出判别器的梯度d(D(x)),然后建立与K之间的二范数就可以实现一个简单的损失函数设计。但是注意到D的梯度的数值空间是整个样本空间,对于图片(既包含了真实数据集也包含了生成出的图片集)这样的数据集来说,维度及其高,显然是及其不适合的计算的。作者提出没必要对整个数据集(真的和生成的)做采样,只要从每一批次的样本中采样就可以了,比如可以产生一个随机数,在生成数据和真实数据上做一个插值
于是就算解决了在整个样本空间上采样的麻烦。
所以WGAN-GP的贡献是:
但是论文提出,由于是对每个batch中的每一个样本都做了梯度惩罚(随机数的维度是(batchsize,1)),因此判别器中不能使用batch norm,但是可以使用其他的normalization方法,比如Layer Normalization、Weight Normalization和Instance Normalization,论文中使用了Layer Normalization,weight normalization效果也是可以的。实验可以发现WGAN-GP完爆其他GAN。
5) LSGAN(2017)
最小二乘GAN,全称是Least Squares Generative Adversarial Networks
Paper:https://arxiv.org/abs/1611.04076
LSGAN原理:
其实原理部分可以一句话概括,即使用了最小二乘损失函数代替了GAN的损失函数。
但是就这样的改变,缓解了GAN训练不稳定和生成图像质量差多样性不足的问题。
事实上,作者认为使用JS散度并不能拉近真实分布和生成分布之间的距离,使用最小二乘可以将图像的分布尽可能的接近决策边界,其损失函数定义如下:
其中作者设置a=c=1,b=0
论文里还是给了一些数学推导与证明,感兴趣的可以去看看
6) BEGAN(2017)
Paper:https://arxiv.org/abs/1703.10717
BEGAN的主要贡献:
先说说BEGAN的主要原理,BEGAN和其他GAN不一样,这里的D使用的是auto-encoder结构,就是下面这种,D的输入是图片,输出是经过编码解码后的图片,
以往的GAN以及其变种都是希望生成器生成的数据分布尽可能的接近真实数据的分布,当生成数据分布等同于真实数据分布时,我们就确定生成器G经过训练可以生成和真实数据分布相同的样本,即获得了生成足以以假乱真数据的能力,所以从这一点出发,研究者们设计了各种损失函数去令G的生成数据分布尽可能接近真实数据分布。BEGAN代替了这种估计概率分布方法,它不直接去估计生成分布Pg与真实分布Px的差距,进而设计合理的损失函数拉近他们之间的距离,而是估计分布的误差之间的距离,作者认为只要分布的的误差分布相近的话,也可以认为这些分布是相近的。即如果我们认为两个人非常相似,又发现这两人中的第二个人和第三个人很相似,那么我们就完全可以说第一个人和第三个人长的很像。
注:所有GAN的代码可在GitHub搜到,下面是一个GAN的zone地址:
https://github.com/hindupuravinash/the-gan-zoo
讲了这么多,2018年Google新的研究表明,这些GAN都差不多,Google研究原文:https://arxiv.org/abs/1711.10337
带你进入GAN(一)原始GAN
DCGAN、WGAN、WGAN-GP、LSGAN、BEGAN原理总结及对比
生成对抗网络(GAN)相比传统训练方法有什么优势?
深入浅出 GAN·原理篇文字版(完整)| 干货(推荐)