那么我们从Generation来看是怎么个生成法。假如我们要生成一张图片,那么用x来代表一张图片 an image (a highdimensional vector)。我们要产生的图片,它有一个固定的一个分布,记为:Pdata(x),那么在整个图像空间中(图像本来是高维的,这里为了可视化,用二维的来表示),只有一小部分区域中采样出来的点才能产生人脸,其他的不行
因此,如上图所示,在蓝色区域以内的点产生人脸的机率较高,蓝色区域以外产生人脸的机率较低。
我们希望机器能够找出Pdata(x)(这个分布长什么样子我们不知道)
• We want to find data distribution Pdata(x)
当我们收集了很多样本的时候,我们知道这些样本的位置产生人脸的机率较高,但是产生人脸的分布我们是不知道什么样子。
从样本推算分布,在没有GAN这个算法之前,我们用的是MLE。先简单复习一下MLE。
MLE
Given a data distribution Pdata(x) (We can sample from it.我们能从里面采样,但是不知道它是啥样子)
• We have a distribution PG(x;θ) parameterized by θ
• We want to find θ such that PG(x;θ) close to Pdata(x)
• E.g. PG(x;θ) is a Gaussian Mixture Model, θ are means and variances of the Gaussians
Sample {x1,x2,⋯,xm} from Pdata(x)
We can compute PG(xi;θ) Likelihood of generating the samples L=i=1∏mPG(xi;θ)
Find θ∗ maximizing the likelihood
意思就是下面这些数据是从Pdata(x)这个分布sample出来的,如果用PG(x;θ)来产生下面这些数据,那么它产生这些数据的Likelihood越大越好(计算公式如上),这个事情可以通过调整参数θ来实现。
用x来代表一张图片 an image (a highdimensional vector)。
• A generator G is a network. The network defines a probability distribution PG
NN就是一个输入一个输出(现在是做图片生成,所以输出就是一个图片),类似下图
写成一个优化的公式为: G∗=argGminDiv(PG,Pdata) Div(PG,Pdata)就是Divergence between distributions PG and Pdata
挖坑:How to compute the divergence? PG 和Pdata的公式我们不知道,如果知道我们就可以代入DL的公式,然后用GD来解。
问题就变成我们怎么从sample的数据求PG 和Pdata
其实我们可以使用Discriminator来衡量PG 和Pdata的Divergence
蓝色星星: data sampled from Pdata
橙色星星: data sampled from PG
我们可以用Discriminator来区分两个Distribution,公式:
前面一项是表示数据sampled from Pdata,值越大越好,后面一项是表示数据sampled from PG ,值越小越好
上面公式的形式和训练一个二分类Classifier的目标函数长得一样,就是说可以把Pdata和PG 看成两个分类。
训练Discriminator就好比训练一个二分类:
The maximum objective value is related to JS divergence.来看下为什么是JS divergence。
如果两个分布的数据很接近(small divergence),那么Discriminator很难把数据分开,也就是上面的公式很难找到一个D,使得D∗取得很大的值
反之:
也就是D∗和divergence程度有关系,下面用数学来证明。
D∗和divergence的关系证明
先把Objective函数写出来: V=Ex∼Pdata[logD(x)]+Ex∼PG[log(1−D(x))]
• Given G(固定 G), what is the optimal D∗ maximizing V=Ex∼Pdata[logD(x)]+Ex∼PG[log(1−D(x))]=∫xPdata(x)logD(x)dx+∫xPG(x)log(1−D(x))dx=∫x[Pdata(x)logD(x)+PG(x)log(1−D(x))]dx
Assume that D(x) can be any function
• Given x, the optimal D∗ maximizing(上面的最大化问题就变成下面的公式) Pdata(x)logD(x)+PG(x)log(1−D(x))
这里Pdata,PG(x)是固定的,要找一个D(x)最大化上面的式子,我们可以设: a=Pdata(x),b=PG(x),D=D(x)(1)
最大化函数就变成: f(D)=alog(D)+blog(1−D)
求极值就是要先求导,并让导数等于0: dDdf(D)=a×D1+b×1−D1×(−1)=1 a×D∗1=b×1−D∗1a×(1−D∗)=b×D∗a−aD∗=bD∗a=(a+bD∗)D∗=a+ba
把假设1带回来 D∗(x)=Pdata(x)+PG(x)Pdata(x)
然后我们把D∗带回二分类的目标函数: DmaxV(G,D)=V(G,D∗)=Ex∼Pdata[logD(x)]+Ex∼PG[log(1−D(x))]=Ex∼Pdata[logPdata(x)+PG(x)Pdata(x)]+Ex∼PG[logPdata(x)+PG(x)PG(x)]∫xPdatalogPdata(x)+PG(x)Pdata(x)dx+∫xPG(x)logPdata(x)+PG(x)PG(x)dx=∫xPdatalog2Pdata(x)+PG(x)21Pdata(x)dx+∫xPG(x)log2Pdata(x)+PG(x)21PG(x)dx=log21+log21+∫xPdatalog2Pdata(x)+PG(x)Pdata(x)dx+∫xPG(x)log2Pdata(x)+PG(x)PG(x)=2log21+∫xPdatalog2Pdata(x)+PG(x)Pdata(x)dx+∫xPG(x)log2Pdata(x)+PG(x)PG(x)=−2log2+∫xPdatalog2Pdata(x)+PG(x)Pdata(x)dx+∫xPG(x)log2Pdata(x)+PG(x)PG(x)=−2log2+KL(Pdata∣∣2Pdata(x)+PG(x))+KL(PG∣∣2Pdata(x)+PG(x))=−2log2+2JSD(Pdata∣∣PG)
JSD: Jensen-Shannon divergence
交叉熵和相对熵的关系:
以上都是基于离散分布的概率,如果是连续的数据,则需要对数据进行Probability Density Estimate来确定数据的概率分布,就不是求和而是通过求积分的形式进行计算了。
现在,原来的挖的坑: G∗=argGminDiv(PG,Pdata) Div(PG,Pdata)就是Divergence between distributions PG and Pdata
可以变化为: G∗=argGminDmaxV(G,D)
这个式子很复杂,就是找一个G,最小化DmaxV(G,D),找一个D,最大化V(G,D)
前面的数学推导已经找到了最好的D∗(The maximum value is related to JS divergence.),现在找一个最好的G∗
假设我们现在只有三个G,分别是G1,G2,G3
横座标不一样,代表选择了不同的Discriminator,当我们固定不同的G的时候,最大化的V(G,D)如下图中的红点所示。
从三个不同的G1,G2,G3来看,从三个最大化的V(G,D)中取最小值,故这里G∗=G3。
换个角度看,就是PG3和Pdata的Divergence最小。
黑框中的内容就是在解G∗=argGminDmaxV(G,D)
GD Algorithm for GAN
用函数L(G)替代G∗中的DmaxV(G,D): G∗=argGminL(G)
To find the best G minimizing the loss function L(G) θG←θG−η∂θG∂L(G),θGdefinesG
• Given G0
• Find D0∗ maximizing V(G0,D) (这里用梯度下降) V(G0,D0∗) is the JS divergence between Pdata(x) and PG0(x) θG←θG−η∂θG∂V(G,D0∗),ObtainG1
这里的梯度下降就是减少JS divergence(坑)
• Find D1∗ maximizing V(G1,D) (这里用梯度下降),这里好比上面横线中的讲解是一样的,当G从G0变到G1的时候,对应的L(G)=DmaxV(G,D)可能改变了,所以要重新求D1 V(G1,D1∗) is the JS divergence between Pdata(x) and PG1(x)
假设在G0的时候,V(G0,D)的曲线如上图左边所示,然后,D0∗使得V(G0,D)最大,这个时候的JSD是V(G0,D0∗) between Pdata(x) and PG0(x),然后我们用梯度下降更新G0,将其变成G1,这个时候由于G的值变化后,V(G1,D)的曲线发生了变化(参考上面f(x)=max{f1(x),f2(x),f3(x)}的例子),这个新曲线V(G1,D)如上图的右边所示,这个时候的最大值就不在D0∗了,离它很远,这个时候的JSD变成了V(G1,D1∗),可以看到后面的JSD明显要变大了,这样是不对的,因此我们做了假设,假设 D0∗≈D1∗
这个时候从V(G0,D)到V(G1,D)的曲线变化不会很大。也就是G这个参数只变化了一点点。
我们同样可以用D0∗来衡量变化后JSD between Pdata(x) and PG1(x)
也就是说GAN的训练技巧:
Generator不要一次update太多,也不需要太多的iteration;
而Discriminator可以训练到收敛。因为要找到最大值才能衡量出JSD。
实作
理论上V是要取期望值,但是实际上是不可能的。只能用样本的均值进行估计:
Given G, how to compute DmaxV(G,D)
• Sample {x1,x2,⋯,xm} from Pdata(x), Sample {x~1,x~2,⋯,x~m} from generator PG(x) Maximize V~=m1i=1∑mlogD(xi)+m1i=1∑mlog(1−D(x~i))(2)
上面这个事情实际上就是在训练一个Binary Classifier,记为D,D后面接一个sigmoid函数,使得输出值在[0,1]之间
我们把{x1,x2,⋯,xm} from Pdata(x)看做Positive examples;
我们把{x~1,x~2,⋯,x~m} from generator PG(x)看做Negative examples
目标是最小化上面两组数据的Cross-entropy,计算这个交叉熵的公式推导出来就是公式2
Algorithm for GAN(Review)
Initialize θd for D and θg for G.
• In each training iteration:
这块分割线内是训练Discriminator,重复k次,这里一定要训练到收敛为止,目的是找到DmaxV(G,D)(实作的时候一般没有办法真的训练到收敛或者卡在局部最小点,因此这里找到的是DmaxV(G,D)的lower bound)。
••Sample m examples {x1,x2,⋯,xm} from data distribution Pdata(x).(找到真实对象)
••Sample m noise examples {z1,z2,⋯,zm} from the prior Pprior(z).(这个先验分布种类不是很重要)
•••Obtaining generated data {x~1,x~2,⋯,x~m},x~i=G(zi).(找到生成对象)
•• Update discriminator parameters θd to maximize V~=m1i=1∑mlogD(xi)+m1i=1∑mlog(1−D(x~i))θd←θd+η▽V~(θd)
这块分割线内是训练Generator,重复1次,目的是减少JSD
••Sample another m noise samples {z1,z2,⋯,zm} from the prior Pprior(z)
••Update generator parameters θg to minimize V~=m1i=1∑mlogD(xi)+m1i=1∑mlog(1−D(G(zi)))θg←θg−η▽V~(θg)
由于m1∑i=1mlogD(xi)和G函数无关,所以在求最小值的时候可以忽略: V~=m1i=1∑mlog(1−D(G(zi)))θg←θg−η▽V~(θg)
Objective Function for Generator in Real Implementation
红色曲线对应log(1−D(x)):江湖人称Minimax GAN (MMGAN)
蓝色曲线对应−log(D(x)):江湖人称Non-saturating GAN (NSGAN)
我们可以看到,红色曲线由于刚开始的Generator 没有训练过,它的生成对象都很假,很容易被识破,因此刚开始log(1−D(x))的值很小。
不好训练,换成蓝色曲线后,两个曲线都是下降趋势,没有变,但是蓝色曲线刚开始的值很大,适合做梯度下降。
其实后来实验证明两种结果都差不多。
老师给出了他的猜想,蓝色曲线其实就是把label x from PG as positive.就是把生成对象和真实对象的标签换一下。估计是作者懒得改code,用的同一套code训练两组data。。。
理论部分到此结束。下面看一些比较直觉的东西。
Intuition
Generator和Discriminator的关系:Discriminator leads the generator.
红线:Discriminator
绿线:Data(target)distribution
蓝线:Generated distribution