简介
上图中
P
G
P_G
PG和
P
d
a
t
a
P_{data}
Pdata我们都是不知道的,因此无法表示他们,故无法计算KL散度(Div表示KL Divergence)。GAN神奇的地方就是不直接计算两个概率分布的KL散度,而是通过判别器来解决这个问题,如上图中所示,引出目标函数
V
(
G
,
D
)
V(G,D)
V(G,D),通过最优化这个目标函数来达到最小化KL散度的目标。
理论:
m i n G m a x D V ( D , G ) = E x ∼ p d a t a ( x ) [ l o g D ( x ) ] + E z ∼ p ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] \mathop{min}\limits_{G}\mathop{max}\limits_{D}V(D,G)=E_{x\sim p_{data}(x)}[logD(x)]+E_{z\sim p_(z)}[log(1-D(G(z)))] GminDmaxV(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼p(z)[log(1−D(G(z)))]
其中 V V V表示Value, x x x表示真实数据, z z z表示噪声, G ( z ) G(z) G(z)表示生成器生成的样本, E E E表示期望。
D D D想增加这个值Value(通过对 D ( x ) D(x) D(x)输出1, D ( G ( z ) ) D(G(z)) D(G(z))输出0,即正确分类,使V接近0), G G G想减小这个值(通过让 D D D把 G ( z ) G(z) G(z)分为1,使V负无穷)。当二者达到纳什平衡时,它们各自达到最优。
注: D ( x ) ∈ ( 0 , 1 ) D(x)\in (0,1) D(x)∈(0,1), V ( D , G ) ∈ ( − ∞ , 0 ] V(D,G)\in (-∞,0] V(D,G)∈(−∞,0]。
实际:
根据前面价值函数 V(G,D) 的定义,我们需要求两个数学期望,即 E[log(D(x))] 和 E[log(1-D(G(z)))],其中 x 服从真实数据分布,z 服从初始化分布。但在实践中,我们是没有办法利用积分求这两个数学期望的,所以一般我们能从无穷的真实数据和无穷的生成器中做采样以逼近真实的数学期望,即:
m
i
n
G
m
a
x
D
V
~
(
D
,
G
)
=
1
m
∑
i
=
1
m
log
D
(
x
i
)
+
1
m
∑
i
=
1
m
log
(
1
−
D
(
G
(
z
i
)
)
)
\mathop{min}\limits_{G}\mathop{max}\limits_{D}\tilde{V}{(D,G)}=\frac{1}{m} \sum_{i=1}^{m} \log D\left(x^{i}\right)+\frac{1}{m} \sum_{i=1}^{m} \log \left(1-D\left(G(z^i)\right)\right)
GminDmaxV~(D,G)=m1i=1∑mlogD(xi)+m1i=1∑mlog(1−D(G(zi)))
训练时,分别固定 G G G,最大化 L ( D ) L(D) L(D)和固定 D D D,最小化 L ( G ) L(G) L(G)。
伪代码:
第一步我们训练D,D是希望V(G, D)越大越好,所以是加上梯度(ascending)。第二步训练G时,V(G, D)越小越好,所以是减去梯度(descending)。整个训练过程交替进行。
内循环 D D D的迭代次数 k k k也可以多于 G G G。因为有一个好的判别器才能引导生成器的学习。
参考:机器之心