一入生成深似海,其中有很多晦涩难懂的数学公式和原理,对于数学基础薄弱的我,实在有些不友好。因此准备不定期的输出,自己所学理论与实践。既是巩固,也方便笔者自己回忆与复习,同时也希望能够帮助同样在学习中的你。往后文章都会先发布于微信公众号:深度学习指南。欢迎关注喔~
最佳排版请前往:公众号文章地址
什么是变分推断?
假设我们现在要做一个生成模型,我们只有训练集的数据,要求数据的分布p,我们当然无法直接求。因此一个可行的方法是,找一个容易表达和求解的分布q,只要p和q的分布差异足够小,我们就可以将q作为p的近似分布了,成为我们的输出结果。而求解这个过程的方法,就叫做变分推断。
这样的一个思路,我们就可以把一个求分布问题,转变成了“缩小距离”的优化问题。
变分推断与证据下界
现在,我们定义一下问题。在机器学习的生成式里,我们没有办法直接显式的写出数据对应的分布表达式,因此采取的办法是引入带有隐变量的概率分布。即
p ( x ) = ∫ p ( z ) p ( x ∣ z ) d z p(x) = \int p(z)p(x|z)dz p(x)=∫p(z)p(x∣z)dz
这个方法的本质是什么?其实就是我们希望z~q,然后有一个神经网络计算$f_{\theta}(z) ,这个计算的结果就是 ,这个计算的结果就是 ,这个计算的结果就是x ,即 ,即 ,即x ~ p(.|z) 。这意味着,我们要定义 。这意味着,我们要定义 。这意味着,我们要定义(X,Z)$的联合分布。
上述积分,我们没法直接求,因为我们不知道 q ( x ∣ z ) q(x|z) q(x∣z)到底是个什么东西,神经网络只是万能的函数拟合器,没法直接拟合分布。因此,这里转向贝叶斯的思路,即
p ( x ) = p ( z ) p ( x ∣ z ) p ( z ∣ x ) p(x) = \frac{p(z)p(x|z)}{p(z|x)} p(x)=p(z∣x)p(z)p(x∣z)
所以我们要想求 p ( x ) p(x) p(x),我们仅需求 p ( z ∣ x ) p(z|x) p(z∣x),因为分子项 q ( z ) q(z) q(z)是我们自己定义的先验分布,一般是一个高斯分布。 p ( x ∣ z ) p(x|z) p(x∣z)是一个我们自己定义的神经网络。因此求分布 p ( x ) p(x) p(x)的问题就转变成了求解后验分布 p ( z ∣ x ) p(z|x) p(z∣x)。
但其实后验分布 p ( z ∣ x ) p(z|x) p(z∣x)并不好搞,它的计算挑战在于计算分母 p ( x ) p(x) p(x), 它是对所有可能的z的值的积分,这在 z z z是高纬或连续的情况下,计算上是不可行的,比如若 z z z是一个10维的连续变量,每个维度上我们需要对1000个点做积分,那么我们总共需要计算 100 0 10 1000^{10} 100010个点!这根本无法接受。
因此到这里我们终于可以引入本篇文章的重点:变分推断方法,寻找一个近似分布 q ∗ q^* q∗(z)来近似替代 p ( z ∣ x ) p(z|x) p(z∣x),即
q ∗ ( z ) = arg min q ( z ) ∈ Q L ( q ( z ) , p ( z ∣ x ) ) q^*(z) = \arg\min_{q(z)\in Q}{L(q(z),p(z|x))} q∗(z)=argq(z)∈QminL(q(z),p(z∣x))
其中 Q Q Q表示空间里的一个概率分布集合,我们需要在 Q Q Q中找一个最优的替代概率分布 q ∗ ( z ) q^*(z) q∗(z),要求这个分布是好求解,并且是整个 Q Q Q中离 p ( z ∣ x ) p(z|x) p(z∣x)最近的分布。 L L L表示此空间上的一种距离度量函数。
如果我们能找到 q ∗ ( z ) q^*(z) q∗(z),那么我们就可以用 q ∗ ( z ) q^*(z) q∗(z)去估计原来不好计算的
在这里,一般采用的距离度量工具是KL散度,那这里的变分推断就是变分贝叶斯推断(Variational Bayes, VB)(VB是变分推断里的特例)。 所以我们的目标就变成了
q ∗ ( z ) = arg min q ( z ) ∈ Q K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) (1) q^*(z) = \arg\min_{q(z)\in Q}{KL(q(z)||p(z|x))} \tag{1} q∗(z)=argq(z)∈QminKL(q(z)∣∣p(z∣x))(1)
单独将KL项展开
K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) = ∫ q ( z ) log q ( z ) p ( z ∣ x ) d z (2) \tag{2} {KL(q(z)||p(z|x))} = \int q(z) \log \frac{q(z)}{p(z|x)} dz KL(q(z)∣∣p(z∣x))=∫q(z)logp(z∣x)q(z)dz(2)
根据期望的公式,我们可以得到
K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) = ∫ q ( z ) log q ( z ) p ( z ∣ x ) d z = E q ( log q ( z ) ) − E q ( log p ( z ∣ x ) ) (3) \tag{3} {KL(q(z)||p(z|x))} = \int q(z) \log \frac{q(z)}{p(z|x)} dz = \mathbb{E}_q (\log q(z)) - \mathbb{E}_q (\log p(z|x)) KL(q(z)∣∣p(z∣x))=∫q(z)logp(z∣x)q(z)dz=Eq(logq(z))−Eq(logp(z∣x))(3)
将最后一项的期望,根据条件概率公式展开
K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) = E q ( log q ( z ) ) − E q ( log p ( x , z ) ) + log p ( x ) (4) \tag{4} {KL(q(z)||p(z|x))} = \mathbb{E}_q (\log q(z)) - \mathbb{E}_q (\log p(x,z)) + \log p(x) KL(q(z)∣∣p(z∣x))=Eq(logq(z))−Eq(logp(x,z))+logp(x)(4)
其中最后一项之所以为 log p ( x ) \log p(x) logp(x),是因为 E q ( log p ( x ) ) \mathbb{E}_q(\log p(x)) Eq(logp(x))与 z z z无关,所以期望是一个常数。
推导到这里,我们已经得到了 − E L B O - ELBO −ELBO,即 E q ( log q ( z ) ) − E q ( log p ( x , z ) ) \mathbb{E}_q (\log q(z)) - \mathbb{E}_q (\log p(x,z)) Eq(logq(z))−Eq(logp(x,z)),注意是负的喔。
所以关于 q ( z ) q(z) q(z)的 E L B O ( q ) ELBO(q) ELBO(q)的表达式为
E L B O ( q ) = E q ( log p ( x , z ) ) − E q ( log q ( z ) ) (5) \tag{5}ELBO(q) = \mathbb{E}_q (\log p(x,z)) - \mathbb{E}_q (\log q(z)) ELBO(q)=Eq(logp(x,z))−Eq(logq(z))(5)
所以我们可以得到
log p ( x ) = E L B O ( q ) + K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) (6) \tag{6} \log p(x)= ELBO(q) + KL(q(z)||p(z|x)) logp(x)=ELBO(q)+KL(q(z)∣∣p(z∣x))(6)
因为等式的左边是一个常数,而还记得我们式子(1)的目标吗?是要最小化KL项,而KL散度总是大于等于0, 因此最终我们要做的就是最大化 E L B O ( q ) ELBO(q) ELBO(q),就能达成我们的目标,即
q ∗ ( z ) = arg min q ( z ) ∈ Q K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) = arg max q ( z ) ∈ Q E L B O ( q ) (7) \tag{7} q^*(z) = \arg\min_{q(z)\in Q}{KL(q(z)||p(z|x))} = \arg\max_{q(z) \in Q} ELBO(q) q∗(z)=argq(z)∈QminKL(q(z)∣∣p(z∣x))=argq(z)∈QmaxELBO(q)(7)
到这里,我们可以总结说,想要找到后验分布 p ( z ∣ x ) p(z|x) p(z∣x)最相近的分布 q ∗ ( z ) q^*(z) q∗(z),只要最大化 q ( z ) q(z) q(z)的ELBO就可以了。另外,到这里也知晓为什么ELBO会叫证明下界(Evidence Lower Bound),是因为KL散度总是大于等于0,所以有了下列的不等式
log p ( x ) = E L B O ( q ) + K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) > = E L B O ( q ) (8) \tag{8} \log p(x)= ELBO(q) + KL(q(z)||p(z|x)) >= ELBO(q) logp(x)=ELBO(q)+KL(q(z)∣∣p(z∣x))>=ELBO(q)(8)
所以ELBO(q)其实就是数据Evidence log p ( x ) \log p(x) logp(x)的下界。
最后:在实际计算中, E L B O ELBO ELBO一般表示为以下形式计算
E L B O ( q ) = E q ( log p ( x , z ) ) − E q ( log q ( z ) ) = E q ( log p ( x ∣ z ) p ( z ) ) − E q ( log q ( z ) ) = E q ( log p ( x ∣ z ) ) + E q ( log p ( z ) ) − E q ( log q ( z ) ) = E q ( log p ( x ∣ z ) ) + ∫ q ( z ) log p ( z ) q ( z ) d z = E q ( log p ( x ∣ z ) ) − K L ( q ( z ) ∣ ∣ p ( z ) \begin{aligned} ELBO(q) &= \mathbb{E}_q(\log p(x,z)) - \mathbb{E}_q(\log q(z)) \\ &= \mathbb{E}_q(\log p(x|z)p(z)) - \mathbb{E}_q(\log q(z)) \\ &= \mathbb{E}_q(\log p(x|z)) + \mathbb{E}_q(\log p(z)) - \mathbb{E}_q(\log q(z)) \\ &= \mathbb{E}_q(\log p(x|z)) + \int q(z)\log \frac{p(z)}{q(z)}dz\\ &= \mathbb{E}_q(\log p(x|z)) - KL(q(z)||p(z) \end{aligned} ELBO(q)=Eq(logp(x,z))−Eq(logq(z))=Eq(logp(x∣z)p(z))−Eq(logq(z))=Eq(logp(x∣z))+Eq(logp(z))−Eq(logq(z))=Eq(logp(x∣z))+∫q(z)logq(z)p(z)dz=Eq(logp(x∣z))−KL(q(z)∣∣p(z)
其中,在机器学习里, p ( z ) p(z) p(z)是我们预设的分布,一般设为高斯分布(因为我们也没有多少可用又简单的显式分布-.-)
总结
本文在开头,先直白讲解了什么叫做变分推断,以及它的作用。然后从机器学习的生成模型的背景开始,逐步引出变分推断的使用,最后从头到尾推导了,ELBO的由来。笔者的数学水平有限,如有错误,欢迎指正喔。
参考资料
- 变分推断之傻瓜式推导ELBO - 知乎 (zhihu.com)
- 变分贝叶斯推断——Variational Bayesian Inference - 知乎 (zhihu.com)
- [(5 封私信 / 2 条消息) 如何简单易懂地理解变分推断(variational inference)? - 知乎 (zhihu.com)](