赞
踩
一维随机变量的概率密度
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)
可见,图片中像素的分布需要满足一定条件时,P(X)中采样得到的图片才能是个宝可梦。可以想象,一个400维的随即向量的可能取值有 25 6 400 256^{400} 256400种,并不是每种像素值的组合都会是一张宝可梦,假如每个像素的边际分布是均匀分布,那么得到的会是一张“电视雪花模糊”图片,毫无意义。
所以,这个P(X)是一种客观实在的东西,是我们用概率学去抽象出的图片的分布规律。于是,我们要想办法生成这个分布函数P(X),让他尽可能的拟合真实世界中的分布。
我们认识客观世界的过程就是学习分布的过程。买菜买肉时“看成色”,是因为我们头脑中有“好物”的颜色、气味应该是什么分布,比如一个深蓝绿色的汉堡包就很奇怪。
把图片X降维,然后生成code,然后在解码,得到一个模拟的分布中的采样sample。
关于降维,如果感兴趣背后的故事,请看我上一篇博客【轩说AI】无监督特征学习——主成分分析、稀疏编码、自编码器。
这里面X是咖啡这个分布的一个采样,生成的也是某个分布中的采样code,最后得到的也是一个分布中的采样sample,整个AE只是在做编码解码。
隐空间code中的分布是一个个“点”,每个X进来,生成一个code值,会出现如下问题。
也就是说,这个生成器产生的分布和隐空间的点具有一一对应的关系,“记得死死的”,过拟合。并且隐空间的编码值可解释性差。而隐空间中各个编码值的之间的“点”,decoder可能因为完全没见过,而产生一些错误的分布。假设我们在隐空间Z中取得数字“8”降维后和数字“9”降维后的点的中心点,我们希望这个点可以既像8又像9,但是真实情况是,decoder并未能解析这个点。
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(x∣m):decoder拟合的正态分布(gaussian)p(x):所有gaussian的mixture
我们要拟合一个手写数字“1”,P(x)就是这个手写数字1的概率分布函数,x∈R(400),每个峰值都对应着一种可能的字体“1”,每处低谷都对应着其他图像分布(可能是一只宝可梦,但是我们不管他)【上述图像的峰值位置应该比较集中,图示仅供参考】
上述这个分布是decoder来拟合的,也就是说,给出一个隐空间的点m(前提是这个点距离之前训练样本产生的点非常非常近),那么这个decoder会拟合出一个比较合理的正态分布 p ( x ∣ m ) p(x|m) p(x∣m),对应着某一种写法的数字“1”(比如草体数字“1”)
但是,这个 P ( m ) P(m) P(m)如果是离散型随机变量的分布,那么有些m的取值我们的decoder就难以拟合出正确的 p ( x ∣ m ) p(x|m) p(x∣m),而进一步说,我们的 P ( x ) P(x) P(x)也可以说是“不完整的”,没有涵盖所有可能的数字“1”。
这就是普通的auto-encoder的问题所在:隐空间中的分布不是连续的。
可见,每个训练样本在隐空间用一个有颜色的点来表示,同一类用一个颜色表示。可以看出,点和点之间的空隙很大。每个样本都在decoder中获得了一个
p
(
x
∣
m
)
p(x|m)
p(x∣m),产生了对应的一个正态分布。并且通过
Σ
m
[
p
(
x
∣
m
)
∗
p
(
m
)
]
\mathop{\Sigma} \limits_{m}[p(x|m)*p(m)]
mΣ[p(x∣m)∗p(m)]得到了P(x)。与上述所言**“AE中的高斯混合模型”**不同的是,这里将p(m)推广为所有手写数字训练样本的在隐空间的分布。生成了的p(x)也是所有手写数字的分布,概率密度大的地方就可能是某一种数字的手写图片分布值(也就是同时涵盖了“1”~"9"的分布)
这里的推广,更多的是开拓思路,也就是p(x)可以用decoder生成的Gaussian 任意mixture。就如同一堆宝可梦的例子中,我们的P(X)涵盖了所有可能的宝可梦,而不只是所有可能的皮卡丘。
根据前文,我们知道了AE隐空间的分布是离散的,decoder实际上就是一个
p
(
x
∣
m
)
p(x|m)
p(x∣m)。
在上面图片中,我们在code(隐空间)中取出一个介于满月和圆月的code-x,然后想要送入decoder,可惜,这个decoder并不能把它映射为一个比较”合理“的”3/4月亮“,同时,在Gaussian Mixture后的P(X)中,我们在3/4月亮对应的分布处的概率密度也是几乎为0。这显然不够合理。
于是产生了VAE,通过加入噪音,来使得code-x在圆月样本训练和半月样本训练时都参加,也就是既去拟合圆月的分布,又去拟合半月的分布,最后得到一个”合理“的”3/4月亮“。
这个噪音通常是以原来AE的code为均值,产生一定方差的正态分布。这个分布p(m),也被称为先验分布。他可以是其他分布,但是我们暂且定义为N(μ,Σ)
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)
z~N(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中的模型,也是这种思想。
我们把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(x∣z)∗p(z)dz
这样,我们就解决了普通auto-encoder中存在的问题——隐空间中的分布已经变成连续的了。
我们用标准正态分布来定义这个p(z)(其他连续型的先验分布也可以),我们将p(z)称为隐空间的理想分布。
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,具体公式上文已经解释过。
p(z|x)
p(z|x)是我们用encoder根据某个输入x得到的编码分布,是一种后验分布。是根据某一个输入样本,实际产生的在隐空间的分布。也就是根据encoder产生的
μ
\mu
μ和
σ
\sigma
σ得到的分布。
那这个p(z)和我们用encoder产生的p(z|x)有什么关联呢?如何建立一种关联?直观上说,或许p(z|x)应该越趋向于p(z)越好,后面我将用理论推导,证明二者分布应该尽可能相似。
在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(z∣x)趋向于N(0,1)
而N(0,I)就是我们定义的p(z)。这个loss表明我们在让p(z|x)趋向于p(z),所以为什么loss函数要这么写呢?请看下文。
这里的推导源于李宏毅老师课上的讲述,更合理的方案是变分推断,需要了解概率图模型、有参推导等知识,建议查看邱锡鹏老师的《nndl》这本书,如果对于上述数学知识了解不深,可以试着用下面的角度理解。
谢谢你看到这里,希望点个赞再走哟。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。