Deep Generative Model1--VAE

1.VAE(Variational auto-encoder)

首先我们思考一下,为什么我们需要VAE? 或者说Auto-encoder有什么问题?首先我们需要明确我们的目标,我们需要的是一个图像生成模型,也就是说在给定维度下的任意一个code,通过decoder都应该产生一张清晰且符合逻辑的图片。但是,仅仅通过auto-encoder类的模型是无法实现任意这一条件的。下面引用李宏毅老师机器学习Deep Generation Model课件中的例子来做解释。

在这里插入图片描述
从上面的图中,假如我们使用了一个deep auto-encoder 模型,对于给定的几张图片,下方的全月图和半月图,通过神经网络参数的学习,我们可以无损地还原出上方的两张图。但是,需要注意的是,参数的学习仅仅focus在有限的训练集图片上,对于那些网络没有见过的陌生图片,模型是无法通过在code space上经过简单的迁移再解码生成的。比方说,现在,如果我们想要生成一张3/4全月的图片,直觉上,我们可能回想说,既然3/4全月介于全月图和半月图之间,那么对应的code是否也是介于两者之间呢?答案是否定的,因为整个encode和decode的过程中引入了复杂的neural network,充斥着非线性变换,因此code space上的点之间的迁移往往是毫无规律可言的。
因此auto-encoder本质上并不是一个真正的生成式模型,那么VAE相较于auto-encoder做了什么改变呢?答案就是化离散为连续,简单来说,原图经过encode之后不再是一个code space(latent space)上的一个点,而是生成一个分布。通过从这个分布中抽样,再decode,从而生成artificial image。
下面,我们通过具体的例子来看一看。
首先我们再来回顾一下,auto-encoder的基本结构。如下所示,
在这里插入图片描述
如果你的目标仅仅是reconstruct你的input,那么 auto-encoder会是一个非常好的选择,通过选取一些deep neural network,能实现非常好的还原。但是正如我上面提到的,auto-encoder并不是一个 generative model。对于那些从来没有见过的code,decoder无法生成合理的图片。

那么VAE是怎么做的呢?
每一个input X通过encoder会生成一个有特定均值 μ 和特定方差 σ 的高维正态分布,维度与latent space 相同,然后,再从standard normal distribution中抽样得到一个epsilon ϵ,最后生成一个random variable z=σ⋅ϵ+μ。z∼N(μ,σ),最后 z就可以作为 decoder的输入。(注意,这里我虽然写的是σ,但是实际上我们会再加一层exp(.),保证其为正值)下图是一个简单的例子。

在这里插入图片描述
这里还有一个需要明确的点就是,对于每个input X,通过encoder生成的正态分布的参数μ和σ自然是不一样的,因为它是input x的函数,下面是李宏毅老师课件中的图片,描述地十分清楚。
在这里插入图片描述

从直观上理解,再比如下图
在这里插入图片描述
但是如果我们把所有的input X生成的正态分布取average,那么我们就可以近似地认为z近似地遵从standard normal distribution。如下
在这里插入图片描述
事实上,这也是VAE中一个非常重要的假设,那就是在这里插入图片描述
当这个条件满足时,其实也意味着我们能够训练我们的decoder,让它能够将从这个分布抽样得到的任意样本转化为一张合理的图片。
另外一个需要明确的点就是为什么我们要构建一个z=σ⋅ϵ+μ的表达式,原因在于如果我们直接通过z∼N(μ,σ)抽样,那么本质上z是一个random variable,那么也就意味着我们无法对其参数σ和μ求导,因此backpropagation算法无法使用。但是当我们将其表示为z=σ⋅ϵ+μ的形式后,从encoder输出到z,就只是涉及线性操作,这里的ϵ对与神经网络而言只是一个常数。我们把这种方法称为reparemerization trick。

以上,我已经从intuition 的角度介绍完了VAE,接下来,我们从理论推导的角度再来回溯一下。
明确目标:使用最大似然的思想,我们希望通过 VAE 生成 x的几率最大。
在这里插入图片描述
通过对P(x)取对数,原目标等价于最大化下图中的L。那么我们再仔细观察一下似然函数的表达式,z的分布是已知的,就是一个标准正态分布,唯一的问题就是 P(x|z)这个条件概率的分布,更进一步来说就是估计 μ(z)和 σ(z)这两个functions。
在这里插入图片描述
具体来说,我们利用一个neural network,下面的蓝色方块,来估计这个函数的参数,使得似然函数最大化。那么这一块实际上也就是对应着VAE 中的Decoder,从 latent variable 到 output x的过程。

在这里插入图片描述
讨论完了decoder的部分,我们再来思考一下encoder的部分。我们知道与decoder相反,encoder实现的是从input x到 latent variable z的转换过程。

在这里插入图片描述

这里我们引入一个分布,q(z|x),其中q可以代表任意分布。因为q(z|x)可以是任意分布,那么我们的logP(x)可以转化如下:
在这里插入图片描述

通过上图中的转化,我们最终可以得到logP(x)的另一种表达式,等于一个lower bound Lb与 一个 KL divergence. 其中KL divergence 描述了两个分布之间的差异,当两个分布完全相同时,它的值为0,两个分布差异越大,它的值越大,因此,这一项恒>=0, 这也说明了为什么把前一项称为lower bound,因为 logP(x)必然恒大于等于它。

OK,到这里,我们再来回顾一下发生了什么,在decoder部分,我们想要求解P(x|z)以期望max logP(x)。 现在当我们在encoder部分引入这个q(z|x),观察lower bound Lb的表达式,我们现在的目标变成了同时求P(x|z) 和 q(z|x)来 max logP(x)。
但是我们可以发现,本质上,logP(x)只与P(x|z)有关,所以当我们fix住P(x|z)的值,logP(x)也是不会变的。我们可以通过不断调整q(z|x)使其不断靠近P(z|x),使KL不断趋近于0,因为logP(x)没有改变,因此意味着Lb能够不断逼近我们的目标logP(x),因此求解max logP(x) 可以转化为求解 max Lb。下面我们来细看一下我们的Lb。
在这里插入图片描述
这里补充一下VAE中的损失函数,除了重构函数(类似 auto-encoder),增加的一项就是下图黄色框中的函数,恰好对应的就是Lb的第一项。那么增加这一项的意义是什么呢?保证足够的噪音,一旦这一项消失,机器在学习的过程中单一地考虑重构函数,原图与生成图的高度匹配,那么必然会让噪声消失,也就是σ会取负无穷。增加这一项的目的就是避免这种情况的发生。
在这里插入图片描述
那么关于第二项呢?最大化Lb意味着应该最大化第二项,我们通过一点转化,可以得到
在这里插入图片描述
这个期望值表示,在给定q(z|x) 也就是encoder输出的情况下,decoder输出值尽可能大,本质上就是input x与output x的接近,可以理解为auto-encoder中的重构函数。

以上是我对VAE的简单总结,关于一些细节的理解还有待进一步提高。

参考:李宏毅老师机器学习课程:https://www.bilibili.com/video/BV1JE411g7XF?p=61
Conditional Variational Autoencoders
https://ijdykeman.github.io/ml/2016/12/21/cvae.html
【VAE学习笔记】全面通透地理解VAE(Variational Auto Encoder)
https://blog.csdn.net/a312863063/article/details/87953517?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

猜你喜欢

转载自blog.csdn.net/weixin_44607838/article/details/109156169