跳转至

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

G^*=argmin_GDiv(P_G,P_{data})

1. 直观看怎么求divergence

要是能计算divergence的话,接下来用梯度下降就可以求解。 但是在P_GP_{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:

V=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_G}[log(1-D(x))]
Training: D^*=argmax_DV(D,G)

这个式子其实和train一个binary classifier是一样的,把P_{data}当作一类,P_G当作一类,所做的就是分类。

而在解完这个Objective Function后,会得到最大的V值,而这个值和divergence有很密切的关系。

直观来看可以这样想,如果两种分布的sample相隔很近,那么很难分开这两类,从而V值拉不高,即这两种分布很接近,divergence很小。

而如果两类sample距离很远,那么可以很容易分开,从而V值很容易变得很大,即两种分布相差较大。


2. 证明divergence为什么和Objective Function有关

首先,Given G,找一个D^*来最大化V

V=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_G}[log(1-D(x))]
=\int_xP_{data}(x)logD(x)dx+\int_xlog(1-D(x))dx
=\int_x[P_{data}(x)logD(x)+P_G(x)log(1-D(x))]dx

做一个很强的假设:D(x)可以是任何function,实际中其实不成立

那么对于一个x,D(x)可以是任何的值,也就是不同x之间没有关联,那么积分就可以分来来算,即对于任意x取值,找D来将下式最大化

P_{data}(x)logD(x)+P_G(x)log(1-D(x))

因为P_{data}(x)P_G(x)不变,即最大化

f(D)=alog(D)+blog(1-D)
\frac{df(D)}{dD}=a\times \frac{1}{D}-b\times \frac{1}{1-D}=0
D^*=\frac{a}{a+b}
D^*(x)=\frac{P_{data}(x)}{P_{data}(x)+P_G(x)}

代入V式子,发现D^*下的V其实就是两个P的JS散度

V(G,D^*)=2JS(P_G||P_{data})-2log2

即,我们在train一个discriminator时,就是在衡量两种P的JS散度

G^*=argmin_GDiv(P_G,P_{data})

那么,上式就可以替换为

G^*=argmin_Gmax_DV(G, D)

如上图,对这三种G,对应V(G, D)如图,那么先选D_*,再选G^*G_3结果最小,应该被选

GAN的训练过程也就是在解这个minmax问题,也就是最小化P_GP_{data}之间的divergence


3. 为什么GAN的训练过程是在解上面的minmax问题(求JS散度)呢

G^*=argmin_GL(G)

用梯度下降来解(\theta_G定义了G)

\theta_G \gets \theta_G-\eta \frac{\partial L(G)}{\partial \theta_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_0G_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)都比较小,会对训练造成问题,所以从

V=E_{x \sim P_G}[log(1-D(x))] \to MMGAN

改为

V=E_{x \sim P_G}[-log(D(x))] \to NSGAN

两种函数都是单调递减,但后一种在D(x)较小时斜率更大,更容易训练

Q: 在train完之后,discriminator会是什么样子?是一条直线,还是只对有数据分布的地方值比较低,其余地方值比较高?

A: 实验中可能更介于两者之间,可能更接近数据分布的地方比较低,也就是可以用来作为分类器等,有些训练拿过去的generator的sample来训练discriminator,也有效果