来玩玩GAN(0)-生成对抗网络简介
生成对抗网络简介
介绍
生成对抗网络简介、原理、训练技巧
生成对抗网络原理
生成对抗网络(GAN,Generative Adversarial Networks),由Goodfellow等人于2014年提出,它能够迫使生成图像与真实图像在统计上几乎无法区分,从而生成相当逼真的合成图像。
传统的GAN网络由两部分构成:一个生成网络和一个判别网络。
- 生成网络:它接收一个随机的噪声,并通过噪声生成图片,记作G。
- 判别网络:判断图片是生成网络生成的“赝品”,还是真实存在的图片,相当于图像一个二分类网络,记作D。
在训练过程中,二者的目的都是打败对方,即:生成网络试图欺骗判别网络,判别网络试图尽量将“赝品”区分出来。二者构成了一个动态博弈的过程,在训练中共同提高。
最后,我们就可以得到一个可以生成图片,并以假乱真的网络G。
以上为它的损失函数,相关资料上是这样解释的:
- 整个式子由两项构成。x表示真实图片,z表示输入G网络的噪声,而G(z)表示G网络生成的图片。
- D(x)表示D网络判断真实图片是否真实的概率(对于D来说,这个值越接近1越好)。而D(G(z))是D网络判断G生成的图片的是否真实的概率。
- G的目的:D(G(z))是D网络判断G生成的图片是否真实的概率,G应该希望自己生成的图片“越接近真实越好”。也就是说,G希望D(G(z))尽可能得大,这时V(D, G)会变小。因此我们看到式子的最前面的记号是min_G。
- D的目的:D的能力越强,D(x)应该越大,D(G(x))应该越小。这时V(D,G)会变大。因此式子对于D来说是求最大max_D。
同时,由于D的目标是最大值,G的目标是最小值。所以在训练过程中,D网络沿梯度上升,G网络沿梯度下降。两者训练同时进行。
优化D:
优化G:
可以看到,优化D的时候,其实没有G什么事,后面的G(z)这里就相当于已经得到的假样本。优化D的公式的第一项,使的真样本x输入的时候,得到的结果越大越好,可以理解,因为需要真样本的预测结果越接近于1越好。对于假样本,需要优化是的其结果越小越好,也就是D(G(z))越小越好,因为它的标签为0。但是第一项是越大,第二项是越小,这不矛盾了?所以呢把第二项改成1-D(G(z)),这样就是越大越好,两者合起来就是越大越好。
同样在优化G的时候,这个时候没有真样本什么事,所以把第一项直接去掉了。这个时候只有假样本,但是我们说这个时候是希望假样本的标签是1的,所以是D(G(z))越大越好,但是呢为了统一成1-D(G(z))的形式,那么只能是最小化1-D(G(z)),本质上没有区别,只是为了形式的统一。
之后这两个优化模型可以合并起来写,就变成了最开始的那个最大最小目标函数了。
GAN的强大之处
-
可以自动的学习原始真实样本集的数据分布
-
可以自动的定义潜在损失函数
即:判别网络可以自动学习到一个好的判别方法,其实就是等效的理解为可以学习到好的损失函数。
训练技巧
在python深度学习书中提到一些关于GAN网络训练的技巧:
- 使用tanh,代替sigmoid作为生成器最后一层。
- 使用正态分布代替均匀分布对潜在空间的点采样。
- 引入随机性避免训练“卡住”,在判别器中使用dropout,在判别器标签添加随机噪声。
- 使用步进卷积代替最大池化进行下采样,使用LeakyReLU代替ReLU,避免过稀疏的梯度。
- 使用卷积和反卷积时,卷积核大小要能够被步幅整除,避免出现棋盘伪影。
参考资料和相关网址
生成对抗式网络 GAN的理解:
https://www.cnblogs.com/baiting/p/8314936.html
最简单易懂的GAN(生成对抗网络)教程:从理论到实践(附代码):
https://www.leiphone.com/news/201706/ty7H504cn7l6EVLd.html