作者指出,深度学习的目的旨在建立能够表示人造的具体应用中的数据分布的模型。为了避免极大似然估计和相关策略中的可能性计算逼近问题,提出GAN:由生成模型和判别模型组成,其中生成模型负责伪造数据,而判别模型负责检测样本服从模型分布还是原始数据分布。
本文主要研究生成模型通过多层感知器传输随机噪声来生成样本,判别模型也是多层感知器的情况。
Adversarial nets
为了学习生成器在数据x上产生的分布,对输入噪声变量定义一个先验函数
,再定义一个到数据空间的映射
,其中G表示一个带有参数
的多层感知器表示的可微函数。同时定义一个多层感知器
输出一个单一标量。D(x)表示x来源于数据而不是生成器产生的分布
。我们训练D以最大化对训练样本和G的生成样本同时分配正确标签的可能性。同时训练生成器G以最小化
,即:
训练时采用对判别网络D进行K次优化然后对生成网络G进行一次优化的迭代过程。训练早期时,G比较弱,因此D能轻易判别出G的生成样本,因此趋于饱和,而G更偏向于最大化
。这样的形式使得在早期也有较大的梯度。
原文给出了图例直观说明:
黑点是数据原始分布,绿线是生成器G生成的数据,蓝线是判别器D输出分布
图a是生成数据和原始数据分布相似但判别器D不够准确的情况;图b在a基础上D收敛后的效果;图c是在b基础上G收敛后的情况;图d是最终训练结束后的情况。
以下给出理论说明:
对于固定的生成器G,最优判别器D可以达到:
对此的证明:
对于给出的生成器G,D的训练准则时最大化V(G,D):
而对于任意(a,b),函数
在[0,1]区间内在a/(a+b)取得最大值(可以用简单的求导证明)
而对于训练判别网络D的目的可以解释为最大化条件概率P(Y=y|x),Y表示x来自(y=1)或者
(y=0),这样先前的公式可以表示为:
当时,C(G)达到最小值-log4。
因此写成:
的相对熵形式,其中KL(Kullback–Leiblerdivergence)是相对熵函数:
而用JS散度(Jensen–Shannon divergence)表示:
其中
而两个分布之间的JS散度非负(当且仅当同分布取0),因此C(G)全局最小取值-log4。
而当判别器D训练过后,根据最大化准则
训练G使得向
收敛。
对于具体loss计算,关键代码段如下(来源https://github.com/wiseodd/generative-models/blob/master/GAN/vanilla_gan/gan_tensorflow.py):
D_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_real, labels=tf.ones_like(D_logit_real)))
D_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_fake, labels=tf.zeros_like(D_logit_fake)))
D_loss = D_loss_real + D_loss_fake
G_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_fake, labels=tf.ones_like(D_logit_fake)))
其中D_logit_real和D_logit_fake分别是输入样本(真实手写数字)和生成的假样本(代码中输入是在-1与1之间的均匀分布)的logits
对于具体实现见以下代码解析:
https://blog.youkuaiyun.com/jiongnima/article/details/80033169
至于更多解释见http://m.sohu.com/n/478052180/