变分自编码器(二):从贝叶斯观点出发
By 苏剑林 | 2018-03-28 | 464510位读者 |源起 #
前几天写了博文《变分自编码器(一):原来是这么一回事》,从一种比较通俗的观点来理解变分自编码器(VAE),在那篇文章的视角中,VAE跟普通的自编码器差别不大,无非是多加了噪声并对噪声做了约束。然而,当初我想要弄懂VAE的初衷,是想看看究竟贝叶斯学派的概率图模型究竟是如何与深度学习结合来发挥作用的,如果仅仅是得到一个通俗的理解,那显然是不够的。
所以我对VAE继续思考了几天,试图用更一般的、概率化的语言来把VAE说清楚。事实上,这种思考也能回答通俗理解中无法解答的问题,比如重构损失用MSE好还是交叉熵好、重构损失和KL损失应该怎么平衡,等等。
建议在阅读《变分自编码器(一):原来是这么一回事》后对本文进行阅读,本文在内容上尽量不与前文重复。
准备 #
在进入对VAE的描述之前,我觉得有必要把一些概念性的内容讲一下。
数值计算vs采样计算 #
对于不是很熟悉概率统计的读者,容易混淆的两个概念应该是数值计算和采样计算,也有读者在《三味Capsule:矩阵Capsule与EM路由》出现过同样的疑惑。比如已知概率密度函数$p(x)$,那么$x$的期望也就定义为
$$\mathbb{E}[x] = \int x p(x)dx\tag{1}$$
如果要对它进行数值计算,也就是数值积分,那么可以选若干个有代表性的点$x_0 < x_1 < x_2 < \dots < x_n$,然后得到
$$\mathbb{E}[x] \approx \frac{1}{x_n - x_0}\sum_{i=1}^n x_i p(x_i) \left(x_i - x_{i-1}\right)\tag{2}$$
这里不讨论“有代表性”是什么意思,也不讨论提高数值计算精度的方法。这样写出来,是为了跟采样计算对比。如果从$p(x)$中采样若干个点$x_1,x_2,\dots,x_n$,那么我们有
$$\mathbb{E}[x] \approx \frac{1}{n}\sum_{i=1}^n x_i,\quad x_i \sim p(x)\tag{3}$$
我们可以比较$(2)$跟$(3)$,它们的主要区别是$(2)$中包含了概率的计算而$(3)$中仅有$x$的计算,这是因为在$(3)$中$x_i$是从$p(x)$中依概率采样出来的,概率大的$x_i$出现的次数也多,所以可以说采样的结果已经包含了$p(x)$在里边,就不用再乘以$p(x_i)$了。
更一般地,我们可以写出
$$\mathbb{E}_{x\sim p(x)}[f(x)] = \int f(x)p(x)dx \approx \frac{1}{n}\sum_{i=1}^n f(x_i),\quad x_i\sim p(x)\tag{4}$$
这就是蒙特卡洛模拟的基础。
KL散度及变分 #
我们通常用KL散度来度量两个概率分布$p(x)$和$q(x)$之间的差异,定义为
$$KL\Big(p(x)\Big\Vert q(x)\Big) = \int p(x)\ln \frac{p(x)}{q(x)} dx=\mathbb{E}_{x\sim p(x)}\left[\ln \frac{p(x)}{q(x)}\right]\tag{5}$$
KL散度的主要性质是非负性,如果固定$p(x)$,那么$KL\Big(p(x)\Big\Vert q(x)\Big)=0 \Leftrightarrow p(x)=q(x)$;如果固定$q(x)$,同样有$KL\Big(p(x)\Big\Vert q(x)\Big)=0 \Leftrightarrow p(x)=q(x)$,也就是不管固定哪一个,最小化KL散度的结果都是两者尽可能相等。这一点的严格证明要用到变分法,而事实上VAE中的V(变分)就是因为VAE的推导就是因为用到了KL散度(进而也包含了变分法)。
当然,KL散度有一个比较明显的问题,就是当$q(x)$在某个区域等于0,而$p(x)$在该区域不等于0,那么KL散度就出现无穷大。这是KL散度的固有问题,我们只能想办法规避它,比如隐变量的先验分布我们用高斯分布而不是均匀分布,原因便在此,这一点我们在前文《变分自编码器(一):原来是这么一回事》中也提到过了。
顺便说点题外话,度量两个概率分布之间的差异只有KL散度吗?当然不是,我们可以看维基百科的Statistical Distance一节,里边介绍了不少分布距离,比如有一个很漂亮的度量,我们称之为巴氏距离(Bhattacharyya distance),定义为
$$D_B\Big(p(x), q(x)\Big)=-\ln\int \sqrt{p(x)q(x)} dx\tag{6}$$
这个距离不仅对称,还没有KL散度的无穷大问题。然而我们还是选用KL散度,因为我们不仅要理论上的漂亮,还要实践上的可行,KL散度可以写成期望的形式,这允许我们对其进行采样计算,相反,巴氏距离就没那么容易了,读者要是想把下面计算过程中的KL散度替换成巴氏距离,就会发现寸步难行了。
本文的符号表 #
讲解VAE免不了出现大量的公式和符号,这里将部分式子的含义提前列举如下:
$$\begin{array}{c|c}
\hline
x_k, z_k & \text{表示随机变量}x,z\text{的第}k\text{个样本}\\
\hline
x_{(k)}, z_{(k)} & \text{表示多元变量}x,z\text{的第}k\text{个分量}\\
\hline
\mathbb{E}_{x\sim p(x)}[f(x)] & \text{表示对}f(x)\text{算期望,其中}x\text{的分布为}p(x)\\
\hline
KL\Big(p(x)\Big\Vert q(x)\Big)& \text{两个分布的}KL\text{散度}\\
\hline
\Vert x\Vert^2& \text{向量}x\text{的}l^2\text{范数,也就是我们通常说的模长的平方}\\
\hline
\mathcal{L}& \text{本文的损失函数的符号}\\
\hline
D,d & D\text{是输入}x\text{的维度,}d\text{是隐变量}z\text{的维度}\\
\hline
\end{array}$$
框架 #
这里通过直接对联合分布进行近似的方式,简明快捷地给出了VAE的理论框架。
直面联合分布 #
出发点依然没变,这里再重述一下。首先我们有一批数据样本$\{x_1,\dots,x_n\}$,其整体用$x$来描述,我们希望借助隐变量$z$描述$x$的分布$\tilde{p}(x)$:
$$q(x)=\int q(x|z)q(z)dz,\quad q(x,z) = q(x|z)q(z)\tag{7}$$
这里$q(z)$是先验分布(标准正态分布),目的是希望$q(x)$能逼近$\tilde{p}(x)$。这样(理论上)我们既描述了$\tilde{p}(x)$,又得到了生成模型$q(x|z)$,一举两得。
接下来就是利用KL散度进行近似。但我一直搞不明白的是,为什么从原作《Auto-Encoding Variational Bayes》开始,VAE的教程就聚焦于后验分布$p(z|x)$的描述?也许是受了EM算法的影响,这个问题上不能应用EM算法,就是因为后验分布$p(z|x)$难以计算,所以VAE的作者就聚焦于$p(z|x)$的推导。
但事实上,直接来对$p(x,z)$进行近似是最为干脆的。具体来说,定义$p(x,z)=\tilde{p}(x)p(z|x)$,我们设想用一个联合概率分布$q(x,z)$来逼近$p(x,z)$,那么我们用KL散度来看它们的距离:
$$KL\Big(p(x,z)\Big\Vert q(x,z)\Big) = \iint p(x,z)\ln \frac{p(x,z)}{q(x,z)} dzdx\tag{8}$$
KL散度是我们的终极目标,因为我们希望两个分布越接近越好,所以KL散度越小越好。当然,由于现在$p(x,z)$也有参数,所以不单单是$q(x,z)$来逼近$p(x,z)$,$p(x,z)$也会主动来逼近$q(x,z)$,两者是相互接近。
于是我们有
$$\begin{aligned}KL\Big(p(x,z)\Big\Vert q(x,z)\Big) =& \int \tilde{p}(x) \left[\int p(z|x)\ln \frac{\tilde{p}(x)p(z|x)}{q(x,z)} dz\right]dx\\
=& \mathbb{E}_{x\sim \tilde{p}(x)} \left[\int p(z|x)\ln \frac{\tilde{p}(x)p(z|x)}{q(x,z)} dz\right]
\end{aligned}\tag{9}$$
这样一来利用$(4)$式,把各个$x_i$代入就可以进行计算了,这个式子还可以进一步简化,因为$\ln \frac{\tilde{p}(x)p(z|x)}{q(x,z)}=\ln \tilde{p}(x) + \ln \frac{p(z|x)}{q(x,z)}$,而
$$\begin{aligned}\mathbb{E}_{x\sim \tilde{p}(x)} \left[\int p(z|x)\ln \tilde{p}(x)dz\right] =& \mathbb{E}_{x\sim \tilde{p}(x)} \left[\ln \tilde{p}(x)\int p(z|x)dz\right]\\
=&\mathbb{E}_{x\sim \tilde{p}(x)} \big[\ln \tilde{p}(x)\big]
\end{aligned}\tag{10}$$
注意这里的$\tilde{p}(x)$是根据样本$x_1,x_2,\dots,x_n$确定的关于$x$的先验分布,尽管我们不一定能准确写出它的形式,但它是确定的、存在的,因此这一项只是一个常数,所以可以写出
$$\mathcal{L}=KL\Big(p(x,z)\Big\Vert q(x,z)\Big) - \text{常数}= \mathbb{E}_{x\sim \tilde{p}(x)} \left[\int p(z|x)\ln \frac{p(z|x)}{q(x,z)} dz\right]\tag{11}$$
目前最小化$KL\Big(p(x,z)\Big\Vert q(x,z)\Big)$也就等价于最小化$\mathcal{L}$。注意减去的常数为$\mathbb{E}_{x\sim \tilde{p}(x)} \big[\ln \tilde{p}(x)\big]$,所以$\mathcal{L}$拥有下界$-\mathbb{E}_{x\sim \tilde{p}(x)} \big[\ln \tilde{p}(x)\big]$~注意到$\tilde{p}(x)$不一定是概率,在连续情形时$\tilde{p}(x)$是概率密度,它可以大于1也可以小于1,所以$-\mathbb{E}_{x\sim \tilde{p}(x)} \big[\ln \tilde{p}(x)\big]$不一定是非负,即loss可能是负数。
你的VAE已经送达 #
到这里,我们回顾初衷——为了得到生成模型,所以我们把$q(x,z)$写成$q(x|z)q(z)$,于是就有
$$\begin{aligned}\mathcal{L} =& \mathbb{E}_{x\sim \tilde{p}(x)} \left[\int p(z|x)\ln \frac{p(z|x)}{q(x|z)q(z)} dz\right]\\
=&\mathbb{E}_{x\sim \tilde{p}(x)} \left[-\int p(z|x)\ln q(x|z)dz+\int p(z|x)\ln \frac{p(z|x)}{q(z)}dz\right]\end{aligned}\tag{12}$$
再简明一点,那就是
$$\begin{aligned}\mathcal{L} = &\mathbb{E}_{x\sim \tilde{p}(x)} \left[\mathbb{E}_{z\sim p(z|x)}\big[-\ln q(x|z)\big]+\mathbb{E}_{z\sim p(z|x)}\Big[\ln \frac{p(z|x)}{q(z)}\Big]\right]\\
= &\mathbb{E}_{x\sim \tilde{p}(x)} \Bigg[\mathbb{E}_{z\sim p(z|x)}\big[-\ln q(x|z)\big]+KL\Big(p(z|x)\Big\Vert q(z)\Big)\Bigg]
\end{aligned}\tag{13}$$
看,括号内的不就是VAE的损失函数嘛?只不过我们换了个符号而已。我们就是要想办法找到适当的$q(x|z)$和$q(z)$使得$\mathcal{L}$最小化。
再回顾一下整个过程,我们几乎都没做什么“让人难以想到”的形式变换,但VAE就出来了。所以,没有必要去对后验分布进行分析,直面联合分布,我们能更快捷地到达终点。
不能搞分裂~ #
鉴于$(13)$式的特点,我们也许会将$\mathcal{L}$分开为两部分看:$\mathbb{E}_{z\sim p(z|x)}\big[-\ln q(x|z)\big]$的期望和$KL\Big(p(z|x)\Big\Vert q(z)\Big)$的期望,并且认为问题变成了两个loss的分别最小化。
然而这种看法是不妥的,因为$KL\Big(p(z|x)\Big\Vert q(z)\Big)=0$意味着$z$没有任何辨识度,所以$-\ln q(x|z)$不可能小(预测不准),而如果$-\ln q(x|z)$小则$q(x|z)$大,预测准确,这时候$p(z|x)$不会太随机,即$KL\Big(p(z|x)\Big\Vert q(z)\Big)$不会小,所以这两部分的loss其实是相互拮抗的。所以,$\mathcal{L}$不能割裂来看,而是要整体来看,整个的$\mathcal{L}$越小模型就越接近收敛,而不能只单独观察某一部分的loss。
事实上,这正是GAN模型中梦寐以求的——有一个总指标能够指示生成模型的训练进程,在VAE模型中天然就具备了这种能力了,而GAN中要到WGAN才有这么一个指标~
实验 #
截止上面的内容,其实我们已经完成了VAE整体的理论构建。但为了要将它付诸于实验,还需要做一些工作。事实上原论文《Auto-Encoding Variational Bayes》也在这部分做了比较充分的展开,但遗憾的是,网上很多VAE教程都只是推导到$(13)$式就没有细说了。
后验分布近似 #
现在$q(z),q(x|z),p(z|x)$全都是未知的,连形式都还没确定,而为了实验,就得把$(13)$式的每一项都明确写出来。
首先,为了便于采样,我们假设$z\sim N(0,I)$,即标准的多元正态分布,这就解决了$q(z)$。那$q(x|z),p(z|x)$呢?一股脑用神经网络拟合吧。
注:本来如果已知$q(x|z)$和$q(z)$,那么$p(z|x)$最合理的估计应该是:
$$\hat{p}(z|x) = q(z|x) = \frac{q(x|z)q(z)}{q(x)} = \frac{q(x|z)q(z)}{\int q(x|z)q(z)dz}\tag{14}$$
这其实就是EM算法中的后验概率估计的步骤,具体可以参考《从最大似然到EM算法:一致的理解方式》。但事实上,分母的积分几乎不可能完成,因此这是行不通的。所以干脆用一般的网络去近似它,这样不一定能达到最优,但终究是一个可用的近似。
具体来说,我们假设$p(z|x)$也是(各分量独立的)正态分布,其均值和方差由$x$来决定,这个“决定”,就是一个神经网络:
$$p(z|x)=\frac{1}{\prod\limits_{k=1}^d \sqrt{2\pi \sigma_{(k)}^2(x)}}\exp\left(-\frac{1}{2}\left\Vert\frac{z-\mu(x)}{\sigma(x)}\right\Vert^2\right)\tag{15}$$
这里的$\mu(x),\sigma^2(x)$是输入为$x$、输出分别为均值和方差的神经网络,其中$\mu(x)$就起到了类似encoder的作用。既然假定了高斯分布,那么$(13)$式中的KL散度这一项就可以先算出来:
$$KL\Big(p(z|x)\Big\Vert q(z)\Big)=\frac{1}{2} \sum_{k=1}^d \Big(\mu_{(k)}^2(x) + \sigma_{(k)}^2(x) - \ln \sigma_{(k)}^2(x) - 1\Big)\tag{16}$$
也就是我们所说的KL loss,这在上一篇文章已经给出。
生成模型近似 #
现在只剩生成模型部分$q(x|z)$了,该选什么分布呢?论文《Auto-Encoding Variational Bayes》给出了两种候选方案:伯努利分布或正态分布。
什么?又是正态分布?是不是太过简化了?然而并没有办法,因为我们要构造一个分布,而不是任意一个函数,既然是分布就得满足归一化的要求,而要满足归一化,又要容易算,我们还真没多少选择。
伯努利分布模型 #
首先来看伯努利分布,众所周知它其实就是一个二元分布:
$$p(\xi)=\left\{\begin{aligned}&\rho,\, \xi = 1;\\
&1-\rho,\, \xi = 0\end{aligned}\right.\tag{17}$$
所以伯努利分布只适用于$x$是一个多元的二值向量的情况,比如$x$是二值图像时(mnist可以看成是这种情况)。这种情况下,我们用神经网络$\rho(z)$来算参数$\rho$,从而得到
$$q(x|z)=\prod_{k=1}^D \Big(\rho_{(k)}(z)\Big)^{x_{(k)}} \Big(1 - \rho_{(k)}(z)\Big)^{1 - x_{(k)}}\tag{18}$$
这时候可以算出
$$-\ln q(x|z) = \sum_{k=1}^D \Big[- x_{(k)} \ln \rho_{(k)}(z) - (1-x_{(k)}) \ln \Big(1 -\rho_{(k)}(z)\Big)\Big]\tag{19}$$
这表明$\rho(z)$要压缩到0~1之间(比如用sigmoid激活),然后用交叉熵作为损失函数,这里$\rho(z)$就起到了类似decoder的作用。
正态分布模型 #
然后是正态分布,这跟$p(z|x)$是一样的,只不过$x,z$交换了位置:
$$q(x|z)=\frac{1}{\prod\limits_{k=1}^D \sqrt{2\pi \tilde{\sigma}_{(k)}^2(z)}}\exp\left(-\frac{1}{2}\left\Vert\frac{x-\tilde{\mu}(z)}{\tilde{\sigma}(z)}\right\Vert^2\right)\tag{20}$$
这里的$\tilde{\mu}(z),\tilde{\sigma}^2(z)$是输入为$z$、输出分别为均值和方差的神经网络,$\tilde{\mu}(z)$就起到了decoder的作用。于是
$$-\ln q(x|z) = \frac{1}{2}\left\Vert\frac{x-\tilde{\mu}(z)}{\tilde{\sigma}(z)}\right\Vert^2 + \frac{D}{2}\ln 2\pi + \frac{1}{2}\sum_{k=1}^D \ln \tilde{\sigma}_{(k)}^2(z)\tag{21}$$
很多时候我们会固定方差为一个常数$\tilde{\sigma}^2$,这时候
$$-\ln q(x|z) \sim \frac{1}{2\tilde{\sigma}^2}\Big\Vert x-\tilde{\mu}(z)\Big\Vert^2\tag{22}$$
这就出现了MSE损失函数。
所以现在就清楚了,对于二值数据,我们可以对decoder用sigmoid函数激活,然后用交叉熵作为损失函数,这对应于$q(x|z)$为伯努利分布;而对于一般数据,我们用MSE作为损失函数,这对应于$q(x|z)$为固定方差的正态分布。
采样计算技巧 #
前一节做了那么多的事情,无非是希望能$(13)$式明确地写下来。当我们假设$p(z|x)$和$q(z)$都是正态分布时,$(13)$式的KL散度部分就已经算出来了,结果是$(16)$式;当我们假设$q(x|z)$是伯努利分布或者高斯分布时,$-\ln q(x|z)$也能算出来了。现在缺什么呢?
采样!
$p(z|x)$的作用分两部分,一部分是用来算$KL\Big(p(z|x)\Big\Vert q(z)\Big)$,另一部分是用来算$\mathbb{E}_{z\sim p(z|x)}\big[-\ln q(x|z)\big]$的,而$\mathbb{E}_{z\sim p(z|x)}\big[-\ln q(x|z)\big]$就意味着
$$-\frac{1}{n}\sum_{i=1}^n \ln q(x|z_i),\quad z_i \sim p(z|x)\tag{23}$$
我们已经假定了$p(z|x)$是正态分布,均值和方差由模型来算,这样一来,借助“重参数技巧”就可以完成采样。
但是采样多少个才适合呢?VAE非常直接了当:一个!所以这时候$(13)$式就变得非常简单了:
$$\mathcal{L} = \mathbb{E}_{x\sim \tilde{p}(x)} \Bigg[-\ln q(x|z) + KL\Big(p(z|x)\Big\Vert q(z)\Big)\Bigg],\quad z\sim p(z|x)\tag{24}$$
该式中的每一项,可以在把$(16),(19),(21),(22)$式找到。注意对于一个batch中的每个$x$,都需要从$p(z|x)$采样一个“专属”于$x$的$z$出来才去算$-\ln q(x|z)$。而正因为VAE在$p(z|x)$这里只采样了一个样本,所以它看起来就跟普通的AE差不多了。
那么最后的问题就是采样一个究竟够了吗?事实上我们会运行多个epoch,每次的隐变量都是随机生成的,因此当epoch数足够多时,事实上是可以保证采样的充分性的。我也实验过采样多个的情形,感觉生成的样本并没有明显变化。
致敬 #
这篇文章从贝叶斯理论的角度出发,对VAE的整体流程做了一个梳理。用这种角度考察的时候,我们心里需要紧抓住两个点:“分布”和“采样”——写出分布形式,并且通过采样来简化过程。
简单来说,由于直接描述复杂分布是难以做到的,所以我们通过引入隐变量来将它变成条件分布的叠加。而这时候我们对隐变量的分布和条件分布都可以做适当的简化(比如都假设为正态分布),并且在条件分布的参数可以跟深度学习模型结合起来(用深度学习来算隐变量的参数),至此,“深度概率图模型”就可见一斑了。
让我们一起致敬贝叶斯大神,以及众多研究概率图模型的大牛,他们都是真正的勇者。
转载到请包括本文地址:https://spaces.ac.cn/archives/5343
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Mar. 28, 2018). 《变分自编码器(二):从贝叶斯观点出发 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/5343
@online{kexuefm-5343,
title={变分自编码器(二):从贝叶斯观点出发},
author={苏剑林},
year={2018},
month={Mar},
url={\url{https://spaces.ac.cn/archives/5343}},
}
April 8th, 2019
学长你好,我又来了,最近在研究生成式模型,偶然发现您的OGAN,精妙的想法折服了我,所以想要把您的文章仔细研究一遍,取取经验。
言归正传,对于(15)式,由于P(z|x)中z每一个分量是完全可以假设独立的,所以可以写成每一个独立分量的分布的乘积形式,但是对于(18)和(20)式,我是持保留态度的,因为这时候q(x|z)中每一个x的分量还是独立的吗,注意到x是一个生成的数据点,通常即一幅图片,那么x的每一个分量即是像素点,但是图片的像素尤其是相邻像素之间是有很强的相关性的,所以(18)(20)就不能直接写成每个分量分布相乘了。我暂时还没有看过VAE的原论文,所以可能是我理解上有问题,盼回复。
这是一个无奈的假设和折中的选择。因为考虑像素之间的相关性的模型太复杂(比如glow)。
好的,谢谢学长!
May 17th, 2019
您开头直面联合分布$$p(x, z)=\tilde{p}(x) p(z | x)$$,然而您在第一篇文章中就已经提到假设后验分布为高斯分布,这里是否存在矛盾?? 另外原文推导的并没有问题吧。
直面联合分布,跟“假设后验分布为高斯分布”,有什么矛盾?
原文的推导没问题,它是标准的、但晦涩难懂的推导。
May 18th, 2019
苏老师,您好,您对vae系列的文章讲的很透彻,我也看了许多讲解,也跟着做了很多推导,现有一个问题一直困扰着我,想请教您:
您的文章中的用联合分布q(x,z)来近似p(x,z),kl散度计算公式如下:
KL(p(x,z)‖q(x,z))=∬p(x,z)lnp(x,z)q(x,z)dzdx (1)
(我认为您KL散度中p与q的位置非常正确,有道理)
但是在vae的原始文章和tutorial那篇文章的推导中,他说的是用q(z|x) infer p(z|x), 计算kl散度时,却写为:
KL(q(x|z)‖p(x|z)), (2)
进而推导出:
logp(x) - KL(p(x|z)‖q(x|z)) =
(T^T,为什么我写了那么多都没了。。。。。)
接上文:
进而推导出
logp(x) - KL(q(x|z)‖p(x|z)) =
(T^T,为什么我写了那么多都没了。。。。。)
接上文:
进而推导出
logp(x) - KL(q(x|z)‖p(x|z)) = Ez∼q(z|x)[logp(x|z)+logp(z)-logq(z|x)] (3)
右边可以用kl公式继续简化为:
logp(x) - KL(q(x|z)‖p(x|z)) = Ez∼q(z|x)[logp(x|z)] - KL(q(z|x)||p(z)) (4)
然而,原文的描述是"use q(z|x) infer p(z|x)", 所以我认为(2)式中p与q的位置颠倒了,应该写为:
KL(p(x|z)‖q(x|z)), (5)
然后整个公式推导下来有:
logp(x) + KL(p(x|z)‖q(x|z)) = Ez∼p(z|x)[logp(x|z)+logp(z)-logq(z|x)] (6)
也就是根本无法推出最终的loss,而导致这一原因的就是我将KL散度中p与q的位置颠倒了,可是按照KL散度定义与vae的假设,确实应该写作(5)式而非(2)式。您(1)式中p与q的位置与我理解的一致,您最终也推出了正确的结果,可是我按照(5)式却无法写出。
原文的推导以及tutorial应该是不会出错的,但是我认为自己的理解也没有错误,所以这个问题困扰了我很久,不知道我究竟哪里有问题。
因为您对vae的理解非常透彻,所以很期待您可以解答我的疑惑,非常感谢!!!
我没看到原论文有$KL(p(x|z)\Vert q(x|z)) $呀,你的$x,z$位置是不是交换过来了?
实在抱歉,低级错误,是我打错了,应该是$KL(q(z|x)||p(z|x)$。
您可以参考tutorial里的公式(5),和我评论中公式(4)是一样的,他基于的初始推导就是算$KL(q(z)||p(z|x))$,后来用$q(z|x)$替换了$q(z)$,但是我的问题是用$q(z|x)$近似$p(z|x)$难道不应该写作$KL(p||q)$吗?为什么他写的是$KL(q||p)$?
1、你认真对比一卡论文的记号,尽量理解含义而不是看外形,因为本文的记号跟原论文的记号不完全对应的,而且推导原理也不一样;
2、从优化的角度来讲,用$q(z|x)$近似$p(z|x)$,既可以去最小化$KL(p(z|x)\Vert q(z|x))$,也可以去最小化$KL(q(z|x)\Vert p(z|x))$,两者都是在缩小$q(z|x)$与$p(z|x)$的差异。
嗯嗯,谢谢您的回复。
May 18th, 2019
接3楼:
进而推导出
logp(x) - KL(q(x|z)‖p(x|z)) =
June 22nd, 2019
感谢博主的工作,我觉得对于公式(11),博主将Ex∼p(x)[lnp(x)]视为一个常数,这个不应该是一个似然函数吗,然后我们试图寻找p(x)中的参数theta,使得似然函数最大,然后再等价于优化其下界L。
$-\mathbb{E}_{x\sim \tilde{p}(x)}[\ln \tilde{p}(x)]$不是似然函数,它只是这批数据的熵;$-\mathbb{E}_{x\sim \tilde{p}(x)}[\ln q(x)]$才是似然函数。
不知是不是可以这么理解,p~(x)是evidence,q(x)是对数据X的模型假设,q(x)隐含潜变量z,并且假设X是由z的某个随机过程产生。博主的这篇博文应该是跟《Auto-Encoding Variational Bayes》这篇文章中的符号有些正好是反的,所以有点地方先入为主了
嗯嗯。不过记号再怎么不一致,$-\mathbb{E}_{x\sim \tilde{p}(x)}[\ln \tilde{p}(x)]$也不是似然函数。
今天又重新看了一遍这篇博文,您在“不要搞分裂”那部分对目标L的两个部分的解读提到说不能分隔开来看,因为当z没有辨识度的话,我觉的可以根据deep infomax中提出的观点理解为就是x与z互信息为0,此时−lnq(x|z)不可能小,在这个地方我觉得不见得,当decoder的拟合能力很强的时候,强到对z的依赖性很小,重构误差也是有可能很小的,这也是我在实验中发现的问题,不知博主怎么看待这个问题
总之两项不可能同时为0
我有个不太靠谱的问题:
如果 【$z$ 不具备辨识度】的定义在直观上的理解是:所有 $x_{i}$ 都对应到同一个$z$ 而不是 $z_{i}$, VAE 是不是就退化成 普通AE了?
我不理解“$z$不具备辨识度的定义”跟“VAE退化成AE”之间有什么联系~
June 29th, 2019
苏神写的文章是有声音的。一问一答,精妙。。读完这篇文章,收获颇多,对vae也有了更深的了解。谢谢苏神。。 第一次写评论,没有问题,就随便写些感受吧。
August 5th, 2019
mse损失中的μ(z)实现的时候怎么实现?
为了防止误解,我重新微调了一下你说的地方的记号,改为了$\tilde{\mu}(z)$和$\tilde{\sigma}(z)$。你说的$\tilde{\mu}(z)$相当于就是生成器,就是将$z$还原为一张图片的模型,常用的结构是反卷积。
谢谢
August 13th, 2019
苏神您好,很感激您的工作,不过有2个比较傻的问题。
文中提到"但事实上,直接来对$p(x,z)$进行近似是最为干脆的", 并且定义了$p(x,z)=\tilde{p}(x)p(z|x)$
问题一: 为什么说"直接来对$p(x,z)$进行近似是最为干脆的"?
我的理解: 在Vae中,我们本质上是要求:
(1) $\tilde{p}(x)$: 整体$x$的分布。 这可以通过$\tilde{p}(x)=\int p(x,z)dz$求得
(2) $p(z|x)$: 编码器。 这可以通过$p(z|x)=p(x,z)/\tilde{p}(x)$求得
(3) $p(x|z)$: 生成器。 这可以通过$p(x|z)=p(x,z)/p(z)$求得, 而$p(z)$通过我们的手段,近似限制为了标准正态分布。
这样,通过求$p(x,y)$, 相当于一石三鸟,所以说干脆。
问题二:定义了$p(x,z)=\tilde{p}(x)p(z|x)$? 不应该是$p(x,z)=p(x)p(z|x)$吗?抱歉这个问题可能太脑残。
是不是在概率论中, 概率函数$P$是一个抽象函数,写成$p(x)$,或者写成$\tilde{p}(x)$甚至写成$r(x)$都是一样的,只是一个记号问题?
不知道对两个问题,我的理解对不对。。
概念有些混乱。
$\tilde{p}(x)$是真实数据分布,我们想要知道这个分布,所以我们用$q(x)=\int q(x,z)dz$去估计这个分布,换句话说,我们希望$q(x)$能逼近$\tilde{p}(x)$。
但是这个直接的目标不好优化,所以我们进一步引入$p(z|x)$,然后构建$p(x,z)=\tilde{p}(x)p(z|x)$,然后让$q(x,z)$去逼近$p(x,z)$,这样就容易优化。
“干脆”的意思是,直接优化$p(x,z)$与$q(x,z)$的KL散度,就可以完整快速地导出VAE了,不需要像原文那样去考虑ELBO的转换。
April 13th, 2020
[...]苏剑林. (2018, Mar 28). 《变分自编码器(二):从贝叶斯观点出发 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/5343[...]
April 28th, 2020
你好,非常感谢您用心写的博客,让我受益匪浅。
我想问一下,在“不能搞分裂”一节中,能不能解释一下 "z没有任何辨识度"是啥意思?为啥z没有任何辨识度,-lnq(x|z)就不可能小(预测不准)?
“z没有任何辨识度“就是指$z$几乎跟$x$无关,所以靠$z$不可能完美重构$x$,所以$q(x|z)$就很小(预测不准),也就是$-\ln q(x|z)$大。