李宏毅学习笔记34.GAN.04.Theory behind GAN

简介

本节将从GAN的提出者Ian Goodfellow在2014年的论文原文角度进行讲解。
公式输入请参考:在线Latex公式
我们根据之前学过的内容大概可以知道GAN是根据一堆样本进行生成工作。
在这里插入图片描述
那么我们从Generation来看是怎么个生成法。假如我们要生成一张图片,那么用xx来代表一张图片 an image (a highdimensional vector)。我们要产生的图片,它有一个固定的一个分布,记为:Pdata(x)P_{data}(x),那么在整个图像空间中(图像本来是高维的,这里为了可视化,用二维的来表示),只有一小部分区域中采样出来的点才能产生人脸,其他的不行
在这里插入图片描述
因此,如上图所示,在蓝色区域以内的点产生人脸的机率较高,蓝色区域以外产生人脸的机率较低。
我们希望机器能够找出Pdata(x)P_{data}(x)(这个分布长什么样子我们不知道)
• We want to find data distribution Pdata(x)P_{data}(x)
当我们收集了很多样本的时候,我们知道这些样本的位置产生人脸的机率较高,但是产生人脸的分布我们是不知道什么样子。
从样本推算分布,在没有GAN这个算法之前,我们用的是MLE。先简单复习一下MLE。

MLE

Given a data distribution Pdata(x)P_{data}(x) (We can sample from it.我们能从里面采样,但是不知道它是啥样子)
• We have a distribution PG(x;θ)P_{G}(x;\theta) parameterized by θ\theta
• We want to find θ\theta such that PG(x;θ)P_{G}(x;\theta) close to Pdata(x)P_{data}(x)
• E.g. PG(x;θ)P_{G}(x;\theta) is a Gaussian Mixture Model, θ\theta are means and variances of the Gaussians
Sample {x1,x2,,xm}\{x^1,x^2,\cdots,x^m\} from Pdata(x)P_{data}(x)
We can compute PG(xi;θ)P_{G}(x^i;\theta) Likelihood of generating the samples
L=i=1mPG(xi;θ)L=\prod_{i=1}^mP_{G}(x^i;\theta)
Find θ\theta^* maximizing the likelihood
意思就是下面这些数据是从Pdata(x)P_{data}(x)这个分布sample出来的,如果用PG(x;θ)P_{G}(x;\theta)来产生下面这些数据,那么它产生这些数据的Likelihood越大越好(计算公式如上),这个事情可以通过调整参数θ\theta来实现。
在这里插入图片描述
上面的数据可能是混合高斯模型,有三个分布组成,用这个混合高斯模型来产生这些数据likelihood最大。
在这里插入图片描述

MLE=Minimize KL Divergence

从另外一个角度来看MLE:
θ=argmaxθi=1mPG(xi;θ)=argmaxθlogi=1mPG(xi;θ)\theta^*=arg\underset{\theta}{\text{max}}\prod_{i=1}^mP_{G}(x^i;\theta)=arg\underset{\theta}{\text{max}}log\prod_{i=1}^mP_{G}(x^i;\theta)
加log不影响求最大,然后就可以乘法变加法:
=argmaxθi=1mlogPG(xi;θ),{x1,x2,,xm} from Pdata(x)=arg\underset{\theta}{\text{max}}\sum_{i=1}^mlogP_{G}(x^i;\theta),\quad \{x^1,x^2,\cdots,x^m\} \space from\space P_{data}(x)
这个事情就相当于求从Pdata(x)P_{data}(x)采样出xx的期望:
argmaxθExPdata[logPG(x;θ)]\approx arg\underset{\theta}{\text{max}}E_{x\sim P_{data}}[logP_{G}(x;\theta)]
把期望展开就是积分:
=argmaxθxPdata(x)logPG(x;θ)dx=arg\underset{\theta}{\text{max}}\int_xP_{data}(x)logP_{G}(x;\theta)dx
上式后面减去一个和PGP_G无关的项不影响求最大值:
=argmaxθxPdata(x)logPG(x;θ)dxxPdata(x)logPdata(x)dx=arg\underset{\theta}{\text{max}}\int_xP_{data}(x)logP_{G}(x;\theta)dx-\int_xP_{data}(x)logP_{data}(x)dx
xPdata(x)\int_xP_{data}(x)提取出来,那么xlogPG(x;θ)dxxlogPdata(x)dx\int_xlogP_{G}(x;\theta)dx-\int_xlogP_{data}(x)dx就是求PGPdataP_{G}||P_{data}的KL Divergence,这里把两个分布位置换一下,就变成求最小值:
=argminθKL(PdataPG)=arg\underset{\theta}{\text{min}}KL(P_{data}||P_{G})
但是我们的分布PGP_G不一定是高斯分布,因此我们如何把PGP_G进行一般化?如果PGP_G是一个NN,就没有办法算likelihood。因此要用GAN的Generator来解决这个问题。

Generator

xx来代表一张图片 an image (a highdimensional vector)。
• A generator GG is a network. The network defines a probability distribution PGP_G
NN就是一个输入一个输出(现在是做图片生成,所以输出就是一个图片),类似下图
在这里插入图片描述
现在输入zz是来自一个分布(可以用Normal Distribution,也可以用uniform distribution,影响不大,因为后面接的是NN,因此输入很简单的分布,NN也可以输出非常复杂的分布)
在这里插入图片描述
如果zzsample的值不一样,那么输出的值也不一样:
在这里插入图片描述
如果把这些输出集合起来就是一个非常复杂的分布,记为:PG(x)P_G(x)
在这里插入图片描述
我们希望Generator生成的分布PG(x)P_G(x)要和目标分布Pdata(x)P_{data}(x)越接近越好:
在这里插入图片描述
写成一个优化的公式为:
G=argminGDiv(PG,Pdata)G^*=arg\underset{G}{\text{min}}Div(P_G,P_{data})
Div(PG,Pdata)Div(P_G,P_{data})就是Divergence between distributions PGP_G and PdataP_{data}
挖坑:How to compute the divergence?
PGP_GPdataP_{data}的公式我们不知道,如果知道我们就可以代入DL的公式,然后用GD来解。

Discriminator

在讲具体的数学推导,先看GAN解决这个问题的原理。
要求:
G=argminGDiv(PG,Pdata)G^*=arg\underset{G}{\text{min}}Div(P_G,P_{data})
尽管我们不知道PGP_GPdataP_{data},但是我们可以从它们里面sample数据。
在这里插入图片描述
问题就变成我们怎么从sample的数据求PGP_GPdataP_{data}
其实我们可以使用Discriminator来衡量PGP_GPdataP_{data}的Divergence
蓝色星星: data sampled from PdataP_{data}
橙色星星: data sampled from PGP_G
在这里插入图片描述
我们可以用Discriminator来区分两个Distribution,公式:
在这里插入图片描述
前面一项是表示数据sampled from PdataP_{data},值越大越好,后面一项是表示数据sampled from PGP_G ,值越小越好
上面公式的形式和训练一个二分类Classifier的目标函数长得一样,就是说可以把PdataP_{data}PGP_G 看成两个分类。
训练Discriminator就好比训练一个二分类:
在这里插入图片描述
The maximum objective value is related to JS divergence.来看下为什么是JS divergence。
如果两个分布的数据很接近(small divergence),那么Discriminator很难把数据分开,也就是上面的公式很难找到一个D,使得DD^*取得很大的值
在这里插入图片描述
反之:
在这里插入图片描述
也就是DD^*和divergence程度有关系,下面用数学来证明。

DD^*和divergence的关系证明

先把Objective函数写出来:
V=ExPdata[logD(x)]+ExPG[log(1D(x))]V=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_G}[log(1-D(x))]
• Given GG(固定 GG), what is the optimal DD^* maximizing
V=ExPdata[logD(x)]+ExPG[log(1D(x))]=xPdata(x)logD(x)dx+xPG(x)log(1D(x))dx=x[Pdata(x)logD(x)+PG(x)log(1D(x))]dxV=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_G}[log(1-D(x))]\\ =\int_xP_{data}(x)logD(x)dx+\int_xP_G(x)log(1-D(x))dx\\ =\int_x[P_{data}(x)logD(x)+P_G(x)log(1-D(x))]dx
Assume that D(x) can be any function
• Given xx, the optimal DD^* maximizing(上面的最大化问题就变成下面的公式)
Pdata(x)logD(x)+PG(x)log(1D(x))P_{data}(x)logD(x)+P_G(x)log(1-D(x))
这里PdataPG(x)P_{data},P_G(x)是固定的,要找一个D(x)D(x)最大化上面的式子,我们可以设:
a=Pdata(x),b=PG(x),D=D(x)(1)a=P_{data}(x),b=P_G(x),D=D(x)\tag1
最大化函数就变成:
f(D)=alog(D)+blog(1D)f(D)=alog(D)+blog(1-D)
求极值就是要先求导,并让导数等于0:
df(D)dD=a×1D+b×11D×(1)=1\cfrac{df(D)}{dD}=a\times\cfrac{1}{D}+b\times\cfrac{1}{1-D}\times(-1)=1
a×1D=b×11Da×(1D)=b×DaaD=bDa=(a+bD)D=aa+ba\times\cfrac{1}{D^*}=b\times\cfrac{1}{1-D^*}\\ a\times(1-D^*)=b\times D^*\\ a-aD^*=bD^*\\ a=(a+bD^*)\\ D^*=\cfrac{a}{a+b}
把假设1带回来
D(x)=Pdata(x)Pdata(x)+PG(x)D^*(x)=\cfrac{P_{data}(x)}{P_{data}(x)+P_G(x)}
然后我们把DD^*带回二分类的目标函数:
maxDV(G,D)=V(G,D)=ExPdata[logD(x)]+ExPG[log(1D(x))]=ExPdata[logPdata(x)Pdata(x)+PG(x)]+ExPG[logPG(x)Pdata(x)+PG(x)]xPdatalogPdata(x)Pdata(x)+PG(x)dx+xPG(x)logPG(x)Pdata(x)+PG(x)dx=xPdatalog12Pdata(x)Pdata(x)+PG(x)2dx+xPG(x)log12PG(x)Pdata(x)+PG(x)2dx=log12+log12+xPdatalogPdata(x)Pdata(x)+PG(x)2dx+xPG(x)logPG(x)Pdata(x)+PG(x)2=2log12+xPdatalogPdata(x)Pdata(x)+PG(x)2dx+xPG(x)logPG(x)Pdata(x)+PG(x)2=2log2+xPdatalogPdata(x)Pdata(x)+PG(x)2dx+xPG(x)logPG(x)Pdata(x)+PG(x)2=2log2+KL(PdataPdata(x)+PG(x)2)+KL(PGPdata(x)+PG(x)2)=2log2+2JSD(PdataPG)\underset{D}{\text{max}}V(G,D)=V(G,D^*)=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_G}[log(1-D(x))]\\ =E_{x\sim P_{data}}\left[log\cfrac{P_{data}(x)}{P_{data}(x)+P_G(x)}\right ]+E_{x\sim P_G}\left[log\cfrac{P_G(x)}{P_{data}(x)+P_G(x)}\right ]\\ \int_xP_{data}log\cfrac{P_{data}(x)}{P_{data}(x)+P_G(x)}dx+\int_xP_G(x)log\cfrac{P_G(x)}{P_{data}(x)+P_G(x)}dx\\ =\int_xP_{data}log\cfrac{\cfrac{1}{2}P_{data}(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}dx+\int_xP_G(x)log\cfrac{\cfrac{1}{2}P_G(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}dx\\ =log\cfrac{1}{2}+log\cfrac{1}{2}+\int_xP_{data}log\cfrac{P_{data}(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}dx+\int_xP_G(x)log\cfrac{P_G(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}\\ =2log\cfrac{1}{2}+\int_xP_{data}log\cfrac{P_{data}(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}dx+\int_xP_G(x)log\cfrac{P_G(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}\\ =-2log2+\int_xP_{data}log\cfrac{P_{data}(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}dx+\int_xP_G(x)log\cfrac{P_G(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}\\ =-2log2+KL\left(P_{data}||\cfrac{P_{data}(x)+P_G(x)}{2}\right)+KL\left(P_G||\cfrac{P_{data}(x)+P_G(x)}{2}\right)\\ =-2log2+2JSD(P_{data}||P_G)
JSD: Jensen-Shannon divergence


KL散度、JS散度和交叉熵
三者都是用来衡量两个概率分布之间的差异性的指标。不同之处在于它们的数学表达。
对于概率分布P(x)和Q(x)
1)KL散度(Kullback–Leibler divergence)
又称KL距离,相对熵。
当P(x)和Q(x)的相似度越高,KL散度越小。
KL散度主要有两个性质:
(1)不对称性
尽管KL散度从直观上是个度量或距离函数,但它并不是一个真正的度量或者距离,因为它不具有对称性,即D(P||Q)!=D(Q||P)。
(2)非负性
相对熵的值是非负值,即D(P||Q)>0。
2)JS散度(Jensen-Shannon divergence)
JS散度也称JS距离,是KL散度的一种变形。
但是不同于KL主要又两方面:
(1)值域范围
JS散度的值域范围是[0,1],相同则是0,相反为1。相较于KL,对相似度的判别更确切了。
(2)对称性
即 JS(P||Q)=JS(Q||P),从数学表达式中就可以看出。
3)交叉熵(Cross Entropy)
在神经网络中,交叉熵可以作为损失函数,因为它可以衡量P和Q的相似性。

交叉熵和相对熵的关系:
以上都是基于离散分布的概率,如果是连续的数据,则需要对数据进行Probability Density Estimate来确定数据的概率分布,就不是求和而是通过求积分的形式进行计算了。


现在,原来的挖的坑:
G=argminGDiv(PG,Pdata)G^*=arg\underset{G}{\text{min}}Div(P_G,P_{data})
Div(PG,Pdata)Div(P_G,P_{data})就是Divergence between distributions PGP_G and PdataP_{data}
可以变化为:
G=argminGmaxDV(G,D)G^*=arg\underset{G}{\text{min}}\underset{D}{\text{max}}V(G,D)
这个式子很复杂,就是找一个G,最小化maxDV(G,D)\underset{D}{\text{max}}V(G,D),找一个D,最大化V(G,D)V(G,D)
前面的数学推导已经找到了最好的DD^*(The maximum value is related to JS divergence.),现在找一个最好的GG^*
假设我们现在只有三个G,分别是G1,G2,G3G_1,G_2,G_3
横座标不一样,代表选择了不同的Discriminator,当我们固定不同的G的时候,最大化的V(G,D)V(G,D)如下图中的红点所示。
在这里插入图片描述
从三个不同的G1,G2,G3G_1,G_2,G_3来看,从三个最大化的V(G,D)V(G,D)中取最小值,故这里G=G3G^*=G_3
在这里插入图片描述
换个角度看,就是PG3P_{G_3}PdataP_{data}的Divergence最小。
在这里插入图片描述
黑框中的内容就是在解G=argminGmaxDV(G,D)G^*=arg\underset{G}{\text{min}}\underset{D}{\text{max}}V(G,D)

GD Algorithm for GAN

用函数L(G)L(G)替代GG^*中的maxDV(G,D)\underset{D}{\text{max}}V(G,D)
G=argminGL(G)G^*=arg\underset{G}{\text{min}}L(G)
To find the best G minimizing the loss function L(G)L(G)
θGθGηL(G)θG,θG defines G\theta_G\leftarrow\theta_G-\eta\cfrac{\partial{L(G)}}{\partial{\theta_G}},\theta_G\space \text{defines}\space G


上面的梯度下降中对L(G)L(G)求偏导有没有问题?因为L(G)L(G)中是有求最大值的。
回答:可以,参考之前在CNN中Max Pooling操作,也是可以做梯度下降的。例如:
f(x)=max{f1(x),f2(x),f3(x)}f(x)=\text{max}\{f_1(x),f_2(x),f_3(x)\}
f1(x),f2(x),f3(x)f_1(x),f_2(x),f_3(x)的图像如下图:
在这里插入图片描述
现在来求:df(x)dx=?\cfrac{df(x)}{dx}=?
要看x能让f1(x),f2(x),f3(x)f_1(x),f_2(x),f_3(x)中的哪个最大,把最大那个拿出来求导即可,例如,x初始化的时候在1号点的位置,那么这个时候是f1(x)f_1(x)最大,这个时候用df1(x)dx\cfrac{df_1(x)}{dx}来做梯度下降,并进行更新(黄色箭头)来到2号点,这个时候f2(x)f_2(x)最大,这个时候用df2(x)dx\cfrac{df_2(x)}{dx}来做梯度下降,并进行更新(黄色箭头)来到3号点。
在这里插入图片描述
也就是说函数中有max操作,也是可以做梯度下降的。
明白这个之后我们继续来看整个GG^*如何算。


• Given G0G_0
• Find D0D_0^* maximizing V(G0,D)V(G_0,D) (这里用梯度下降)
V(G0,D0)V(G_0,D_0^*) is the JS divergence between Pdata(x)P_{data}(x) and PG0(x)P_{G_0}(x)
θGθGηV(G,D0)θG,Obtain G1\theta_G\leftarrow\theta_G-\eta\cfrac{\partial{V(G,D_0^*)}}{\partial{\theta_G}},\text{Obtain}\space G_1
这里的梯度下降就是减少JS divergence(坑)
• Find D1D_1^* maximizing V(G1,D)V(G_1,D) (这里用梯度下降),这里好比上面横线中的讲解是一样的,当GGG0G_0变到G1G_1的时候,对应的L(G)=maxDV(G,D)L(G)=\underset{D}{\text{max}}V(G,D)可能改变了,所以要重新求D1D_1
V(G1,D1)V(G_1,D_1^*) is the JS divergence between Pdata(x)P_{data}(x) and PG1(x)P_{G_1}(x)
在这里插入图片描述
θGθGηV(G,D1)θG,Obtain G2\theta_G\leftarrow\theta_G-\eta\cfrac{\partial{V(G,D_1^*)}}{\partial{\theta_G}},\text{Obtain}\space G_2
这里的梯度下降就是减少JS divergence(坑)
然后不断循环


把上面标记的坑:这里的梯度下降就是减少JS divergence,这里的减少是有条件的。
在这里插入图片描述
假设在G0G_0的时候,V(G0,D)V(G_0,D)的曲线如上图左边所示,然后,D0D_0^*使得V(G0,D)V(G_0,D)最大,这个时候的JSD是V(G0,D0)V(G_0,D_0^*) between Pdata(x)P_{data}(x) and PG0(x)P_{G_0}(x),然后我们用梯度下降更新G0G_0,将其变成G1G_1,这个时候由于G的值变化后,V(G1,D)V(G_1,D)的曲线发生了变化(参考上面f(x)=max{f1(x),f2(x),f3(x)}f(x)=\text{max}\{f_1(x),f_2(x),f_3(x)\}的例子),这个新曲线V(G1,D)V(G_1,D)如上图的右边所示,这个时候的最大值就不在D0D_0^*了,离它很远,这个时候的JSD变成了V(G1,D1)V(G_1,D_1^*),可以看到后面的JSD明显要变大了,这样是不对的,因此我们做了假设,假设
D0D1D_0^*\approx D_1^*
这个时候从V(G0,D)V(G_0,D)V(G1,D)V(G_1,D)的曲线变化不会很大。也就是G这个参数只变化了一点点。
我们同样可以用D0D_0^*来衡量变化后JSD between Pdata(x)P_{data}(x) and PG1(x)P_{G_1}(x)
也就是说GAN的训练技巧:
Generator不要一次update太多,也不需要太多的iteration;
而Discriminator可以训练到收敛。因为要找到最大值才能衡量出JSD。


实作

理论上V是要取期望值,但是实际上是不可能的。只能用样本的均值进行估计:
Given GG, how to compute maxDV(G,D)\underset{D}{\text{max}}V(G,D)
• Sample {x1,x2,,xm}\{x^1,x^2,\cdots,x^m\} from Pdata(x)P_{data}(x), Sample {x~1,x~2,,x~m}\{\tilde x^1,\tilde x^2,\cdots,\tilde x^m\} from generator PG(x)P_{G}(x)
Maximize V~=1mi=1mlogD(xi)+1mi=1mlog(1D(x~i))(2)\text{Maximize }\tilde V=\cfrac{1}{m}\sum_{i=1}^mlogD(x^i)+\cfrac{1}{m}\sum_{i=1}^mlog(1-D(\tilde x^i))\tag2
上面这个事情实际上就是在训练一个Binary Classifier,记为D,D后面接一个sigmoid函数,使得输出值在[0,1]之间
我们把{x1,x2,,xm}\{x^1,x^2,\cdots,x^m\} from Pdata(x)P_{data}(x)看做Positive examples;
我们把{x~1,x~2,,x~m}\{\tilde x^1,\tilde x^2,\cdots,\tilde x^m\} from generator PG(x)P_{G}(x)看做Negative examples
目标是最小化上面两组数据的Cross-entropy,计算这个交叉熵的公式推导出来就是公式2

Algorithm for GAN(Review)

Initialize θd\theta_d for DD and θg\theta_g for GG.
• In each training iteration:


这块分割线内是训练Discriminator,重复k次,这里一定要训练到收敛为止,目的是找到maxDV(G,D)\underset{D}{\text{max}}V(G,D)(实作的时候一般没有办法真的训练到收敛或者卡在局部最小点,因此这里找到的是maxDV(G,D)\underset{D}{\text{max}}V(G,D)的lower bound)。
••Sample m examples {x1,x2,,xm}\{x^1,x^2,\cdots,x^m\} from data distribution Pdata(x)P_{data}(x).(找到真实对象)
••Sample m noise examples {z1,z2,,zm}\{z^1,z^2,\cdots,z^m\} from the prior Pprior(z)P_{prior}(z).(这个先验分布种类不是很重要)
•••Obtaining generated data {x~1,x~2,,x~m},x~i=G(zi)\{\tilde x^1,\tilde x^2,\cdots,\tilde x^m\},\tilde x^i=G(z^i).(找到生成对象)
•• Update discriminator parameters θd\theta_d to maximize
V~=1mi=1mlogD(xi)+1mi=1mlog(1D(x~i))θdθd+ηV~(θd)\tilde V=\cfrac{1}{m}\sum_{i=1}^mlogD(x^i)+\cfrac{1}{m}\sum_{i=1}^mlog(1-D(\tilde x^i))\\ \theta_d\leftarrow\theta_d+\eta\triangledown\tilde V(\theta_d)



这块分割线内是训练Generator,重复1次,目的是减少JSD
••Sample another m noise samples {z1,z2,,zm}\{z^1,z^2,\cdots,z^m\} from the prior Pprior(z)P_{prior}(z)
••Update generator parameters θg\theta_g to minimize
V~=1mi=1mlogD(xi)+1mi=1mlog(1D(G(zi)))θgθgηV~(θg)\tilde V=\cfrac{1}{m}\sum_{i=1}^mlogD(x^i)+\cfrac{1}{m}\sum_{i=1}^mlog(1-D(G(z^i)))\\ \theta_g\leftarrow\theta_g-\eta\triangledown\tilde V(\theta_g)
由于1mi=1mlogD(xi)\cfrac{1}{m}\sum_{i=1}^mlogD(x^i)GG函数无关,所以在求最小值的时候可以忽略:
V~=1mi=1mlog(1D(G(zi)))θgθgηV~(θg)\tilde V=\cfrac{1}{m}\sum_{i=1}^mlog(1-D(G(z^i)))\\ \theta_g\leftarrow\theta_g-\eta\triangledown\tilde V(\theta_g)


Objective Function for Generator in Real Implementation

按上面的算法:,我们可以知道Generator目标函数应该是:
V=ExPdata[logD(x)]+ExPG[log(1D(x))]V=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_G}[log(1-D(x))]
然后第一项和GG函数无关,所以在求最小值的时候可以忽略:
V=ExPG[log(1D(x))]V=E_{x\sim P_G}[log(1-D(x))]
但是,在论文原文在实作的时候把这个函数改为:
V=ExPG[log(D(x))]V=E_{x\sim P_G}[-log(D(x))]
我们先给出这两个函数的图片,然后再解释:
在这里插入图片描述
红色曲线对应log(1D(x))log(1-D(x)):江湖人称Minimax GAN (MMGAN)
蓝色曲线对应log(D(x))-log(D(x)):江湖人称Non-saturating GAN (NSGAN)
我们可以看到,红色曲线由于刚开始的Generator 没有训练过,它的生成对象都很假,很容易被识破,因此刚开始log(1D(x))log(1-D(x))的值很小。
不好训练,换成蓝色曲线后,两个曲线都是下降趋势,没有变,但是蓝色曲线刚开始的值很大,适合做梯度下降。
其实后来实验证明两种结果都差不多。
老师给出了他的猜想,蓝色曲线其实就是把label xx from PGP_G as positive.就是把生成对象和真实对象的标签换一下。估计是作者懒得改code,用的同一套code训练两组data。。。
理论部分到此结束。下面看一些比较直觉的东西。

Intuition

Generator和Discriminator的关系:Discriminator leads the generator.
红线:Discriminator
绿线:Data(target)distribution
蓝线:Generated distribution
在这里插入图片描述
有两组数据,生成对象(蓝色点)、真实对象(绿色点),然后我们训练一个Discriminator,然后Discriminator会给蓝色点比较低的分数,绿色点比较高的分数(红色曲线)。然后蓝色点就会跟着Discriminator的趋势(梯度方向)向右边移动,要获得高分:
在这里插入图片描述
移动过头,没关系,这个时候我们会再训练一次Discriminator,这个时候两个分布比较近,所以Discriminator的loss比较大,也就是两个分布的JS divergence比较小。然后蓝色点就会跟着Discriminator的趋势(梯度方向)向左边移动,直到Discriminator变成直线,就是Discriminator无法分辨生成对象(蓝色点)和真实对象(绿色点)。
在这里插入图片描述
GAN会不会出现正负样本不均衡的情况?
答:不会,因为正负样本都是我们自己sample出来的,只要不想自己和自己过不去就可以sample等量的样本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章