Generative Adversarial Nets-生成对抗网络
- Abstract
- 1.Introduction
- 2.Related work
- 3.Adversarial nets
- 4.Theoretical Results
- 4.1全局最优 pg=pdatap_g=p_{data}pg=pdata
- 4.2算法1的收敛性质
- 5.Experiments
- 6.Advantagesa and disadvantages
- 7.Conclusions and future work
- 8.GAN-代码实现资料
- 8.1 pytorch 教程
- 8.2 简书教程
- 8.3 CSDN博客
- 8.4 pytorch 中文文档
GAN开篇之作2014年
Abstract
我们通过一个对抗过程( adversarial process)给估计生成模型(generative models)提出了一个新的框架(最后是为了取生成模型)。在这个新的框架中,我们同时训练两个模型:一个用于捕获数据分布的生成模型G,一个判别模型D,用于估计来自训练集数据而非模型G产生的数据的概率。生成模型G的训练过程:最大化判别模型D产生错误的概率(不懂),这个框架与最小化两人博弈相对应。在任意函数G和D的空间中,存在唯一解;其中,G恢复训练数据分布,D处处等于0.5。在G和D由多层感知机定义的情况下,整个系统可以利用BP算法进行训练。在训练模型或者生成样本的过程中,不需要马尔科夫链或展开近似推理网络( unrolled approximate inference networks)。通过定性和定量分析生成样本,实验结果展示了本框架的潜力。
1.Introduction
深度学习有希望发现丰富的,有层次的模型[2],这些模型表达了人工智能应用领域各种数据的概率分布,例如自然图像、语音音频波、自然语言库的符号等数据的概率分布。到目前为止,深度学习最显著的成功都涉及到判别式模型,这些判别式模型将高维、丰富的感官输入映射到类别标签[14,20]。这些惊人的成功主要依赖于BP算法和dropout算法的应用,特别是具有良好梯度的分段线性单元。深度生成模型的影响力很小,主要是由于:极大似然估计和相关策略中出现了难以解决的概率计算困难、很难利用生成上下文中使用分段线性单元获得的好处。我们提出了一个生成估计模型,分步解决这些困难。
本文提出的对抗网络框架,其中的生成模型类似于与对手对峙:判别式模型要区分样本是来自数据分布还是生成模型分布。(做一个生动的比喻:)生成模型可以认为类似于一个造假团队,试图生产假币而且在不被发现的情况下使用它;而判别模型类似于一个警察,试图检测假币。在这个博弈中的竞争驱使两个团队都改进他们的方法性能直至真品与伪造品难以辨别(目的是:让造假团队的技术达到真假难辨)。
本文提出的框架能够给 许多模型和优化算法 产生特定的训练算法。本文中,我们探索了一个特例:将随机噪声输入到多层感知器的生成模型、判别模型也是一个多层感知器。我们称这个特殊情况为对抗网络。在这情况下,我们可以利用高度成熟的BP算法和dropout算法[16]训练两个模型;以及利用前向算法通过生成模型,计算模型生成样本。(这个过程中)不需要近似推断和马尔科夫链条。
2.Related work
目前,大多数关于深度生成模型的工作都聚焦于 提供概率分布函数的 参数化规范 的模型上。可以通过最大化对数似然函数训练模型。在这个模型家族中,最成功的是深度玻尔兹曼机(Deep Boltzmann machine)[25]。这些模型通常具有难以处理的似然函数,因此需要对似然梯度进行大量的近似。这些困难促使“生成机器”的发展–即不明确表示似然性,但能够从所需分布生成样本的模型。生成随机网络[4]是生成机器的一个例子,它可以通过精确的反向传播而不是Boltzmann机器所需的大量近似来训练。这项工作通过消除生成随机网络中使用的马尔可夫链扩展了生成机器的概念。
我们的工作是通过 生成过程 反向传播导数,通过观察
limσ→0∇xEϵ∼N(0,σ2I)f(x+ϵ)=∇xf(x)\lim _{\sigma \rightarrow 0} \nabla_{\boldsymbol{x}} \mathbb{E}_{\epsilon \sim \mathcal{N}\left(0, \sigma^{2} \boldsymbol{I}\right)} f(\boldsymbol{x}+\epsilon)=\nabla_{\boldsymbol{x}} f(\boldsymbol{x}) σ→0lim∇xEϵ∼N(0,σ2I)f(x+ϵ)=∇xf(x)
我们开发这项工作时,并不知道金马和韦林[18]和雷森德等人[23]发展了更一般的随机反向传播规则,允许通过有限方差的高斯分布进行反向传播,并反向传播到协方差参数和均值。这些反向传播规则允许学习生成器的条件方差,在本文中,我们将其作为一个超参数处理。Kingma和Welling[18]和Rezende等人[23]使用随机反向传播训练变分自编码器(VAE)。与生成性对抗网络一样,变分自编码器将可微生成网络与第二个神经网络配对。与生成性对抗网络不同,vae中的第二个网络识别模型,执行近似推理工作。gans需要通过可见单元来微分,因此不能对离散数据建模;vae需要通过隐藏单元来微分,因此不能有离散的潜在变量。其他类似vae的方法也存在[12,22],但与我们的方法关系不大。
先前有些工作尝试使用判别准则来训练生成模型[29,13]。这些标准则对于深层生成模型来说是难以适用的。这些方法甚至很难用来对深度模型进行近似,因为它们涉及的概率比不能通过概率下界用变分推断来近似。噪声对比估计(nce)[13]涉及通过学习 使模型有助于从固定噪声分布 中区分数据 的权重 来训练生成模型。使用先前训练过的模型作为噪声分布,可以训练一系列高质量的模型。这可以看作是一种非正式的竞争机制,在核心类似于对抗性网络博弈中使用的正式竞争。NCE的关键局限性在于它的“鉴别器”是由噪声分布的概率密度和模型分布的概率密度之比来定义的,因此它需要具有评估和反向传播两种密度的能力。
以前一些工作已经使用过两个神经网络竞争的概念。最相关的工作是可预测性最小化[26]。在可预测性最小化中,神经网络中的每个隐藏单元都被训练成不同于第二个网络的输出,后者根据所有其他隐藏单元的值来预测该隐藏单元的值。本文工作与可预测性最小化有三个重要的区别:1)本工作中,网络间的竞争是唯一的训练准则,它本身就足以训练网络。可预测性最小化只是一种正则化方法,它鼓励神经网络的隐单元在完成其他任务时在统计上独立,而不是一个主要的训练准则。2)竞争的性质不同。在可预测性最小化中,比较了两个网络的输出,一个网络试图使输出相似,另一个网络试图使输出不同。所以其输出是标量。在gans中,生成器网络产生一个丰富的高维向量,用作另一个网络的输入,并试图选择另一个网络不知道如何区分的输入。3)学习过程的规格不同。**可预测性极小化是一个目标函数最小化的优化问题,学习方法是使目标函数的最小化。**GANS 是基于一个极大极小博弈,而不是一个优化问题,它具有一个agent寻求最大化而另一个agent寻求最小化的价值函数。博弈在一个鞍点结束,这个鞍点对于一个玩家的策略是最小的,对于另一个玩家的策略是最大的。
生成性对抗网络有时与“对抗性例子”的相关概念混淆[28]。**对抗性的例子 是通过直接对分类网络的输入使用 基于梯度的优化 来找到的例子,以便找到与数据相似但又被错误分类的例子。**这与目前的研究不同,因为对抗性的例子不是一种培养生成模型的机制。相反,对抗性的例子主要是一种分析工具,用来显示神经网络以有趣行为,通常以高度的自信地将两幅图像分为两类,即使人类观察者无法察觉它们之间的差异。这些对抗性例子的存在确实表明,生成性对抗性网络训练可能效率低下,因为它们表明,现代的鉴别网络可以自信地识别一个类,而不必模仿该类的任何人类可感知属性(人类肉眼区分的依赖特征)。
3.Adversarial nets
当(生成模型和判别模型)都是多层感知器时,对 抗模型框架 能够被直接应用。为了学习 生成器 在 数据 xxx 的分布,我们在输入噪声变量 pz(z)p_z(z)pz(z) 的(基础)上定义了一个先验,将 数据空间 的映射 表达成 G(z;θg)G(z;\theta_g)G(z;θg),其中GGG是由多层感知器表示的可微函数,参数为θg\theta_gθg。我们还定义了第二个多层感知器D(X;θd)D(X;\theta_d)D(X;θd),它的输出是一个简单的标量。D(x)D(x)D(x)表l示x来自数据而不是pgp_gpg的 概率。我们训练DDD,以最大化给训练样本和G产生的样本打上正确标签概率。我们同时训练GGG最小化log(1−D(G(Z)))log(1-D(G(Z)))log(1−D(G(Z)))。换一句话说,DDD和GGG使用值函数V(G,D)V(G,D)V(G,D)‘开展’一下的双人最小最大博弈:
(minGmaxDV(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))](1)(\min_G\max_DV(D,G)=E_{x\sim p_{data}(x)}[logD(x)]+E_{z\sim p_z(z)}[log(1-D(G(z)))]\tag 1 (GminDmaxV(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))](1)
在下一节中,我们会展示对抗网络的理论分析,基本上显示:训练标准允许人们恢复数据的生成分布,因为GGG和DDD被赋予足够的容量(enough capacity) ,例如,在非参数限制中。本方法的不太正式,更具教学意义的解释,请参见图1。实际中,我们需要使用迭代的数值方法来是实施博弈。在训练的内层循环中‘优化D到完成(完美)’在计算上是不可能实现的,并且在有限数据集合上会导致过拟合。相反,我们在’k步优化D’与‘一步优化G’之间交替进行。这一处理方式,只要G变换的足够慢;就能使得D保持接近他的最优解。这一过程在算法1中正式呈现。
在实际中,等式1可能无法为‘G学习到足够好’提供足够的梯度。在学习之初,当G的性能很差时,D可以‘有高自信’地拒绝样本;因为这些样本与训练数据明显不同。在这种情况下,log(1−D(G(z)))log(1-D(G(z)))log(1−D(G(z)))是饱和的。我们可以训练G去最大化log(D(G(z)))log(D(G(z)))log(D(G(z))),而不是训练G去最小化log(1−D(G(z)))log(1-D(G(z)))log(1−D(G(z)))。该目标方程 导致了 G和D的相同的动力学固定点,但是,在早期学习的时候提供更强的梯度。
4.Theoretical Results
生成器G隐含地将概率分布pgp_gpg定义为当z∼pzz\sim p_zz∼pz时所获得的样本G(z)的分布。因此,如果给定足够的容量和训练时间,我们希望 算法1收敛至pdatap_{data}pdata的良好预期。这个部分的结果是在非参数设定中完成的,例如,我们通过研究概率密度函数空间的收敛性 来 表示具有 有限容量的模型。
我们会在4.1节中展示这个最小最大化博弈对于pg=pdatap_g=p_{data}pg=pdata有一个全局最优。我们会在4.2节展示算法1优化等式1,从而获得期待的结果。
图1:通过同时更新判别分布(D蓝色,虚线)来训练生成对抗网络,以便区分来自数据产生分布(黑,虚线)pxp_xpx 与 模型产生的分布(绿色,实线)pg(G)p_g(G)pg(G)。下面的水平线是z 的采样域,(图示)这种情况下是均匀的,上面的水平线是x域的一部分。向上的箭头显示了映射x=G(z)x=G(z)x=G(z)如何对变换样本施加非均匀分布。G在高密度区域收缩,在低密度区域扩展。再解释4个图。
4.1全局最优 pg=pdatap_g=p_{data}pg=pdata
首先固定G,寻求D使,GAN目标函数V(G,D)V(G,D)V(G,D)最大化。等价于求pdatap_{data}pdata与pgp_gpg之间的JS散度。
固定D∗D^*D∗,寻求G使得V(G,D∗)V(G,D^*)V(G,D∗)最小,就是使pdatap_{data}pdata与pgp_gpg之间的JS散度最小化,当pg=pdatap_g=p_{data}pg=pdata,V(G,D∗)V(G,D^*)V(G,D∗)最小。
4.2算法1的收敛性质
理论分析:严格按照4.1求解,pgp_gpg会收敛于pdatap_{data}pdata。但是采用迭代优化时,求出最优的D∗D^*D∗之后,迭代一步G0−>G1G_0->G_1G0−>G1,此时D∗D^*D∗不是V(G1,D)V(G_1,D)V(G1,D)的最大值,那么,继续迭代将会愈加偏离收敛目标。且迭代找到最优值需要的次数很多,所以,在实际算法中,没更新k次判别器后更新一次生成器。虽然pgp_gpg不会严格收敛于pdatap_{data}pdata,但是,生成器的效果已经能够符合人么的需求。
5.Experiments
我们用一系列数据集训练了对抗网络,包括 MNIST [23],多伦多人脸数据库(TFD)[28]和CIFAR-10 [21]。 生成网络使用线性激活[19,9]和 S 形激活的混合激活层,而判别网络使用 Maxout[10]激活。随机丢弃算法(Dropout)[17]用于训练判别网络。 虽然我们的理论框架允许在生成器的中间层使用压差和其他噪声,但我们使用噪声作为生成网络最底层的输入。.
我们通过将高斯 Parzen 窗口拟合到用 G 生成的样本并在该分布下报告对数似然来估计测试集数据在pgp_gpg下的概率。参数σ通过验证集上的交叉验证获得高斯算子。 该程序在 Breuleux 等人的研究中[8]引入并用于各种生成模型,其确切的可能性是不易处理的[25,3,5]。实验结果 显示在表 1 中。这种估计概率的方法具有稍高的方差,并且在高维空间中表现不佳,但它是我们所知的最佳方法。 可以采样但不能估计概率的生成模型的进步直接激发了对如何评估此类模型的进一步研究。
6.Advantagesa and disadvantages
与以前的建模框架相比,这个新框架具有优点和缺点。缺点主要在于没有pg(x)p_g(x)pg(x)的明确表示,并且 D 在训练期间必须与 G 很好地同步(特别是,在不更新 D 的情况下,G 不得过多训练,以避免“Helvetica 场景” “其中 G 将太多的 z 值折叠到 x 的相同值以具有足够的多样性来模拟pdatap_{data}pdata ”,就像Boltzmann 机器的负链必须在学习步骤之间保持最新一样。优点是永远不需要马尔可夫链,只有反向传播,学习期间不需要推理,并且可以将多种功能合并到模型中。表 2 总结了生成对抗网络与其他生成建模方法的比较。
上述优点主要是在计算上。对抗模型也可能从生成网络中获得一些统计优势,而不是直接用数据示例更新,而是仅通过流经判别器的梯度。这意味着输入的组件不会直接复制到生成器的参数中。对抗性网络的另一个优点是它们可以表示非常尖锐,甚至是较为初始的分布,而基于马尔可夫链的方法要求分布有些模糊,以便链能够在模式之间混合.
7.Conclusions and future work
该框架有许多直接的扩展 :
1.条件生成模型p(x∣c)p(x|c)p(x∣c): 可以通过将 c 作为 G 和 D 的输入来得到这个后验概率 。
2.给定 x,可以通过训练一个辅助的网络来学习近似推理,达到预测 z 的目的。这和 wakesleep 算法[15]训练出的推理网络类似,但是它具有一个优势,就是在生成器训练完成后,这个推理网络可以针对固定的生成器进行训练。
3.可以通过训练共享参数的条件模型族来近似地对所有条件概率p(xs∣xs′)p(x_s|x_{s'})p(xs∣xs′)进行建模,其中 S是 x 下标的子集。本质上,可以使用敌对网络来实现确定性 MP-DBM[11]的随机扩展。
4.半监督学习:当有限的标签数据可用时,来自鉴别器或推理网络的特征可以改善分类器的性能。
5.改善效率:通过为协调 G 和 D 设计更好的方法,或在训练期间确定更好的分布来采样 z,能够极大的加速训练。
本文已经展示了对抗模型框架的可行性,表明这些研究方向是有用的。
8.GAN-代码实现资料
自2014年GAN一文发布以来,网上出现了各种各样GAN的变体。原文网络结构:D和G均采用多层感知器,但是具体代码实现没找到。以下整理了4个最基本的GAN架构实现的教程与代码。
8.1 pytorch 教程
pytorch 教程中有DGGAN的例子代码,主要是处理人脸生成问题。英文教程,英文注释代码,G与D用深度卷积神经网络搭建。
官网教程:
https://pytorch.org/tutorials/beginner/dcgan_faces_tutorial.html
github资料:
https://github.com/pytorch/tutorials/blob/master/beginner_source/dcgan_faces_tutorial.py
https://github.com/pytorch/examples/blob/master/dcgan
8.2 简书教程
莫烦的简书教程(一如既往的好),主要实现给定上下界之后,曲线生成问题。中文教程,曲线拟合问题比较简单,用两层感知器搭建G与D.
https://morvanzhou.github.io/tutorials/machine-learning/torch/4-06-GAN/
https://github.com/MorvanZhou/PyTorch-Tutorial/blob/master/tutorial-contents/406_GAN.py
8.3 CSDN博客
CSDN博客,手写数字生成代码实现。中英参半的教程,图片代码,D和G都用多层感知器搭建。
https://blog.csdn.net/IAMoldpan/article/details/78711426
8.4 pytorch 中文文档
pytorch 中文文档中的一篇教程。手写数字生成代码实现,中文教程,图片代码,D和G都用多层感知器搭建。3和4的结构稍有不同,但是在输入数据时,肯定得先将图片变成向量才能输入。
https://ptorch.com/news/14.html