本文简单介绍生成对抗网络的来源及逻辑。
假设我们想训练一个生成器
G
(
z
)
G(z)
G(z),使得生成器的输出
x
x
x尽可能真实自然,但是是否真实自然这个损失函数很难设计。于是我们想到可以利用一个判别器
D
(
x
)
D(x)
D(x)来判断生成样本
x
x
x的真假。但问题是这个判别器从何而来?既然很难设计,那就不妨训练一个这样的判别器。训练数据分为两类,正例是真实的天然样本,负例是伪造的生成的样本。天然样本当然好获取,那么伪造的生成样本哪里来呢?既然生成器
G
(
z
)
G(z)
G(z)生成的样本不够真实,那么恰好可以被拿来当做负例。这样就有两类样本来训练判别器
D
(
x
)
D(x)
D(x).
假设{X,T}为样本集, X = { x 1 , . . , x N } X=\{x_1,..,x_N\} X={x1,..,xN}, T = { t 1 , . . , t N } T=\{t_1,..,t_N\} T={t1,..,tN}, t i ∈ { 0 , 1 } t_i\in\{0,1\} ti∈{0,1}。标签 0 0 0代表样本来自于生成器 G ( x ) G(x) G(x),标签 1 1 1代表样本来自于天然样本集。
对于二分类问题,类似与逻辑回归, D ( x ) D(x) D(x)只需要一个输出节点 y y y,输出的就是样本为真的概率。
则对数似然函数:
l
o
g
L
(
X
,
T
∣
θ
D
)
=
l
o
g
∏
i
=
1
N
P
(
t
i
∣
x
i
)
=
l
o
g
∏
i
=
1
N
y
i
t
i
(
1
−
y
i
)
1
−
t
i
logL({X,T}|\theta_D)=log\prod\limits_{i=1}^NP(t_i|x_i)=log\prod\limits_{i=1}^Ny_i^{t_i}(1-y_i)^{1-t_i}
logL(X,T∣θD)=logi=1∏NP(ti∣xi)=logi=1∏Nyiti(1−yi)1−ti
注意:
P
(
t
i
∣
x
i
)
P(t_i|x_i)
P(ti∣xi)可以看成关于变量
t
i
,
x
i
t_i, x_i
ti,xi的二元函数,输出为概率。且:
P
(
t
i
=
1
∣
x
i
)
=
y
i
=
D
(
x
i
)
P(t_i=1|x_i)=y_i=D(x_i)
P(ti=1∣xi)=yi=D(xi),
P
(
t
i
=
0
∣
x
i
)
=
1
−
y
i
=
1
−
D
(
x
i
)
P(t_i=0|x_i)=1-y_i=1-D(x_i)
P(ti=0∣xi)=1−yi=1−D(xi)。
所以有:
l
o
g
L
(
X
,
T
∣
θ
D
)
=
l
o
g
∏
i
=
1
N
y
i
t
i
(
1
−
y
i
)
1
−
t
i
=
∑
i
=
1
N
{
t
i
l
o
g
D
(
x
i
)
+
(
1
−
t
i
)
l
o
g
(
1
−
D
(
x
i
)
)
}
=
∑
i
=
1
N
t
i
l
o
g
D
(
x
i
)
+
∑
i
=
1
N
(
1
−
t
i
)
l
o
g
(
1
−
D
(
x
i
)
)
logL({X,T}|\theta_D)=log\prod\limits_{i=1}^Ny_i^{t_i}(1-y_i)^{1-t_i} \\=\sum\limits_{i=1}^N\{t_ilogD(x_i)+(1-t_i)log(1-D(x_i))\} \\=\sum\limits_{i=1}^Nt_ilogD(x_i)+\sum\limits_{i=1}^N(1-t_i)log(1-D(x_i))
logL(X,T∣θD)=logi=1∏Nyiti(1−yi)1−ti=i=1∑N{tilogD(xi)+(1−ti)log(1−D(xi))}=i=1∑NtilogD(xi)+i=1∑N(1−ti)log(1−D(xi))
因为真样本来自于天然数据集,假样本来自于生成器,所以有:
max
D
E
x
∼
p
d
a
t
a
l
o
g
(
D
(
x
)
)
+
E
x
∼
p
m
o
d
e
l
l
o
g
(
1
−
D
(
x
)
)
\max\limits_{D}E_{x\sim p_{data}}log(D(x))+E_{x\sim p_{model}}log(1-D(x))
DmaxEx∼pdatalog(D(x))+Ex∼pmodellog(1−D(x))
这样就可以最大化
l
o
g
L
(
X
,
T
∣
θ
D
)
logL({X,T}|\theta_D)
logL(X,T∣θD),训练得到
D
(
x
)
D(x)
D(x)。得到
D
(
x
)
D(x)
D(x)后,我们的任务才开始,因为我们的目标是让
G
(
z
)
G(z)
G(z)生成尽可能真的样本。现在我们已经有了训练好的判别器D(x)。我们考虑如何构造损失函数来训练
G
(
z
)
G(z)
G(z)呢?
首先我们的思路就是把 G ( z ) G(z) G(z)的输出直接输入到 D ( x ) D(x) D(x),并设置监督信号为“真实图片”。这样一来,如果 D ( x ) D(x) D(x)预测x为真实图片,则说明 G ( z ) G(z) G(z)生成的样本很真,符合要求,不返回误差;如果 D ( x ) D(x) D(x)预测x为假,则说明 G ( z ) G(z) G(z)生成的样本很假,需要返回误差更新 G ( z ) G(z) G(z)的权重。也就是说,训练 D ( x ) D(x) D(x)时,真实图片被标记为真,生成图片被标记为假,训练 G ( z ) G(z) G(z)时只有生成图片,并且被标记为真。可以看出,这样的训练 G ( z ) G(z) G(z)目标恰好和训练 D ( x ) D(x) D(x)的目标相反,最大化变为最小化,因此被称为对抗学习。
基于这样的思路,假设生成了
M
M
M个样本,我们设计目标函数:
min
l
o
g
L
(
T
,
Z
∣
θ
G
)
=
l
o
g
∏
i
=
1
M
P
(
t
i
∣
z
i
)
=
l
o
g
∏
i
=
1
M
(
1
−
y
i
)
1
−
t
i
=
l
o
g
∏
i
=
1
M
(
1
−
y
i
)
=
∑
i
=
1
M
l
o
g
(
1
−
y
i
)
=
∑
i
=
1
M
l
o
g
(
1
−
D
(
x
i
)
)
=
∑
i
=
1
M
l
o
g
(
1
−
D
(
G
(
z
i
)
)
)
=
E
z
∼
p
z
l
o
g
(
1
−
D
(
G
(
z
)
)
)
=
E
x
∼
p
m
o
d
e
l
l
o
g
(
1
−
D
(
x
)
)
\min logL(T,Z|\theta_G)=log\prod\limits_{i=1}^MP(t_i|z_i) \\=log\prod\limits_{i=1}^M(1-y_i)^{1-t_i} \\=log\prod\limits_{i=1}^M(1-y_i) \\=\sum\limits_{i=1}^M log(1-y_i) \\=\sum\limits_{i=1}^M log(1-D(x_i)) \\=\sum\limits_{i=1}^M log(1-D(G(z_i))) \\=E_{z\sim p_{z}}log(1-D(G(z))) \\=E_{x\sim p_{model}}log(1-D(x))
minlogL(T,Z∣θG)=logi=1∏MP(ti∣zi)=logi=1∏M(1−yi)1−ti=logi=1∏M(1−yi)=i=1∑Mlog(1−yi)=i=1∑Mlog(1−D(xi))=i=1∑Mlog(1−D(G(zi)))=Ez∼pzlog(1−D(G(z)))=Ex∼pmodellog(1−D(x))
训练完 G ( z ) G(z) G(z)后,逻辑上可能认为G生成的图片已经得到要求了,因为D已经判断所有生成的图片为真。但是这是假设D是完美判别器的情况下,实际并不是这样。因此我们考虑提升D。或者另外一个思路是,G生成的图片有所提升但是依然很假。用这些生成的图片和天然图片进一步训练D,来提高D的区分能力。然后继续训练G,让D判断…
什么时候停止呢?可以想象的是G的生成会越来越真,直到和天然图片一样。这时候D无法判断,也就是输出0.5的概率值。此时停止。
因此有GAN中的复合优化函数:
min
G
max
D
E
x
∼
p
d
a
t
a
l
o
g
(
D
(
x
)
)
+
E
x
∼
p
m
o
d
e
l
l
o
g
(
1
−
D
(
x
)
)
\min\limits_{G}\max\limits_{D}E_{x\sim p_{data}}log(D(x))+E_{x\sim p_{model}}log(1-D(x))
GminDmaxEx∼pdatalog(D(x))+Ex∼pmodellog(1−D(x))
或者:
min
G
max
D
E
x
∼
p
d
a
t
a
l
o
g
(
D
(
x
)
)
+
E
z
∼
p
z
l
o
g
(
1
−
D
(
G
(
z
)
)
)
\min\limits_{G}\max\limits_{D}E_{x\sim p_{data}}log(D(x))+E_{z\sim p_{z}}log(1-D(G(z)))
GminDmaxEx∼pdatalog(D(x))+Ez∼pzlog(1−D(G(z)))