Generative Adversarial Nets 论文解读
generative 生成 adversarial 对抗
摘要 Abstract
提出了一个生成模型框架(framework),通过一个对抗的过程,同时训练两个模型:一个生成模型G,G是用来抓取数据的分布,对其进行建模;一个辨别模型D,D来辨别该样本是生成的,还是真实数据 。G的目标是让D犯错,D的目标是来辨别出生成的数据(不被欺骗)。每个框架都类似于一个 two-player 游戏(博弈论中的著名游戏)。在任何函数的G和D都存在一个独一无二的解,G能找出所有的解,D的辨别率到达50%。G和D是一个MLP(多层感知机),整个系统可以通过一个误差反传来进行训练,在这里不需要使用马尔科夫链和对一个近似的推理过程展开。
导论 Introduction
深度学习是用来发现丰富、有层次的模型,这些模型能对AI中的数据做一个概率分布的表示,深度学习不仅仅是深度神经网络,更多的是对整个数据分布的一个特征的表示。虽然深度学习在辨别模型上取得了很大的成就,但是在生成模型上表现依然较差。这个问题来自在最大化似然函数时,要对概率分布进行很多近似,这个近似会带来很大的困难。
GAN(本篇论文)是一个框架,框架中有两类模型:生成模型G和判别模型D,一个比喻能帮助你更好的理解这个概念。生成模型G是造假币的罪犯,判别模型D是捉罪犯的警察,警察的任务是找出假币,将其与真币区分开。罪犯G和警察D会不断地学习,G会提升自己造假的技能,警察会提升自己判别真假币的技能,最终目标是,罪犯G造的假币和真币没有区别,警察无法区分真币和假币。
在GAN框架下,生成模型G是一个MLP,输入是一个随机的噪音,G能够把产生随机噪音的一个分布(通常是一个高斯分布)可以映射到任何一个我们想要拟合的分布。如果判别模型也是一个MLP,这种情况叫做对抗网络(adversarial nets)。此时由于两个模型都是MLP,可以通过误差的反向传递来对分布进行复杂的采样,而不是采用马尔科夫链的算法。
相关工作 Related Work
其他方法总是想构造一个分布函数,向这个函数提供一些参数让他学习,这些参数通过最大化它的对数似然函数来做,此方法缺点在于采量一个分布时计算较困难,尤其是在较高纬度时。最近有一些工作是,不再构造分布,而是训练一个模型来近似这个分布,此方法缺点在于不知道分布什么样子,只知道结果,好处在于计算较容易。
对f的期望求导等价于对f求导
lim
σ
→
0
▽
x
E
ε
∼
N
(
0
,
σ
2
I
)
f
(
x
+
ε
)
=
▽
x
f
(
x
)
\lim\limits_{\sigma\to0} \bigtriangledown_{x} \mathbb{E}_{\varepsilon\sim\mathcal{N}(0,\sigma^{2}\mathcal{I})} f(x+\varepsilon)=\bigtriangledown_{x}f(x)
σ→0lim▽xEε∼N(0,σ2I)f(x+ε)=▽xf(x)
通过一个辨别模型来帮助生成模型也不可以,NCE做过这个工作。后面在解释跟predictability minimization算法的区别(具体小故事可以自行搜索)
跟“adversarial examples”的区别,adversarial examples是构造一些假的样本但是跟真的很像,从而测试算法的稳定性。
算法 Adversial nets
GAN框架最简单的应用是生成模型和判别模型都是MLP的时候,生成器G要学习在数据
x
x
x上的分布
p
g
p_{g}
pg,我们在输入噪声
z
z
z上定义了一个先验(先验概率,一个可能性的概率评估),分布为
p
z
(
z
)
p_{z}(z)
pz(z),生成模型的功能就是将
z
z
z映射成
x
x
x,对于MLP生成器G来说,有一个可学习参数
θ
g
\theta_{g}
θg (可学习参数通常是指权重(weights)和偏置(biases)),上述这个映射表示为
G
(
z
;
θ
g
)
G(z;\theta_{g})
G(z;θg)。这个思路的优点,计算比较简单;缺点,没有理解对应的
z
z
z。辨别器D也是一个MLP,同样拥有可学习参数
θ
d
\theta_{d}
θd,作用是把数据转换为一个标量,输出是真实数据的概率,来自真实的数据输出为1,来自生成器的数据输出为0。我们训练D的同时也在训练G,G用来 minimax
l
o
g
(
1
−
D
(
G
(
z
)
)
)
log(1-D(G(z)))
log(1−D(G(z))),
z
z
z是随机噪声,
G
(
z
)
G(z)
G(z)对应生成的数据
x
′
x'
x′(区别于真实数据
x
x
x),
D
(
G
(
z
)
)
D(G(z))
D(G(z))对应的是判别器的输出,
l
o
g
(
1
−
D
(
G
(
z
)
)
)
log(1-D(G(z)))
log(1−D(G(z)))的功能是辨别器做的很好的情况下为0,否则输出大于0的数,如果
D
D
D确信
x
′
x'
x′是真实数据就为1。
总结来说,
D
D
D和
G
G
G是两个模型,目标函数是如下的 two-player minmax game 的函数
V
(
G
,
D
)
V(G,D)
V(G,D)
min
G
max
D
V
(
D
,
G
)
=
E
x
∼
p
d
a
t
a
(
x
)
[
l
o
g
D
(
x
)
]
+
E
z
∼
p
z
(
z
)
[
l
o
g
(
1
−
D
(
G
(
z
)
)
)
]
\min\limits_{G} \max\limits_{D} V(D,G) = \mathbb{E}_{x\sim\ p_{data(x)}}[logD(x)]+\mathbb{E}_{z\sim\ p_{z}(z)} [log(1-D(G(z)))]
GminDmaxV(D,G)=Ex∼ pdata(x)[logD(x)]+Ez∼ pz(z)[log(1−D(G(z)))]
第一项
E
x
∼
p
d
a
t
a
(
x
)
[
l
o
g
D
(
x
)
]
\mathbb{E}_{x\sim p_{data}(x)} [logD(x)]
Ex∼pdata(x)[logD(x)]是一个期望,
x
x
x是采样真实数据,如果判别器效果很好
l
o
g
D
(
x
)
logD(x)
logD(x)的值应为0
第二项
E
z
∼
p
z
(
z
)
[
l
o
g
(
1
−
D
(
G
(
z
)
)
)
]
\mathbb{E}_{z\sim\ p_{z}(z)} [log(1-D(G(z)))]
Ez∼ pz(z)[log(1−D(G(z)))]是采样噪音分布,如果
D
D
D是完美的情况下
l
o
g
(
1
−
D
(
G
(
z
)
)
)
log(1-D(G(z)))
log(1−D(G(z)))应该为0
如果
D
D
D并不完美的情况下,一二项都会产生误分类的情况,都会变成一个负数值。
G
G
G要尽量的犯错使第二项值更小,这与
D
D
D的目标是矛盾的,这就是对抗的过程,最终结果是达到一个均衡即纳什均衡。
(a):
x
x
x和
z
z
z分别是一维的标量,z是均分分布采样来的,x是高斯分布,第一步将z映射到x,表示为绿线,辨别器为蓝色的线。
(b):
更新辨别器, 使其能分辨出真实的数据和生成的数据
(c):
更新生成器,使峰值右移
(d):
不断更新辨别器和生成器,最后将生成映射成接近真实分布的分布,辨别器对每个值得输出都是0.5
算法1
第一行是一个for loop,每个loop里做一次迭代
第二行是另一个for loop,做k步
■ 每一步里先采样m个噪音样本
{
z
(
1
)
,
…
,
z
(
m
)
}
\{ z^{(1)},\ldots ,z^{(m)} \}
{z(1),…,z(m)}
■ 再采样m个来自真实数据的样本
{
x
(
1
)
,
…
,
x
(
m
)
}
\{ x^{(1)},\ldots ,x^{(m)} \}
{x(1),…,x(m)}
组成
2
m
2m
2m大小的批量
p
d
a
t
a
(
x
)
p_{data}(x)
pdata(x)
■ 放入价值函数
V
(
G
,
D
)
V(G,D)
V(G,D)求梯度,做
k
k
k步对辨别器的参数求梯度,来更新辨别器
∇
θ
d
1
m
∑
i
=
1
m
[
l
o
g
D
(
x
(
i
)
)
+
l
o
g
(
1
−
D
(
G
(
z
(
i
)
)
)
)
]
\nabla_{\theta_{d}}\frac{1}{m} \sum_{i=1}^{m}[logD(x^{(i)})+log(1-D(G(z^{(i)})))]
∇θdm1∑i=1m[logD(x(i))+log(1−D(G(z(i))))]
结束
■ 采样m个噪音样本
{
z
(
1
)
,
…
,
z
(
m
)
}
\{ z^{(1)},\ldots ,z^{(m)} \}
{z(1),…,z(m)}
■ 放入第二项中,求梯度更新生成器
∇
θ
d
1
m
∑
i
=
1
m
[
l
o
g
(
1
−
D
(
G
(
z
(
i
)
)
)
)
]
\nabla_{\theta_{d}}\frac{1}{m} \sum_{i=1}^{m}[log(1-D(G(z^{(i)})))]
∇θdm1∑i=1m[log(1−D(G(z(i))))]
结束完成一次迭代
先更新辨别器再更新生成器,其中
k
k
k是一个超参数,不能太大也不能太小。GAN的收敛是非常不稳定的。
欠更新:
更新了生成器后,辨别器更新不好,在下一轮,更新D就没有意义。
过更新:
生成器一更新,就将D训练到完美,那么
1
−
D
(
G
(
z
(
i
)
)
)
)
1-D(G(z^{(i)})))
1−D(G(z(i))))就会变成0,那么在生成模型G上的更新会有困难。
问题,初始时G很弱,很容易把D训练到很好,会导致
l
o
g
(
1
−
D
(
G
(
z
)
)
)
log(1-D(G(z)))
log(1−D(G(z)))变成0,建议在更新G时把目标函数改成maximize
l
o
g
(
D
(
G
(
z
)
)
)
log(D(G(z)))
log(D(G(z))),但是依然有问题
理论结果 Theoretical Results
当生成器学到的分布
p
g
p_{g}
pg与真实分布
p
d
a
t
a
p_{data}
pdata相等时,目标函数有一个全局最优解。算法1确实能求解目标函数。
全局最优解 Gloabl Optimality of p g = p d a t a p_{g}=p_{data} pg=pdata
结论一:G固定,最优辨别器D是
D
G
∗
(
x
i
)
=
p
d
a
t
a
(
x
)
p
d
a
t
a
(
x
)
+
p
g
(
x
)
D_{G}^{*}(x^{i}) = \frac{p_{data}(x)}{p_{data}(x)+p_{g}(x)}
DG∗(xi)=pdata(x)+pg(x)pdata(x)
p
d
a
t
a
(
x
)
p_{data}(x)
pdata(x)x在真实数据的分布中概率是多少,
p
g
(
x
)
p_{g}(x)
pg(x)x在生成器所拟合的分布中的概率。不管对什么样子的x,最优辨别器的输出的概率都是
1
2
\frac{1}{2}
21
证明:
计算来自p的x的期望
E
x
∼
p
f
(
x
)
=
∫
x
p
(
x
)
f
(
x
)
d
x
\mathbb{E}_{x\sim p} f(x) = \int_x p(x)f(x)dx
Ex∼pf(x)=∫xp(x)f(x)dx
将期望带入价值函数
V
(
D
,
G
)
=
∫
x
p
d
a
t
a
(
x
)
l
o
g
D
(
x
)
+
∫
x
p
z
(
z
)
l
o
g
(
1
−
D
(
G
(
z
)
)
)
d
z
V(D,G) =\int_x p_{data}(x)logD(x) +\int_x p_{z}(z)log(1-D(G(z)))dz
V(D,G)=∫xpdata(x)logD(x)+∫xpz(z)log(1−D(G(z)))dz
第一项是在
p
d
a
t
a
p_{data}
pdata上对
l
o
g
(
D
(
x
)
)
log(D(x))
log(D(x))求均值,第二项是在
p
z
(
z
)
p_z(z)
pz(z)上对
l
o
g
(
1
−
D
(
G
(
z
)
)
)
log(1-D(G(z)))
log(1−D(G(z)))求均值
因为
x
=
g
(
z
)
x = g(z)
x=g(z),可得出
V
(
D
,
G
)
=
∫
x
p
d
a
t
a
(
x
)
l
o
g
D
(
x
)
+
p
g
l
o
g
(
1
−
D
(
x
)
)
d
x
V(D,G) =\int_x p_{data}(x)logD(x) + p_{g}log(1-D(x))dx
V(D,G)=∫xpdata(x)logD(x)+pglog(1−D(x))dx
对于任何
(
a
,
b
)
∈
R
>
0
2
(a,b) \in \mathbb{R}^2_{>0}
(a,b)∈R>02,函数
y
=
a
log
(
y
)
+
b
log
(
1
−
y
)
y = a\log(y) + b\log(1-y)
y=alog(y)+blog(1−y) 在区间
[
0
,
1
]
[0,1]
[0,1] 上达到其最大值点
y
=
a
a
+
b
y = \frac{a}{a+b}
y=a+ba。分母不需要在
S
u
p
p
(
p
d
a
t
a
)
∪
S
u
p
p
(
p
g
)
Supp(p_{data}) \cup Supp(p_g)
Supp(pdata)∪Supp(pg) 之外定义,从而证明。
将D的最优解带回到我们的价值函数中
C
(
G
)
=
max
D
V
(
G
,
D
)
C(G) = \max\limits_{D} V(G, D)
C(G)=DmaxV(G,D)
=
E
x
∼
p
data
[
log
D
G
∗
(
x
)
]
+
E
z
∼
p
z
[
log
(
1
−
D
G
∗
(
G
(
z
)
)
)
]
=\mathbb{E}_{x \sim p{\text{data}}} [\log D_{G}^{*}(x)] + \mathbb{E}_{z \sim p_z} [\log (1- D_{G}^{*}(G(z)))]
=Ex∼pdata[logDG∗(x)]+Ez∼pz[log(1−DG∗(G(z)))]
=
E
x
∼
p
data
[
log
D
G
∗
(
x
)
]
+
E
x
∼
p
g
[
l
o
g
(
1
−
D
G
∗
(
G
(
z
)
)
)
]
=\mathbb{E}_{x \sim p{\text{data}}} [\log D_{G}^{*}(x)] + \mathbb{E}_{x \sim p_g} [log(1- D_{G}^{*}(G(z)))]
=Ex∼pdata[logDG∗(x)]+Ex∼pg[log(1−DG∗(G(z)))]
=
E
x
∼
p
data
[
log
p
data
(
x
)
P
data
(
x
)
+
p
g
(
x
)
]
+
E
x
∼
p
g
[
log
p
g
(
x
)
p
data
(
x
)
+
p
g
(
x
)
]
=\mathbb{E}_{x \sim p_{\text{data}}} [\log \frac{p_{\text{data}}(x)}{P_{\text{data}}(x) + p_g(x)} ]+ \mathbb{E}_{x \sim p_g} [\log \frac{p_g(x)}{p{\text{data}}(x) + p_g(x)}]
=Ex∼pdata[logPdata(x)+pg(x)pdata(x)]+Ex∼pg[logpdata(x)+pg(x)pg(x)]
定理一:当且仅当 p g = p d a t a p_{g}=p_{data} pg=pdata时, C ( G ) C(G) C(G)是全局最小值
证明:
引入KL散度证明,太难了,建议看原文…Generative Adversarial
算法一的收敛
当
G
G
G和
D
D
D有足够容量时,并且在算法 1 的每一步中,允许鉴别器在给定 G 的条件下达到其最优状态,并且更新
p
g
p_{g}
pg以改善标准
E
x
∼
p
data
[
log
D
(
G
(
x
)
)
]
+
E
x
∼
p
g
[
log
(
1
−
D
(
x
)
)
]
\mathbb{E}_{x\sim p_{\text{data}}}[\log D(G(x))] + \mathbb{E}_{x \sim p_g}[\log(1 - D(x))]
Ex∼pdata[logD(G(x))]+Ex∼pg[log(1−D(x))]
那么
p
g
p_{g}
pg会收敛至
p
d
a
t
a
p_{data}
pdata。
证明:
考虑
V
(
G
,
D
)
=
U
(
p
g
,
D
)
V(G, D) = U(p_g, D)
V(G,D)=U(pg,D) 作为上述标准中对
p
g
p_g
pg的一个函数。注意到
U
(
p
g
,
D
)
U(p_g, D)
U(pg,D)在
p
g
p_g
pg中是凸的。凸函数的上确界的次导数包括在最大值达到的点上该函数的导数。换句话说,如果
f
(
x
)
=
s
u
p
A
f
(
x
)
f(x) = sup_A f(x)
f(x)=supAf(x)并且对于每一个 A,f(x) 在 x 中是凸的,那么
f
′
(
x
)
f'(x)
f′(x)就是在
a
r
g
s
u
p
A
f
(
x
)
argsup_A f(x)
argsupAf(x)处的 f(x)。这相当于在给定相应的G时,对于最优的 D,为
p
g
p_g
pg计算一个梯度下降更新。定理一证明了在
p
g
p_g
pg中
s
u
p
D
U
(
p
g
,
D
)
sup_D U(p_g, D)
supDU(pg,D)是凸的,并且有一个唯一的全局最优解,因此,通过对
p
g
p_g
pg进行足够小的更新,
p
g
p_g
pg会收敛到
p
x
p_x
px,从而完成了证明。