当前位置:   article > 正文

【轩说AI】生成模型(1)——自编码器AE+变分自编码器VAE_变分自编码器生成序列

变分自编码器生成序列

生成模型

从概率分布的角度去理解“生成”一张图片

一维随机变量的概率密度 f ( X ) f(X) f(X)
二维随机变量的联合概率密度 f ( X , Y ) f(X,Y) f(X,Y)

一张图片的每一个像素都是一个随机变量X,他可以在0-255之间任意取值,一张20pixel*20pixel的图片,就是400维的随机向量,他的分布 f ( X 1 , X 2 , . . . , X 399 , X 400 ) f(X_1,X_2,...,X_{399},X_{400}) f(X1,X2,...,X399,X400),如果它是一张特定的宝可梦的图片
宝可梦

生成宝可梦

上述宝可梦图片每个像素的值是确定的。如果一个生成模型想要生成它,那么他的分布 f ( X 1 , X 2 , . . . , X 399 , X 400 ) f(X_1,X_2,...,X_{399},X_{400}) f(X1,X2,...,X399,X400)必须尽可能的拟合这个原图给出的像素值 Y = ( x 1 , x 2 , . . . , x 399 , x 400 ) Y=(x_1,x_2,...,x_{399},x_{400}) Y=(x1,x2,...,x399,x400),也就是说,这个生成模型是在拟合一个概率分布,这个分布在某个给定的400维像素分布Y的时候,取值最大,且方差尽可能小。

举例,假如Y中某个像素Xi=168,那么 f ( X 1 , X 2 , . . . , X 399 , X 400 ) f(X_1,X_2,...,X_{399},X_{400}) f(X1,X2,...,X399,X400)的边缘概率密度 f ( X i ) f(X_i) f(Xi)可以拟合出一个均值168,方差越小越好的正态分布。

生成系列图片

生成所有的宝可梦:
在这里插入图片描述
P ( X ) P(X) P(X)=分布 f ( X 1 , X 2 , . . . , X 399 , X 400 ) f(X_1,X_2,...,X_{399},X_{400}) f(X1,X2,...,X399,X400)

  1. 在上述生成单个皮卡丘的情况,这个分布P(X)是单峰的,只有在给定的Y分布时,概率密度最大。
  2. 在生成所有的宝可梦时,这个分布可以是多峰的,也就是P(X)涵盖了所有可能的宝可梦。同理,在手写数字识别时,它涵盖了所有可能的数字“1”(或者其他数字)。这时,只要在P采样,就可以得到想要的sample。

可见,图片中像素的分布需要满足一定条件时,P(X)中采样得到的图片才能是个宝可梦。可以想象,一个400维的随即向量的可能取值有 25 6 400 256^{400} 256400种,并不是每种像素值的组合都会是一张宝可梦,假如每个像素的边际分布是均匀分布,那么得到的会是一张“电视雪花模糊”图片,毫无意义。

所以,这个P(X)是一种客观实在的东西,是我们用概率学去抽象出的图片的分布规律。于是,我们要想办法生成这个分布函数P(X),让他尽可能的拟合真实世界中的分布。

我们认识客观世界的过程就是学习分布的过程。买菜买肉时“看成色”,是因为我们头脑中有“好物”的颜色、气味应该是什么分布,比如一个深蓝绿色的汉堡包就很奇怪。

自动编码器Auto-Encoder

AE的模型及其存在的问题

在这里插入图片描述
把图片X降维,然后生成code,然后在解码,得到一个模拟的分布中的采样sample。

关于降维,如果感兴趣背后的故事,请看我上一篇博客【轩说AI】无监督特征学习——主成分分析、稀疏编码、自编码器

这里面X是咖啡这个分布的一个采样,生成的也是某个分布中的采样code,最后得到的也是一个分布中的采样sample,整个AE只是在做编码解码。

隐空间code中的分布是一个个“点”,每个X进来,生成一个code值,会出现如下问题。
在这里插入图片描述
也就是说,这个生成器产生的分布和隐空间的点具有一一对应的关系,“记得死死的”,过拟合。并且隐空间的编码值可解释性差。而隐空间中各个编码值的之间的“点”,decoder可能因为完全没见过,而产生一些错误的分布。假设我们在隐空间Z中取得数字“8”降维后和数字“9”降维后的点的中心点,我们希望这个点可以既像8又像9,但是真实情况是,decoder并未能解析这个点。

AE中的高斯混合模型

在这里插入图片描述
m :隐空间的取值。 p ( m ) :隐空间的分布 p ( x ∣ m ) : d e c o d e r 拟合的正态分布 ( g a u s s i a n ) p ( x ) :所有 g a u s s i a n 的 m i x t u r e m:隐空间的取值。\\ p(m):隐空间的分布\\ p(x|m):decoder拟合的正态分布(gaussian)\\ p(x):所有gaussian的mixture\\ m:隐空间的取值。p(m):隐空间的分布p(xm)decoder拟合的正态分布(gaussian)p(x):所有gaussianmixture

我们要拟合一个手写数字“1”,P(x)就是这个手写数字1的概率分布函数,x∈R(400),每个峰值都对应着一种可能的字体“1”,每处低谷都对应着其他图像分布(可能是一只宝可梦,但是我们不管他)【上述图像的峰值位置应该比较集中,图示仅供参考

上述这个分布是decoder来拟合的,也就是说,给出一个隐空间的点m(前提是这个点距离之前训练样本产生的点非常非常近),那么这个decoder会拟合出一个比较合理的正态分布 p ( x ∣ m ) p(x|m) p(xm),对应着某一种写法的数字“1”(比如草体数字“1”)

但是,这个 P ( m ) P(m) P(m)如果是离散型随机变量的分布,那么有些m的取值我们的decoder就难以拟合出正确的 p ( x ∣ m ) p(x|m) p(xm),而进一步说,我们的 P ( x ) P(x) P(x)也可以说是“不完整的”,没有涵盖所有可能的数字“1”。

这就是普通的auto-encoder的问题所在:隐空间中的分布不是连续的。

AE的训练情况

在这里插入图片描述
可见,每个训练样本在隐空间用一个有颜色的点来表示,同一类用一个颜色表示。可以看出,点和点之间的空隙很大。每个样本都在decoder中获得了一个 p ( x ∣ m ) p(x|m) p(xm),产生了对应的一个正态分布。并且通过 Σ m [ p ( x ∣ m ) ∗ p ( m ) ] \mathop{\Sigma} \limits_{m}[p(x|m)*p(m)] mΣ[p(xm)p(m)]得到了P(x)。与上述所言**“AE中的高斯混合模型”**不同的是,这里将p(m)推广为所有手写数字训练样本的在隐空间的分布。生成了的p(x)也是所有手写数字的分布,概率密度大的地方就可能是某一种数字的手写图片分布值(也就是同时涵盖了“1”~"9"的分布)
这里的推广,更多的是开拓思路,也就是p(x)可以用decoder生成的Gaussian 任意mixture。就如同一堆宝可梦的例子中,我们的P(X)涵盖了所有可能的宝可梦,而不只是所有可能的皮卡丘。

举例理解从AE到VAE

在这里插入图片描述
根据前文,我们知道了AE隐空间的分布是离散的,decoder实际上就是一个 p ( x ∣ m ) p(x|m) p(xm)

在上面图片中,我们在code(隐空间)中取出一个介于满月和圆月的code-x,然后想要送入decoder,可惜,这个decoder并不能把它映射为一个比较”合理“的”3/4月亮“,同时,在Gaussian Mixture后的P(X)中,我们在3/4月亮对应的分布处的概率密度也是几乎为0。这显然不够合理。

于是产生了VAE,通过加入噪音,来使得code-x在圆月样本训练和半月样本训练时都参加,也就是既去拟合圆月的分布,又去拟合半月的分布,最后得到一个”合理“的”3/4月亮“。

这个噪音通常是以原来AE的code为均值,产生一定方差的正态分布。这个分布p(m),也被称为先验分布。他可以是其他分布,但是我们暂且定义为N(μ,Σ)

变分自动编码器Variational Auto-Encoder

VAE的模型

在这里插入图片描述
VAE中,某样本Xi经过encoder产生的是一个隐空间上的正态分布,而不是一个具体的点。
不同于AE的Encoder只产生一个vector,VAE的Encoder产生一个两倍dimension的vector,并将前1/2看做产生的分布的“均值”,后1/2看做产生的分布的“方差的以e为底的对数”。之所以如此,是因为我们希望分布均值为0,方差为1,则ln(e)=0,而神经网络拟合变量趋向于0的能力比拟合到1的能力更稳定。
z ~ N ( m 1 , m 2 , m 3 , e x p ( σ 1 ) , e x p ( σ 2 ) , e x p ( σ 3 ) ) 这里我们定义均值 μ = m ,方差 Σ = e x p ( σ ) z~N(m_1,m_2,m_3,exp(\sigma_1),exp(\sigma_2),exp(\sigma_3))\\这里我们定义均值\mu=m,方差\Sigma=exp(\sigma) zN(m1,m2,m3,exp(σ1),exp(σ2),exp(σ3))这里我们定义均值μ=m,方差Σ=exp(σ)
在这里插入图片描述
如下图,在代码实现上,为了保证没有“梯度断裂”,可以做back propagation,不能产生 μ \mu μ σ \sigma σ后生成高斯分布然后随机sample。而是迂回一下,通过在N(0,I)中采样得到 ϵ \epsilon ϵ,然后 z = ϵ σ + μ z=\epsilon\sigma+\mu z=ϵσ+μ得到sample值,然后放入后面的decoder解码。这样就保证了梯度在反向传播时可以顺畅无阻。
在这里插入图片描述
在李宏毅的PPT中的模型,也是这种思想。

VAE的高斯混合模型

在这里插入图片描述
我们把m换成z,同样表示隐空间的变量。在上述的m分布里,m是一组离散的隐空间取值。z是一个随机向量,每一个维度表示一种特征。我们在其某一维度上映射在图中,方便观察。z的每一维度都是连续型随机变量。z的每一个取值都对应一个Gaussian,所以P(x)是由无数个Gaussian来mix而成。

我们还以二维隐空间为例。
在这里插入图片描述
这样,隐空间中连续分布的p(z),每一个点都会对应一个Gaussian,从而有无穷多个Gaussian。使得decoder可以对隐空间的任意位置(相对AE而言更任意)进行分布映射,生成对应的图片像素分布。将其mixture之后得到了P(X)
P ( x ) = ∫ p ( x ∣ z ) ∗ p ( z ) d z P(x)=∫p(x|z)*p(z)dz P(x)=p(xz)p(z)dz
这样,我们就解决了普通auto-encoder中存在的问题——隐空间中的分布已经变成连续的了。

我们用标准正态分布来定义这个p(z)(其他连续型的先验分布也可以),我们将p(z)称为隐空间的理想分布。

明确p(z)和p(z|x)的区别
  1. p(z)
    p(z)是我们期望的隐空间的分布情况,是一种先验分布,人为定义成正态分布,也可以是其他分布。在AE中,我们隐空间的p(z)是离散型分布【又称之为p(m)】,故经过decoder后在p(x)中不能包含隐空间中每个点的Gaussian,而是只有个别某些可数个点的Gaussian的mixture。所以我们希望隐空间应该是一种连续的分布,并假设二维隐空间上的分布是一个标准正态分布N(0,0,1,1),经过强大的decoder后,每一个Z(x,y)都会映射为一个Gaussian,具体公式上文已经解释过。

  2. p(z|x)
    p(z|x)是我们用encoder根据某个输入x得到的编码分布,是一种后验分布。是根据某一个输入样本,实际产生的在隐空间的分布。也就是根据encoder产生的 μ \mu μ σ \sigma σ得到的分布。

那这个p(z)和我们用encoder产生的p(z|x)有什么关联呢?如何建立一种关联?直观上说,或许p(z|x)应该越趋向于p(z)越好,后面我将用理论推导,证明二者分布应该尽可能相似。

VAE的训练情况

在VAE的训练中,如果我们只关注重构误差(reconstruction error),那么encoder产生的 l o g ( σ ) log(\sigma) log(σ)会逐渐趋于负无穷,即:z的正态分布的方差逐渐趋于0,因为VAE发现noise越小,重构误差就越小。然而这和我们的初心相悖,我们希望encoder产生的是一个有噪音的分布。
在这里插入图片描述
于是,loss中除了重构误差,还有对隐空间变量的限制:
Σ [ ( e x p ( σ i ) − ( 1 + σ i ) + m 2 ) ] \Sigma[(exp(\sigma_i)-(1+\sigma_i)+m^2)] Σ[(exp(σi)(1+σi)+m2)]

旨在让: μ i 趋向于 0 , σ i 趋向于 1 μi趋向于0,σi趋向于1 μi趋向于0,σi趋向于1
即: p ( z ∣ x ) 趋向于 N ( 0 , 1 ) p(z|x)趋向于N(0,1) p(zx)趋向于N(0,1)
而N(0,I)就是我们定义的p(z)。这个loss表明我们在让p(z|x)趋向于p(z),所以为什么loss函数要这么写呢?请看下文。

Loss中对隐空间分布限制的函数的推导

这里的推导源于李宏毅老师课上的讲述,更合理的方案是变分推断,需要了解概率图模型、有参推导等知识,建议查看邱锡鹏老师的《nndl》这本书,如果对于上述数学知识了解不深,可以试着用下面的角度理解。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

谢谢你看到这里,希望点个赞再走哟。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/318095?site
推荐阅读