文章目录
简介
本节将从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=1∏mPG(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=1∏mPG(xi;θ)=argθmaxlogi=1∏mPG(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=1∑mlogPG(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θmaxEx∼Pdata[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θmax∫xPdata(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θmax∫xPdata(x)logPG(x;θ)dx−∫xPdata(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;θ)dx−∫xlogPdata(x)dx就是求
P
G
∣
∣
P
d
a
t
a
P_{G}||P_{data}
PG∣∣Pdata的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(Pdata∣∣PG)
但是我们的分布
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=Ex∼Pdata[logD(x)]+Ex∼PG[log(1−D(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=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
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(1−D(x))
这里
P
d
a
t
a
,
P
G
(
x
)
P_{data},P_G(x)
Pdata,PG(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(1−D)
求极值就是要先求导,并让导数等于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×1−D1×(−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×D∗1=b×1−D∗1a×(1−D∗)=b×D∗a−aD∗=bD∗a=(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∗)=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
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−η∂θG∂L(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−η∂θG∂V(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−η∂θG∂V(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^*
D0∗≈D1∗
这个时候从
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=1∑mlogD(xi)+m1i=1∑mlog(1−D(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=1∑mlogD(xi)+m1i=1∑mlog(1−D(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=1∑mlogD(xi)+m1i=1∑mlog(1−D(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)
m1∑i=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=1∑mlog(1−D(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=Ex∼Pdata[logD(x)]+Ex∼PG[log(1−D(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=Ex∼PG[log(1−D(x))]
但是,在论文原文在实作的时候把这个函数改为:
V
=
E
x
∼
P
G
[
−
l
o
g
(
D
(
x
)
)
]
V=E_{x\sim P_G}[-log(D(x))]
V=Ex∼PG[−log(D(x))]
我们先给出这两个函数的图片,然后再解释:
红色曲线对应
l
o
g
(
1
−
D
(
x
)
)
log(1-D(x))
log(1−D(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(1−D(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等量的样本。