变分推断(Variational Inference)解析

article/2025/8/22 17:59:41

一、什么是变分推断

假设在一个贝叶斯模型中, x x x为一组观测变量, z z z为一组隐变量(参数也看做随机变量,包含在 z z z中),则推断问题为计算后验概率密度 P = ( z ∣ x ) P=(z|x) P=(zx)。根据贝叶斯公式,有:
p ( z ∣ x ) = p ( x , z ) p ( x ) = p ( x , z ) ∫ p ( x , z ) d z p(z|x)=\frac{p(x,z)}{p(x)}=\frac{p(x,z)}{\int p(x,z)dz} p(zx)=p(x)p(x,z)=p(x,z)dzp(x,z)
但是在实际应用中,可能由于积分没有闭式解,或者是指数级的计算复杂度等原因,导致计算上面公式中的积分往往是不可行的。变分推断就是用来解决这个问题的。

变分推断是变分法在推断问题中的应用,既然无法直接求得后验概率密度 p ( z ∣ x ) p(z|x) p(zx),那我们可以寻找一个简单的分布 q ∗ ( z ) q^*(z) q(z)来近似后验概率密度 p ( z ∣ x ) p(z|x) p(zx),这就是变分推断的思想。借此,我们将推断问题转换为一个泛函优化问题:
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(zx))(1)
其中 Q Q Q为候选的概率分布族。但是又出现了一个新的问题:我们已经知道后验概率密度 p ( z ∣ x ) p(z|x) p(zx)难以计算,所以上式中的KL散度本身也是无法计算的!这时,需要借助于证据下界ELBO。

ELBO

ELBO,全称为 Evidence Lower Bound,即证据下界。这里的证据指数据或可观测变量的概率密度。

假设 x = x 1 : n x=x_{1:n} x=x1:n表示一系列可观测数据集, z = z 1 : m z=z_{1:m} z=z1:m为一系列隐变量(latent variables)。则可用 p ( z , x ) p(z,x) p(z,x)表示联合概率, p ( z ∣ x ) p(z∣x) p(zx)为条件概率, p ( x ) p(x) p(x)为证据。

那么,贝叶斯推理需要求解的就是条件概率,即: p ( z ∣ x ) = p ( x , z ) p ( x ) p(z|x)=\frac{p(x,z)}{p(x)} p(zx)=p(x)p(x,z)
(1)式中的KL散度可以表示为 K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) = ∫ q ( z ) log ⁡ q ( z ) p ( z ∣ x ) d z KL(q(z)||p(z|x))=\int q(z)\log\frac{q(z)}{p(z|x)}dz KL(q(z)p(zx))=q(z)logp(zx)q(z)dz其中, x x x为可观测数据集, z z z为未知变量,下面将公式继续变形:
∫ q ( z ) log ⁡ q ( z ) p ( z ∣ x ) d z = − ∫ q ( z ) log ⁡ p ( z ∣ x ) q ( z ) d z = − ∫ q ( z ) log ⁡ p ( x , z ) q ( z ) p ( x ) d z = − ∫ q ( z ) log ⁡ p ( x , z ) d z + ∫ q ( z ) log ⁡ q ( z ) d z + ∫ q ( z ) log ⁡ p ( x ) d z \begin{aligned}\int q(z)\log\frac{q(z)}{p(z|x)}dz&=-\int q(z)\log\frac{p(z|x)}{q(z)}dz\\&=-\int q(z)\log\frac{p(x,z)}{q(z)p(x)}dz\\&=-\int q(z)\log p(x,z)dz+\int q(z)\log q(z)dz+\int q(z)\log p(x)dz\end{aligned} q(z)logp(zx)q(z)dz=q(z)logq(z)p(zx)dz=q(z)logq(z)p(x)p(x,z)dz=q(z)logp(x,z)dz+q(z)logq(z)dz+q(z)logp(x)dz其中, ∫ q ( z ) d z = 1 \int q(z)dz=1 q(z)dz=1进而可以转化成: = − ∫ q ( z ) log ⁡ p ( x , z ) d z + ∫ q ( z ) log ⁡ q ( z ) d z + log ⁡ p ( x ) =-\int q(z)\log p(x,z)dz+\int q(z)\log q(z)dz+\log p(x) =q(z)logp(x,z)dz+q(z)logq(z)dz+logp(x) L ( q ( z ) ) = ∫ q ( z ) log ⁡ p ( x , z ) d z − ∫ q ( z ) log ⁡ q ( z ) d z L(q(z))=\int q(z)\log p(x,z)dz-\int q(z)\log q(z)dz L(q(z))=q(z)logp(x,z)dzq(z)logq(z)dz
则有 K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) = − L ( q ( z ) ) + log ⁡ p ( x ) KL(q(z)||p(z|x))=-L(q(z))+\log p(x) KL(q(z)p(zx))=L(q(z))+logp(x)从这个公式可以发现, log ⁡ p ( x ) \log p(x) logp(x)不涉及参数(数据似然),因此在最小化 K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) KL(q(z)||p(z|x)) KL(q(z)p(zx))时可以忽略。那么,最小化 K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) KL(q(z)||p(z|x)) KL(q(z)p(zx))便转化成了最大化 L ( q ( z ) ) L(q(z)) L(q(z))

因为 K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) ≥ 0 KL(q(z)||p(z|x))\geq 0 KL(q(z)p(zx))0,即: − L ( q ( z ) ) + log ⁡ p ( x ) ≥ 0 -L(q(z))+\log p(x)\geq 0 L(q(z))+logp(x)0进而可以得到: log ⁡ p ( x ) ≥ L ( q ( z ) ) \log p(x)\geq L(q(z)) logp(x)L(q(z))因此,可以将 L ( q ( z ) ) L(q(z)) L(q(z))堪称 log ⁡ p ( x ) \log p(x) logp(x)的下界,这个下界也称之为ELBO(evidence lower bound),那么最小化 K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) KL(q(z)||p(z|x)) KL(q(z)p(zx)),可以看成最大化下界的问题。

另外,从公式中可以看到,KL散度是 L ( q ( z ) ) L(q(z)) L(q(z)) log ⁡ p ( x ) \log p(x) logp(x)的误差,当然误差越小越好。

根据以上结果,最新的目标函数转化成了 q ∗ ( z ) = arg ⁡ max ⁡ q ( z ) ∈ Q L ( q ( z ) ) = arg ⁡ max ⁡ q ( z ) ∈ Q ∫ z q ( z ) log ⁡ p ( x , z ) d z ⏟ ( a ) − ∫ z q ( z ) log ⁡ q ( z ) d z ⏟ ( b ) (2) \begin{aligned}q^*(z)&=\arg\max_{q(z)\in Q}L(q(z))\\&=\arg\max_{q(z)\in Q}\underbrace{\int_z q(z)\log p(x,z)dz}_{(a)}-\underbrace{\int_z q(z)\log q(z)dz}_{(b)}\tag{2}\end{aligned} q(z)=argq(z)QmaxL(q(z))=argq(z)Qmax(a) zq(z)logp(x,z)dz(b) zq(z)logq(z)dz(2)至此,我们已经解决了KL散度无法求解的问题,将泛函优化问题转换为寻找一个简单分布 q ∗ ( z ) q^*(z) q(z)来最大化证据下界 L ( q ( z ) ) L(q(z)) L(q(z))

二、基于平均场理论的变分推断

在变分推断中,候选分布族 Q Q Q的复杂性决定了优化问题的复杂性。一个通常的选择是平均场分布族,即 z z z可以拆分成多组相互独立的变量,有: q ( z ) = ∏ i = 1 M q i ( z i ) (3) q(z)=\prod_{i=1}^Mq_i(z_i)\tag{3} q(z)=i=1Mqi(zi)(3)其中 z i z_i zi是隐变量的子集,可以是单变量,也可以是一组多元变量。

下面我们分布(3)把将代入(2)中的(a)和(b),看看 L ( q ( z ) ) L(q(z)) L(q(z))最后的模样,其中假设我们想先求 q j ( z j ) q_j(z_j) qj(zj),将其它组的 q ∖ j ( z ∖ j ) q_{\setminus j}(z_{\setminus j}) qj(zj)当作常量:

2.1、求解(a)

我们首先求解(a):
( a ) = ∫ z q ( z ) log ⁡ p ( x , z ) d z = ∫ z ∏ i = 1 M q i ( z i ) log ⁡ p ( x , z ) d z = ∫ z j q j ( z j ) ( ∫ z ∖ j ∏ i ≠ j q i ( z i ) log ⁡ p ( x , z ) d z ∖ j ) d z j = ∫ z j q j ( z j ) E ∏ i ≠ j q i ( z i ) [ log ⁡ p ( x , z ) ] d z j = ∫ z j q j ( z j ) log ⁡ p ^ ( x , z j ) d z j \begin{aligned}(a)&=\int_z q(z)\log p(x,z)dz\\&=\int_z\prod_{i=1}^M q_i(z_i)\log p(x,z)dz\\&=\int_{z_j}q_j(z_j)(\int_{z_{\setminus j}}\prod_{i\neq j}q_i(z_i)\log p(x,z)dz_{\setminus j})dz_j\\&=\int_{z_j}q_j(z_j)E_{\prod_{i\neq j}q_i(z_i)}[\log p(x,z)]dz_j\\&=\int_{z_j}q_j(z_j)\log \hat{p}(x,z_j)dz_j\end{aligned} (a)=zq(z)logp(x,z)dz=zi=1Mqi(zi)logp(x,z)dz=zjqj(zj)(zji=jqi(zi)logp(x,z)dzj)dzj=zjqj(zj)Ei=jqi(zi)[logp(x,z)]dzj=zjqj(zj)logp^(x,zj)dzj在最后一步中,我们把期望 E ∏ i ≠ j q i ( z i ) [ log ⁡ p ( x , z ) ] E_{\prod_{i\neq j}q_i(z_i)}[\log p(x,z)] Ei=jqi(zi)[logp(x,z)]记为 log ⁡ p ^ ( x , z j ) \log \hat{p}(x,z_j) logp^(x,zj)

2.2、求解(b)

接着,我们求解(b):
( b ) = ∫ z q ( z ) log ⁡ q ( z ) d z = ∫ z ∏ i = 1 M q i ( z i ) ∑ j = 1 M log ⁡ q j ( z j ) d z (4) \begin{aligned}(b)&=\int_z q(z)\log q(z)dz\\&=\int_z\prod_{i=1}^M q_i(z_i)\sum_{j=1}^M\log q_j(z_j)dz\tag{4}\end{aligned} (b)=zq(z)logq(z)dz=zi=1Mqi(zi)j=1Mlogqj(zj)dz(4)我们取 ∑ \sum 符号中的第一项出来,看看有没有什么规律可以帮助我们化简:
∫ z ∏ i = 1 M q i ( z i ) log ⁡ q 1 ( z 1 ) d z = ∫ z q 1 ( z 1 ) log ⁡ q 1 ( z 1 ) q 2 ( z 2 ) q 2 ( z 3 ) ⋯ ⋯ q M ( z M ) d z = ∫ z 1 q 1 ( z 1 ) log ⁡ q 1 ( z 1 ) d z 1 ∫ z 2 q 2 ( z 2 ) d z 2 ⏟ = 1 ∫ z 3 q 3 ( z 3 ) d z 3 ⏟ = 1 ⋯ ⋯ ∫ z M q M ( z M ) d z M ⏟ = 1 = ∫ z 1 q 1 ( z 1 ) log ⁡ q 1 ( z 1 ) d z 1 \begin{aligned}\int_z\prod_{i=1}^M q_i(z_i)\log q_1(z_1)dz&=\int_z q_1(z_1)\log q_1(z_1)q_2(z_2)q_2(z_3)\cdots\cdots q_M(z_M)dz\\&=\int_{z_1} q_1(z_1)\log q_1(z_1)dz_1\underbrace{\int_{z_2}q_2(z_2)dz_2}_{=1}\underbrace{\int_{z_3}q_3(z_3)dz_3}_{=1}\cdots\cdots\underbrace{\int_{z_M}q_M(z_M)dz_M}_{=1}\\&=\int_{z_1} q_1(z_1)\log q_1(z_1)dz_1\end{aligned} zi=1Mqi(zi)logq1(z1)dz=zq1(z1)logq1(z1)q2(z2)q2(z3)qM(zM)dz=z1q1(z1)logq1(z1)dz1=1 z2q2(z2)dz2=1 z3q3(z3)dz3=1 zMqM(zM)dzM=z1q1(z1)logq1(z1)dz1综上,(4)式可继续化简为:
( b ) = ∫ z ∏ i = 1 M q i ( z i ) ∑ j = 1 M log ⁡ q j ( z j ) d z = ∑ i = 1 M ∫ z i q i ( z i ) log ⁡ q i ( z i ) d z i = ∫ z j q j ( z j ) log ⁡ q j ( z j ) d z j + C \begin{aligned}(b)&=\int_z\prod_{i=1}^M q_i(z_i)\sum_{j=1}^M\log q_j(z_j)dz\\&=\sum_{i=1}^M\int_{z_i} q_i(z_i)\log q_i(z_i)dz_i\\&=\int_{z_j} q_j(z_j)\log q_j(z_j)dz_j+C\end{aligned} (b)=zi=1Mqi(zi)j=1Mlogqj(zj)dz=i=1Mziqi(zi)logqi(zi)dzi=zjqj(zj)logqj(zj)dzj+C

2.3、求解ELBO

至此,(a)、(b)我们都求出来了,现在回到证据下界 L ( q ( z ) ) L(q(z)) L(q(z))
L ( q ( z ) ) = ( a ) − ( b ) = ∫ z j q j ( z j ) log ⁡ p ^ ( x , z j ) d z j − ∫ z j q j ( z j ) log ⁡ q j ( z j ) d z j + C = ∫ z j q j ( z j ) log ⁡ p ^ ( x , z j ) q j ( z j ) + C = − K L ( q j ( z j ) ∣ ∣ p ^ ( x , z j ) ) + C \begin{aligned}L(q(z))&=(a)-(b)\\&=\int_{z_j}q_j(z_j)\log \hat{p}(x,z_j)dz_j-\int_{z_j} q_j(z_j)\log q_j(z_j)dz_j+C\\&=\int_{z_j}q_j(z_j)\log\frac{\hat{p}(x,z_j)}{q_j(z_j)}+C\\&=-KL(q_j(z_j)||\hat{p}(x,z_j))+C\end{aligned} L(q(z))=(a)(b)=zjqj(zj)logp^(x,zj)dzjzjqj(zj)logqj(zj)dzj+C=zjqj(zj)logqj(zj)p^(x,zj)+C=KL(qj(zj)p^(x,zj))+C由于 − K L ( q j ( z j ) ∣ ∣ p ^ ( x , z j ) ) ≤ 0 -KL(q_j(z_j)||\hat{p}(x,z_j))\leq 0 KL(qj(zj)p^(x,zj))0,因此如果我们想令 L ( q ( z ) ) L(q(z)) L(q(z))最大,则 K L ( q j ( z j ) ∣ ∣ p ^ ( x , z j ) ) = 0 KL(q_j(z_j)||\hat{p}(x,z_j))=0 KL(qj(zj)p^(x,zj))=0,即: q j ∗ ( z j ) = p ^ ( x , z j ) = e x p { E ∏ i ≠ j q i ( z i ) [ log ⁡ p ( x , z ) ] } (5) q^*_j(z_j)=\hat{p}(x,z_j)=exp\{E_{\prod_{i\neq j}q_i(z_i)}[\log p(x,z)]\}\tag{5} qj(zj)=p^(x,zj)=exp{Ei=jqi(zi)[logp(x,z)]}(5)从(5)式可知, q j ∗ ( z j ) q^*_j(z_j) qj(zj)的计算依赖于其他隐变量,因此我们采用坐标上升法,迭代地优化每个 q j ∗ ( z j ) , j = 1 , 2 , ⋯ , M q^*_j(z_j),j=1,2,\cdots,M qj(zj),j=1,2,,M。通过不断地循环(5),证据下界 L ( q ( z ) ) L(q(z)) L(q(z))会收敛到一个局部最优值。

三、基于随机梯度的变分推断

上面提到的基于平均场理论的变分推断,最终导出了坐标上升的方法,但是平均场假设太强了,需要假设各组 z z z之间是相互独立的,这在例如玻尔兹曼机等情况下是不成立的,而且(5)式中的积分有时候也十分难算。

我们知道,常见的优化方法除了坐标上升,还有梯度上升,那么我们能否基于随机梯度来得到变分推断的另外一种方法,改进基于平均场理论的变分推导的算法缺点呢?

3.1、蒙特卡洛采样方法

首先简单介绍一下蒙特卡洛采样方法。

3.1.1、蒙特卡洛的概念

蒙特卡洛原来是一个赌场的名称,用它作为名字大概是因为蒙特卡洛方法是一种随机模拟的方法,这很像赌博场里面的扔骰子的过程。最早的蒙特卡洛方法都是为了求解一些不太好求解的求和或者积分问题

例如下图是一个经典的用蒙特卡洛求圆周率的问题,用计算机在一个正方形之中随机地生成点,计数有多少点落在1/4圆之中,这些点的数目除以总的点数目即圆的面积,根据圆面积公式即可求得圆周率
在这里插入图片描述
蒙特卡洛算法的另一个应用是求积分,某些函数的积分不好求,我们可以按照下面的方法将这个函数进行分解,之后转化为求期望与求均值的问题 ∫ a b h ( x ) d x = ∫ a b f ( x ) p ( x ) d x = E p ( x ) [ f ( x ) ] \int_a^bh(x)dx=\int_a^bf(x)p(x)dx=E_{p(x)}[f(x)] abh(x)dx=abf(x)p(x)dx=Ep(x)[f(x)]从分布 p ( x ) p(x) p(x)采样大量样本点 x 1 , x 2 , ⋯ , x n x_1,x_2,\cdots,x_n x1,x2,,xn,这些样本符合分布 p ( x ) p(x) p(x) E p ( x ) [ f ( x ) ] = 1 n ∑ f ( x i ) E_{p(x)}[f(x)]=\frac{1}{n}\sum f(x_i) Ep(x)[f(x)]=n1f(xi)最终使用蒙特卡洛的方法求得积分。

3.1.2、蒙特卡洛采样方法

对某一种概率分布 p ( x ) p(x) p(x)进行蒙特卡洛采样的方法主要分为直接采样、拒绝采样与重要性采样三种,下面分别予以介绍

直接采样

直接采样的方法是根据概率分布进行采样。对一个已知概率密度函数与累积概率密度函数的概率分布,我们可以直接从累积分布函数(cdf)进行采样

如下图所示是高斯分布的累积概率分布函数,可以看出函数的值域是 ( 0 , 1 ) (0, 1) (0,1),我们可以从 U ( 0 , 1 ) U(0, 1) U(0,1)均匀分布中进行采样,再根据累积分布函数的反函数计算对应的 x x x,这样就获得了符合高斯分布的 N N N个粒子

在这里插入图片描述
使用累积分布函数进行采样看似简单,但是由于很多分布我们并不能写出概率密度函数与累积分布函数,所以这种方法的适用范围较窄。

接受-拒绝采样

对于累积分布函数未知的分布,我们可以采用接受-拒绝采样。如下图所示, p ( z ) p(z) p(z)是我们希望采样的分布, q ( z ) q(z) q(z)是我们提议的分布(proposal distribution),令 k q ( z ) > p ( z ) kq(z)>p(z) kq(z)>p(z),我们首先在 k q ( z ) kq(z) kq(z)中按照直接采样的方法采样粒子,接下来判断这个粒子落在途中什么区域,对于落在灰色区域的粒子予以拒绝,落在红线下的粒子接受,最终得到符合 p ( z ) p(z) p(z) N N N个粒子

在这里插入图片描述
重要性采样

接受-拒绝采样完美的解决了累积分布函数不可求时的采样问题。但是接受拒绝采样非常依赖于提议分布(proposal distribution)的选择,如果提议分布选择的不好,可能采样时间很长却获得很少满足分布的粒子。而重要性采样就解决了这一问题

直接采样与接受-拒绝采样都是假设每个粒子的权重相等,而重要性采样则是给予每个粒子不同的权重,使用加权平均的方法来计算期望 E p ( x ) [ f ( x ) ] = ∫ a b f ( x ) p ( x ) q ( x ) d x = E q ( x ) [ f ( x ) p ( x ) q ( x ) ] E_{p(x)}[f(x)]=\int_a^bf(x)\frac{p(x)}{q(x)}dx=E_{q(x)}[f(x)\frac{p(x)}{q(x)}] Ep(x)[f(x)]=abf(x)q(x)p(x)dx=Eq(x)[f(x)q(x)p(x)]我们从提议分布 q ( x ) q(x) q(x)中采样大量粒子 x 1 , x 2 , ⋯ , x n x_1,x_2,\cdots,x_n x1,x2,,xn,每个粒子的权重是 p ( x i ) q ( x i ) \frac{p(x_i)}{q(x_i)} q(xi)p(xi),通过加权平均的方式可以计算出期望 E p ( x ) [ f ( x ) ] = 1 N ∑ f ( x i ) p ( x i ) q ( x i ) E_{p(x)}[f(x)]=\frac{1}{N}\sum f(x_i)\frac{p(x_i)}{q(x_i)} Ep(x)[f(x)]=N1f(xi)q(xi)p(xi)

3.1.3、总结

蒙特卡洛方法是一种近似推断的方法,通过采样大量粒子的方法来求解期望、均值、面积、积分等问题,蒙特卡洛对某一种分布的采样方法有直接采样、接受拒绝采样与重要性采样三种,直接采样最简单,但是需要已知累积分布的形式。接受拒绝采样与重要性采样适用于原分布未知的情况,这两种方法都是给出一个提议分布,不同的是接受拒绝采样对不满足原分布的粒子予以拒绝,而重要性采样则是给予每个粒子不同的权重,大家可以根据不同的场景使用这三种方法中的一种进行采样。

3.2、初窥SGVI

首先明确一下我们的目标函数:
q ∗ ( z ) = arg ⁡ max ⁡ q ( z ) ∈ Q L ( q ( z ) ) (6) q^*(z)=\arg\max_{q(z)\in Q}L(q(z))\tag{6} q(z)=argq(z)QmaxL(q(z))(6)我们假设 q ( z ) q(z) q(z)服从某种分布,对应的参数为 ϕ \phi ϕ,则将目标由求解最佳分布 q ∗ ( z ) q^*(z) q(z)转化为求最佳分布 q ∗ ( z ) q^*(z) q(z)所对应的参数 ϕ \phi ϕ,如果我们能够顺利求出 L ( q ( z ) ) L(q(z)) L(q(z))的梯度,那么采用(7)所示的梯度上升法,我们就通过迭代求得参数的局部最优值:
ϕ t + 1 ← ϕ t + λ ∇ ϕ L ( ϕ ) (7) \phi^{t+1}\gets\phi^t+\lambda\nabla_{\phi}L(\phi)\tag{7} ϕt+1ϕt+λϕL(ϕ)(7)下面我们试着推导一下 ∇ ϕ L ( ϕ ) \nabla_{\phi}L(\phi) ϕL(ϕ)
∇ ϕ L ( ϕ ) = ∇ ϕ E q ϕ ( z ) [ log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ] = ∇ ϕ ∫ z q ϕ ( z ) ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) d z = ∫ z ∇ ϕ [ q ϕ ( z ) ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) ] d z ( 交 换 求 导 和 积 分 的 次 序 ) = ∫ z ( ∇ ϕ q ϕ ( z ) ) ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) d z + ∫ z q ϕ ( z ) ∇ ϕ [ ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) ] d z ( 乘 法 求 导 法 则 ) = ∫ z ( ∇ ϕ q ϕ ( z ) ) ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) d z − ∫ z q ϕ ( z ) 1 q ϕ ( z ) ( ∇ ϕ q ϕ ( z ) ) d z = ∫ z ( ∇ ϕ q ϕ ( z ) ) ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) d z − ∇ ϕ ∫ z ( q ϕ ( z ) ) d z ⏟ = 1 = ∫ z ( ∇ ϕ q ϕ ( z ) ) ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) d z = ∫ z q ϕ ( z ) ( ∇ ϕ log ⁡ q ϕ ( z ) ) ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) d z ( 以 便 写 成 期 望 的 形 式 , 进 而 利 用 蒙 特 卡 洛 采 样 ) = E q ϕ ( z ) [ ( ∇ ϕ log ⁡ q ϕ ( z ) ) ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) ] \begin{aligned}\nabla_{\phi}L(\phi)&=\nabla_{\phi}E_{q_{\phi}(z)}[\log p(x,z)-\log q_{\phi}(z)]\\&=\nabla_{\phi}\int_zq_{\phi}(z)(\log p(x,z)-\log q_{\phi}(z))dz\\&=\int_z\nabla_{\phi}[q_{\phi}(z)(\log p(x,z)-\log q_{\phi}(z))]dz(交换求导和积分的次序)\\&=\int_z(\nabla_{\phi}q_{\phi}(z))(\log p(x,z)-\log q_{\phi}(z))dz+\int_zq_{\phi}(z)\nabla_{\phi}[(\log p(x,z)-\log q_{\phi}(z))]dz(乘法求导法则)\\&=\int_z(\nabla_{\phi}q_{\phi}(z))(\log p(x,z)-\log q_{\phi}(z))dz-\int_zq_{\phi}(z)\frac{1}{q_{\phi}(z)}(\nabla_{\phi}q_{\phi}(z))dz\\&=\int_z(\nabla_{\phi}q_{\phi}(z))(\log p(x,z)-\log q_{\phi}(z))dz-\nabla_{\phi}\underbrace{\int_z(q_{\phi}(z))dz}_{=1}\\&=\int_z(\nabla_{\phi}q_{\phi}(z))(\log p(x,z)-\log q_{\phi}(z))dz\\&=\int_zq_{\phi}(z)(\nabla_{\phi}\log q_{\phi}(z))(\log p(x,z)-\log q_{\phi}(z))dz(以便写成期望的形式,进而利用蒙特卡洛采样)\\&=E_{q_{\phi}(z)}[(\nabla_{\phi}\log q_{\phi}(z))(\log p(x,z)-\log q_{\phi}(z))]\end{aligned} ϕL(ϕ)=ϕEqϕ(z)[logp(x,z)logqϕ(z)]=ϕzqϕ(z)(logp(x,z)logqϕ(z))dz=zϕ[qϕ(z)(logp(x,z)logqϕ(z))]dz()=z(ϕqϕ(z))(logp(x,z)logqϕ(z))dz+zqϕ(z)ϕ[(logp(x,z)logqϕ(z))]dz()=z(ϕqϕ(z))(logp(x,z)logqϕ(z))dzzqϕ(z)qϕ(z)1(ϕqϕ(z))dz=z(ϕqϕ(z))(logp(x,z)logqϕ(z))dzϕ=1 z(qϕ(z))dz=z(ϕqϕ(z))(logp(x,z)logqϕ(z))dz=zqϕ(z)(ϕlogqϕ(z))(logp(x,z)logqϕ(z))dz(便)=Eqϕ(z)[(ϕlogqϕ(z))(logp(x,z)logqϕ(z))]至此,我们可以通过蒙特卡洛采样的方法来近似求得梯度,进而利用随机梯度下降来优化参数:
采 样 : z l ∼ q ϕ ( z ) 采样:z^l\sim q_{\phi}(z) zlqϕ(z) 计 算 梯 度 : ∇ ϕ L ( ϕ ) = E q ϕ ( z ) [ ( ∇ ϕ log ⁡ q ϕ ( z ) ) ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) ] = 1 L ∑ l = 1 L ( ∇ ϕ log ⁡ q ϕ ( z ) ) ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) 计算梯度:\begin{aligned}\nabla_{\phi}L(\phi)&=E_{q_{\phi}(z)}[(\nabla_{\phi}\log q_{\phi}(z))(\log p(x,z)-\log q_{\phi}(z))]\\&=\frac{1}{L}\sum_{l=1}^L(\nabla_{\phi}\log q_{\phi}(z))(\log p(x,z)-\log q_{\phi}(z))\end{aligned} ϕL(ϕ)=Eqϕ(z)[(ϕlogqϕ(z))(logp(x,z)logqϕ(z))]=L1l=1L(ϕlogqϕ(z))(logp(x,z)logqϕ(z)) 参 数 更 新 : ϕ t + 1 ← ϕ t + λ ∇ ϕ L ( ϕ ) 参数更新:\phi^{t+1}\gets\phi^t+\lambda\nabla_{\phi}L(\phi) ϕt+1ϕt+λϕL(ϕ)但是上述的这个方法其实还是有点问题,由于 q ϕ ( z ) q_{\phi}(z) qϕ(z)是一个概率分布,对其取对数的结果波动非常大,造成直接采样的方差很大。

3.3、重参数化方法解决高方差问题

针对上述的high variance问题,我们可以采用重参数化技巧(Reparameterization)来解决:

∇ ϕ L ( ϕ ) = ∇ ϕ E q ϕ ( z ) [ log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ] \nabla_{\phi}L(\phi)=\nabla_{\phi}E_{q_{\phi}(z)}[\log p(x,z)-\log q_{\phi}(z)] ϕL(ϕ)=ϕEqϕ(z)[logp(x,z)logqϕ(z)]中,倘若我们能把 E q ϕ ( z ) E_{q_{\phi}(z)} Eqϕ(z)中的 q ϕ ( z ) q_{\phi}(z) qϕ(z)转化成与 ϕ \phi ϕ无关的分布,则我们可以直接对函数 log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) \log p(x,z)-\log q_{\phi}(z) logp(x,z)logqϕ(z)求导,而不用对它的期望求导,大大降低了复杂度。

原本, z ∼ q ϕ ( z ) z\sim q_{\phi}(z) zqϕ(z)。现在我们假设 z = g ϕ ( ϵ , x ) , ϵ ∼ p ( ϵ ) z=g_{\phi}(\epsilon,x),\epsilon\sim p(\epsilon) z=gϕ(ϵ,x),ϵp(ϵ),因此有: ∣ q ϕ ( z ) d z ∣ = ∣ p ( ϵ ) d ϵ ∣ |q_{\phi}(z)dz|=|p(\epsilon)d\epsilon| qϕ(z)dz=p(ϵ)dϵ则求导过程变为: ∇ ϕ L ( ϕ ) = ∇ ϕ E q ϕ ( z ) [ log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ] = ∇ ϕ ∫ z q ϕ ( z ) ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) d z = ∫ z ∇ ϕ ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) q ϕ ( z ) d z = ∫ z ∇ ϕ ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) p ( ϵ ) d ϵ = E p ( ϵ ) [ ∇ ϕ ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) ] = E p ( ϵ ) [ ∇ z ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ) ∇ ϕ ( z ) ] ( 链 式 法 则 ) = E p ( ϵ ) [ ∇ z [ ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ] ∇ ϕ g ϕ ( ϵ , x ) ] \begin{aligned}\nabla_{\phi}L(\phi)&=\nabla_{\phi}E_{q_{\phi}(z)}[\log p(x,z)-\log q_{\phi}(z)]\\&=\nabla_{\phi}\int_zq_{\phi}(z)(\log p(x,z)-\log q_{\phi}(z))dz\\&=\int_z\nabla_{\phi}(\log p(x,z)-\log q_{\phi}(z))q_{\phi}(z)dz\\&=\int_z\nabla_{\phi}(\log p(x,z)-\log q_{\phi}(z))p(\epsilon)d\epsilon\\&=E_{p(\epsilon)}[\nabla_{\phi}(\log p(x,z)-\log q_{\phi}(z))]\\&=E_{p(\epsilon)}[\nabla_{z}(\log p(x,z)-\log q_{\phi}(z))\nabla_{\phi}(z)](链式法则)\\&=E_{p(\epsilon)}[\nabla_{z}[(\log p(x,z)-\log q_{\phi}(z)]\nabla_{\phi}g_{\phi}(\epsilon,x)]\end{aligned} ϕL(ϕ)=ϕEqϕ(z)[logp(x,z)logqϕ(z)]=ϕzqϕ(z)(logp(x,z)logqϕ(z))dz=zϕ(logp(x,z)logqϕ(z))qϕ(z)dz=zϕ(logp(x,z)logqϕ(z))p(ϵ)dϵ=Ep(ϵ)[ϕ(logp(x,z)logqϕ(z))]=Ep(ϵ)[z(logp(x,z)logqϕ(z))ϕ(z)]()=Ep(ϵ)[z[(logp(x,z)logqϕ(z)]ϕgϕ(ϵ,x)]至此,我们终于完成了基于梯度的变分推断,每次迭代时,我们通过蒙特卡洛采样的方法来近似求得梯度,进而利用随机梯度下降来优化参数: 采 样 : ϵ ∼ p ( ϵ ) 采样:\epsilon\sim p(\epsilon) ϵp(ϵ) 计 算 z : z = g ϕ ( ϵ , x ) 计算z:z=g_{\phi}(\epsilon,x) z:z=gϕ(ϵ,x) 计 算 梯 度 : ∇ ϕ L ( ϕ ) = E p ( ϵ ) [ ∇ z [ ( log ⁡ p ( x , z ) − log ⁡ q ϕ ( z ) ] ∇ ϕ g ϕ ( ϵ , x ) ] 计算梯度:\nabla_{\phi}L(\phi)=E_{p(\epsilon)}[\nabla_{z}[(\log p(x,z)-\log q_{\phi}(z)]\nabla_{\phi}g_{\phi}(\epsilon,x)] ϕL(ϕ)=Ep(ϵ)[z[(logp(x,z)logqϕ(z)]ϕgϕ(ϵ,x)] 参 数 更 新 : ϕ t + 1 ← ϕ t + λ ∇ ϕ L ( ϕ ) 参数更新:\phi^{t+1}\gets\phi^t+\lambda\nabla_{\phi}L(\phi) ϕt+1ϕt+λϕL(ϕ)


http://chatgpt.dhexx.cn/article/Pquh16XA.shtml

相关文章

深度学习-在线推断(Inference)技术

深度学习一般分为训练和在线推断两个部分,大家平时经常关注的多为训练阶段,也就是搜索和求解模型最优参数的阶段。而当模型参数已经求解出来,如何使用模型,以及在在线环境中部署模型,也是非常重要的。 一般会比较关注其…

推理(Inference)与预测(Prediction)

在机器学习的背景下,很多人似乎混淆了这两个术语。这篇文章将试图澄清我们所说的这两个词是什么意思,每一个词在哪里有用,以及它们是如何应用的。在这里,我将举几个例子来直观地理解两者之间的区别。 推理和预测这两个术语都描述…

嵌入式C语言自我修养:从芯片、编译器到操作系统(附送书籍)

关注星标公众号,不错过精彩内容 来源 | 宅学部落 最近,阅读了王工(王利涛)赠送的一本由他编著的书籍《嵌入式C语言自我修养》,感觉写的挺不错。今天分享一下这本书籍《嵌入式C语言自我修养》:从芯片、编译器…

进行嵌入式C语言编程调试的通用办法

总结了一下调试我们嵌入式C程序的一些基本的办法和思想,供大家学习参考: 打印日志:在代码中添加打印语句,输出变量值、函数调用等信息,以便在程序运行时观察程序执行情况。 断点调试:在代码中添加断点&…

linux c与c语言的区别吗,嵌入式c语言与c语言的区别

原标题:嵌入式c语言与c语言的区别 最广泛使用的系统编程语言是C语言,它是使用自由格式源代码的简单编程语言;它曾用于以前用汇编语言构建的应用程序中。嵌入式C是C语言的扩展,它在嵌入式系统中应用于编写嵌入式软件,那么二者之间究竟有什么差异呢? 一、启动过程 1. 通用c…

嵌入式C语言——常见面试题

1、描述一下gcc编译过程? gcc编译过程分为4步骤:预处理、编译、汇编、链接。 预处理:头文件包含、宏替换、条件编译、删除注释。编译:主要进行词法、语法、语义分析等等,检查无误后把预处理好的文件编译成汇编文件。…

c语言对嵌入式的作用是什么,关于嵌入式C语言它有些什么意义

描述 首先,在当前产业结构升级的大背景下,机械行业未来的自动化、智能化程度会越来越高,所以机械类相关专业的知识结构必然会不断得到丰富和发展,而学习编程语言对于机械类专业来说具有较为实际的意义,尤其是C语言。 机…

总结嵌入式C语言难点(2部分)

结构类型和对齐 C语言提供自定义数据类型来描述一类具有相同特征点的事务,主要支持的有结构体,枚举和联合体。其中枚举通过别名限制数据的访问,可以让数据更直观,易读,实现如下: 联合体的是能在同一个存储…

嵌入式c语言教程 题库 百度云,嵌入式c语言视频教程尚观主讲视频教程

嵌入式C语言培训-01C语言概述-01C语言概念-发展历史-特点.mp4 嵌入式C语言培训-01C语言概述-02C基本程序结构-第一个helloworld程序-Linux下编辑编译执行.mp4 嵌入式C语言培训-01C语言概述-03C语言第2个程序第3个程序.mp4 嵌入式C语言培训-01C语言概述-04C程序开发过程.mp4 嵌入…

《嵌入式C语言》C语言介绍及环境搭建

--最具价值的嵌入式C语言1 C语言简介 C语言是国际上广泛流行的高级语言,是在B语言的基础上发展起来的, 1970年, 美国贝尔实验室的D.M.Ritchie设计了B 语言, 并用于编写了第一个UNIX操作系统。 1973年, D.M.Ritchie 在B语言的基础…

嵌入式C语言深入篇之 —— 变量

新建一个物联网行业交流学习QQ群,感兴趣可加:928840648 CUT 变量 可执行程序存储区 当一个C/C原码文件被编译链(比如gcc/g)编译及链接成为可执行程序后,由4个段组成,分别是:代码段&#xff…

嵌入式C语言编程技巧

基础语法编程技巧 变量 (1)变量名需见名知意,用英文单词命名,尽可能避免出现 a b 等单一字母的变量 (2)变量在定义同时进行初始化,防止乱码数据 (3)变量序号尽可能用英语…

嵌入式C语言强化学习——(嵌入式学习路线1)

前言 从零开始记录自己学习嵌入式,之前看稚晖君的视频,里面的费曼学习法觉得对自己很有帮助,所以准备把自己学习到的东西分享出来,便于学的更深(符合费曼学习法) 众所周知,嵌入式编一般是使用C…

嵌入式C语言开发

这是我的第一篇对ARM有有疑问并展开调查的文档总结,以备之后查阅。 首先的疑惑是发现之前的源码中都是在对寄存器做操作,所以对寄存器的地址是怎么被确定的就很疑惑。 搜索引擎关键词:嵌入式 寄存器 基地址 使用 参考《嵌入式15——HAL 库中…

嵌入式C语言编译过程

1.预处理 gcc -E -o a.i 001.c 把001.c输出为a.s文件。预处理的本质是把宏定义替换处理。#define ABC 123 2.编译 gcc -S -o a.s 001.c 3.汇编 gcc -c -i a.s 001.c 把c文件生成汇编文件 4.链接 gcc -o build 001.c把001.c生成build.exe可执行文件,从预处理开始。

嵌入式C语言自我修养分享课件

一.异构计算 1.背景: 随着物联网、大数据、人工智能时代的到来,海量的数据分析和大量复杂的运算对CPU 的算力要求越来越高,CPU 的大部分资源用于缓存和逻辑控制,适合运行各种复杂的串行程序,但是单核或者多核CPU处理性…

标准c语言与嵌入式,嵌入式C语言与C语言的区别

嵌入式C语言与C语言的区别:最常用的系统编程语言是C,它是在汇编语言中使用的一种简单的编程语言,源代码采用自由格式。Embeddedc是c语言用于编写嵌入式软件的扩展,这两者有什么区别? 首先是启动过程 1.普通C语言程序的…

嵌入式 C 语言(上)

目录 基础知识数据类型const 用法作用域与 static 用法extern 用法 基础知识 嵌入式C语言和普通C语言在语法上几乎没有差别,其主要差别在于普通C语言的运行环境是OS之上,有很多的标准库函数支撑调用,分配的内存是电脑的内存,其处…

嵌入式C语言

文章目录 一、学会使用char/short/int关键字二、学会使用 if & switch三、学会使用 for & while四、学会使用static关键字五、学会使用define关键字六、学会使用typedef关键字七、学会使用enum关键字八、学会使用struct类型九、学会使用指针类型十、学会使用回调函数十…

嵌入式开发之C语言基础(一)

目前是一名大二升大三的学生,早就有想法写博文了,但是因为自己的拖延一直到现在才开始着手。关于博文,我有以下打算:把C语言再重新过一遍,毕竟嵌入式开发C语言的重要性不言而喻;接下来我还会有一些关于单片…