GAN
本节思维导图
理论
假设图片是高维空间的向量x,而我们需要产生的图片是有一个固定的分布 P d a t a ( x ) P_{data}(x) Pdata(x).我们需要做的是把这个分布找出来,但我们拥有的数据是一些样本,我们能够知道这些能产生很好效果的样本的位置在哪里,不知道具体的要求的分布是什么样的。
在GAN之前,我们使用的算法是MEL(极大似然估计法)。
MLE
以下内容参考一文搞懂极大似然估计
似然函数(参数未知、变量已知)就是对于不同的模型参数,出现x这个样本点的概率。
极大似然估计就是利用已知的样本结果信息,反推最具有可能导致这些样本结果出现的模型参数值。
如何做?
-
从 P d a t a ( x ) P_{data}(x) Pdata(x)中sample出数据。
-
假设给定一组参数 θ \theta θ,将每一个数据的 P G ( x i ; θ ) P_{G}(x^i;\theta) PG(xi;θ)计算出来
-
然后得到似然函数 L = ∏ i = 1 m P G ( x i ; θ ) L=\prod_{i=1}^mP_{G}(x^i;\theta) L=∏i=1mPG(xi;θ),我们需要找到 θ ∗ = arg max θ ∏ i = 1 m P G ( x i ; θ ) \theta^*={\underset {\theta}{\operatorname {arg\,max} }}\,\prod_{i=1}^mP_{G}(x^i;\theta) θ∗=θargmax∏i=1mPG(xi;θ)
θ ∗ = arg max θ ∏ i = 1 m P G ( x i ; θ ) = arg max θ log ∏ i = 1 m P G ( x i ; θ ) = arg max θ log ∑ i = 1 m log P G ( x i ; θ ) ≈ arg max θ E x ∼ P d a t a [ l o g P G ( x ; θ ) ] \theta^* =\underset {\theta}{\operatorname {arg\,max} }\prod_{i=1}^mP_{G}(x^i;\theta)\\ =\underset {\theta}{\operatorname {arg\,max} }\log\prod_{i=1}^m P_{G}(x^i;\theta)\\ =\underset {\theta}{\operatorname {arg\,max} }\log\sum_{i=1}^m\log P_{G}(x^i;\theta)\\ \approx\underset{\theta}{\operatorname{arg\,max}}E_{x \sim{P_{data}}}[logP_G(x;\theta)] θ∗=θargmaxi=1∏mPG(xi;θ)=θargmaxlogi=1∏mPG(xi;θ)=θargmaxlogi=1∑mlogPG(xi;θ)≈θargmaxEx∼Pdata[logPG(x;θ)]
最后其实就是求从 P d a t a P_{data} Pdata中采样出的x的期望,展开就是积分:
= arg max θ ∫ x P d a t a ( x ) l o g P G ( x ; θ ) d x =\underset {\theta}{\operatorname {arg\,max} }\int_{x}P_{data}(x)logP_G(x;\theta)dx =θargmax∫xPdata(x)logPG(x;θ)dx
之后再减去一个值对求最大值是没有影响的
= arg max θ ∫ x P d a t a ( x ) l o g P G ( x ; θ ) d x − ∫ x P d a t a ( x ) P d a t a ( x ) d x =\underset {\theta}{\operatorname{arg\,max}}\int_{x}P_{data}(x)logP_G(x;\theta)dx-\int_xP_{data}(x)P_data(x)dx\\ =θargmax∫xPdata(x)logPG(x;θ)dx−∫xPdata(x)Pdata(x)dx
这个式子也就是求 P G ∣ ∣ P d a t a P_G∣∣P_{data} PG∣∣Pdata的KL散度最小,也就是使得 P G 最 接 近 P d a t a P_G最接近P_{data} PG最接近Pdata
= arg min θ K L ( P d a t a ∣ ∣ P G ) =\underset {\theta}{\operatorname{arg\,min}}\,KL(P_{data}||P_G) =θargminKL(Pdata∣∣PG)KL散度
衡量两个分布(比如两条线)之间的匹配程度。KL散度再形式上定义如下:
D K L ( p ∣ ∣ q ) = ∑ i = 1 N p ( x i ) l o g ( p ( x i ) q ( x i ) ) D_{KL}(p||q)=\sum_{i=1}^Np(x_i)log(\frac{p(x_i)}{q(x_i)}) DKL(p∣∣q)=i=1∑Np(xi)log(q(xi)p(xi))
其中q(x)是近似分布,p(x)是我们想要用q(x)匹配的真实分布。就是衡量的是给定任意分布偏离真实分布的程度。如果两个分布完全匹配,那么KL散度就等于0。KL散度越小,真实分布与近似分布之间的匹配就越好。
性质
- 非负性
- 不对称性
直观解释
若 p ( x i ) 大 于 q ( x i ) 若p(x_i)大于q(x_i) 若p(xi)大于q(xi),则 l o g ( p ( x i ) q ( x i ) ) log(\frac{p(x_i)}{q(x_i)}) log(q(xi)p(xi))是正值,反之亦然。而前面再乘上一个 p ( x i ) p(x_i) p(xi)相当于一个加权,让 p ( x i ) p(x_i) p(xi)大的匹配区域比小的对KL散度起到的作用更大,也就是优先匹配近似分布中真正高可能性的事件。
交叉熵(扩展)
在机器学习二分类问题中,我们一般用交叉熵作为损失函数。这是因为当我们评估labels和predicts之间的差距时,可以使用KL散度。而KL散度也可写作:
D
K
L
(
p
∣
∣
q
)
=
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
q
(
x
i
)
)
=
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
=
−
H
(
p
(
x
)
)
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
D_{KL}(p||q)=\sum_{i=1}^np(x_i)log(\frac{p(x_i)}{q(x_i)})\\=\sum_{i=1}^np(x_i)log(p(x_i))-\sum_{i=1}^np(x_i)log(q(x_i))\\=-H(p(x))-\sum_{i=1}^np(x_i)log(q(x_i))
DKL(p∣∣q)=i=1∑np(xi)log(q(xi)p(xi))=i=1∑np(xi)log(p(xi))−i=1∑np(xi)log(q(xi))=−H(p(x))−i=1∑np(xi)log(q(xi))
最后化简出的等式的前一部分恰巧就是p的熵,等式的后一部分就是交叉熵。
所以我们在评估时,由于前一部分-H(p(x))不变,在优化过程中我们只需要关注交叉熵。(扩展结束)
所以极大似然估计也就是使KL散度最小。
但是 P G P_G PG可能很复杂,可能计算不出似然函数,怎么解决这样的问题呢?
Generator
定义一个generator G,它是一个网络。G接受一个输入,会得到一个输出。我们将若干从分布中sample出来的数据输入generator中,将这些输出结合起来可以得到复杂的分布,就是我们需要的 P G ( x ) P_G(x) PG(x)。由于generator是一个网络,所以即使输入的数据的分布是normal distribution也不会有限制,因为从之前的学习中我们也知道即使是一个hidden layer的网络也可以产生任何function。
有了
P
G
(
x
)
P_G(x)
PG(x),我们的就是希望生成的分布
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} {\operatorname{min}}Div(P_G,P_{data})
G∗=argGminDiv(PG,Pdata)
这里的Div就是某种散度算法。
但是怎么计算出这个divergence? 我们不知道 P d a t a P_{data} Pdata的分布。
Discriminator
我们需要求 G ∗ = a r g min G D i v ( P G , P d a t a ) G^*=arg\underset{G} {\operatorname{min}}Div(P_G,P_{data}) G∗=argGminDiv(PG,Pdata)。尽管我们不知道这两个分布,但我们可以从两个分布中sample出数据。
对于 P d a t a P_{data} Pdata的sample就是从真实数据集中抽取;对于 P G P_G PG的sample就是先由简单分布随机生成一些vector,然后由输入生成器产生一些image。
通过discriminator量这两个分布之间的散度距离。
用我们拿到的数据去训练discriminator。就是让D给data中的数据高分,G生成的数据低分,这样从训练的结果就可以得到 P G 和 P d a t a P_G和P_{data} PG和Pdata之间的距离。
我们定义一个目标优化函数
V
(
G
,
D
)
=
E
x
∼
P
d
a
t
a
[
l
o
g
D
(
x
)
]
+
E
x
∼
P
G
[
1
−
l
o
g
D
(
x
)
]
V(G,D)=E_{x\sim{P_{data}}}[logD(x)]+E_{x\sim{P_G}}[1-logD(x)]
V(G,D)=Ex∼Pdata[logD(x)]+Ex∼PG[1−logD(x)]
G是固定住的。这个优化函数和二分类的函数形式一样。而我们需要训练的是
D
∗
=
a
r
g
max
D
V
(
D
,
G
)
D^*=arg\underset{D}{\operatorname{max}}V(D,G)
D∗=argDmaxV(D,G)。这个求最大的目标值和JS散度相关。
假设我们有两种数据,当它们的divergence很小的时候,就很难分辨,那么它的目标函数的值就会很小;反之亦然。而我们需要求的是使目标函数最大,所以和divergence相关。
数学:
V
(
G
,
D
)
=
E
x
∼
P
d
a
t
a
[
l
o
g
D
(
x
)
]
+
E
x
∼
P
G
[
1
−
l
o
g
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(G,D)=E_{x\sim{P_{data}}}[logD(x)]+E_{x\sim{P_G}}[1-logD(x)]\\ =\int_x{P_{data}}(x)logD(x)dx+\int_x{P_G}(x)log(1-D(x))dx\\ =\int_x[{P_{data}}(x)logD(x)+{P_G}(x)log(1-D(x))]dx
V(G,D)=Ex∼Pdata[logD(x)]+Ex∼PG[1−logD(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
就可以等价于求D值使得
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))值最大。将D(x)视为变量,进行求导后可以得到
D
∗
(
x
)
=
P
d
a
t
a
(
x
)
P
d
a
t
a
(
x
)
+
P
G
(
x
)
D^*(x)=\frac{P_{data}(x)}{P_{data}(x)+P_G(x)}
D∗(x)=Pdata(x)+PG(x)Pdata(x)。
将求得的最优的D带入V(G,D)。
max
D
V
(
G
,
D
)
=
V
(
G
,
D
∗
)
=
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
[
P
G
(
x
)
P
d
a
t
a
(
x
)
+
P
G
(
x
)
]
=
∫
x
P
d
a
t
a
(
x
)
l
o
g
1
2
P
d
a
t
a
(
x
)
P
d
a
t
a
(
x
)
+
P
G
(
x
)
2
d
x
+
1
2
P
G
(
x
)
P
d
a
t
a
(
x
)
+
P
G
(
x
)
2
d
x
=
−
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}{\operatorname{max}}V(G,D)=V(G,D^*)\\ =E_{x\sim{P_{data}}}[log\frac{P_{data}(x)}{P_{data}(x)+P_G(x)}]+E_{x\sim{P_G}}[\frac{P_G(x)}{P_{data}(x)+P_G(x)}]\\ =\int_xP_{data}(x)log\frac{\frac{1}{2}P_{data}(x)}{\frac{P_{data}(x)+P_G(x)}{2}}dx+\frac{\frac{1}{2}P_G(x)}{\frac{P_{data}(x)+P_G(x)}{2}}dx\\ =-2log2+KL(P_{data}||\frac{P_{data}(x)+P_G(x)}{2})+KL(P_G||\frac{P_{data}(x)+P_G(x)}{2})\\ =-2log2+2JSD(P_{data}||P_G)
DmaxV(G,D)=V(G,D∗)=Ex∼Pdata[logPdata(x)+PG(x)Pdata(x)]+Ex∼PG[Pdata(x)+PG(x)PG(x)]=∫xPdata(x)log2Pdata(x)+PG(x)21Pdata(x)dx+2Pdata(x)+PG(x)21PG(x)dx=−2log2+KL(Pdata∣∣2Pdata(x)+PG(x))+KL(PG∣∣2Pdata(x)+PG(x))=−2log2+2JSD(Pdata∣∣PG)
JS散度
JS散度度量了两个概率分布的相似度,基于KL散度的变体,解决了KL散度非对称的问题(有时用它来训练神经网络会有顺序不同造成不一样的训练结果的情况)。一般地,JS散度是对称的,其取值是0到1之间。定义如下:
J
S
(
P
1
∣
∣
P
2
)
=
1
2
K
L
(
P
1
∣
∣
P
1
+
P
2
2
)
+
1
2
K
L
(
P
2
∣
∣
P
1
+
P
2
2
)
JS(P_1||P_2)=\frac{1}{2}KL(P_1||\frac{P_1+P_2}{2})+\frac{1}{2}KL(P_2||\frac{P_1+P_2}{2})
JS(P1∣∣P2)=21KL(P1∣∣2P1+P2)+21KL(P2∣∣2P1+P2)
问题
当两个分布相差很远,甚至完全不重叠,JS散度就为一个常数,梯度就消失了。
算法
我们本来需要求 G ∗ = a r g min G D i v ( P G , P d a t a ) G^*=arg\underset{G} {\operatorname{min}}Div(P_G,P_{data}) G∗=argGminDiv(PG,Pdata),我们通过训练discriminator来度量Div,那么这个式子也就是 G ∗ = a r g min G max D V ( G , D ) G^*=arg\underset{G}{\operatorname{min}} \underset{D}{\operatorname{max}}V(G,D) G∗=argGminDmaxV(G,D)
步骤
- 初始化生成器和判别器
- 每次迭代
- 固定生成器G,更新判别器D
- 固定判别器D,更新生成器G
我们可以把 max D V ( G , D ) \underset{D}{\operatorname{max}}V(G,D) DmaxV(G,D)看作损失函数L(G),这样可以用梯度下降求得最好的G。那么该如何微分有max操作的L(G)呢?
假设 f ( x ) = m a x { f 1 ( x ) , f 2 ( x ) , f 3 ( x ) } f(x)=max\{f_1(x),f_2(x),f_3(x)\} f(x)=max{f1(x),f2(x),f3(x)},在算微分的时候,计算最大的那个选择的微分。
同理,现在给定 G 0 G_0 G0的条件下,找到使 V ( G 0 , D ) 最 小 的 D 0 ∗ V(G_0,D)最小的D_0^* V(G0,D)最小的D0∗,然后再对G求梯度,更新G,如此重复。
实际上
我们没有办法计算期望,只能用sample代替。从
P
G
和
P
d
a
t
a
P_G和P_{data}
PG和Pdata中抽取样本。
M
a
x
i
m
i
z
e
V
^
=
1
m
∑
i
=
1
m
l
o
g
D
(
x
i
)
+
1
m
∑
i
=
1
m
l
o
g
(
1
−
D
(
x
~
i
)
)
Maximize \,\hat{V}=\frac{1}{m}\sum_{i=1}^{m}logD(x^i)+\frac{1}{m}\sum_{i=1}^{m}log(1-D(\tilde{x}^i))
MaximizeV^=m1i=1∑mlogD(xi)+m1i=1∑mlog(1−D(x~i))
这其实就是一个二分类的交叉熵。D其实就是一个sigmoid作**函数的二分类问题。
算法
-
在每次迭代中
-
从真实数据中抽取数据
-
从pior distribution中生成noise sample
-
把noise sample丢到G中,得到生成数据
-
更新生成器D(反复k次,直到收敛)
- M a x i m i z e V ^ = 1 m ∑ i = 1 m l o g D ( x i ) + 1 m ∑ i = 1 m l o g ( 1 − D ( x ~ i ) ) Maximize \,\hat{V}=\frac{1}{m}\sum_{i=1}^{m}logD(x^i)+\frac{1}{m}\sum_{i=1}^{m}log(1-D(\tilde{x}^i)) MaximizeV^=m1∑i=1mlogD(xi)+m1∑i=1mlog(1−D(x~i))
-
再从pior distribution中生成新的noise sample,放入G中,得到新的生成数据
-
更新G
-
$$
Minimize ,\hat{V}=-\frac{1}{m}\sum_{i=1}{m}logD(xi)+\frac{1}{m}\sum_{i=1}{m}log(1-D(G(zi)))$$
-
-
但由于前面这个式子和G没有关系,可以删去。
在实际运用中,由于一开始D(x)很小,那么微分也很小,不好训练。我们把它改成
E
x
∼
P
G
[
−
l
o
g
D
(
x
)
]
E_{x\sim{P_G}}[-logD(x)]
Ex∼PG[−logD(x)]
Intuition
直观来看
就是通过D(x)的指导将G的分布靠近真实分布,然后再用Discriminator对真实分布打高分,生成分布打低分,如此循环,直到最后重合。
参考文章
李宏毅学习笔记33.GAN.04.Theory behind GAN