图像生成:
图像生成的目的是,学习一个生成模型,能够将来自于输入分布的一幅图像或变量转变成为一幅输出图像。
- 「输入」满足一个输入分布input distribution;
- 「输出」满足一个预期的期望分布desired distribution;
通过定义不同的输入分布和期望分布,就对应着不同的图像生成问题。
类比:
生成模型像“一个造假团伙,试图生产和使用假币”,而判别模型像“检测假币的警察”。生成器(generator)试图欺骗判别器(discriminator),判别器则努力不被生成器欺骗。模型经过交替优化训练,两种模型都能得到提升,直到到达一个“假冒产品和真实产品无法区分”的点。
图像生成关于GAN 的三个问题:
度量复杂分布之间差异性、如何设计生成器、建立输入和输出之间的联系。
• 第一,度量复杂分布之间差异性。我们希望输出分布达到期望分布,那么我们需要找两个分布之间差异的度量方式。
•第二,如何设计生成器。如果我们想要学习映射,就需要一个生成器,那么就要对它的训练、可学习性进行设计。
•第三,连接输入和输出。如下图性别转换的例子,输入是一张男性图像,输出是一张女性图像。显然我们需要的并不是从输入到任意一幅女性人脸图像的映射,而是要求输出的女性图像要跟输入的男性图像尽可能像,这个转换才是有意义的。
解决图像生成关于GAN 的三个问题的方法:
度量复杂分布之间差异性:
1、Discriminator:
采用了一个判别器来度量两个分布的差异化程度。基本的过程是,固定生成器,得到一个最好的判别器,再固定判别器,学到一个最好的生成器。但是其中有一个最令人担心的问题,那就是如果我们学到的是一个很复杂的分布,就会出现模式崩溃(Mode
Collapse)的问题,即无法学习复杂分布的全局,只能学习其中的一部分。
对此,最早的解决方案,是调整生成器(G)和判别器(D)的优化次序。
2、最大化均值差异(MaximumMean Discrepancy,MMD):
如果两个分布相同的话,那么两个分布的数学期望显然也应该相同;然而,如果两个分布的数学期望相同,并不能保证两个分布相同。因而,我们需要更好地建立「分布相同」和「期望相同」之间的连接关系。幸运的是,我们可以对来自于两个分布的变量施加同样的非线性变换。如果对于所有的非线性变换下两个分布的数学期望均相同(即:两个分布的期望的最大差别为0),在统计学意义上就可以保证两个分布是相同的。不幸的是,这种方法需要我们遍历所有的非线性变换,从实践的角度似乎任由一定难度。
一开始,在机器学习领域,大家倾向于用线性kernel或GaussianRBF kernel
来进行非线性变换,后来开始采用multi-kernel。从去年开始,大家开始用
CNN 来近似所有的非线性变换,在MMD
框架下进行图像生成。首先,固定生成器并最大化 MMD,然后固定判别器里MMD
的 f,然后通过最小化
MMD 来更新生成器。
最常用的一种方法,就是拿MMD
来代替判别器,去学习一个 CNN,这是ICML2015
的一篇文章中尝试的方法。
但实际上,如果直接拿MMD
去替换生成器,虽然有一定效果,但不是特别成功。所以,从 NIPS 2016
开始,就出现了一个 Improved GAN,这个工作虽然没有引用
MMD 的论文,但实际上在更新判别器的同时也最小化了MMD。
后来的WassersteinGAN 就明确解释了与MMD
之间的联系,虽然论文里写的是一个「减」的关系,但我们看它的代码,它也是要加上一个范数的,因为只是让两个分布的期望最大化或最小化都不能保证分布的差异化程度最小。
ICLR2017 的一篇论文也明确指出要用MMD
来作为 GAN网络的停止条件和学习效果的评价手段。
如何设计一个生成器:
1、DCCGAN:图像生成
早期的时候,GAN
的一个最大的进步就是DCGAN,用于图像生成时,比较合适的选择就是用全卷积网络+BN。
2、分阶段方式:图像生成
对于复杂的图像生成,可以使用分阶段的方式。比如,第一步可以生成小图,然后由小图生成大图。沿着这个方向,香港中文大学王晓刚老师和康奈尔大学JohnHopcroft
都做了一些工作。
3、ResNet:图像增强
对于图像增强(imageenhancement)相关的一些任务,包括超分辨率和人脸属性转换(Face Attribute
Transfer),目前在有监督时表现最好网络是 ResNet,所以我们在这些任务中实用GAN时一般也会采用ResNet结构.
4、U-Net结构:图像转换
对于图像转换(imagetranslation),基本上用的是U-Net结构。基于引导图像的人脸填充(guided
face completion)时也采用了 U-Net
结构。
5、CNN+RNN :图像文本描述的自动生成
对于图像文本描述的自动生成,显然应该采用
CNN+RNN 这样的网络结构。总而言之,一个比较好的建议就是根据任务的特点和前任的经验来设计生成器网络
如何连接输入与输出:
1、InfoGAN
比较早的一个工作就是InfoGAN,其特点就是输入包括两个部分:C(隐变量)和Z(噪声)。InfoGAN生成图像之后,不仅要求生成图像和真实图像难以区分,还要求能够从生成图像中预测出C,这样就为输入和输出建立起了一个联系。
2、Perceptualloss
另外针对一些任务,比如超分辨,可以用Perceptualloss
的方式来建立输入和输出的联系。
3、Adaptiveperceptual loss
在做人脸属性转换时发现,现有的Perceptualloss
往往是定义在一个现有的网络基础上的,我们就想能不能把Perceptualloss
网络和判别器结合起来,所以就提出了一个Adaptiveperceptual loss。结果表明Adaptive perceptual loss能够具有更好的自适应性,能够更好地建立输入和输出的联系和显著改善生成图片的视觉效果。
4、Conditional GAN:输入和输出都是已知
当输入和输出都是已知时(比如图像超分辨和图像转换),要用什么方式来连接输入和输出呢?以前是用Perceptualloss
来连,现在更好的方式是用
Conditional GAN。假设有一个
Positive Pair(输入和groundtruth图像)和
NegativePair(输入和生成图像),那么判别器就不是在两幅图像之间做判别,而是在两个「Pair」之间做判别。这样的话,输入就很自然地引入到了判别器中。
5、Cycle-Consistent:额外的Guidance如:unpair
在此基础上,我们还考虑了当有一些额外的Guidance时,如何来更好地建立输入和输出的联系。
上面提到,在有监督的情况下ConditionalGAN
是一个比较好的选择。但如果在unpair的情况下做图像转换,要如何建立输入和输出的联系?谭平老师他们组和Efros组今年就做了这方面的工作,其实去年投CVPR2017的一篇论文也做了类似的工作。由于是unpair的,原则上训练阶段输入和输出不能直接建立联系。这时他们采用的是一种Cycle-Consistent的方式。从X
可以预测和生成 Y,再从Y 重新生成 X',那么由 Y生成的 X' 就能跟输入的X 建立联系。这样的话,我们实际上相当于隐式地建立了从 X 到Y 的联系