- 一、原理部分
- 1.1举例解释
- 1.2基本知识
- 1.3优缺点
- 二、GAN的主要问题
- 三、公式说明
- 四、训练GAN的一些技巧
- 五、GAN的改进策略
- 六、 DCGAN
- 6.1 DCGAN介绍
- 6.2 DCGAN应用案例
- 6.2.1 DCGAN用于生成图像变换
- 6.2.2 DCGAN用于生成图像的算术运算
- 6.2.3 DCGAN用于残缺图像的补全
- 6.3 DCGAN代码实战
- 七、Wasserstein GAN
- 7.1 WGAN介绍
- 7.2 WGAN-GP
- 八、其他结构的GAN
- 8.1 EBGAN
- 8.2 总结
- 十、GAN的应用领域
Generative Adversarial Networks(GAN):生成对抗网络。 2014年Ian J. Goodfellow等人在论文《Generative Adversarial Nets》中第一次提出GAN的概念。 大牛Yann LeCun甚至评价GAN为 “adversarial training is the coolest thing since sliced bread”。
1.1举例解释论文中举了一个很通俗的例子——假币与真币的例子。 造假币的团伙相当于生成器,他们想通过伪造金钱来骗过银行,使得假币能够正常交易,而银行相当于判别器,需要判断进来的钱是真币还是假币。因此假币团伙的目的是造出银行识别不出的假币而骗过银行,银行则是想办法准确的识别出假币。
这样,G和D构成了一个动态的“博弈过程”。因此,生成对抗网络由此而来。
1.2基本知识GAN的主要灵感来源于博弈论中零和博弈的思想。GAN属于非监督式学习,但与一般非监督式学习不同。GAN被誉为近年来复杂分布上无监督学习最具前景的方法之一。
组成: GAN包括两个部分, 生成器G(generator) 和 判别器D(discriminator) 。生成器接收一个随机噪声(随机数),并且学习真实图像分布从而让自身生成的图像更加真实,以骗过判别器。判别器则需要对接收的图片进行真假判别。
目标: 使得判别器无法判断,无论对于真假样本,输出结果概率都是0.5。
原理: 在训练过程中,生成器努力地让生成的图像更加真实,而判别器则努力地去识别出图像的真假,这个过程相当于一个二人博弈,随着时间的推移,生成器和判别器在不断地进行对抗。最终两个网络达到了一个动态均衡:生成器生成的图像接近于真实图像分布,而判别器识别不出真假图像,对于给定图像的预测为真的概率基本接近0.5(相当于随机猜测)。
在分析GAN结构模型之前,我们首先要明白在使用以下两个问题:
- 我们有什么? 我们所拥有的,也就是向神经网络中填喂的数据仅仅是真实采集来的数据集,仅此而已,甚至连类标签都没有。
- 我们要得到什么? 我们希望根据输入数据,当输入一个噪声时,能模拟得到与输入数据类似的图像,以此得到以假乱真的效果。
模型结构如图所示:
- G表示生成器,它接收一个随机噪声z(随机数),通过这个噪声生成图像;
- D代表判别器,判别图像真假,它的输出是(0,1)之间的数字,代表真实图像的概率。如果是1,表示是真实图片;如果是0则代表不是真实图像,而是生成器生成的图像。
【注意】:需要注意的是生成模型和对抗模型可以说是完全独立的两个模型,他们之间是没有什么联系的。因此训练这两个模型的方法是:单独交替迭代训练。也就是说,当一个神经网络开始训练时,另一个必须停止;而另一个训练时,第一个就需要停止。
1.3优缺点关于优缺点部分,作者在论文中是这样写的: 具体来说, 优点:
- 相比较其它模型,只需使用反向传播来获得梯度,而不需要复杂的马尔科夫链(Markov chains)
- 在学习过程中不需要推理,非常灵活,并且可以将多种函数合并到模型中(无监督学习方式)
- 相比较于VAE,可以产生更加清晰真实的样本
缺点:
- 不适合处理离散形式的数据,比如文本
- 在训练过程中D必须与G很好地同步(特别是,G在不更新D的情况下不能训练太多),否则可能会出现 训练不稳定、梯度消失、模式崩溃等问题。
【注1:模式崩溃(model collapse)现象】
GAN采用的是对抗训练的方式,G的梯度更新来自D,所以G生成的好不好,得看D怎么说。具体就是G生成一个样本,交给D去评判,D会输出生成真假样本的概率(0-1),相当于告诉G生成的样本有多大的真实性,G就会根据这个反馈不断改善自己,提高D输出的概率值。但是如果某一次G生成的样本可能并不是很真实,但是D给出了正确的评价,或者是G生成的结果中一些特征得到了D的认可,这时候G就会认为我输出的正确的,那么接下来我就这样输出肯定D还会给出比较高的评价,实际上G生成的并不怎么样,但是他们两个就这样自我欺骗下去了,导致最终生成结果缺失一些信息,导致训练失败。
二、GAN的主要问题GAN从本质上来说,有着与一般神经网络不同的特点,因为GAN的训练是依次迭代D和G,如果判别器D学的不好,生成器G得不到正确反馈,就无法稳定学习。如果判别器D学的太好,整个loss迅速下降,G就无法继续学习。
GAN的优化需要生成器和判别器达到纳什均衡,但是因为判别器D和生成器G是分别训练的,纳什平衡并不一定能达到,这是早期GAN难以训练的主要原因。另外,最初的损失函数也不是最优的。
三、公式说明 生成网络G的损失函数为:
log
(
1
−
D
(
G
(
z
)
)
)
\log (1 - D(G(z)))
log(1−D(G(z)))或者
−
l
o
g
D
(
G
(
z
)
)
-log D(G(z))
−logD(G(z))。 判别网络D的损失函数为:
−
(
log
D
(
x
)
+
log
(
1
−
D
(
G
(
z
)
)
)
)
- (\log D(x) + \log (1 - D(G(z))))
−(logD(x)+log(1−D(G(z))))
我们从式子中解释对抗,损失函数的图像是一个类似于y=log(x)函数图形,x>1时,y>0,x=1时,y=0。
生成网络和判别网络对抗(训练)的目的是使得各自的损失函数最小,生成网络G的训练希望 D ( G ( z ) ) D(G(z)) D(G(z))趋近于1,也就是正类,这样生成网络G的损失函数 log ( 1 − D ( G ( z ) ) ) \log (1 - D(G(z))) log(1−D(G(z)))就会最小。而判别网络的训练就是一个2分类,目的是让真实数据x的判别概率D趋近于1,而生成数据G(z)的判别概率 D ( G ( z ) ) D(G(z)) D(G(z))趋近于0,这是负类。
- 当判别网络遇到真实数据时: E x ∼ p d a t a ( x ) [ log D ( x ) ] {E_{x \sim {p_{data}}(x)}}[\log D(x)] Ex∼pdata(x)[logD(x)],这个期望要取最大,只有当D(x)=1的时候,也就是判别网络判别出真实数据是真的。
- 当判别网络遇到生成数据时:
E
z
∼
P
z
(
z
)
[
log
(
1
−
D
(
G
(
z
)
)
)
]
{E_{z \sim Pz(z)}}[\log (1 - D(G(z)))]
Ez∼Pz(z)[log(1−D(G(z)))],因为0
关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?