Deep Generative Model2--GAN(Generative Adversarial Network)

GAN 初探(参考李宏毅老师机器学习课程)

GAN的基本原理:
本质上来说,GAN就是一个生成器,用来生成我们需要的数据比如图片或文字。首先,我们扔一个vector到这个生成器,通过生成器内部复杂的neural network 结构,它会生成一个我们想要的数据类型的数据,比如生成一张二次元人物图片。
但是相较于其他的生成式模型,GAN不同的点在于其同时包含一个discriminator(判别器),同样的,其内部也可以看作是一个复杂的网络结构,但是与generator相反,discriminator的input是一张图片,或者更确切地说,是generator的output的数据类型,而它的output是一个scalar,并且值越高,代表generator生成的output越靠近真实数据,值越低,代表越虚假。举个例子,比如generator的目标是由机器生成手绘二次元人物图片,那么discriminator会去判定说机器生成的图片与真实图片差距如何,如果判别器输出一个非常大的值, 比如1.0,那么代表generator已经足够优秀,能够以假乱真,反之如果,输出值很小比如0.1,那么就代表说generator还需要不断被训练。
上面分别介绍了生成器和判别器,接下来我们来讨论一下两者之间的关系。我们知道在循环的训练过程中,生成器会不断的进化,从而不断生成更优质的仿真数据(比如仿真图片),但是在这个过程中,我们的判别器也会不断提高标准,变得更加刁钻,来尽可能提升鉴别fake图片的能力,在两者不断的对抗和较劲的过程中,我们的生成器逐渐变得越来越优秀。这也是为什么我们把它叫做生成对抗网络的原因。
接下来,我们来通过算法的描述来加深一下对GAN的理解。下面这张图引自李宏毅老师的课件,我会仔细解释算法中的每一步。
在这里插入图片描述
这里,为了配合图片中的notation,在下面的解释中,我直接用D和G代指Discriminator 和 Generator。OK,首先第一步当然是初始化两个NN的参数。
接着在训练的每一个iter中,首先,我们从真实数据集(比如真实手绘图片)中随机抽取m个样本{x1,x2,…xm},接着从某个分布中随机抽取m个样本(vector){z1,z2,…zm},这个分布可以是uniform/高斯等等,然后将抽样得到的m个vector扔到G的网络中,生成伪数据{x_1,x_2,…x_m}。然后我们来看一下目标函数
在这里插入图片描述
注意这里我们的优化对象是D,也就是要让它尽可能区分出真实与虚假数据。对于真实数据xi,要让它的output值越大越好,而对于虚假数据x_i,要让它的output值越小越好,所以取1-D(x_i),当然,因为这里的目标是最大化目标函数,因此参数的优化方向自然也是上升,也就是梯度上升。
在这里插入图片描述
当我们优化完D的参数后,D已经完成了升级,接下来我们fix住D,开始优化我们的G,目标让G能够骗过这一轮完成升级的D。同样的,我们再次随机抽取m个样本,并基于此再次生成m个伪数据,对于G而言,它想要的就是让着m个伪数据能够尽可能骗过D,在D的判别下获得尽可能高的得分。因此同样的,下面的目标函数优化方向仍是上升,参数优化仍然选用梯度上升。
在这里插入图片描述
在之后的每一轮训练中,都重复上面的步骤,这里需要注意的一点是,每次训练D时,G的参数不变,而每次训练G时,D的参数也是不变的,也就是说,它们的进步过程是交替进行的。

从结构化学习的角度来思考GAN:
一般而言,结构化学习可以分为Bottom up 和 Top down两种方法。Bottom up可以通俗地理解为从局部一步一步生成最终目标的方式,正对应着GAN中的Generator,而Top down 可以理解为当整体的目标被生成后,我们去一个一个评估,再挑选出最好的那一个,正对应着GAN中的Discriminator。所以,我们可以把GAN视为一种结构化学习的方法。

仅使用Generator的问题:
我们知道在除了GAN,另一种经典的生成式模型是VAE。假设我们想要生成图片,目标自然是我们生成的图片与真实图片一致。如果真的实现,那么确实没有任何问题,但是一般情况下,生成模型生成的图片势必与真实图片会有不同,那么现在的关键问题是,机器会怎么选择差别点呢?因为机器的目标是从局部生成整体的过程中,sum(单个区域的误差)最小,但是没有明确的学习准则告诉它怎样去选择哪几个区域去犯错。OK, 我们拿手写数字生成作为例子,引用李宏毅老师课件中的例子来看一看。假设我们的目标是手写数字2
在这里插入图片描述
然后我们有4个generator生成4张不同的图片。
在这里插入图片描述
但从误差的角度看,似乎第一排的两张图对应的生成器完成的更好,但是如果我们从人的思维出发,显然第二排的生成图片更接近真实手写数字,因为它们的偏差点非常无足轻重,符合人类的手写习惯,尽管它们与目标有6个pixel的误差。
所以说,在真实的生成任务中,区域间的关系往往非常重要,对于VAE来说,仅使用generator想要捕捉到这层关系可能需要非常深的网络结构,这也是在GAN中引入Discriminator的重要意义,通过判断器这个具有全局思维的纠错官,能够帮助生成器更好地达到以假乱真的目目标。

仅使用Discriminator的问题
单单使用Discriminator,能够生成object,但是我们需要的是穷举所有的candidate object,来挑选出最优的那个作为生成目标。但是我们需要考虑的一个问题是,我们在训练D的时候,往往只有positive examples,也就是真实图片数据,却缺乏negative examples。如果你只是随机产生一堆noise作为negative examples,那么训练出来的D往往鉴别能力会非常一般,比如一张just so so 的生成图片也会别D分类为positive。因此,我们需要尽可能好的negative examples才能训练处好的D,但是恰恰又是我们只有一个相对好的D,才能生成相对好的negative examples,至此,我们陷入一个死循环。
Solution:General Algorithm
简单来说, 先训练D,然后根据训练好的D1,选出D1认为好的negative examples,再将这些negative examples作为第二轮的训练样本,训练出D2,不断运行这个循环。下面是李宏毅老师课件中的示例图。
在这里插入图片描述
简单来说,每一轮,D都在不断地修正自己的弱点或者说认知上的缺陷,通过将上一轮生成的认为好的样本(认为是真实图片)在下一轮定义为generated ,直到最后D能够精准定义真实样本,D(x)的分布与真实数据分布一致。

参考:李宏毅老师机器学习 https://www.bilibili.com/video/BV1JE411g7XF?p=74

猜你喜欢

转载自blog.csdn.net/weixin_44607838/article/details/109206117