@sambodhi
2018-02-06T15:36:42.000000Z
字数 5963
阅读 6250
作者|Prakash Pandey
译者|Sambodhi
编辑|Debra Chen
AI前线导语:近年来,深度生成模型(Deep Generative Models)取得了令人瞩目的成功。其中有两种强大的深度生成模型学习框架:变分自编码器(Variational Autoencoders,VAE)和生成对抗网络(Generative Adversarial Networks,GAN),这是两种不同的范式。VAE的好处是可以通过编码解码的步骤,直接比较重建图片和原始图片的差异,而这一点GAN做不到。VAE的劣势是没有使用对抗网络,因此会更趋向于产生模糊的图片。为了了解深度生成模型的两种方法工作机制,AI前线翻译了Prakash Pandey撰写的博文[1],有助于读者进一步了解VAE和GAN的方方面面。
更多干货内容请关注微信公众号“AI前线 ”,(ID:ai-front)
生成模型是一种利用无监督学习来学习任何类型的数据分布的强有力方法,它在短短几年内取得了巨大的成功。所有类型的生成模型都致力于学习训练集的真实数据分布,从而产生具有一些变化的新数据点。但我们并不总能够隐式或显式地了解我们数据的确切分布。因此,我们要试图建立一个与真实数据分布尽可能相似的分布建模。为此,我们可以利用神经网络的能力来学习一个函数,它可以将模型分布逼近真实分布。
最常用、最有效的两种方法是变分自编码器(Variational Autoencoders,VAE)和生成对抗网络(Generative Adversarial Networks,GAN)。VAE的目标是最大限度降低数据对数似然(log-likelihood)的下限,而GAN的目标是实现生成器(Generator)和判别器(Discriminator)之间的平衡。在本文中,作者将解释VAE和GAN的工作及它们背后的直觉。
假设读者已经熟悉vanilla autoencoder的工作机制。我们知道,我们可以使用自编码器将输入图像编码为更小的维度表示,它可以存储关于输入数据分布的潜在信息。但是在一个vanilla autoencoder中,编码向量只能通过解码器映射到相应的输入。它当然不能用于生成具有可变性的相似图像。
AI前线: vanilla是神经网络领域的常见词汇,比如Vanilla Neural Networks、Vanilla CNN等。Vanilla本意是香草,在这里基本等同于raw。比如Vanilla Neural Networks实际上就是BP神经网络,而Vanilla CNN实际上就是最原始的CNN。
为了实现这一点,模型需要学习训练数据的概率分布。VAE是一种最流行的学习复杂数据分布的方法,它使用无监督的方式使用神经网络。这是一个基于贝叶斯推理(Bayesian inference)的概率图模型。该模型的目的是了解训练数据集数据的潜在概率的分布,以便能够很容易地从所学的分布中采样新的数据。我们的想法是学习一种被称为隐变量(latent variables)的训练数据的低维潜在表示(这些变量不是直接观察到的,而是通过数学模型推导出来的),我们假设这些变量产生了我们实际的训练数据。这些隐变量可以存储模型需要生成的输出类型的有用信息。隐变量z的概率分布用P(z)表示。选择高斯分布(Gaussian distribution)作为学习分布P(z)的先验,以便在推理时方便采样新的数据点。
现在主要目标是用一些参数对数据进行建模,这最大化了训练数据X的可能性。简而言之,我们假设一个低维的特征向量(latent vector)产生了我们的数据x(x∈X),我们可以用一个确定函数f(z;θ)将这个特征向量映射到数据x上然后评估(见图1)。在这种生成过程中,我们的目标是最大化X中每个数据的概率,
Pө(X) = ∫Pө(X, z)dz = ∫Pө(X|z)Pө(z)dz (1)
在这里,f(z;θ)已被分布Pө(X|z)取代了。
这个极大似然估计(maximum likelihood estimation)背后的直觉是,如果模型可以从这些隐变量产生训练样本,那么它也可以产生具有一些变化的相似样本。换句话说,如果我们从P(z)中抽取大量的隐变量,并从这些变量中生成x,则生成的x应与数据分布Pdata(x)相匹配。现在我们有两个问题需要回答。如何捕捉隐变量的分布以及如何将方程1整合到z的所有维上?
显然,手动指定我们想要在特征向量中编码的相关信息以生成输出图像是一项繁琐的任务。相反,我们依靠神经网络来计算z,假设这个特征向量可以很好地近似为正态分布,以便在推理时很容易地进行采样。如果我们在n维空间中有z的正态分布,那么就可以用一个足够复杂的函数来生成任何类型的分布,并且可以使用此函数的逆来学习隐变量本身。
在方程1中,积分在z的所有维上进行,因此难以处理。但是,它可以使用蒙特卡罗积分(Monte-Carlo integration)方法来计算,这不容易实现。所以我们采用另一种方法来近似地最大化方程1中的Pө(X) 。VAE的想法是使用我们不知道的P(z|X)来推断P(z)。我们使用一种称为变分推断(variational inference)的方法来推断P(z|X),这种方法基本上是贝叶斯统计(Bayesian statistics)中的一个优化问题。我们首先用易于发现的简单分布Q(z|X)对P(z|X)进行建模,我们试着用KL散度度量(KL-divergence metric)方法来尽量减小P(z|X)和Q(z|X)之间的差异,从而使我们的假设接近真实的分布。接下来是大量的数学方程,笔者不再赘述,如你有兴趣可在原文中找到它。如果你有了VAE的直觉,这些方程就不难理解了。
VAE的最终目标是:
上面的方程有一个非常好的解释。术语Q(z|X)基本上是我们的编码器网络,z是我们对数据x(x∈X)的编码表示,P(X|z)是我们的解码器网络。因此,在上面的方程中,我们的目标是在D_KL[Q(z|X)||P(z|X)],在某些误差下,极大似然估计数据分布。由于P(z|X)不易处理,但KL散度项≥0,因此很容易看出VAE试图最小化log(P(X))的下界。这和最大化E[logP(X|z)]和最小化D_KL[Q(z|X)||P(z|X)]是一样的。我们知道最大化E[logP(X|z)]是一个极大似然估计,并使用解码器网络进行建模。正如我前面说过的,我们希望我们的潜在表示接近于高斯函数,因此我们假设P(z)为N(0,1)。按照这个假设,Q(z|X)也应该接近这个分布。如果我们假设它是具有参数μ(X)和Ʃ(X)的高斯分布,则由KL散度给出的这两个分布(即P(z)和Q(z|X))之间的差异导致的误差的封闭形式的解,解决方案如下:
我们优化了较低的变分边界,优化函数是:
log(P(X|z))−D_KL[Q(z|X)‖P(z)],第二个解如上图所示。
因此,我们的损失函数将包含两项。第一个是输入到输出的重建损失,第二个损失是KL散度项。现在我们可以使用反向传播(Backpropagation)算法来训练网络。但是有一个问题,第一项不仅依赖于P的参数,也依赖于Q的参数,但是这个依赖性并没有出现在上面的方程中。所以我们如何从分布Q(z|X)或N[μ(X), Ʃ(X)]中随机穿过我们抽样的层z,以便P可以解码。渐变不能流过随机节点。我们使用重新参数化技巧(见图所示)使网络可微。我们从N(μ(X), Σ(X))中抽样ε∼N(0,I),然后计算z=μ(X)+Σ1/2(X)∗ε。
图2中显示的非常完美。应该注意的是,前馈步骤对于这两个网络(左侧和右侧)都是相同的,但是渐变只能通过正确的网络进行反向传播。
在推断时,我们可以简单地从N(0,1)中采样z并将其馈送到解码器网络以生成新的数据点。由于我们正在优化较低的变分边界,因此生成的图像的质量相对于像生成对抗网络(Generative Adversarial Networks,GAN)这样的最新技术来说是比较差的。
VAE最好的一点是它同时学习生成模型和推理模型。虽然VAE和GAN都是非常令人兴奋的方法,它们都可以使用无监督学习来学习基础数据分布,但与VAE相比,GAN能产生更好的结果。在VAE中,我们优化了较低的变分边界;而在GAN中,没有这样的假设。事实上,GAN并不处理任何显式的概率密度估计。VAE在生成清晰图像方面的失败意味着模型无法学习真实的后验分布。VAN和GAN主要在训练方式上有所不同。现在让我们进入生成对抗网络。
Yann LeCun说,对抗训练是有史以来最酷的东西。我想大多数人都会同意他的观点,因为我们都看到了对抗网络的广为流行,以及它们所产生的的结果和质量。对抗训练完全改变了我们教会神经网络做特定任务的方式。生成对抗网络不使用任何显式的密度估计,如变分自编码器。相反,它是基于博弈论(game theory)的方法,目的是在两个网络,生成器和判别器之间的纳什均衡(Nash equilibrium)。这个想法是从一个简单的分布,比如高斯分布,然后学习利用通用函数逼近器(如神经网络)将噪声转化为数据分布。
这是通过这两个网络的对抗训练来实现的。生成器(Generator)模型G学习捕捉数据分布,判别器(Discriminator)模型D估计样本来自数据分布而非模型分布的概率。基本上,生成器的主要任务是生成自然的图像,而判别器的任务是判断图像是假的还是真实的。这可以认为是一款迷你max的双人游戏,随着时间的推移,两个网络的性能都会提高。在这个游戏中,生成器试图通过生成真实图像来欺骗判别器,并通过提高其识别能力来避免被判别器迷惑。下图显示了GAN的基本架构。
我们定义一个先验输入噪声变量P(z),然后生成器将其映射到使用具有参数өg的复微分函数的数据分布。除此之外,我们还有另一个网络称为判别器,它接受输入x并使用另一个带参数的微分函数。输出表示x来自真实数据分布Pdata(x)的概率的单个标量值。GAN的目标函数被定义为:
在上面的方程中,如果判别器的输入来自真实的数据分布,那么D(x)应该输出1来最大化上述关于D的目标函数,如果图像是由生成器生成的,那么D(G(z))应该输出1,以使关于G的目标函数最小化。从本质上说,G应该生成这样的显示图像,它可以欺骗D。采用梯度上升法(Gradient Ascent)使有关判别器的参数最大化,采用梯度下降法(Gradient Descent)最小化有关生成器的参数。但是在优化生成器目标方面存在一个问题,在游戏开始时,生成器还没有学到任何东西时,梯度通常非常小,当运行良好时,梯度非常高(见图4)。但我们想要的是相反的行为。因此,我们将E[log(D(G(z))]最大化,而不是最小化E[log(1-D(G(z))]。
训练过程包括随机梯度下降(Stochastic Gradient Descent)对判别器和生成器的同步应用。在训练过程中,我们交替优化D的k级步骤和小批量上优化G的一步。当判别器无法区分ρg和ρdata时,即D(x,өd)=½或者ρg=ρdata时,则停止训练过程。
GAN应用卷积神经网络最早的模型之一是DCGAN,它代表了深度卷积生成对抗网络(Deep Convolutional Generative Adversarial Networks,DCGAN)。该网络从均匀分布中提取的100个随机数作为输入,并输出所需形状的图像。该网络由许多卷积、反卷积和完全连通的层组成。网络使用许多反卷积层将输入噪声映射到所需的输出图像。批量标准化用于稳定网络的训练。除了使用tanh层和Leaky ReLU的输出层外,所有层都使用ReLU激活。该网络使用小批量随机梯度下降法进行训练,并使用Adam优化器来加速训练,对超参数进行优化。这篇论文的结果很有趣。作者指出,这些生成器具有又去的向量运算性质,可以用我们想要的方式来处理图像。
GAN使用最广泛的变体之一是有条件的GAN(conditional GAN,cGAN),它是通过简单地将条件向量与噪声向量一起添加而构成的(见图7)。在cGAN之前,我们从随机的噪声样本z中随机生成图像。如果我们想要生成具有某些所需特征的图像,有没有什么方法可以为模型提供额外的信息,无论我们想要生成什么样的图像?答案是肯定的,有条件的GAN是这样做的。通过对提供给生成器和判别器的附加信息调整模型,可以指导数据生成过程。有条件的GAN用于各种任务,如文本到图像的生成、图像到图像的转换、图像的自动标记等。下图显示了这两个网络的统一结构。
GAN的一个很酷的地方就是,即使训练数据很小,也可以进行训练。确实,GAN的结果是有希望的,但训练过程并不简单,尤其是建立网络的超参数。此外,GAN很难进行优化,因为它们不容易收敛。当然,有一些技巧和窍门来破解GAN,但它们可能并非总是有用的。你可以访问https://github.com/soumith/ganhacks
找到一些建议。另外,除了检查生成的图像是否看上去很真实之外,我们对结果的定量评价没有任何标准。
深度学习模型在监督学习中确实达到了人类水平的表现,但在无监督学习中却不是这样。尽管如此,研究深度学习的科学家们正在努力改进无监督模型的性能。在这篇博文中,我们看到了两个最著名的无监督学习框架的生成模型是如何工作的。我们了解了变分自编码器的问题,以及为什么对抗网络能更好地生成逼真的图像。但是GAN也存在一些问题,比如稳定它们的训练,这仍然是一个活跃的研究领域。然而GAN非常强大,目前它们正被用于高质量图像(参见以下视频)和视频生成、文本到图像的转换、图像增强、图像中物体3D模型重建、音乐生成、发现抗癌药物等等。除此之外,许多深度学习研究人员也在努力统一这两种模型,并使这两种模型得到最好的结果。随着深度学习的不断提高,我相信GAN将会打开人工智能的封闭之门。在接下来的几年里,生成模型将对于图形设计、设计有吸引力的用户界面等非常有帮助。也可能会使用生成对抗网络来生成自然语言文本。
视频:
https://v.qq.com/x/page/t0547w6fb1p.html
[1]:Deep Generative Models
https://towardsdatascience.com/deep-generative-models-25ab2821afd3