1、模型简介:

GAN网络可以看成是两个网络模型对抗,一个是生成网络模型G,一个是识别网络模型D。生成式网络模型G是一个用来生图片的网络,该模型的输入为一个随机的噪声z,通过这个噪声来生成相应的图片,该图片记做G(z)。识别网络模型D是一个判断网络,它用来判断网络是不是真是的样本。输入的样本图像为x,x即可能来自于模型G所产生,也可能来自于真实的样本,D(x)表示x为真实样本的概率,输出为1表示100%的真实图片,为0表示真实图片。生成网络G的目的就是尽量生成真实的图片去欺骗识别网络D,识别网络D的目的就是就是区分出生成网络G和真实样本的图片。

  • 生成模型功能:比作是一个样本生成器,输入一个噪声/样本,然后把它包装成一个逼真的样本,也就是输出。
  • 判别模型:比作一个二分类器(如同0-1分类器),来判断输入的样本是真是假。(就是输出值大于0.5还是小于0.5);

简单理解生成对抗网络GAN

所谓对抗网络:判别网络说,我很强,来一个样本我就知道它是来自真样本集还是假样本集。生成网络说我也很强,我生成一个假样本,虽然我生成网络知道是假的,但是你判别网络不知道呀,我包装的非常逼真,以至于判别网络无法判断真假,那么用输出数值来解释就是,生成网络生成的假样本进去了判别网络以后,判别网络给出的结果是一个接近0.5的值,极限情况就是0.5,也就是说判别不出来了,这就是纳什平衡了。

由这个分析可以发现,生成网络与判别网络的目的正好是相反的,一个说我能判别的好,一个说我让你判别不好。所以叫做对抗

2、 模型训练:

生成模型与对抗模型可以说是完全独立的两个模型,好比就是完全独立的两个神经网络模型,他们之间没有什么联系。

那么训练这样的两个模型的大方法就是:单独交替迭代训练

对于判别网络:

假设我们现在有了假样本集,真样本集一直都有,现在我们人为的定义真假样本集的标签,很明显这里我们就已经默认真样本集所有的类标签都为1,而假样本集的所有类标签都为0. 此时问题就变成了一个再简单不过的有监督的二分类问题了,直接送到神经网络模型中训练就完事了。

对于生成网络:

目的是生成尽可能逼真的样本。那么原始的生成网络生成的样本怎么知道它真不真呢?如果把刚才的判别网络串接在生成网络的后面,这样就知道生成样本的真假了,也就有了误差了。所以对于生成网络的训练其实是对生成-判别网络串接的训练,原始的噪声数组Z有,也就是生成的假样本有,此时很关键的一点来了,我们要把这些假样本的标签都设置为1,也就是认为这些假样本在生成网络训练的时候是真样本。那么为什么要这样呢?因为这样才能起到迷惑判别器的目的,也才能使得生成的假样本逐渐逼近为真样本。重新顺一下思路,现在对于生成网络的训练,我们有了样本集(只有假样本集,没有真样本集),有了对应的label(全为1),是不是就可以训练了?有人会问,这样只有一类样本,训练啥呀?谁说一类样本就不能训练了?只要有误差就行。还有人说,你这样一训练,判别网络的网络参数不是也跟着变吗?没错,这很关键,所以在训练这个串接的网络的时候,一个很重要的操作就是不要判别网络的参数发生变化,也就是不让它参数发生更新,只是把误差一直传,传到生成网络那块后更新生成网络的参数。这样就完成了生成网络的训练了。

3、数学模型分析

目标公式:

简单理解生成对抗网络GAN

这个公式是最大最小的优化,对比分析过程也是这样的,这里先优化D,然后优化G,本质上是两个优化问题,把拆解就如同下面两个公式:

简单理解生成对抗网络GAN

优化D的时候,也就是判别网络,其实没有生成网络什么事,后面的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)),本质上没有区别,只是为了形式的统一。

后记:

1、传统的机器学习方法,一般都会定义一个什么模型让数据去学习。生成模型最后可以通过噪声生成一个完整的真实数据(比如人脸),GAN的机制可以学习到,也就是说GAN学习到了真实样本集的数据分布。

2、GAN网络存在着不收敛问题;网络不稳定;网络难训练

对原始gan的改进有以下4点,使得训练更为稳定,生成的图片种类更加多样:

 

  • 判别器最后一层去掉sigmoid
  • 生成器和判别器的loss不取log
  • 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
  • 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行

 参考博客:https://blog.csdn.net/on2way/article/details/72773771