完整笔记:http://www.gwylab.com/note-gans.html
——————————————————————-
第二章 GANs的理论与提升
本章会介绍一些与提升和改进GANs相关的paper,这涉及到一些与GANs理论相关的知识,在第一部分会用较简短的话语介绍一些GANs的相关核心理论,第二部分是GANs存在的一些缺陷和改进手段,第三部分会介绍一个很有趣的paper――fGAN,它能帮助我们更深的理解GANs的算法思想,第四部分开始就是更多的paper,它们会用到一些很有意思的tricks去提升和改进GANs。
1. GANs相关理论
GANs本质上在做的事情是什么?
我们假设把每一个图片看作二维空间中的一个点,并且现有图片会满足于某个数据分布,我们记作Pdata(x)。以人脸举例,在很大的一个图像分布空间中,实际上只有很小一部分的区域是人脸图像。如上图所示,只有在蓝色区域采样出的点才会看起来像人脸,而在蓝色区域以外的区域采样出的点就不是人脸。今天我们需要做的,就是让机器去找到人脸的分布函数。具体来说,就是我们会有很多人脸图片数据,我们观测这些数据的分布,大致能猜测到哪些区域出现人脸图片数据的概率比较高,但是如果让我们找出一个具体的定义式,去给明这些人脸图片数据的分布规律,我们是没有办法做到的。但是如今,我们有了机器学习,希望机器能够学习到这样一个分布规律,并能够给出一个极致贴合的表达式。
在GANs出现之前,人们采用的方法是Maximum Likelihood Estimation。
简单来说,就是我们有一个生成器和一组参数 θ,我们还有从真实分布Pdata(x)中sample出的数据{},我们不知道数据的真实分布具体长什么样,但是我们希望不断地调整和θ,让越接近越好。具体的做法是,对于每一组参数θ和真实分布的抽样,我们能够计算出参数θ下的生成器生成该真实抽样的likelihood,于是我们希望找到一个最佳的参数组,使得生成器的结果最接近,也就是对于每个真实抽样的likelihood都最大,这等价于所有真实抽样的likelihood的乘积最大,那原始问题就转换为如下这个最大似然问题:
下面我们需要求解这个maximizing the likelihood问题,我们先证明,它其实等价于求minimize KL divergence(KL divergence是一个衡量两个分布之间的差异的计算式)问题。
首先我们加上一个对数log,将累乘转化为累加问题。然后再将累加转化为期望问题
然后这个期望也就是积分问题:
因为是arg max,后面可以再补上一项:
补完之后的式子便刚好等价于与的KL Divergence的最小化求解。
现在这个KL Divergance的最小化问题如何求解呢?我们不介绍传统的数学方法求解了,我们下面考虑引用neural network。
我们把这个neural network称作generator。通过上述的分析我们知道,我们需要训练出这样的generator,对于一个已知分布的数据z,它可以把数据z转化成一个未知分布的数据x,这个未知分布可以与z所在的分布完全不一样,我们把它称作,并且我们希望与之间的Divergence越小越好。如果能找到这样的,那也就意味着我们找到了真实数据分布的近似解,也就意味着我们能够生成各种各样符合真实分布规律的数据。
现在一个最关键的问题是,这个Divergence要如何计算出来呢?理论上来说我们不知道是什么,我们也不知道是什么,因此Divergence是我们无法计算的。但是,人无法计算的东西,交给神经网络或许就知道如何计算了。于是,我们新建了一个neural network,专门来量与之间的Divergence,这个neural network,就叫做Discriminator。
如上图所示,蓝色星星是从中sample出的数据,黄色星星是从中sample出的数据,现在交给Discriminator去判别读入数据是来自还是,实际上就是在衡量与之间的Divergence,因为如果二者之间的Divergence越大,Discriminator就会给的数据更低的分数,给的数据更高的分数;而如果二者之间的Divergence越小,Discriminator就会给二者的分数越接近;当与完全一致时,也就是Divergence=0时,
Discriminator给二者的分数就都是0.5了。
当然,上述只是我们直观上觉得说,Discriminator是与Divergence有关的,下面我们需要用数学方法证明:Discriminator真的可以衡量Divergence的值。我们先来看一下Discriminator的目标式:
这个式子很好理解,如果来源x~,D(x)尽可能高;如果来源x~,D(x)尽可能低。下面我们求解一下这个目标式。
首先将目标式转化为一个积分:
我们假设D(x)可以是任意函数。那么现在这个表达式,对于所有的x,计算出一个表达式,使得所有表达式的积分求和最大,这等价于,如果对于每一个表达式,我们能找到一个D的取值,使得这个表达式的最大,那么最终所有表达式的积分求和也最大,即:
这个方程的求解非常容易,最后的结果是;
现在把代入到目标表达式中得到:
进一步变形(分子分母同除以2),转化为:
这个表达式等价为:
至此,我们证明了,最大化V(G,D)问题的求解实际上就是在求解与之间JS Divergence的值(与前面提到的KL Divergence可以认为是等效的)。
于是,我们可以再回到Generator要解决的问题上:
Generator的目的,是让产生数据与真实数据之间的Divergence最小,本来Divergence是没有办法计算的,但是现在有了Discriminator之后,Divergence变得可以计算了,于是Generator的新的目标表达式变为:
接下来我们需要求解这个表达式。值得注意的是,在实际的网络训练中,discriminator与generator是交替训练的,并且是先训练discriminator再训练generator,因此,当generator需要求解上述表达式的时候,discriminator是已经训练好的,于是这个式子就可以写成L(G),目标表达式就转化成:
这是一个最初级的目标表达式,用基本的gradient descent就能求解:
综上,我们求解出了Disciminator,然后我们也求解出了Generator,下面我们先用一个完整的算法来回顾一下这整套流程,然后我们会反思目前的这套架构是否已经是完美的。
第一个部分是训练discriminator,先从真实数据分布中抽样,然后从先验分布中抽样z,并通过generator产生仿造数据,接着把和丢入discriminator中训练,使得目标函数最大;第二个部分是训练generator,从先验分布中抽样新的z,接着把丢入generator中训练,使得目标函数最小。这样循环交替,最终generator产生的数据就会越来越接近真实数据。