GAN-02
GAN Lecture 2¶
对于图片,可以看作是一个distribution,以二次元头像为例,在distribution区域内的图片大概率是人脸,而在区域外则可能是noise,那么我们希望来找出这个已有的distribution
在GAN之前,通常用maximum likelihood estimation来做,也就是求解KL散度。但对于更复杂的Generator,无法计算P_G(x,\theta)
需要更generalized的方法。 初始的z来自normal distribution (或其它分布),经过一个generator后变为更复杂的分布 P_G(x),我们希望P_G(x)能越来越接近P_{data}(x),即求一种G来最小化某种divergence
1. 直观看怎么求divergence¶
要是能计算divergence的话,接下来用梯度下降就可以求解。 但是在P_G和P_{data}的公式都不知道的情况下,怎么计算这种divergence呢? GAN可以帮助做到这点。
从distribution中取样
直观来看,我们不知道公式,但可以从两个distribution里面sample examples,对于P_G,可以先从某种distributin中sample一些vector出来,每一个vector再产生一张image。
根据样本计算divergence
那么根据这些sample如何知道divergenceGAN神奇的地方就是通过discriminator可以衡量两者之间的divergence。
具体来说,在D训练的过程中,会固定G,然后设法增大Objective Function for D:
这个式子其实和train一个binary classifier是一样的,把P_{data}当作一类,P_G当作一类,所做的就是分类。
而在解完这个Objective Function后,会得到最大的V值,而这个值和divergence有很密切的关系。
直观来看可以这样想,如果两种分布的sample相隔很近,那么很难分开这两类,从而V值拉不高,即这两种分布很接近,divergence很小。
而如果两类sample距离很远,那么可以很容易分开,从而V值很容易变得很大,即两种分布相差较大。
2. 证明divergence为什么和Objective Function有关¶
首先,Given G,找一个D^*来最大化V
做一个很强的假设:D(x)可以是任何function,实际中其实不成立
那么对于一个x,D(x)可以是任何的值,也就是不同x之间没有关联,那么积分就可以分来来算,即对于任意x取值,找D来将下式最大化
因为P_{data}(x)、P_G(x)不变,即最大化
代入V式子,发现D^*下的V其实就是两个P的JS散度
即,我们在train一个discriminator时,就是在衡量两种P的JS散度
那么,上式就可以替换为
如上图,对这三种G,对应V(G, D)如图,那么先选D_*,再选G^*,G_3结果最小,应该被选
GAN的训练过程也就是在解这个minmax问题,也就是最小化P_G和P_{data}之间的divergence
3. 为什么GAN的训练过程是在解上面的minmax问题(求JS散度)呢¶
用梯度下降来解(\theta_G定义了G)
但是L(G)=max_DV(G,D),式子中包含max操作,但其实max不影响微分,操作如下:
假设f(x)=max{f_1(x),f_2(x),f_3(x)}
对对应的函数段作微分即可
对应到GAN训练过程:
- Given G_0
- Find D_0^* maximizing V(G_0, D)
- update \theta_G minimizing L(G) \to G_1
- ...
这个过程和求解minmax问题是一样的,但有个问题,刚开始对于V(G_0,D),找到最大的V(G_0,D_0),接下来找到的G_1使V(G_1,D_0)最小化,但不一定使V(G_1,D_1)变小
在对一个G求解出D^*后,得到的V就是JS散度,但再次更新generator后,所得就不是JS散度:V(G_1,D_0)不是,V(G_1,D_1)才是
上述算法可进行的前提是,G_0和G_1比较接近,这样可以用D_0来模拟D_1,所以在train generator的时候,不能update过多,但在train discriminator的时候,应该train到底,即找到这个generator的JS散度
4. 实际操作¶
Given G, how to compute max_DV(G,D)
实际上是从P_{data}和P_G中sample m个样本,然后maximize这些样本的V,其实就是train一个binary classifier
D is a binary classifier with sigmoid output
Algorithm¶
Initialize \theta_d for D and \theta_g for G
In each training iteration:
Learning D,这里其实无法真的求解max,最后得到一个lower bound
- sample m examples \{x^1, x^2,...,x^m\} from data distribution P_{data}(x)
- sample m noise examples \{z^1, z^2,...,z^m\} from the prior P_{prior}(Z)
- Obtaining generated data \{\widetilde x^1, \widetilde x^2,...,\widetilde x^m\}, \widetilde x^i=G(z^i)
- update discriminator parameters \theta_d to maximize
- \widetilde V=\frac{1}{m}logD(x^i)+\frac{1}{m}\sum_{i=1}^mlog(1-D(\widetilde x^i))
- \theta_d \gets \theta_d+\eta \nabla \widetilde V(\theta_d)
Repeat k times
Learning G
- Sample another m noise samples \{z^1, z^2,...,z^m\}
- Updaete generator parameters \theta_g to minimize
- \widetilde V=\frac{1}{m}\sum_{i=1}^mlogD(x^i)+\frac{1}{m}\sum_{i=1}^mlog(1-D(G(z^i))) 这里第一项其实和G无关,可以省去
- \theta_g \gets \theta_g - \eta \nabla \widetilde V(\theta_g)
这里不能update太多次
因为一开始D可以轻松两种P,所以D(x)都比较小,会对训练造成问题,所以从
改为
两种函数都是单调递减,但后一种在D(x)较小时斜率更大,更容易训练
Q: 在train完之后,discriminator会是什么样子?是一条直线,还是只对有数据分布的地方值比较低,其余地方值比较高?
A: 实验中可能更介于两者之间,可能更接近数据分布的地方比较低,也就是可以用来作为分类器等,有些训练拿过去的generator的sample来训练discriminator,也有效果