强烈推荐的一篇VAE博客:
从零推导:变分自编码器(VAE):这篇文章从from scratch的角度阐述了VAE的来龙去脉,从为什么引入隐变量,然后到阐述最大似然求解隐变量模型的缺点,再过渡到为什么要求后验分布,再从变分推断的公式推导中引出了VAE的目标函数,即ELBO(Evidence Lower Bound)称为对数似然的下界,逻辑非常紧密!!!
对于这篇文章,我要补充的就是隐变量模型公式是如何变化来的,隐变量模型背后的关键思想是:任何一个概率分布经过一个足够复杂的函数后可以映射到任意概率分布。推导如下图,把p(x)表示成p(x,z)对z进行边缘化求和,然后用贝叶斯公式展开就得到了隐变量模型的公式:
补充一个错误纠正:文中画红线的x应该是指的z
还可以结合着这一篇互补着阅读:机器学习方法—优雅的模型(一):变分自编码器(VAE)
在开始之前首先要明确隐变量Z的作用,隐变量Z就是样本x的representation,所以只有Z的维度够高,它才能充分得表示出x,对x的认识才足够深刻。然后隐变量也是一个随机变量,所以肯定具备一个概率分布。举个例子如x是一个人(代表一个实例或者理解为具体事件),那么Z就可以是包含了这个人身上的很多属性,如性别,肤色,身高,文化水平。VAE中假设成立的“独立同分布”就是指的数据中的样本之间独立而且同分布的意思!(大写字母表示随机变量,小写表示实例)
问题点记录与解答:
1.下图是困扰我很久的一个点,蓝色框内e1,e2,e3为噪声,来自与Normal Distribution。绿色框为网络预测得到的variance,为什么这取名叫variance,我认为原因就是它与蓝框里的元素相乘后,会改变原噪声e1,e2,e3的方差,最终噪声的方差会乘以exp(σ)的平方,这是由于随机变量的方差的性质所导致。然后再加上m1,m2,m3后,原噪声的分布其实就变换到以m1,m2,m3为均值,方差为网络预测得到的variance决定的分布上去了。
2.下图这里很容易混淆,整个图主要的内容就是讲解Decoder和Encoder设计的逻辑,是先设计了Decoder再根据Decoder存在的问题引出了Encoder的设计。现在开始讲解,如下图所示,我们通过最大化P(X)来求解u(z)和σ(z),其实这个就是解码器decoder干的事情,x就是观测到的data(images),使得经过编码生成的向量转变为图像x的可能性变到最大,其中这个P(x|z)的概率分布的参数(均值和方差)是由decoder学出来的。但是在最大化P(x)时,P(x|z)这个分布是写不出来数学表达式的,因为它是由神经网络学出来的,所以就无法求解。而且最开始我们假设的是z属于Normal Distribution(正态分布),可是在正态分布空间中很多样本值都生成不了图像的高斯分布,所以就退而求其次,看训练样本中的x能产生哪些z,就相当于找出了z空间里哪些是有效的,训练样本能产生的z肯定就能反过来生成图像的高斯分布,所以引出了求p(z|x)。可是p(z|x)是没法求的(由变分推断得知),所以只能用p(z|x)去逼近p(z|x)。
3.下图一直强调z是属于Normal distribution,我之前一直不能理解,结果仔细阅读文章后发现z其实就是指的(e1,e2,e3)噪声。因为(e1,e2,e3)噪声的产生是来自于Normal Distribution,所以就恍然大悟了。
4.下图是非常容易混淆的一个点,z=(e1,e2,e3)是指产生的从Normal Distribution产生的噪声,相当于可以手动控制。z和由网络预测得到的均值和方差进行计算后就能得到对应的编码了。因为可以实现element-wise的运算,所以z的维度是和最终encoder产生的码的维度是相同的。所以采样得到的z向量中的每一维可以看成一个属性,比如z的第一维是有没有胡子,第二维是有没有眼镜,等等。所以调整z的每一维的向量后可以让生成的图像产生变化。
还有个问题是为什么每个采样的z都要对应一个不同的高斯分布,原因是为了生成多样性的单高斯分布组合起来以此来拟合下图那条黑线,也就是原图像x的分布。
5.看下面两张图,VAE是怎么由最大化P(x)转变到了最大化Lower bound项? 因为绿框内存在P(z|x)这个概率分布,没法计算,所以直接就不看绿框这个式子,因为Lower bound项一直是P(x)的下界,所以使得Lower bound项变大,一定会使得P(x)变大。所以问题转变到了最大化Lb(Lower bound)项,通过公式变换后,最大化项包括了p(x|z)和q(z|x),就分别对应了编码器学出来的q(z|x)和解码器学出来的p(x|z)了。然后变换的最后只有两项,分别就对应了VAE的KL损失和重构损失了。 KL loss(目的是让初始噪声e1经过预测得到的m1和σ1作用后得到的最终噪声均值为 0,方差为 1),事实上就是相当于对 encoder 的一个正则项,希望 encoder 出来的东西(m1,m2,m3)均有零均值。