生成对抗网络与2014年被提出,一经提出便引发了深度学习的又一次小高潮,属于无监督学习,本篇博客主要介绍***GAN网络的结构以及训练过程!***

对抗样本即对抗网络的发展大家可以参考GANs学习系列(4):对抗样本和对抗网络,有助于建立一个对对抗样本的系统认知!

1、生成对抗网络(GAN)的结构

GAN网络主要由两个网络构成,生成网络G和辨别网络D,生成模型G的思想是将一个噪声包装成一个逼真的样本,判别模型D则需要判断送入的样本是真实的还是假的样本,即共同进步的过程,辨别模型D对样本的判别能力不断上升,生成模型G的造假能力也不断上升!
需要注意的是,生成模型G的输入是服从-1~1均匀分布的随机变量,输出为一张图片(或者其他,这里我们需要图片而已),因此,生成网络的结构是一个反卷积网络,即对应CNN中的可视化操作,由随机变量生成图片的过程!

2、生成对抗网络(GAN)的训练

生成网络G的分布参考:生成对抗网络的tensorflow实现,接下来我们来看一下如何训练这两个网络!
因为是2个网络,不好一起训练,所以怎样训练这两个模型呢?方法就是:

单独交替迭代训练。

即在训练一个网络的时候,固定住一个网络,然后去训练另一个网络;训练另一个网络的时候,固定住一个网络!
假设现在生成网络已经存在了,给一堆随机数组,就会得到一堆假的样本集,针对判别网络D,结合真样本集和假的样本集同时对D进行训练,可以使D对于真假样本的判别能力得到提高!

针对生成网络呢?我们的目的是即可能的生成尽可能逼真的样本,原始的生成网络只负责生成对抗样本,然而它的效果好不好则需要判别网络进行判别,因此,在训练生成网络G的时候后面需要跟上一个判别网络D进行训练,需要注意的是:在训练生成网络G的时候,判别网络D的参数不发生变化,即只是把loss一直回传,传到生成网络G后更新生成网络的参数即可!

我们来看看GAN网络的额loss函数,下面是原始论文中给出来的目标公式:
生成对抗网络(GAN)简单入门(33)---《深度学习》
这个公式包含了两个网络的训练过程,即先优化辨别网络D,然后再来优化生成网络G,仔细想想,我们要生成很好地对抗样本,如何证明我们生成很棒的对抗样本呢?即能够非常好的愚弄一个已经能够对样本进行很好区分的辨别网络D,这样才可定义为对抗样本是比较逼真的,这样就很容易确定优化顺序了,即先要有一个训练的好的辨别网络D,由于辨别网络D和生成网络G是同时训练的,因此,因此我们先训练辨别网络D,然后在训练生成网络G,即两个优化问题,现在我们将该公式进行拆解:
1)优化辨别网络D:
生成对抗网络(GAN)简单入门(33)---《深度学习》
生成对抗网络(GAN)简单入门(33)---《深度学习》
**(分析:因为D(x)或者D(G(z))的取值范围仅仅只是0~1,分析一下这个函数,可以发现,为了是这个函数值最大,D(x)应该尽可能趋向于1,而D(G(z))应该尽可能趋向于0,这样的话,可以很好地训练我们的辨别网络D)**优化辨别网络的时候,我们需要对真样本的预测结果越大越好,对于伪样本的的预测结果越小越好,即log(D(x)和1-log(1-D(G(z))),包含智能使其尽可能大,然后进行训练。
2)优化生成网络G:
生成对抗网络(GAN)简单入门(33)---《深度学习》
生成对抗网络(GAN)简单入门(33)---《深度学习》
训练生成网络G的时候,与真样本无关,因此可以去掉第一项,我们的目标是最大化D(G(z)),为了统一格式,所以写成了最小化log(1-D(G(z)),将两个优化模型合并起来写,就变成了原始的那个最大最小目标函数了!

下面是论文中给出的训练GAN网络的算法:
生成对抗网络(GAN)简单入门(33)---《深度学习》

ps:不过需要注意的是,实际中在定义loss函数的时候,1)训练辨别网络D的时候,由于需要最大化对应的值,在实际中我们使用梯度下降算法,因此,我们将其转化为负数,即可以利用梯度下降算法减小loss值即可;2)训练生成网络的时候,我们需要最小化对应的值,因此,我们采用小trick,即将1-D(G(z))转化为D(G(z))并给对应的外部值乘上负号,便于计算,而且还能避免在log(1-D(G(z))饱和时出现的相应问题,方便操作!具体参考参考文献中第6条!

参考:
1、对抗生成网络(Generative Adversarial Net)
2、生成对抗网络GANs理解(附代码)
3、简述生成式对抗网络
4、最简单易懂的GAN(生成对抗网络)教程:从理论到实践(附代码)
5、不要怂,就是GAN (生成式对抗网络) (一): GAN 简介
6、Generative Adversarial Nets论文笔记+代码解析

7、生成对抗网络GANs理解(附代码)

8、对数损失函数