简介
-
生成对抗网络GAN,是当今的一大热门研究方向。在2014年,被Goodfellow大神提出来,当时的G神还只是蒙特利尔大学的博士生而已。
-
GAN之父的主页:http://www.iangoodfellow.com/
-
GAN的论文首次出现在NIPS2014上,原论文地址如下:https://arxiv.org/pdf/1406.2661.pdf
入坑GAN之前,首先需要理由,GAN能做什么,为什么我们要学它。GAN的初衷就是生成不存在于真实世界的数据,类似于使得 AI具有创造力或者想象力。应用大致如下:
1.将模糊图变清晰(去雨、去雾、去抖动、去马赛克等)。
2.AI画家需要创造力的AI体。
3.进行数据增强,根据有限的数据生成更多的新数据,来扩大数据集。
一 、什么是GAN?
GAN的英文全称是Generative Adversarial Networks,GAN模型包括了一个生成模型G和一个判别模型D。生成器G的目的是生成假的目标,企图彻底骗过判别器D的识别。而判别器通过学习真目标和假目标,提高自己的判别能力,不让假目标骗过自己。两者相互进化,相互博弈,一方进化,另一方损失,最后直到假目标与真目标很相似则停止进化。
这样可以简单的看作是两个网络的博弈过程。在最原始的GAN论文里面,G和D都是两个多层感知机网络。首先,注意一点,GAN操作的数据不一定非得是图像数据,不过为了更方便解释,我在这里用图像数据为例解释以下GAN:
Z是一组随机噪声,D通过真图和假图的数据(相当于天然label),进行一个二分类神经网络训练。G根据一串随机数就可以捏造一个“假图像”出来,用这些假图去欺骗D,D负责辨别这是真图还是假图,会给出一个score。比如,G生成了一张图,在D这里得分很高,那证明G是很成功的。如果D能有效区分真假图,则G生成的效果还不太好,需要调整参数。GAN就是这么一个二人博弈的过程。
二、 GAN的原理及训练过程
先上一张看起来比较好理解的图:
1.我们有什么?
比如我们有的知识真实采集而来的人脸样本数据集,仅此而已,我们甚至连人脸数据集的类标签都没有,也就是说我们不知道哪个人脸对应的是谁。
2.我们要得到什么?
比如我们现在的任务是通过输入一个噪声,模拟得到一个人脸图像,这个图像可以非常逼真以至于我们基本看不出来真假。
3.GAN的两个模型要做什么?
首先看判别器D,就是上图中右半部分网络,直观的来看就是一个简单的神经网络结构,输入就是一副图像,输出就是一个概率值,用于判断使用(概率值大于0.5我们就认为是真,小于0.5就是假)。
再看生成器G,同样也可以看成是一个神经网络模型,输入是一组随机数Z,输出是一个图像,不再是一个数值了。
需要注意的是生成器模型和判别器模型可以说是完全独立的两个模型,就是两个完全独立的两个神经网络,它们之间没有什么联系。
那么训练这样的两个模型的方法就是:单独交替迭代训练
敲黑板!!! 下面划重点了!
假设现在生成网络模型已经有了(当然可能不是最好的生成网络),那么我们给出一堆随机数组Z,就会得到一堆假的样本集(因为是最初始的生成模型,肯定生成的样本不咋地,很明显就被判别出来这货是假冒的了)。现在我们有了这样的假样本集了,然后真的样本集我们一直都有,现在我们人为的手动定义真假样本集的标签,因为我们希望真样本集的输出尽可能为1,假样本集为0。所以我们现在就有了真样本集和它们的label(都是1),假样本集和它们的label(都是0)。这样单就判别网络来说,此时的问题就变成了一个再简单不过的有监督的二分类问题了,直接送到神经网络模型中训练就完事了。(有人会问:真样本集里面的张三人脸和李四人脸不一样啊,为什么label都定为1,因为我们现在的目的是区分真假人脸,而不是谁的人脸是谁)。假设已经训练完了,下面来看生成网络。
对于生产网络,我们的目的是生成尽可能逼真的样本。那么原始的生成网络生成的样本你怎么知道它真不真呢?对,就是送到判别网络中去鉴别。所以再训练生成网络的时候,我们需要联合判别网络一起才能达到训练的目的。什么意思?就是如果我们单单只用生成网络,那么误差来源在哪里?所以如果我们把刚才的判别网络串接在生成网络的后面,这样我们就知道真假了,也就有了误差了。所以对于生成网络的训练就是是对生成-判别网络串接的训练,就像图中显示的那样。
现在我们来分析一下样本,原始的噪声Z我们有,也就是说第一遍生成的假样本我们有。此时很关键的一点来了!我们要把这些假样本的label都设置为1,也就是认为这些假样本在生成网络训练的时候是真样本。为什么要这样呢?是不是这样才能起到迷惑判别器的目的,也才能使得生成器的假样本逐渐逼近为真样本。好的,现在我们有的是假样本集和它的label(都是1),是不是可以训练了?有的小伙伴会问,就一类样本,训练个毛线?嗯?谁说一类样本就不能训练了?只要有误差就行。还有机智的小伙伴会发现,你这样一训练,判别网络的网络参数不是也跟着在变吗?没错,这很关键,所以在训练这个生成-判别串接网络的时候,一个很重要的操作就是不让判别网络的参数发生变化,也就是不让它参数发生更新,只是把误差一直传,传到生成网络那块后更新生成网络的参数。这样就完成了生成网络的训练了。
现在生成网络训练好了,那么我们是不是可以根据目前新的生成网络再对先前的那些随机噪声Z生成新的假样本了,没错,并且现在的假样本应该会更真一点了才对。然后我们又有了新的假样本集和它的label(都是1),这样我们又可以重复上述过程了。我们把这个过程称作为单独交替训练。我们可以实现定义一个迭代次数,交替迭代到一定次数后停止即可。这个时候我们再回头去看一看噪声Z生成的假样本会发现,它已经有点真了。
三、数学公式
如何用数学语言描述呢?这个问题比较头痛,这里直接摘录论文里的公式:
这个公式可以说是比较经典了,为了便于理解我们把它拆开来看:
优化D:
优化G:
简单分析一下公式:
x表示真是图片,z表示输入G网络的噪声,而G(z)表示G网络生成的图片。D(x)表示D网络判断真实图片是否真实的概率(因为x是真实图片,所以对于D来说,这个值越接近1越好)。而D(G(z))是D网络判断G生成的图片是否真实的概率。
G的目的:G希望自己生成的图片越接近真实越好,也就是说,G希望D(G(z))尽可能的大,也就是V(D,G)尽可能的小,因此前面是min_G。
D的目的:D的能力越强,D(x)应该越大,D(G(z))应该越小。这时V(D,G)尽可能的大,因此前面是max_D。
那么如何用随机梯度下降法训练D和G?论文中也给出了算法:
对于判别器D,目标函数为(梯度上升):
对于生成器G,目标函数为(梯度下降):
于是模型就成了优化这两个目标函数的问题了。这样的话就只需要反向传播来对模型训练就好了,没有像传统的生成式模型的最大似然函数的计算、马尔可夫链或者其他推理等运算了。
GAN的一些优点
1. GAN是更好的生成模型,在某种意义上避免了马尔科夫链式的学习机制,这使得它能够区别于传统的概率生成模型。传统概率生成模型一般都需要进行马可夫链式的采样和推断,而GAN避免了这个计算复杂度特别高的过程,直接进行采样和推断,从而提高了GAN的应用效率,所以其实际应用场景也就更为广泛。
2. GAN是一个非常灵活的设计框架,各种类型的损失函数都可以整合到GAN模型当中,这样使得针对不同的任务,我们可以设计不同类型的损失函数,都会在GAN的框架下进行学习和优化。
3. 最重要的一点是,当概率密度不可计算的时候,传统依赖于数据自然性解释的一些生成模型就不可以在上面进行学习和应用。但是GAN在这种情况下依然可以使用,这是因为GAN引入了一个非常聪明的内部对抗的训练机制,可以逼近一些不是很容易计算的目标函数。
GAN的一些问题:
1.不收敛:模型参数震荡、不收敛。
2.模式崩溃:有限的样本导致生成器崩溃。
3.梯度弱化:判别器太成功了,生成器梯度消失,什么也没学到。
4.生成器和判别器不平衡导致过拟合,高度敏感的超参选择。如果没有合适的超参,没有代价函数可以工作,调整它们需要时间和耐心。新的成本函数可能会引入具有敏感性能的超参数。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:初窥门径__生成对抗网络(GAN)(一) - Python技术站