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

简介

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

MLE

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

MLE=Minimize KL Divergence

从另外一个角度来看MLE:
θ ∗ = a r g max θ ∏ i = 1 m P G ( x i ; θ ) = a r g max θ l o g ∏ i = 1 m P G ( x i ; θ ) \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) θ=argθmaxi=1mPG(xi;θ)=argθmaxlogi=1mPG(xi;θ)
加log不影响求最大,然后就可以乘法变加法:
= a r g max θ ∑ i = 1 m l o g P G ( x i ; θ ) , { x 1 , x 2 , ⋯   , x m }   f r o m   P d a t a ( 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) =argθmaxi=1mlogPG(xi;θ),{x1,x2,,xm} from Pdata(x)
这个事情就相当于求从 P d a t a ( x ) P_{data}(x) Pdata(x)采样出 x x x的期望:
≈ a r g max θ E x ∼ P d a t a [ l o g P G ( x ; θ ) ] \approx arg\underset{\theta}{\text{max}}E_{x\sim P_{data}}[logP_{G}(x;\theta)] argθmaxExPdata[logPG(x;θ)]
把期望展开就是积分:
= a r g max θ ∫ x P d a t a ( x ) l o g P G ( x ; θ ) d x =arg\underset{\theta}{\text{max}}\int_xP_{data}(x)logP_{G}(x;\theta)dx =argθmaxxPdata(x)logPG(x;θ)dx
上式后面减去一个和 P G P_G PG无关的项不影响求最大值:
= a r g max θ ∫ x P d a t a ( x ) l o g P G ( x ; θ ) d x − ∫ x P d a t a ( x ) l o g P d a t a ( x ) d x =arg\underset{\theta}{\text{max}}\int_xP_{data}(x)logP_{G}(x;\theta)dx-\int_xP_{data}(x)logP_{data}(x)dx =argθmaxxPdata(x)logPG(x;θ)dxxPdata(x)logPdata(x)dx
∫ x P d a t a ( x ) \int_xP_{data}(x) xPdata(x)提取出来,那么 ∫ x l o g P G ( x ; θ ) d x − ∫ x l o g P d a t a ( x ) d x \int_xlogP_{G}(x;\theta)dx-\int_xlogP_{data}(x)dx xlogPG(x;θ)dxxlogPdata(x)dx就是求 P G ∣ ∣ P d a t a P_{G}||P_{data} PGPdata的KL Divergence,这里把两个分布位置换一下,就变成求最小值:
= a r g min θ K L ( P d a t a ∣ ∣ P G ) =arg\underset{\theta}{\text{min}}KL(P_{data}||P_{G}) =argθminKL(PdataPG)
但是我们的分布 P G P_G PG不一定是高斯分布,因此我们如何把 P G P_G PG进行一般化?如果 P G P_G PG是一个NN,就没有办法算likelihood。因此要用GAN的Generator来解决这个问题。

Generator

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

Discriminator

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

D ∗ D^* D和divergence的关系证明

先把Objective函数写出来:
V = E x ∼ P d a t a [ l o g D ( x ) ] + E x ∼ P G [ l o g ( 1 − D ( x ) ) ] V=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_G}[log(1-D(x))] V=ExPdata[logD(x)]+ExPG[log(1D(x))]
• Given G G G(固定 G G G), what is the optimal D ∗ D^* D maximizing
V = E x ∼ P d a t a [ l o g D ( x ) ] + E x ∼ P G [ l o g ( 1 − D ( x ) ) ] = ∫ x P d a t a ( x ) l o g D ( x ) d x + ∫ x P G ( x ) l o g ( 1 − D ( x ) ) d x = ∫ x [ P d a t a ( x ) l o g D ( x ) + P G ( x ) l o g ( 1 − D ( x ) ) ] d x 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_xP_G(x)log(1-D(x))dx\\ =\int_x[P_{data}(x)logD(x)+P_G(x)log(1-D(x))]dx 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))]dx
Assume that D(x) can be any function
• Given x x x, the optimal D ∗ D^* D maximizing(上面的最大化问题就变成下面的公式)
P d a t a ( x ) l o g D ( x ) + P G ( x ) l o g ( 1 − D ( x ) ) P_{data}(x)logD(x)+P_G(x)log(1-D(x)) Pdata(x)logD(x)+PG(x)log(1D(x))
这里 P d a t a , P G ( x ) P_{data},P_G(x) PdataPG(x)是固定的,要找一个 D ( x ) D(x) D(x)最大化上面的式子,我们可以设:
a = P d a t a ( x ) , b = P G ( x ) , D = D ( x ) (1) a=P_{data}(x),b=P_G(x),D=D(x)\tag1 a=Pdata(x),b=PG(x),D=D(x)(1)
最大化函数就变成:
f ( D ) = a l o g ( D ) + b l o g ( 1 − D ) f(D)=alog(D)+blog(1-D) f(D)=alog(D)+blog(1D)
求极值就是要先求导,并让导数等于0:
d f ( D ) d D = a × 1 D + b × 1 1 − D × ( − 1 ) = 1 \cfrac{df(D)}{dD}=a\times\cfrac{1}{D}+b\times\cfrac{1}{1-D}\times(-1)=1 dDdf(D)=a×D1+b×1D1×(1)=1
a × 1 D ∗ = b × 1 1 − D ∗ a × ( 1 − D ∗ ) = b × D ∗ a − a D ∗ = b D ∗ a = ( a + b D ∗ ) D ∗ = a a + b a\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} a×D1=b×1D1a×(1D)=b×DaaD=bDa=(a+bD)D=a+ba
把假设1带回来
D ∗ ( x ) = P d a t a ( x ) P d a t a ( x ) + P G ( x ) D^*(x)=\cfrac{P_{data}(x)}{P_{data}(x)+P_G(x)} D(x)=Pdata(x)+PG(x)Pdata(x)
然后我们把 D ∗ D^* D带回二分类的目标函数:
max D V ( G , D ) = V ( G , D ∗ ) = E x ∼ P d a t a [ l o g D ( x ) ] + E x ∼ P G [ l o g ( 1 − D ( x ) ) ] = E x ∼ P d a t a [ l o g P d a t a ( x ) P d a t a ( x ) + P G ( x ) ] + E x ∼ P G [ l o g P G ( x ) P d a t a ( x ) + P G ( x ) ] ∫ x P d a t a l o g P d a t a ( x ) P d a t a ( x ) + P G ( x ) d x + ∫ x P G ( x ) l o g P G ( x ) P d a t a ( x ) + P G ( x ) d x = ∫ x P d a t a l o g 1 2 P d a t a ( x ) P d a t a ( x ) + P G ( x ) 2 d x + ∫ x P G ( x ) l o g 1 2 P G ( x ) P d a t a ( x ) + P G ( x ) 2 d x = l o g 1 2 + l o g 1 2 + ∫ x P d a t a l o g P d a t a ( x ) P d a t a ( x ) + P G ( x ) 2 d x + ∫ x P G ( x ) l o g P G ( x ) P d a t a ( x ) + P G ( x ) 2 = 2 l o g 1 2 + ∫ x P d a t a l o g P d a t a ( x ) P d a t a ( x ) + P G ( x ) 2 d x + ∫ x P G ( x ) l o g P G ( x ) P d a t a ( x ) + P G ( x ) 2 = − 2 l o g 2 + ∫ x P d a t a l o g P d a t a ( x ) P d a t a ( x ) + P G ( x ) 2 d x + ∫ x P G ( x ) l o g P G ( x ) P d a t a ( x ) + P G ( x ) 2 = − 2 l o g 2 + K L ( P d a t a ∣ ∣ P d a t a ( x ) + P G ( x ) 2 ) + K L ( P G ∣ ∣ P d a t a ( x ) + P G ( x ) 2 ) = − 2 l o g 2 + 2 J S D ( P d a t a ∣ ∣ P G ) \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) DmaxV(G,D)=V(G,D)=ExPdata[logD(x)]+ExPG[log(1D(x))]=ExPdata[logPdata(x)+PG(x)Pdata(x)]+ExPG[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(Pdata2Pdata(x)+PG(x))+KL(PG2Pdata(x)+PG(x))=2log2+2JSD(PdataPG)
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 ∗ = a r g min G D i v ( P G , P d a t a ) G^*=arg\underset{G}{\text{min}}Div(P_G,P_{data}) G=argGminDiv(PG,Pdata)
D i v ( P G , P d a t a ) Div(P_G,P_{data}) Div(PG,Pdata)就是Divergence between distributions P G P_G PG and P d a t a P_{data} Pdata
可以变化为:
G ∗ = a r g min G max D V ( G , D ) G^*=arg\underset{G}{\text{min}}\underset{D}{\text{max}}V(G,D) G=argGminDmaxV(G,D)
这个式子很复杂,就是找一个G,最小化 max D V ( G , D ) \underset{D}{\text{max}}V(G,D) DmaxV(G,D),找一个D,最大化 V ( G , D ) V(G,D) V(G,D)
前面的数学推导已经找到了最好的 D ∗ D^* D(The maximum value is related to JS divergence.),现在找一个最好的 G ∗ G^* G
假设我们现在只有三个G,分别是 G 1 , G 2 , G 3 G_1,G_2,G_3 G1,G2,G3
横坐标不一样,代表选择了不同的Discriminator,当我们固定不同的G的时候,最大化的 V ( G , D ) V(G,D) V(G,D)如下图中的红点所示。
在这里插入图片描述
从三个不同的 G 1 , G 2 , G 3 G_1,G_2,G_3 G1,G2,G3来看,从三个最大化的 V ( G , D ) V(G,D) V(G,D)中取最小值,故这里 G ∗ = G 3 G^*=G_3 G=G3
在这里插入图片描述
换个角度看,就是 P G 3 P_{G_3} PG3 P d a t a P_{data} Pdata的Divergence最小。
在这里插入图片描述
黑框中的内容就是在解 G ∗ = a r g min G max D V ( G , D ) G^*=arg\underset{G}{\text{min}}\underset{D}{\text{max}}V(G,D) G=argGminDmaxV(G,D)

GD Algorithm for GAN

用函数 L ( G ) L(G) L(G)替代 G ∗ G^* G中的 max D V ( G , D ) \underset{D}{\text{max}}V(G,D) DmaxV(G,D)
G ∗ = a r g min G L ( G ) G^*=arg\underset{G}{\text{min}}L(G) G=argGminL(G)
To find the best G minimizing the loss function L ( G ) 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 θGθGηθGL(G),θG defines G


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


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


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


实作

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

Algorithm for GAN(Review)

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


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



这块分割线内是训练Generator,重复1次,目的是减少JSD
••Sample another m noise samples { z 1 , z 2 , ⋯   , z m } \{z^1,z^2,\cdots,z^m\} {z1,z2,,zm} from the prior P p r i o r ( z ) P_{prior}(z) Pprior(z)
••Update generator parameters θ g \theta_g θg to minimize
V ~ = 1 m ∑ i = 1 m l o g D ( x i ) + 1 m ∑ i = 1 m l o g ( 1 − D ( G ( z i ) ) ) θ 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) V~=m1i=1mlogD(xi)+m1i=1mlog(1D(G(zi)))θgθgηV~(θg)
由于 1 m ∑ i = 1 m l o g D ( x i ) \cfrac{1}{m}\sum_{i=1}^mlogD(x^i) m1i=1mlogD(xi) G G G函数无关,所以在求最小值的时候可以忽略:
V ~ = 1 m ∑ i = 1 m l o g ( 1 − D ( G ( z i ) ) ) θ 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) V~=m1i=1mlog(1D(G(zi)))θgθgηV~(θg)


Objective Function for Generator in Real Implementation

按上面的算法:,我们可以知道Generator目标函数应该是:
V = E x ∼ P d a t a [ l o g D ( x ) ] + E x ∼ P G [ l o g ( 1 − D ( x ) ) ] V=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_G}[log(1-D(x))] V=ExPdata[logD(x)]+ExPG[log(1D(x))]
然后第一项和 G G G函数无关,所以在求最小值的时候可以忽略:
V = E x ∼ P G [ l o g ( 1 − D ( x ) ) ] V=E_{x\sim P_G}[log(1-D(x))] V=ExPG[log(1D(x))]
但是,在论文原文在实作的时候把这个函数改为:
V = E x ∼ P G [ − l o g ( D ( x ) ) ] V=E_{x\sim P_G}[-log(D(x))] V=ExPG[log(D(x))]
我们先给出这两个函数的图片,然后再解释:
在这里插入图片描述
红色曲线对应 l o g ( 1 − D ( x ) ) log(1-D(x)) log(1D(x)):江湖人称Minimax GAN (MMGAN)
蓝色曲线对应 − l o g ( D ( x ) ) -log(D(x)) log(D(x)):江湖人称Non-saturating GAN (NSGAN)
我们可以看到,红色曲线由于刚开始的Generator 没有训练过,它的生成对象都很假,很容易被识破,因此刚开始 l o g ( 1 − D ( x ) ) log(1-D(x)) log(1D(x))的值很小。
不好训练,换成蓝色曲线后,两个曲线都是下降趋势,没有变,但是蓝色曲线刚开始的值很大,适合做梯度下降。
其实后来实验证明两种结果都差不多。
老师给出了他的猜想,蓝色曲线其实就是把label x x x from P G P_G PG 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等量的样本。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oldmao_2000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值