Basic Theory
假设下图中的蓝色区域是人脸的分布(用一个点代表一张人脸图片),区域内的是high probability的,区域外的是Low probability。GAN的generator做的事情就是找出这个distribution。
在没有GAN之前,如何找出这个distribution的呢?使用的是Maximum Likelihood Estimation(最大似然估计)
等价于最小化KL Divergence
如何定义general Pg? 之前用高斯分布,但是,生成的效果很糊。
现在在GAN中,G是一个网络,这样,就可以将输入(normal distribution/)生成出更为复杂的distribution,使得生成的distribution与目标的distribution越近越好。衡量两个distribution的方法,是计算相应的divergence。
但是,Pg和Pdata的distribution到时是什么样的,我们并不知道,所以,也就无法直接计算。但是,在GAN中是可以的,怎么做的呢?后面会介绍。
直观地感受一下GAN是如何度量两个distribution之间的divergence的。
下面的slide说的是:虽然我们没法知道Pg和Pdata的真实distribution,但是,我们可以抽样啊,然后,利用抽样的数据来评估。
如何评估呢?—— GAN中的discriminator就是可以用作评估的。
与训练一个Binary Classifier是一样的,Loss使用的也是cross entropy。
max V(D,G) 就是一种divergence(JS divergence)
直观的理解:小的divergence,会使得discriminator难以区分,也就是max V(D,G);反之,大的divergence,会使得discriminator方便地区分。
下面是公式推导:(推导maxV(G,D)与JS Divergenc的关系)
对于给定的G,找到一个D*,可以最大化V。
推导以后,变成积分的公式。为了使得V达到最大化,那么,对于给定的任意x,让被积函数最大化,就可以了。
Pdata和Pg都是固定的,通过求微分是0的地方,就是最大值了。(MD: 为什么不是最小值呢?)
将上面的最优D带入到原来的公式中。。。
下图右上角是JS Divergence的定义。
综合上面的推导和介绍,maxV(G,D)代表的就是JSDivergence,G就是要最小化这种JSD,所以,下图中,最右边的G是三者中最好的。
GAN的算法就是在解下面的maxV(G,D)
下面用L(G)代替maxV(G,D),通过梯度下降,就可以找出最小的G。
考虑到L(G)中有max,该怎么求梯度呢?也可以做,分段求解。
下图的横坐标是G,纵坐标是L(G)。每做一步梯度下降,要重新确认一下,当前的G对应的是哪个L(G)。这个过程在下面的介绍中,就是交替地固定G和D,分别计算梯度和寻找最优解。这个过程,也就和GAN的训练过程是一致的了。
上面的slide中,对Decrease JS divergence加了个❓,为什么?
下面给出一种解释,下图中,最下面的两幅曲线图,左边的JSDivergence要大于右边的。但是,G1的distrubution已经相较于G0发生了较大的变化。这就导致产生了另外一个max point.
所以,在训练G的时候,不要对G做太多次更新。D是可以做多次迭代,跑到底的。
理论上,我们希望可以获得Pdata和Pg对应的期望值,但是,在真实的训练过程中,都是用真实的sample来计算均值来代替。
另外,maxV(G,D)的过程,其实,等同于训练一个binary classifier。能够训练出一个binary classifier,也就达到最大化V(G,D)的目的了。分类问题,用的Loss是cross-entropy。
D的作用是量出JS Divergence,G的作用是要minimize JS Divergence.
下面再重复一下GAN的过程:
在Ian Goodfellow的实现版本中,G的实现,并没有采用上面的log(1-D(x))式子,而是采用了下面的-log(D(x))。
潜在的两点理由:
- 初始斜率更大,训练可能会更快一些;
- 代码实现上可以重复利用。
直观的感受,如下图,D的作用是将G的分布赶来赶去,尽可能与Data分布一致,让D无法区分。