在对抗网络中,生成模型与判别相竞争,判别模型通过学习确定样本是来自生成模型分布还是原始数据分布。生成模型可以被认为是类似于一组伪造者,试图产生假币并在没有检测的情况下使用它,而判别模型类似于警察,试图检测假币。 在这个游戏中的竞争驱动两个团队改进他们的方法,直到假冒与真正的物品难以分别。
生成模型和判别模型对抗的结果是,两者都提升了自己的能力。生成模型提高了模拟原始数据分布的能力,判别模型提高了分辨的能力。
GAN之所以叫生成对抗网络,是因为判别模型和生成模型都是用的神经网络模型,如果选择其他模型的话,可能就要叫GAXX了
“生成模型”表示任何一种可以接受训练集(从一个分布$$ p_{data} $$
采样的样本)学会表示该分布的估计的模型。其结果是一个概率分布$$p_{model}$$
。有些时候,模型会显式地估计$$p_{model}$$
,比如说图上半部分所示。还有些时候,模型只能从 $$p_{model}$$
中生成样本,比如说图下半部分。有些模型能够同时这两件事情。虽说 GANs 经过设计可以做到这两点,我们这里把精力放在 GANs 样本生成上。
- 作者虽然说GANs可以都做,但是现在的应用一般都是在样本生成上
- 关于判别模型和生成模型的区别,请参考《统计学习方法》第17-18页
上图是作者将要与GAN比较的集中生成模型
GANs是针对其他生成式模型的缺点进行设计的:
作者原话:GANs were designed to avoid many disadvantages associated with other generative models,相当直白,毫不客气
GANs 的基本思想是设置两个参与人的博弈。其中一个是生成器(generator)。生成器的目的产生来自和训练样本一样的分布的样本(制作跟真币一样的假币)。另外一个判别器(discriminator)。判别器检查这些样本来确定他们是真实的还是伪造的(识别真币和假币)。判别器使用传统的监督学习技术进行训练,将输入分成两类(真实的或者伪造的)。生成器训练的目标就是欺骗判别器。
博弈中的两个参与人由两个函数表示,每个都是关于输入和参数可微分的。判别器是一个以 x (真实数据)作为输入和使用 θ(D) 为参数的函数 D 定义。生成器由一个以 z(噪音数据即假数据) 为输入使用 θ(G) 为参数的函数 G 定义。
双方的 costfunction 都有双方定义的参数。判别器希望仅控制住 θ(D) 情形下最小化 J(D)(θ(D),θ(G)) 。生成器希望在仅控制 θ(D) 情形下最小化 J(G)(θ(D),θ(G)) 。因为每个人的 costfunction 都依赖于另一个人的参数,但是每个人都不能控制别人的参数,这个场景其实更为接近一个博弈而非优化问题。优化问题的解是一个局部最小,而一个博弈的解是一个纳什均衡。在这样的设定下,Nash 均衡是一个元组, (θ(D),θ(G)) 既是关于 θ(D) 的 J(D) 的局部最小值和也是关于 θ(G) 的 J(G) 局部最小值。
生成器是一个可微分函数 G 。当 z 从某个简单的先验分布中采样出来时, G(z) 产生一个从 pmodel 中的样本 x 。一般来说,深度神经网络可以用来表示 G 。注意函数 G 的输入不需要和深度神经网络的第一层的输入相同;输入可能放在网络的任何地方。例如,我们可以将 z 划分成两个向量 z(1) 和 z(2) ,然后让 z(1) 作为神经网络的第一层的输入,将 z(2) 作为神经网络的最后一层的输入。如果 z(2) 是 Gaussian,这就使得 x 成为 z(1) 条件高斯。另外一个流行的策略是将噪声加到或者乘到隐含层或者将噪声拼接到神经网络的隐含层上。总之,我们看到其实对于生成式网络只有很少的限制。如果我们希望 pmodel 是 x 空间的支集(support),我们需要 z 的维度需要至少和 x 的维度一样大,而且 G 必须是可微分的,但是这些其实就是仅有的要求了。特别地,注意到使用非线性 ICA 方法的任何模型都可以成为一个 GAN 生成器网络。GANs 和变分自编码器的关系更加复杂一点;一方面 GAN 框架可以训练一些 VAE 不能的训练模型,反之亦然,但是两个框架也有很大的重合部分。 最为显著的差异是,如果采用标准的反向传播,VAEs 不能在生成器输入有离散变量,而* GANs 不能够在生成器的输出层有离散变量。*
训练过程包含同时随机梯度下降 simultaneous SGD。在每一步,会采样两个 minibatch:一个来自数据集的 x 的 minibatch 和一个从隐含变量的模型先验采样的 z 的 minibatch。然后两个梯度步骤同时进行:一个更新 θ(D) 来降低 J(D) ,另一个更新 θ(G) 来降低 J(G) 。这两个步骤都可以使用你选择的基于梯度的优化算法。 Adam (Kingmaand Ba, 2014) 通常是一个好的选择。
很多作者推荐其中某个参与人运行更多步骤(包括14年的文章上,算法过程在上图),但是在 2016 年的年末,观点是最好的机制就是同时梯度下降,每个参与人都是一步。
下面这张图可能更加容易理解训练过程
训练对抗的生成网络时,同时更新判别分布(D,蓝色虚线)使D能区分数据生成分布
目前为 GANs 设计的所有不同的博弈针对判别器 J(D) 使用了同样的代价函数。他们仅仅是生成器 J(G) 的代价函数不同。
其实就是标准的训练一个 sigmoid 输出的标准的二分类器交叉熵代价。唯一的不同就是分类器在两个 minibatch 的数据上进行训练;一个来自数据集(其中的标签均是 1),另一个来自生成器(其标签均是 0)。
GAN 博弈的所有版本都期望判别器能够最小化(8)式。所有情况下,判别器有同样最优策略。
最简单的博弈版本是零和博弈,其中所有参与人的代价总是 0。在这个版本的博弈中
在 minimax 博弈中用在生成器上的代价对理论分析很有用但是在实践中表现很糟糕。
最小化目标类和分类器预测的分布的交叉熵是很高效的,因为代价不会在分类器有错误的输出的时候饱和。最终代价会饱和到 θ ,但是仅仅是在分类器选择了正确的类标的情况下。
在 minimax 博弈中,判别器最小化交叉熵,但是生成器是最大化同一个交叉熵。这对于生成器是不利的,因为判别器成功地以高置信度反对生成器产生的样本时,生成器的梯度会消失。
为了解决这个问题,一种方式是继续使用交叉熵来最小化生成器。不过我们不是去改变判别器代价函数的正负号来获得生成器的代价。我们是将用来构造交叉熵代价的目标的正负号。所以,生成器的代价函数就是:
我们可能能够使用 GANs 进行最大似然学习,这就意味着可以最小化数据和模型之间的 KL 散度
有很多中方式能够使用 GAN 框架来近似(4)式:
上述不同损失函数的比较:
最大的缺点就是训练困难,导致无法收敛和模式崩溃
现在 GAN 面临的最大问题就是不稳定,很多情况下都无法收敛(non-convergence)。原因是我们使用的优化方法很容易只找到一个局部最优点,而不是全局最优点。或者,有些算法根本就没法收敛。
模式崩溃(mode collapse)就是一种无法收敛的情况,这在 Ian 2014 年的首篇论文中就被提及了。比如,对于一个最小最大博弈的问题,我们把最小(min)还是最大(max)放在内循环?minmax V(G,D) 不等于 maxmin V(G,D)。如果 maxD 放在内圈,算法可以收敛到应该有的位置,如果 minG 放在内圈,算法就会一股脑地扑向其中一个聚集区,而不会看到全局分布
不过值得庆幸的是,现在已经有算法解决这些问题,这也是2016年GAN才火的一个原因吧
github上有人总结的GAN的文章:AdversarialNetsPapers
Generative Adversarial Nets
NIPS 2016 Tutorial: Generative Adversarial Networks
GAN之父NIPS 2016演讲现场直击:全方位解读生成对抗网络的原理及未来