本文主要是介绍平均场变分推断:以混合高斯模型为例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一、贝叶斯推断的工作流
- 二、一个业务例子
- 三、变分推断
- 四、平均场理论
- 五、业务CASE的平均场变分推断求解
- 六、代码实现
一、贝叶斯推断的工作流
在贝叶斯推断方法中,工作流可以总结为:
- 根据观察者的知识,做出合理假设,假设数据是如何被生成的
- 将数据的生成模型转化为数学模型
- 根据数据通过数学方法,求解模型参数
- 对新的数据做出预测
在整个pipeline中,第1点数据的生成过程,这是业务相关的,需要丰富的领域知识。第二点是连接业务领域和数学领域的桥梁,一般称之为数学建模,第3点是存粹的数学步骤,使用数学工具求解模型参数。第4步为业务应用,为业务做出预测和推断结果。
二、一个业务例子
下面以一个业务例子来实践这个pipeline。假设在我们的app中总用户数为k,并且在app的数据库中记录了用户每日使用时长的增长量,假设我们没有任何关于用户的唯一id,能观测到的只有增量值: [-6.04231708, -1.64784446, ..., 1.63898137, -4.29063685, -0.87892713]
,我们需要做的是为每个用户赋予一个用户id,并且在未来时刻给定某个用户使用时长增量,将这个时长增量归属到其用户id上,如此便可以建立每个用户的使用时长记录,以便在商业上分析用户行为。
首先,于是我们根据业务知识,知道用户产生时长增量记录的过程为:
- 某个用户 c k c_k ck 登录系统
- 用户产生一条使用时长增量记录 x i x_i xi,
然后,我们将这个过程建模为数学问题:假设登录到系统上的用户为 k ′ k' k′的概率是均匀分布的,概率都为 1 k \frac{1}{k} k1,并且用户 k ′ k' k′生的时长增量为一个随机变量,其符合均值为 u k u_k uk, 标准差为 1 1 1的分布,并且 u k u_{k} uk自身也是符合均值为0,方差为 σ \sigma σ的高斯分布,特别注意的是 σ \sigma σ是一个人工设定的超参数,为领域专家根据先验知识调整的。数学化的表述如下:
μ k ∼ N ( 0 , σ 2 ) , k = 1 , … , K c i ∼ Categorical ( 1 / K , … , 1 / K ) , i = 1 , … , n x i ∣ c i , μ ∼ N ( c i ⊤ μ , 1 ) i = 1 , … , n \begin{aligned} \mu_{k} & \sim \mathcal{N}\left(0, \sigma^{2}\right), & k &=1, \ldots, K \\ c_{i} & \sim \operatorname{Categorical}(1 / K, \ldots, 1 / K), & & i=1, \ldots, n \\ x_{i} | c_{i}, \mu & \sim \mathcal{N}\left(c_{i}^{\top} \mu, 1\right) & & i=1, \ldots, n \end{aligned} μkcixi∣ci,μ∼N(0,σ2),∼Categorical(1/K,…,1/K),∼N(ci⊤μ,1)k=1,…,Ki=1,…,ni=1,…,n
其中 c i c_i ci为指示向量,它指明了当前这条数据 x i x_i xi是由哪个用户产生的,假如由用户1产生的,那么对应的指示向量为 c i = [ 0 , 1 , 0 , . . . , 0 , 0 ] c_i=[0,1,0,...,0,0] ci=[0,1,0,...,0,0], u u u为k维向量,每一维度为 u k u_k uk, 即 u = [ u 1 , u 2 , . . . , u k ] u=[u_1, u_2, ..., u_k] u=[u1,u2,...,uk]根据上面的描述,我们可以用python代码写出整个数据产生的过程:
def gen_data(sigma, k, n):#获取u_ku_k = np.random.normal(0, sigma, k)print(u_k)x = []c = []for i in range(n):ci = random.choice(range(k))c.append(ci)u = u_k[ci]x.append(np.random.normal(u, 1))return x, u_k, c
我们使用这个函数产生 ( σ = 10 , k = 10 ) (\sigma=10, k=10) (σ=10,k=10)实验室数据,采样得到的 u = [ − 34.59 , − 30.27 , − 20.69 , − 19.65 , − 8.04 , 3.0 , 13.79 , 14.6 , 15.65 , 26.56 ] u=[-34.59, -30.27, -20.69, -19.65, -8.04, 3.0, 13.79, 14.6, 15.65, 26.56] u=[−34.59,−30.27,−20.69,−19.65,−8.04,3.0,13.79,14.6,15.65,26.56], 数据x分布如下图:
于是我们的目标是根据数据x,去计算得出 u u u,然后未来有数据 x ′ x' x′到来时查看数据与 u i ∈ k u_{i\in k} ui∈k的距离,选择距离最近的 i = a r g m i n i d i s ( u i ∈ k , x ′ ) i=argmin_{i} dis(u_{i \in k}, x') i=argminidis(ui∈k,x′)赋予该条数据作为其用户id即可。
三、变分推断
上述问题的思路很直接,就是根据条件概率公式,计算 u , c u, c u,c的后验分布,选择后验概率最大的 u , c u, c u,c即可
p ( u , c ∣ x ) = p ( u , c , x ) p ( x ) p(u, c|x)=\frac{p(u, c, x)}{p(x)} p(u,c∣x)=p(x)p(u,c,x)
OK, 说干就干,首先根据第二节的数学模型,写出分子部分:
p ( μ , c , x ) = p ( μ ) ∏ i = 1 n p ( c i ) p ( x i ∣ c i , μ ) (1) p(\mathbf \mu, \mathbf{c}, \mathbf{x})=p(\mu) \prod_{i=1}^{n} p\left(c_{i}\right) p\left(x_{i} | c_{i}, \mu\right) \tag{1} p(μ,c,x)=p(μ)i=1∏np(ci)p(xi∣ci,μ)(1)
然后写出分母部分:
p ( x ) = ∫ p ( μ ) ∏ i = 1 n ∑ c i p ( c i ) p ( x i ∣ c i , μ ) d μ p(\mathbf{x})=\int p(\boldsymbol{\mu}) \prod_{i=1}^{n} \sum_{c_{i}} p\left(c_{i}\right) p\left(x_{i} | c_{i}, \mu\right) \mathrm{d} \mu p(x)=∫p(μ)i=1∏nci∑p(ci)p(xi∣ci,μ)dμ
这个问题在于计算 p ( x ) p(x) p(x)存在一个对 u u u的多维积分,在这个例子中,有10个用户即意味着10维积分,计算复杂度随着 u u u的维度指数增长,在现实世界里 u u u的维度小则几千几万,大则千万上亿,计算 p ( x ) p(x) p(x)是现有计算机的计算能力无法完成的,变分推断的出现就是为了解决这个难题。
变分推断的思路是将该问题转换为一个最优化问题,并通过现有高效的最优化方法来进行求解。首先我们将无法观测到的隐藏变量聚拢为 z = ( u , c ) z=(u, c) z=(u,c),然后使用一个分布 q ( z ) q(z) q(z)来逼近 p ( z ∣ x ) p(z|x) p(z∣x),两个分布之间的逼近程度用KL散度来衡量,于是我们的问题被转化成为了一个最小化 K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) KL(q(z)||p(z|x)) KL(q(z)∣∣p(z∣x))的最优化问题,形式化地表述为:
q ( z ) ∗ = arg min q ( z ) K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) q(z)^*=\mathop{\arg \min}_{q(z)} KL(q(z)||p(z|x)) q(z)∗=argminq(z)KL(q(z)∣∣p(z∣x))
我们将KL散度展开为:
KL ( q ( z ) ∥ p ( z ∣ x ) ) = E q ( z ) [ log q ( z ) ] − E q ( z ) [ log p ( z ∣ x ) ] = E q ( z ) [ log q ( z ) ] − E q ( z ) [ log p ( z , x ) ] + log p ( x ) \begin {aligned} \operatorname{KL}(q(\mathbf{z}) \| p(\mathbf{z} | \mathbf{x})) &= \mathbb{E}_{q(z)}[\log q(\mathbf{z})]-\mathbb{E}_{q(z)}[\log p(\mathbf{z} | \mathbf{x})] \\ &= \mathbb{E}_{q(z)}[\log q(\mathbf{z})]-\mathbb{E}_{q(z)}[\log p(\mathbf{z,x})] +\log p(x) \end {aligned} KL(q(z)∥p(z∣x))=Eq(z)[logq(z)]−Eq(z)[logp(z∣x)]=Eq(z)[logq(z)]−Eq(z)[logp(z,x)]+logp(x)
在最小化的过程中由于 log p ( x ) \log p(x) logp(x)难以计算,于是退而求其次,稍作变换最小化目标为 E q ( z ) [ log q ( z ) ] − E q ( z ) [ log p ( z , x ) ] \mathbb{E}_{q(z)}[\log q(\mathbf{z})]-\mathbb{E}_{q(z)}[\log p(\mathbf{z,x})] Eq(z)[logq(z)]−Eq(z)[logp(z,x)], 等同于最大化其取负后的结果,形式化地表述如下:
q ( z ) ∗ = arg max q ( z ) E q ( z ) [ log p ( z , x ) ] − E q ( z ) [ log q ( z ) ] q(z)^*=\mathop{\arg \max}_{q(z)} \mathbb{E}_{q(z)}[\log p(\mathbf{z}, \mathbf{x})]-\mathbb{E}_{q(z)}[\log q(\mathbf{z})] q(z)∗=argmaxq(z)Eq(z)[logp(z,x)]−Eq(z)[logq(z)]
上述地优化目标被称之为evidence lower bound ,即ELBO, 国内有翻译为“证据下界”,也有翻译为“变分下界”。换个角度来看ELBO,其实 E L B O ( q ( z ) ) = log p ( x ) − K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) ELBO(q(z))=\log p(x) - KL(q(z)||p(z|x)) ELBO(q(z))=logp(x)−KL(q(z)∣∣p(z∣x)),因为KL散度的非负性,于是有:
log p ( x ) ≥ E L B O ( q ( z ) ) \log p(x) \ge ELBO(q(z)) logp(x)≥ELBO(q(z))
所以本质上最大化ELBO就是在最大化 log p ( x ) \log p(x) logp(x),这一点在最大似然估计和最大后验估计上思路都是相似的。最后,只要我们最后选择一个参数化的 q ( z ) q(z) q(z),然后使用最优化算法即可求解原问题。
四、平均场理论
选取合适的参数化 q ( z ) q(z) q(z)可以使得求解原问题变得简单易行,当我们取 q ( z ) = q ( z ∣ x ; θ t ) q(z)=q(z|x; \theta_t) q(z)=q(z∣x;θt)时,就得到了EM算法,具体展开ELBO并且迭代求解即可。但这里介绍另一种求解方法: 平均场。平均场理论并不假设具体 q ( z ) q(z) q(z)的函数形式,但它假设隐变量之间相互独立:
q ( z ) = ∏ j = 1 m q j ( z j ) q(\mathbf{z})=\prod_{j=1}^{m} q_{j}\left(z_{j}\right) q(z)=j=1∏mqj(zj)
这在很多场合下是符合直觉的,例如在上述场景中,用户使用时长的增量分布大都由自身兴趣爱好决定,两个用户之间对app的使用的时长程度并不相关。
为了求解模型,我们将平均场假设带入ELBO,首先处理第一部分:
E q ( z ) [ log p ( z , x ) ] = ∫ q ( z ) log p ( z , x ) d z = ∫ ∏ i q ( z i ) log p ( z , x ) d z i = ∫ q ( z j ) [ ∫ ∏ i ≠ j q ( z i ) log p ( z , x ) d z i ] d z j = ∫ q ( z j ) E q ( z i ≠ j ) [ log p ( z , x ) ] d z j \begin {aligned} \mathbb{E}_{q(z)}[\log p(\mathbf{z}, \mathbf{x})] &= \int q(\mathbf{z}) \log p(\mathbf{z}, \mathbf{x}) d\mathbf{z} \\ &= \int \prod_{i} q(z_i) \log p(\mathbf{z}, \mathbf{x}) dz_i \\ &= \int q(z_j) \left[ \int \prod_{i \neq j} q(z_i) \log p(\mathbf{z}, \mathbf{x}) dz_i \right ] dz_j \\ &= \int q(z_j) \mathbb{E}_{q(z_{i\neq j})} \left[ \log p(\mathbf{z}, \mathbf{x}) \right]dz_j \end {aligned} Eq(z)[logp(z,x)]=∫q(z)logp(z,x)dz=∫i∏q(zi)logp(z,x)dzi=∫q(zj)⎣⎡∫i=j∏q(zi)logp(z,x)dzi⎦⎤dzj=∫q(zj)Eq(zi=j)[logp(z,x)]dzj
接着处理第二部分:
E q ( z ) [ log q ( z ) ] = E q ( z j ) [ log q j ( z j ) ] − E q i ≠ j ( z i ) [ ∑ i ≠ j log q i ( z i ) ] = [ ∫ q ( z j ) log q ( z j ) d z j ] − E q i ≠ j ( z i ) [ ∑ i ≠ j log q i ( z i ) ] \begin {aligned} \mathbb{E}_{q(z)}[\log q(\mathbf{z})] &= \underset{q\left(z_{j}\right)}{\mathbb{E}}\left[\log q_{j}\left(z_{j}\right)\right]-\underset{q_{i\neq j}\left(z_{i}\right)}{\mathbb{E}}\left[\sum_{i \neq j} \log q_{i}\left(z_{i}\right)\right] \\ &= \left[ \int q(z_j) \log q(z_j) dz_j \right] - \underset{q_{i\neq j}\left(z_{i}\right)}{\mathbb{E}}\left[\sum_{i \neq j} \log q_{i}\left(z_{i}\right)\right] \end {aligned} Eq(z)[logq(z)]=q(zj)E[logqj(zj)]−qi=j(zi)E⎣⎡i=j∑logqi(zi)⎦⎤=[∫q(zj)logq(zj)dzj]−qi=j(zi)E⎣⎡i=j∑logqi(zi)⎦⎤
两部分合起来得到:
E L B O ( q ( z ) ) = [ ∫ q ( z j ) E q ( z i ≠ j ) [ log p ( z , x ) ] d z j ] − [ ∫ q ( z j ) log q ( z j ) d z j ] + E q i ≠ j ( z i ) [ ∑ i ≠ j log q i ( z i ) ] ELBO(q(\mathbf z))=\left[ \int q(z_j) \mathbb{E}_{q(z_{i\neq j})} \left[ \log p(\mathbf{z}, \mathbf{x}) \right]dz_j \right] - \left[ \int q(z_j) \log q(z_j) dz_j \right] + \underset{q_{i\neq j}\left(z_{i}\right)}{\mathbb{E}}\left[\sum_{i \neq j} \log q_{i}\left(z_{i}\right)\right] ELBO(q(z))=[∫q(zj)Eq(zi=j)[logp(z,x)]dzj]−[∫q(zj)logq(zj)dzj]+qi=j(zi)E⎣⎡i=j∑logqi(zi)⎦⎤
这里利用坐标上升法进行优化在每一轮迭代时,将 q ( z i ≠ j ) q(z_{i \neq j}) q(zi=j)固定,然后优化 q ( z j ) q(z_j) q(zj)。于是我们能把注意力集中到 q ( z j ) q(z_j) q(zj)上来,在上面式子中 q ( z i ≠ j ) q(z_{i \neq j}) q(zi=j)已经固定,这时候 E q i ≠ j ( z i ) [ ∑ i ≠ j log q i ( z i ) ] = c \underset{q_{i\neq j}\left(z_{i}\right)}{\mathbb{E}}\left[\sum_{i \neq j} \log q_{i}\left(z_{i}\right)\right]=c qi=j(zi)E[∑i=jlogqi(zi)]=c为常数,于是上面式子可以简化一下:
E L B O ( q ( z j ) ) = [ ∫ q ( z j ) E q ( z i ≠ j ) [ log p ( z , x ) ] d z j ] − [ ∫ q ( z j ) log q ( z j ) d z j ] + c ELBO(q(z_j))=\left[ \int q(z_j) \mathbb{E}_{q(z_{i\neq j})} \left[ \log p(\mathbf{z}, \mathbf{x}) \right]dz_j \right] - \left[ \int q(z_j) \log q(z_j) dz_j \right] + c ELBO(q(zj))=[∫q(zj)Eq(zi=j)[logp(z,x)]dzj]−[∫q(zj)logq(zj)dzj]+c
最后我们令 log D = E q ( z i ≠ j ) [ log p ( z , x ) ] \log D=\mathbb{E}_{q(z_{i\neq j})} \left[ \log p(\mathbf{z}, \mathbf{x}) \right] logD=Eq(zi=j)[logp(z,x)], 于是得到:
E L B O ( q ( z j ) ) = [ ∫ q ( z j ) log D d z j ] − [ ∫ q ( z j ) log q ( z j ) d z j ] + c = − K L ( q ( z j ) ∣ ∣ D ) + c \begin {aligned} ELBO(q(z_j)) &= \left[ \int q(z_j) \log D dz_j \right] - \left[ \int q(z_j) \log q(z_j) dz_j \right] + c \\ &= -KL(q(z_j)||D) + c \end {aligned} ELBO(q(zj))=[∫q(zj)logDdzj]−[∫q(zj)logq(zj)dzj]+c=−KL(q(zj)∣∣D)+c
由KL散度可以知道当取 q ( z j ) = D q(z_j)=D q(zj)=D即:
q ( z j ) = e E q ( z i ≠ j ) [ log p ( z , x ) ] (2) q(z_j)=e^{\mathbb{E}_{q(z_{i\neq j})} \left[ \log p(\mathbf{z}, \mathbf{x}) \right]} \tag{2} q(zj)=eEq(zi=j)[logp(z,x)](2)
时KL散度最小为0,有 E B L O ( q ( z j ) ) = c EBLO(q(z_j))=c EBLO(q(zj))=c最大。于是我们得到了平均场变分推断算法:
- 迭代计算每一个 q ( z j ) = e E q ( z i ≠ j ) [ log p ( z , x ) ] q(z_j)=e^{\mathbb{E}_{q(z_{i\neq j})} \left[ \log p(\mathbf{z}, \mathbf{x}) \right]} q(zj)=eEq(zi=j)[logp(z,x)]
- 计算 E L B O ( q ( z ) ) ELBO(q(\mathbf z)) ELBO(q(z)),如果ELBO收敛,则结束,否则返回第一步
五、业务CASE的平均场变分推断求解
为了求解第三节中的问题,根据平均场变分推断的思路,我们先假设隐变量 u k u_k uk的分布满足均值为 m k m_k mk, 方差为 s k s_k sk,而隐变量 c i c_i ci由参数 φ i \varphi_i φi决定, 参数也是k维向量,每一维度指定了 c i c_i ci对应维度为1的概率,即:
q ( c i ; φ i ) = ∑ k c i k φ i k (3) q(c_i;\varphi_i)=\sum_k c_{ik}\varphi_{ik} \tag{3} q(ci;φi)=k∑cikφik(3)
于是根据平均场假设有:
p ( μ , c ) = ∏ k q ( μ k ; m k , s k ) ∏ i q ( c i ; φ i ) p(\mathbf \mu, \mathbf c)=\prod_{k}q(\mu_k;m_k,s_k)\prod_iq(c_i;\varphi_i) p(μ,c)=k∏q(μk;mk,sk)i∏q(ci;φi)
式子(1)被重写为:
p ( μ , c , x ) = ∏ k p ( μ k ; m k , s k ) ∏ i p ( c i ; φ i ) p ( x i ∣ c i , μ ) p(\mathbf \mu, \mathbf c, \mathbf x) = \prod_k p(\mu_k;m_k,s_k) \prod_i p(c_i;\varphi_i) p(x_i|c_i,\mathbf \mu) p(μ,c,x)=k∏p(μk;mk,sk)i∏p(ci;φi)p(xi∣ci,μ)
于是ELBO为:
E L B O ( m , s , φ ) = ∑ k E q ( μ k ; m k , s k ) [ log p ( u k ; m k , s k ) ] + ∑ i ( E q ( c i ; φ i ) [ log p ( c i ; φ i ) ] + E q ( c i ; φ i ) [ log p ( x i ∣ c i , μ ; m , s , φ i ) ] ) − ∑ k E q ( μ k ; m k , s k ) [ log q ( μ k ; m k , s k ) ] − ∑ i E q ( c i ; φ i ) [ log q ( c i ; φ i ) ] (4) \begin {aligned} ELBO(\mathbf m, \mathbf s,\mathbf \varphi) &= \sum_k \mathbb E_{q(\mu_k;m_k,s_k)} \left[ \log p(u_k;m_k,s_k) \right] \\ &+ \sum_i \left( \mathbb E_{q(c_i;\varphi_i)} \left[ \log p(c_i; \varphi_i) \right] + \mathbb E_{q(c_i;\varphi_i)} \left[ \log p(x_i|c_i,\mathbf \mu; \mathbf m, \mathbf s, \varphi_i) \right] \right) \\ & - \sum_k \mathbb E_{q(\mu_k;m_k,s_k)}\left[ \log q(\mu_k;m_k, s_k) \right] \\ & - \sum_i \mathbb E_{q(c_i;\varphi_i)} \left[ \log q(c_i; \varphi_i) \right] \end {aligned} \tag{4} ELBO(m,s,φ)=k∑Eq(μk;mk,sk)[logp(uk;mk,sk)]+i∑(Eq(ci;φi)[logp(ci;φi)]+Eq(ci;φi)[logp(xi∣ci,μ;m,s,φi)])−k∑Eq(μk;mk,sk)[logq(μk;mk,sk)]−i∑Eq(ci;φi)[logq(ci;φi)](4)
在算法运行的每一轮迭代中,先求解 q ( c i ; φ i ) q(c_i; \varphi_i) q(ci;φi):
log q ( c i ; φ i ) = E q ( μ ; m , s ) [ log p ( c , μ , x ) ] = log p ( c i ) + E q ( μ ; m , s ) [ log p ( x i ∣ c i , μ ; m , s , φ i ) ] \begin {aligned} \log q(c_i; \varphi_i) &= \mathbb{E}_{q(\mathbf \mu;\mathbf m,\mathbf s)} \left[ \log p(\mathbf c, \mathbf{\mu}, \mathbf{x}) \right] \\ &= \log p(c_i) + \mathbb{E}_{q(\mathbf \mu;\mathbf m,\mathbf s)} \left[ \log p(x_i|c_i,\mathbf \mu; \mathbf m, \mathbf s, \varphi_i) \right] \end {aligned} logq(ci;φi)=Eq(μ;m,s)[logp(c,μ,x)]=logp(ci)+Eq(μ;m,s)[logp(xi∣ci,μ;m,s,φi)]
根据业务上的定义 log p ( c i ) = − log k \log p(c_i)=-\log k logp(ci)=−logk为常数,并且根据 c i c_i ci的定义有 p ( x i ∣ c i , μ ) = ∏ k p ( x ∣ μ k ) c i k p(x_i|c_i, \mathbf \mu)=\prod_k p(x|\mu_k)^{c_{ik}} p(xi∣ci,μ)=∏kp(x∣μk)cik, 其中 c i k c_{ik} cik为 c i c_i ci的第k维值,于是
log q ( c i ; φ i ) = E q ( μ ; m , s ) [ log p ( x i ∣ c i , μ ; m , s , φ i ) ] + c o n s t = ∑ k c i k E q ( μ k ; m k , s k ) [ log p ( x i ∣ μ k ; m k , s k ) ] + c o n s t = ∑ k c i k E q ( μ k ; m k , s k ) [ − ( x i − μ k ) 2 2 ; m k , s k ] + c o n s t = ∑ k c i k ( E q ( μ k ; m k , s k ) [ μ k ; m k , s k ] x i − 1 2 E q ( μ k ; m k , s k ) [ μ k 2 ; m k , s k ] ) + c o n s t (5) \begin{aligned} \log q(c_i; \varphi_i) &= \mathbb{E}_{q(\mathbf \mu;\mathbf m,\mathbf s)} \left[ \log p(x_i|c_i,\mathbf \mu; \mathbf m, \mathbf s, \varphi_i) \right] + const\\ &= \sum_k c_{ik}\mathbb{E}_{q(\mathbf \mu_k;m_k,s_k)} \left[ \log p(x_i|\mathbf \mu_k; m_k, s_k) \right] + const \\ &= \sum_k c_{ik}\mathbb{E}_{q(\mathbf \mu_k;m_k,s_k)} \left[ \frac{-(x_i-\mu_k)^2}{2}; m_k, s_k \right] + const \\ &= \sum_k c_{ik} \left( \mathbb{E}_{q(\mathbf \mu_k;m_k,s_k)} \left[ \mu_k;m_k, s_k \right]x_i - \frac{1}{2} \mathbb{E}_{q(\mathbf \mu_k;m_k,s_k)} \left[\mu_k^2;m_k,s_k\right] \right) + const \end{aligned} \tag{5} logq(ci;φi)=Eq(μ;m,s)[logp(xi∣ci,μ;m,s,φi)]+const=k∑cikEq(μk;mk,sk)[logp(xi∣μk;mk,sk)]+const=k∑cikEq(μk;mk,sk)[2−(xi−μk)2;mk,sk]+const=k∑cik(Eq(μk;mk,sk)[μk;mk,sk]xi−21Eq(μk;mk,sk)[μk2;mk,sk])+const(5)
对比式子(3)和(5), 很显然有:
φ i k = e E q ( μ k ; m k , s k ) [ μ k ; m k , s k ] x i − 1 2 E q ( μ k ; m k , s k ) [ μ k 2 ; m k , s k ] \varphi_{ik} = e^{\mathbb{E}_{q(\mathbf \mu_k;m_k,s_k)} \left[ \mu_k;m_k, s_k \right]x_i - \frac{1}{2} \mathbb{E}_{q(\mathbf \mu_k;m_k,s_k)} \left[\mu_k^2;m_k,s_k\right]} φik=eEq(μk;mk,sk)[μk;mk,sk]xi−21Eq(μk;mk,sk)[μk2;mk,sk]
在这里根据 q ( μ k ; m k , s k ) q(\mu_k;m_k,s_k) q(μk;mk,sk)的定义,可以知道 E q ( μ k ; m k , s k ) [ μ k ; m k , s k ] x i = m k x i \mathbb{E}_{q(\mathbf \mu_k;m_k,s_k)} \left[ \mu_k;m_k, s_k \right]x_i=m_kx_i Eq(μk;mk,sk)[μk;mk,sk]xi=mkxi而 E q ( μ k ; m k , s k ) [ μ k 2 ; m k , s k ] = s k 2 + m k 2 \mathbb{E}_{q(\mathbf \mu_k;m_k,s_k)} \left[\mu_k^2;m_k,s_k\right]=s_k^2+m_k^2 Eq(μk;mk,sk)[μk2;mk,sk]=sk2+mk2于是:
φ i k = m k − 1 2 ( s k 2 + m k 2 ) (6) \varphi_{ik}=m_k-\frac{1}{2}(s_k^2+m_k^2) \tag{6} φik=mk−21(sk2+mk2)(6)
接下来 继续来求解 q ( μ k ; m k , s k ) q(\mu_k;m_k,s_k) q(μk;mk,sk)
log q ( μ k ; m k , s k ) = log p ( μ k ) + ∑ i E q ( c i , μ k ) [ log p ( x i ∣ c i , μ k ; φ i , m − k , s − k ) ] = − μ k 2 2 σ 2 + ∑ i φ i k ( − ( x i − u k ) 2 2 ) + c o n s t = μ k ( ∑ i φ i k x i ) − μ k 2 ( 1 2 σ 2 + ∑ i φ i k 2 ) + c o n s t (7) \begin {aligned} \log q(\mu_k;m_k,s_k) &= \log p(\mu_k) + \sum_i \mathbb E_{q(c_i,\mathbf \mu_{k})}\left[ \log p(x_i|c_i, \mathbf \mu_k; \varphi_i, \mathbf m_{-k}, \mathbf s_{-k}) \right] \\ &= -\frac{\mu_k^2}{2\sigma^2} + \sum_i \varphi_{ik} \left(\frac{-(x_i-u_k)^2}{2} \right) + const \\ &= \mu_k \left( \sum_i\varphi_{ik}x_i \right) - \mu_k^2 \left( \frac{1}{2\sigma^2} + \sum_i \frac{\varphi_{ik}}{2} \right) + const \end {aligned} \tag{7} logq(μk;mk,sk)=logp(μk)+i∑Eq(ci,μk)[logp(xi∣ci,μk;φi,m−k,s−k)]=−2σ2μk2+i∑φik(2−(xi−uk)2)+const=μk(i∑φikxi)−μk2(2σ21+i∑2φik)+const(7)
观察高斯分布的形式 p ( x ) = 1 2 π s e − ( x − μ ) 2 2 s 2 p(x)=\frac{1}{\sqrt{2\pi}s}e^{\frac{-(x-\mu)^2}{2s^2}} p(x)=2πs1e2s2−(x−μ)2于是有:
log p ( x ) = − log ( 2 π s ) − ( x − μ ) 2 2 s 2 = − log ( 2 π s ) − x 2 2 s 2 − μ 2 2 s 2 + x μ s 2 (8) \begin{aligned} \log p(x) &= -\log (\sqrt{2\pi}s) - \frac{(x-\mu)^2}{2s^2} \\ &= -\log (\sqrt{2\pi}s) - \frac{x^2}{2s^2}-\frac{\mu^2}{2s^2} + \frac{x\mu}{s^2} \end{aligned} \tag{8} logp(x)=−log(2πs)−2s2(x−μ)2=−log(2πs)−2s2x2−2s2μ2+s2xμ(8)
对比(7)和(8)式,可见实际上 q ( u k ; m k , s k ) q(u_k;m_k, s_k) q(uk;mk,sk)是一个高斯分布,于是可以令:
1 2 s k 2 = 1 2 σ 2 + ∑ i φ i k 2 \frac{1}{2s_k^2}=\frac{1}{2\sigma^2} + \sum_i \frac{\varphi_{ik}}{2} 2sk21=2σ21+i∑2φik
可以解出来:
s k = 1 1 σ 2 + ∑ i φ i k (9) s_k= \frac{1}{\sqrt{\frac{1}{\sigma^2}+\sum_i \varphi_{ik}}} \tag{9} sk=σ21+∑iφik1(9)
同理可以令:
m k s k 2 = ∑ i φ i k x i (10) \frac{m_k}{s_k^2}=\sum_i \varphi_{ik}x_i \tag{10} sk2mk=i∑φikxi(10)
把(9)带入即可解得:
m k = ∑ i φ i k x i 1 σ 2 + ∑ i φ 1 k (11) m_k=\frac{\sum_i \varphi_{ik}x_i}{\frac{1}{\sigma^2}+\sum_i \varphi_{1k}} \tag{11} mk=σ21+∑iφ1k∑iφikxi(11)
最后我们得到了所有参数的更新公式,总结求解过程为:
- 随机初始化所有参数 φ , m , s \mathbf \varphi, \mathbf m, \mathbf s φ,m,s
- 按照(6)式子更新每一个参数参数 φ i \varphi_i φi
- 按照(9)式更新每一个参数 s k s_k sk
- 按照(10)式更新每一个参数 m k m_k mk
- 按照(4)式计算ELBO, 如果ELBO收敛则结束,否则返回第1步
六、代码实现
根据上述算法的描述,可以写出实现代码,但第5步可以不需要计算ELBO, 直接迭代n步之后结束即可,具体代码如下:
def solve(x, k, sigma, ephco=20):"""x: 输入数据k: 超参数k,c_i的维度,在业务CASE中等于用户数sigma: 超参数,需要人工调整"""n = len(x)phis = np.random.random([n, k])mk = np.random.random([k])sk = np.random.random([k])for _ in range(epoch):for i in range(n):phi_i_k = []for _k in range(k):#根据公式(6)更新参数phi_ikphi_i_k.append(np.exp(mk[_k]*x[i] - (sk[_k]**2 + mk[_k]**2)/2))sum_phi = sum(phi_i_k)phi_i_k = [phi/sum_phi for phi in phi_i_k]phis[i] = phi_i_kden = np.sum(phis, axis=0) + 1/(sigma**2)#根据公式(10)更新m_kmk = np.matmul(x, phis)/den#根据公式(11)更新s_ksk = np.sqrt(1/den)return mk, sk, phis
输入第二节中生成的数据x和超参数后,求解得到 m = [ − 32.44 , − 20.15 , − 8.14 , − 7.89 , 2.79 , 3.15 , 13.78 , 14.72 , 15.65 , 26.58 ] m=[-32.44, -20.15, -8.14, -7.89, 2.79, 3.15, 13.78, 14.72, 15.65, 26.58] m=[−32.44,−20.15,−8.14,−7.89,2.79,3.15,13.78,14.72,15.65,26.58], 对比第二节的真实参数 u u u十分接近。从图像上, 根据求解出来的参数 m , s , φ \mathbf m, \mathbf s, \mathbf \varphi m,s,φ模拟采样数据,得到的数据分布也与真实数据分布十分接近(蓝色为真实数据,橙色为模拟采样数据)
这篇关于平均场变分推断:以混合高斯模型为例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!