GAN诞生于2014年,由深度学习三巨头之一的Bengio团队提出。是目前为止机器学习中最令人兴奋的技术之一。目前有几百种不同构架的GAN,论文也是非常非常多,可见研究有多么热门。
论文信息:2014.06,Bengio团队
论文地址:Generative Adversarial Networks
GitHub地址:https://github.com/goodfeli/adversarial
GAN利用Generator和Discriminator,可以完成很多匪夷所思的生成问题。在图像生成、语音转换、文本生成领域均占有很重要地位。它由两部分组成
生成器和判别器二者进行对抗学习,生成器不断迭代进化,努力生成假的图片,从而可以骗过判别器。判别器也在不断迭代进化,努力识别越来越接近真实的假图片。通过二者对抗学习,最终生成器生成的假图片越来越像真实图片,而判别器越来越能区分和真实图片很接近的假图片。二者能力在迭代过程中,都可以得到大幅提升。
如上图所示,枯叶蝶可以视作生成器,鸟可以视作判别器。枯叶蝶不断进化,长得越来越像枯叶,从而可以骗过鸟,不被吃掉。而鸟在这个过程中也是不断进化的,从最初从颜色来区分真假,到从纹理区分,它也在学习如何区分真假枯叶。
GAN在实际中也大有用武之地。
GAN的通用步骤如下
其网络架构可以是一个end2end的模型
判别器的目标是真实样本高分,假样本低分,其目标函数如下,我们需要最大化这个目标函数。其中xi为真实样本,x ̃i为假样本。
生成器的目标是假样本也得高分。zi为一个随机vector,它通过G()得到一个假样本,然后再通过D()进行判别。我们的目标是让判别平均分尽量高
广义来说,生成器和判别器二者不是敌人,他们不是对抗关系。他们其实是在对方帮助下,不断提升了自己,成就了彼此。那现在有个问题,我们利用Auto-Encoder等技术,不是就已经可以生成还不错的图片了吗。貌似生成器不需要判别器,就可以搞定生成的问题啊。
如上图所示,训练完Auto-Encoder后,decoder网络就可以作为生成器了。结合去噪自编码器,变分自编码器VAE等技术,可以大大提升生成器的鲁棒性,提升图片生成质量。那这样做有什么问题呢?
问题就在于As close as possible判别这一步,直接在pixel级别上,对输入输出图片进行对比,是一个很不科学的行为。因为pixel级别对比,特征实在是太低阶了。我们对比两个物体相似度,要尽量在高阶特征上进行对比。比如下面一个典型例子
利用Auto-Encoder生成的数字2,上面两个结果,虽然只有一个pixel的error。但是它们在关键位置出错了,比如出现一个单独的有颜色的pixel,以及中间挖空了一个pixel。这显然不可能是真实人类画出来的。而下面两个结果,虽然有6个pixel的error,但它们都是合乎情理的,只是笔画的加长而已。故直接在pixel级别上判别图片,是很不严谨的一种方法。
一般来说,利用VAE生成的图片没有GAN清晰。如下图所示
那怎么判别图片的生成效果呢?当然就是用判别器了啊。这就是为什么生成器需要判别器的帮助了
那判别器有没有办法独立完成高质量图片的生成呢。我们也是有办法的。我们可以通过组合pixel的办法进行图片的生成,随机sample一些组合后的假图片,和真实图片放一起,给到判别器,从而来训练判别器。通过不断的迭代,判别器能力会越来越强,最终挑选出被打高分的随机组合pixel得到的图片即可。这个办法看似可行,但其实问题也很多
因此,判别器也是需要有生成器的帮助,才能不断提升任务难度,不断进化的。
一般来说自动生成图片或文本意义不算很大,但如果能在一定限制条件下生成,则十分有意义。比如生成一张图片,要和给定的文本语义接近,这就是text2image。利用conditional GAN,我们可以得到我们想要的图片。
conditional GAN的生成器一般如下。
生成器这一块没啥花头,只是多了一个condition输入而已。
conditional GAN的判别器一般如下
判别器的目标有两个,一个是样本要尽量真实,第二个是样本要和条件是匹配的。这和通用的GAN是不同的
为了避免模型需要应对两个条件,导致难度过大。我们也可以把判别器的两个条件分开,如下
网络分为两路,样本通过绿色network,判别是否是真实样本。条件condition和样本同时经过蓝色network,判别二者是否是match的。
通过condition GAN,我们就可以随心控制想要的输出了。比如我们可以控制想要的眼睛和头发颜色,来生成想要的卡通头像。
通用GAN和条件GAN,都需要监督信号,也就是满足条件的真实样本。有时候真实样本不是那么容易得到,那我们有没有办法实现无监督条件GAN呢。在某些任务中,还是可以实现的。比如图片风格转换。
conditional GAN需要满足两个条件,一个是图片尽量真实,另一个是图片是想要的风格。cycleGAN利用两个生成器和一个判别器解决了这个问题。如上图所示,我们需要将真实图片转换为抽象派图片,分别记为domain X和domain Y。步骤如下
通过两个生成器,将domain x的图片转换为domain y,然后又转换回domain x,从而确保两个domain图片是关联的。这种方法就是cycleGAN。
其他有XGAN、Couple GAN、UNIT、ComboGAN可以解决这个问题。就不一一说了。