GAN系列学习笔记
GAN
GAN的任务是“无中生有”。打个比方,我们想要造假币(但是不知道真币是什么样的),那么我们只能通过执法者的反馈,才知道我们造的假币到底够不够真。GAN网络里既有造假者,也有执法者,一来二去,执法者辨识力越来越高,造假者的造假技术也越加成熟,最终我们得到了一个火眼金睛的执法者,但是也得到了能以假乱真的造币工艺。事实上,执法者是网络的副产品,我们真正需要得到的是造币工艺,这就是对GAN的感性认识。
这张图里最左端的潜变量空间不要看,不是最原始的GAN的内容,G的输入只有噪声。G可以把噪声z映射到真实样本x的特征空间,得到G(z)。一开始, 虽然G(z)和x是在同一个特征空间里的,但它们分布的差异很大,这时,承担鉴别真实样本和虚 假样本的模型D性能也不强,它很容易就能把两者区分开来,而随着训练的推进,虚假样本的分布逐渐与真实样本重合,D虽然也在不断更新,但也已经力不从心了。
图中,黑色曲线是真实样本的概率分布函数,绿色曲线是虚假样本的概率分布函数,蓝色曲线是判别器D的输出,它的值越大表示这个样本越有可能是真实样本。最下方的平行线是噪声z,它映射到了x。我们可以看到, 黑线和绿线最后几乎重合,模型达到了最优状态,这时D的输出对于任意样本都是0.5。
为了便于描述训练过程,我们要对文中提到的公式进行一些基本的解释。
GAN的目标函数是这样的:
从判别器D的角度看,它希望自己能尽可能区分真实样本和虚假样本,因此希望D(x)尽可能大,D(G(z))尽可能小, 也就是V(D,G)整体尽可能大。从生成器G的角度看,它希望自己尽可能骗过D,也就是希望D(G(z))尽可能大,也就是V(D,G)整体尽可能小。两个模型相对抗,最后达到全局最优。
生成模型G隐式地定义了一个概率分布P(g),我们希望P(g) 收敛到数据真实分布Pdata。论文证明了这个极小化极大博弈当且仅当P(g) = P(data)时存在最优解,即达到纳什均衡,此时生成模型G恢复了训练数据的分布,判别模型D的准确率等于50%。
DCGAN
DCGAN,Deep Convolutional Generative Adversarial Networks是生成对抗网络(Generative Adversarial Networks)的一种延伸,将卷积网络引入到生成式模型当中来做无监督的训练,利用卷积网络强大的特征提取能力来提高生成网络的学习效果。
DCGAN有以下特点:
- 在判别器模型中使用strided convolutions来替代空间池化(pooling),而在生成器模型中使用fractional strided convolutions,即deconv,反卷积层。
- 除了生成器模型的输出层和判别器模型的输入层,在网络其它层上都使用了Batch Normalization,使用BN可以稳定学习,有助于处理初始化不良导致的训练问题。
- 去除了全连接层,而直接使用卷积层连接生成器和判别器的输入层以及输出层。
- 在生成器的输出层使用Tanh激活函数,而在其它层使用ReLU;在判别器上使用leaky ReLU。
CGAN
GAN中输入是随机的数据,没有太多意义,那么我们很自然的会想到能否用输入改成一个有意义的数据,最简单的就是数字字体生成,能否输入一个数字,然后输出对应的字体。这就是CGAN要做的事。
做法是非常的简单的:
就是在G网络的输入在z的基础上连接一个输入y,然后在D网络的输入在x的基础上也连接一个y
目标函数变为
训练方式几乎就是不变的,但是从GAN的无监督变成了有监督。只是大家可以看到,这里和传统的图像分类这样的任务正好反过来了,图像分类是输入图片,然后对图像进行分类,而这里是输入分类,要反过来输出图像。显然后者要比前者难。
基于这样的算法,作者做了两个任务:一个是MNIST的字体生成任务,另一个是图像多标签任务。这里就谈MNIST字体生成任务,要求输入数字,输入对应字体。那么这里的数字是处理成one hot的形式,也就是如果是5,那么对应one hot就是[0,0,0,0,0,1,0,0,0,0]。然后和100维的z向量串联输入。
InfoGAN
有了CGAN,我们可以有一个单一输入y,然后通过调整z输出不同的图像。但是CGAN是有监督的,我们需要指定y。那么有没有可能实现无监督的CGAN?这个想法本身就比较疯狂,要实现无监督的CGAN,意味着需要让神经网络不但通过学习提取了特征,还需要把特征表达出来。对于MNIST,如何通过无监督学习让神经网络知道你输入y=2时就输出2的字体?或者用一个连续的值来调整字的粗细,方向?感觉确实是一个非常困难的问题,但是InfoGAN就这么神奇的做到了。
怎么做呢?作者引入了信息论的知识,也就是mutual information互信息。作者的思路就是G网络的输入除了z之外同样类似CGAN输入一个c变量,这个变量一开始神经网络并不知道是什么含义,但是没关系,我们希望c与G网络输出的x之间的互信息最大化,也就是让神经网络自己去训练c与输出之间的关系。mutual information在文章中定义如下:
其中的H为c的entropy熵,也就是log(c)*c,Q网络则是反过来基于X输出c。基于I,整个GAN的训练目标变成:
有了这样的理论之后,就具体如何训练的问题了。
相比CGAN,InfoGAN在网络上做了一定改变:
(1)D网络的输入只有x,不加c。
(2)Q网络和D网络共享同一个网络,只是到最后一层独立输出。
对于c,如果是categorical latent code,可以使用softmax的非线性输出来代表Q(c|x);如果是continuous latent code,可以使用高斯分布来表示。
在实验中,作者通过只改表c的某一个维度,来观察生成数据的变化,实验结果证明了,latent code确实学习到了一些可解释的信息,如在MNIST中的数字,倾斜度、笔画粗细等等
详细推导过程:https://blog.csdn.net/hjimce/article/details/55657325
Image-to-Image Translation with Conditional Adversarial Networks
用条件生成式对抗网络生成图片
https://blog.csdn.net/Ruo_hua/article/details/77170117
网友评论