Open In Colab

源代码:

本文是关于隐变量模型的第 1 篇,介绍了期望最大化 (EM) 算法及其在高斯混合模型中的应用。

1. 概述

给定概率模型 p(xθ)p(\mathbf{x} \lvert \boldsymbol{\theta})NN 个观测值值 X={x1,,xN}\mathbf{X} = \{ \mathbf{x}_1, \ldots, \mathbf{ x}_N \} 。 我们希望找到一个能够使似然 p(Xθ)p(\mathbf{X} \lvert \boldsymbol{\theta}) 最大化的参数 θ\boldsymbol{\theta} 。这也被称为 最大似然估计 (MLE)。

θMLE=argmaxθp(Xθ)(1)\boldsymbol{\theta}_{MLE} = \underset{\boldsymbol{\theta}}{\mathrm{argmax}} \quad p(\mathbf{X} \lvert \boldsymbol{\theta}) \tag{1}

如果模型是一个简单概率分布( 例如单高斯分布 ),则 θMLE={μMLE,ΣMLE}\boldsymbol{\theta}_{MLE} = \{ \boldsymbol{\mu}_{MLE}, \boldsymbol{\Sigma}_{MLE} \} 可能有解析解。更复杂模型通常会采用 梯度下降法,只要 p(Xθ)p(\mathbf{X} \lvert \boldsymbol{\theta}) 相对于 θ\boldsymbol{\theta} 可微,就可以将负对数似然 logp(Xθ)-\log p(\mathbf{X} \lvert \boldsymbol{\theta}) 作为损失函数。 但这不一定是最有效的方法。

2. 高斯混合模型

通常可以通过引入隐变量来简化最大似然估计。隐变量模型假设观测值 xi\mathbf{x}_i 是由一些潜在的隐变量引起的,该变量不能直接观测,但可以从观测到的变量和参数中推断出来。例如,下图显示了二维空间中的观测结果,可以看到其整体分布似乎不像是单个高斯那样简单的分布。

1
2
3
4
5
6
7
8
from latent_variable_models_util import n_true, mu_true, sigma_true
from latent_variable_models_util import generate_data, plot_data, plot_densities

%matplotlib inline

X, T = generate_data(n=n_true, mu=mu_true, sigma=sigma_true)

plot_data(X, color='grey')

png

我们可以看到更高密度的集群。此外,与整体分布相比,集群内的分布看起来更像高斯分布。事实上,这些数据是使用下面代码,从三个高斯分布混合生成的,如下图所示。

1
2
plot_data(X, color=T)
plot_densities(X, mu=mu_true, sigma=sigma_true)

png

其背后的概率模型被称为高斯混合模型 (GMM),是由 CC 个高斯组份加权总和的结果,见公式(2),在本例中 C=3C=3

p(xθ)=c=1CπcN(xμc,Σc)(2)p(\mathbf{x} \lvert \boldsymbol{\theta}) = \sum_{c=1}^{C} \pi_c \mathcal{N}(\mathbf{x} \lvert \boldsymbol{\mu}_c, \boldsymbol{\Sigma}_c) \tag{2}

πc\pi_cμc\boldsymbol{\mu}_{c}Σc\boldsymbol{\Sigma}_{c} 分别是组份 cc 的权重(标量)、均值(向量)和协方差(矩阵)。权重是非负的,总和为 11,即 c=1Cπc=1\sum_{c=1}^{C} \pi_c = 1。参数向量 θ={π1,μ1,Σ1,,πC,μC,ΣC}\boldsymbol{\theta} = \{ \pi_1, \boldsymbol{\mu}_{1}, \boldsymbol{\Sigma}_{1}, \ldots, \pi_C, \boldsymbol{\mu}_{C}, \boldsymbol{\Sigma}_{C} \} 表示所有模型参数的集合。如果引入一个离散的隐变量 t\mathbf{t} 来确定对各组份观测值的分配,则我们可以根据条件分布 p(xt,θ)p(\mathbf{x} \lvert \mathbf{t}, \boldsymbol{\theta}) 和先验分布 p(tθ)p(\mathbf{t} \lvert \boldsymbol{\theta}) ,定义观测变量和隐变量的联合分布 p(x,tθ)p(\mathbf{x}, \mathbf{t} \lvert \boldsymbol{\theta})

p(x,tθ)=p(xt,θ)p(tθ)(3)p(\mathbf{x}, \mathbf{t} \lvert \boldsymbol{\theta}) = p(\mathbf{x} \lvert \mathbf{t}, \boldsymbol{\theta}) p(\mathbf{t} \lvert \boldsymbol{\theta}) \tag{3}

其中 p(xtc=1,θ)=N(xμc,Σc)p(\mathbf{x} \lvert t_c = 1, \boldsymbol{\theta}) = \mathcal{N}(\mathbf{x} \lvert \boldsymbol{\mu}_c, \boldsymbol{\Sigma} _c) 并且 p(tc=1θ)=πcp(t_c = 1 \lvert \boldsymbol{\theta}) = \pi_ct\mathbf{t} 的值采用单热编码向量( one-hot coding )。例如, t2=1t_2 = 1 指第二个组份, 当总共有 C=3C=3 个组份时,这意味着 t=(0,1,0)T\mathbf{t} = (0,1,0)^T 。边缘分布 p(xθ)p(\mathbf{x} \lvert \boldsymbol{\theta}) 是通过对 t\mathbf{t} 的所有可能状态求和获得的。

p(xθ)=c=1Cp(tc=1θ)p(xtc=1,θ)=c=1CπcN(xμc,Σc)\begin{align*} p(\mathbf{x} \lvert \boldsymbol{\theta}) &= \sum_{c=1}^{C} p(t_c = 1 \lvert \boldsymbol{\theta}) p(\mathbf{x} \lvert t_c = 1, \boldsymbol{\theta}) \\ &= \sum_{c=1}^{C} \pi_c \mathcal{N}(\mathbf{x} \lvert \boldsymbol{\mu}_c, \boldsymbol{\Sigma}_c) \tag{4} \end{align*}

对于每个观测值值 xi\mathbf{x}_i,对应一个隐变量 ti\mathbf{t}_i,如下面概率图模型的符号所示。

gmm

用大写的 X\mathbf{X} 表示所有观测构成的集合,用大写的 T\mathbf{T} 表示所有隐变量构成的集合。如果我们能够直接观测 T\mathbf{T} ,则很容易通过最大化 完整数据似然 p(X,Tθ)p(\mathbf{X}, \mathbf{T} \lvert \boldsymbol{\theta}) 以得到最佳的 θ\boldsymbol{\theta} 。因为这种情况下,每个数据点分配给哪个组份是明确的,并且可以通过拟合获得每个组份的高斯分布(此时实际上已经变成监督学习任务了)。但目前的限制性条件是只能观测到 X\mathbf{X},所以我们只能通过最大化 边缘似然 (或 不完整的数据似然p(Xθ)p(\mathbf{X} \lvert \boldsymbol{\theta}) 来推导。 通过使用似然的对数,有:

θMLE=argmaxθlogp(Xθ)=argmaxθlogTp(X,Tθ)\begin{align*} \boldsymbol{\theta}_{MLE} &= \underset{\boldsymbol{\theta}}{\mathrm{argmax}} \log p(\mathbf{X} \lvert \boldsymbol{\theta}) \\ &=\underset{\boldsymbol{\theta}}{\mathrm{argmax}} \log \sum_{T} p(\mathbf{X}, \mathbf{T} \lvert \boldsymbol{\theta}) \tag{5} \end{align*}

上式涉及对数内关于隐变量的累积求和,并且阻碍了对优化问题的解析解。

3. 期望最大算法

虽然无法直接观测到隐变量的值,但我们可以通过似然和先验得到其后验分布。根据贝叶斯定理,我们从一个初步的参数值 θold\boldsymbol{\theta}^{old} 开始。在固定 θold\boldsymbol{\theta}^{old} 的情况下, T\mathbf{T} 的后验为:

p(TX,θold)=p(XT,θold)p(Tθold)Tp(XT,θold)p(Tθold)(6)p(\mathbf{T} \lvert \mathbf{X}, \boldsymbol{\theta}^{old}) = { p(\mathbf{X} \lvert \mathbf{T}, \boldsymbol{\theta}^{old}) p(\mathbf{T} \lvert \boldsymbol{\theta}^{old}) \over \sum_{T} p(\mathbf{X} \lvert \mathbf{T}, \boldsymbol{\theta}^{old}) p(\mathbf{T} \lvert \boldsymbol{\theta}^{old})} \tag{6}

依据该后验,我们可以定义完整数据似然 p(X,Tθ)p(\mathbf{X}, \mathbf{T} \lvert \boldsymbol{\theta}) 的期望(对数形式):

Q(θ,θold)=Tp(TX,θold)logp(X,Tθ)=Ep(TX,θold)logp(X,Tθ)\begin{align*} \mathcal{Q}(\boldsymbol{\theta}, \boldsymbol{\theta}^{old}) &= \sum_{T} p(\mathbf{T} \lvert \mathbf{X}, \boldsymbol{\theta}^{old}) \log p(\mathbf{X}, \mathbf{T} \lvert \boldsymbol{\theta}) \\ &= \mathbb{E}_{p(\mathbf{T} \lvert \mathbf{X}, \boldsymbol{\theta}^{old})} \log p(\mathbf{X}, \mathbf{T} \lvert \boldsymbol{\theta}) \tag{7} \end{align*}

将该期望作为目标,相对于 θ\boldsymbol{\theta} 做最大化,并得到一个更新后的参数向量 θnew\boldsymbol{\theta}^{new}

θnew=argmaxθQ(θ,θold)(8)\boldsymbol{\theta}^{new} = \underset{\boldsymbol{\theta}}{\mathrm{argmax}} \mathcal{Q}(\boldsymbol{\theta}, \boldsymbol{\theta}^{old}) \tag{8}

在式 (7) 中,求和是在对数之外进行的,这在 GMM 情形下,使得 θnew\boldsymbol{\theta}^{new} 能够得到解析解。然后令 θoldθnew\boldsymbol{\theta}^{old} \leftarrow \boldsymbol{\theta}^{new} ,并重复上述步骤直到 θ\boldsymbol{\theta} 收敛。这就是 期望最大化(EM)算法 的本质。它包括一个计算期望的步骤( E-step ),以更新隐变量的后验;以及一个最大化步骤( M-step ),该步骤依据更新后的隐变量的后验,通过完整数据似然的期望最大化,进一步更新模型参数 θ\boldsymbol{\theta} 。可以证明EM 算法总是收敛到 p(Xθ)p(\mathbf{X} \lvert \boldsymbol{\theta}) 的局部最大值。

以下小节以更一般的形式描述了 EM 算法。

3.1 一般形式

通过为每个观测 xi\mathbf{x}_i 引入一个隐变量 ti\mathbf{t}_i,可以将对数边缘似然定义为:

logp(Xθ)=i=1Nlogp(xiθ)=i=1Nlogc=1Cp(xi,tic=1θ)\begin{align*} \log p(\mathbf{X} \lvert \boldsymbol{\theta}) &= \sum_{i=1}^{N} \log p(\mathbf{x}_i \lvert \boldsymbol{\theta}) \\ &= \sum_{i=1}^{N} \log \sum_{c=1}^{C} p(\mathbf{x}_i, t_{ic} = 1 \lvert \boldsymbol{\theta})\tag{9} \end{align*}

接下来我们在隐变量 ti\mathbf{t}_i 上引入一个分布 q(ti)q(\mathbf{t}_i) ,它可以是任何概率分布。 然后用该分布左乘和左除式( 9 ),得到:

logp(Xθ)=i=1Nlogc=1Cq(tic=1)p(xi,tic=1θ)q(tic=1)=i=1NlogEq(ti)p(xi,tiθ)q(ti)\begin{align*} \log p(\mathbf{X} \lvert \boldsymbol{\theta}) &= \sum_{i=1}^{N} \log \sum_{c=1}^{C} q(t_{ic} = 1) {p(\mathbf{x}_i, t_{ic} = 1 \lvert \boldsymbol{\theta}) \over q(t_{ic} = 1)} \\ &= \sum_{i=1}^{N} \log \mathbb{E}_{q(\mathbf{t}_i)} {p(\mathbf{x}_i, \mathbf{t}_i \lvert \boldsymbol{\theta}) \over q(\mathbf{t}_i)} \tag{10} \end{align*}

现在得到一个期望的凹函数 (log\log 函数),它允许我们应用 Jensen 不等式 来定义 logp(Xθ)\log p(\mathbf{X} \lvert \boldsymbol{\theta})下界 L\mathcal{L}

logp(Xθ)=i=1NlogEq(ti)p(xi,tiθ)q(ti)i=1NEq(ti)logp(xi,tiθ)q(ti)=Eq(T)logp(X,Tθ)q(T)=L(θ,q)\begin{align*} \log p(\mathbf{X} \lvert \boldsymbol{\theta}) &= \sum_{i=1}^{N} \log \mathbb{E}_{q(\mathbf{t}_i)} {p(\mathbf{x}_i, \mathbf{t}_i\lvert \boldsymbol{\theta}) \over q(\mathbf{t}_i)} \\ &\geq \sum_{i=1}^{N} \mathbb{E}_{q(\mathbf{t}_i)} \log {p(\mathbf{x}_i, \mathbf{t}_i\lvert \boldsymbol{\theta}) \over q(\mathbf{t}_i)} \\ &= \mathbb{E}_{q(\mathbf{T})} \log {p(\mathbf{X}, \mathbf{T} \lvert \boldsymbol{\theta}) \over q(\mathbf{T})} \\ &= \mathcal{L}(\boldsymbol{\theta}, q) \tag{11} \end{align*}

该下界是 θ\boldsymbol{\theta}qq 的函数。当从对数边缘似然中减去下界时,我们应该得到非负的结果。

logp(Xθ)L(θ,q)=logp(Xθ)Eq(T)logp(X,Tθ)q(T)=Eq(T)logp(Xθ)q(T)p(X,Tθ)=Eq(T)logq(T)p(TX,θ)=KL(q(T)p(TX,θ))\begin{align*} \log p(\mathbf{X} \lvert \boldsymbol{\theta}) - \mathcal{L}(\boldsymbol{\theta}, q) &= \log p(\mathbf{X} \lvert \boldsymbol{\theta}) - \mathbb{E}_{q(\mathbf{T})} \log {p(\mathbf{X}, \mathbf{T} \lvert \boldsymbol{\theta}) \over q(\mathbf{T})} \\ &= \mathbb{E}_{q(\mathbf{T})} \log {p(\mathbf{X} \lvert \boldsymbol{\theta}) q(\mathbf{T}) \over p(\mathbf{X}, \mathbf{T} \lvert \boldsymbol{\theta})} \\ &= \mathbb{E}_{q(\mathbf{T})} \log {q(\mathbf{T}) \over p(\mathbf{T} \lvert \mathbf{X}, \boldsymbol{\theta})} \\ &= \mathrm{KL}(q(\mathbf{T}) \mid\mid p(\mathbf{T} \lvert \mathbf{X}, \boldsymbol{\theta})) \tag{12} \end{align*}

最终得到了 q(T)q(\mathbf{T}) 与隐变量的真实后验 p(TX,θ)p(\mathbf{T} \lvert \mathbf{X}, \boldsymbol{\theta}) 之间的 KLKL 散度。我们最终为下界写出以下表达式:

L(θ,q)=logp(Xθ)KL(q(T)p(TX,θ))(13)\mathcal{L}(\boldsymbol{\theta}, q) = \log p(\mathbf{X} \lvert \boldsymbol{\theta}) - \mathrm{KL}(q(\mathbf{T}) \mid\mid p(\mathbf{T} \lvert \mathbf{X}, \boldsymbol{\theta})) \tag{13}

在 EM 算法的 E 步中, 保持 θ\boldsymbol{\theta} 固定,相对于 qq 最大化 L(θ,q)\mathcal{L}(\boldsymbol{\theta}, q) 被最大化,进而更新 qq

qnew=argmaxqL(θold,q)=argminqKL(q(T)p(TX,θold))\begin{align*} q^{new} &= \underset{q}{\mathrm{argmax}} \mathcal{L}(\boldsymbol{\theta}^{old}, q) \\ &= \underset{q}{\mathrm{argmin}} \mathrm{KL}(q(\mathbf{T}) \mid\mid p(\mathbf{T} \lvert \mathbf{X}, \boldsymbol{\theta}^{old})) \tag{14} \end{align*}

L(θ,q)\mathcal{L}(\boldsymbol{\theta}, q) 的最大化等价于 KL(q(T)p(TX,θ))\text{KL}(q(\mathbf{T}) \mid\mid p(\mathbf{T} \lvert \mathbf {X}, \boldsymbol{\theta})) 的最小化,因为 logp(Xθ)\log p(\mathbf{X} \lvert \boldsymbol{\theta}) 不依赖于 qq

如果能够获得真实的后验,就像在 GMM 的情况下一样,可以将 q(T)q(\mathbf{T}) 设置为 p(TX,θ)p(\mathbf{T} \lvert \mathbf{X}, \boldsymbol{\theta} )KLKL 散度变为 00。如果真正的后验是不可处理的,则必须使用近似值。一类近似技术称为 变分推断,它使用特定形式的 qq 来近似真实后验。例如,qq 可能来自某个受参数控制的分布族,可以通过选择 qq 的参数以使 KLKL 散度最小化。第 2 部分更详细地介绍了变分推断。

在 M 步中,保持 qq 固定, 相对于模型参数 θ\boldsymbol{\theta} 最大化 L(θ,q)\mathcal{L}(\boldsymbol{\theta}, q) ,进而更新 θ\boldsymbol{\theta} 。使用式 (11) 可以得到:

θnew=argmaxθL(θ,qnew)=argmaxθEqnew(T)logp(X,Tθ)qnew(T)=argmaxθEqnew(T)logp(X,Tθ)Eqnew(T)logqnew(T)=argmaxθEqnew(T)logp(X,Tθ)+const.\begin{align*} \boldsymbol{\theta}^{new} &= \underset{\boldsymbol{\theta}}{\mathrm{argmax}} \mathcal{L}(\boldsymbol{\theta}, q^{new}) \\ &= \underset{\boldsymbol{\theta}}{\mathrm{argmax}} \mathbb{E}_{q^{new}(\mathbf{T})} \log {p(\mathbf{X}, \mathbf{T} \lvert \boldsymbol{\theta}) \over q^{new}(\mathbf{T})} \\ &= \underset{\boldsymbol{\theta}}{\mathrm{argmax}} \mathbb{E}_{q^{new}(\mathbf{T})} \log p(\mathbf{X}, \mathbf{T} \lvert \boldsymbol{\theta}) - \mathbb{E}_{q^{new}(\mathbf{T})} \log q^{new}(\mathbf{T}) \\ &= \underset{\boldsymbol{\theta}}{\mathrm{argmax}} \mathbb{E}_{q^{new}(\mathbf{T})} \log p(\mathbf{X}, \mathbf{T} \lvert \boldsymbol{\theta}) +\mathrm{const.} \tag{15} \end{align*}

如果真正的后验是已知的, 则式 (15) 变为式 (7) ,除了在优化过程中可以忽略的常数项。同样,让 θoldθnew\boldsymbol{\theta}^{old} \leftarrow \boldsymbol{\theta}^{new} 并重复这些步骤直到收敛。下一节将 EM 算法应用于 GMM。

4. 高斯混合模型的期望最大化算法

The parameters for a GMM with 3 components are θ={π1,μ1,Σ1,π2,μ2,Σ2,π3,μ3,Σ3}\boldsymbol{\theta} = \{ \pi_1, \boldsymbol{\mu}_{1}, \boldsymbol{\Sigma}_{1}, \pi_2, \boldsymbol{\mu}_{2}, \boldsymbol{\Sigma}_{2}, \pi_3, \boldsymbol{\mu}_{3}, \boldsymbol{\Sigma}_{3} \}. The prior probability for component cc is p(tc=1θ)=πcp(t_c = 1 \lvert \boldsymbol{\theta}) = \pi_c and the conditional distribution of x\mathbf{x} given the latent variable value for this component is p(xtc=1,θ)=N(xμc,Σc)p(\mathbf{x} \lvert t_c = 1, \boldsymbol{\theta}) = \mathcal{N}(\mathbf{x} \lvert \boldsymbol{\mu}_c, \boldsymbol{\Sigma}_c).

具有 3 个组份的 GMM 模型参数是 θ={π1,μ1,Σ1, pi2μ2Σ2π3μ3Σ3}\boldsymbol{\theta} = \{ \pi_1, \boldsymbol{\mu}_{1}, \boldsymbol{\Sigma}_{1}, \ pi_2、\boldsymbol{\mu}_{2}、\boldsymbol{\Sigma}_{2}、\pi_3、\boldsymbol{\mu}_{3}、\boldsymbol{\Sigma }_{3} \}。组份 cc 的先验概率为 p(tc=1θ)=πcp(t_c = 1 \lvert \boldsymbol{\theta}) = \pi_c ,且给定该组份的隐变量值时, x\mathbf{x} 的条件分布为 $ p(\mathbf{x} \lvert t_c = 1, \boldsymbol{\theta}) = \mathcal{N}(\mathbf{x} \lvert \boldsymbol{\mu}_c, \boldsymbol{\Sigma}_c)$ 。

4.1 numpy 和 scipy 的实现

1
2
3
import numpy as np

from scipy.stats import multivariate_normal as mvn

在 E 步中,使用式( 6 )将隐变量的近似后验 q(T)q(\mathbf{T}) 初值设置为后验 p(TX,θ)p(\mathbf{T} \lvert \mathbf{X}, \boldsymbol{\theta}) ,并给出计算后验概率的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def e_step(X, pi, mu, sigma):
"""
Computes posterior probabilities from data and parameters.

Args:
X: observed data (N, D).
pi: prior probabilities (C,).
mu: mixture component means (C, D).
sigma: mixture component covariances (C, D, D).

Returns:
Posterior probabilities (N, C).
"""

N = X.shape[0]
C = mu.shape[0]
q = np.zeros((N, C))

# Equation (6)
for c in range(C):
q[:, c] = mvn(mu[c], sigma[c]).pdf(X) * pi[c]
return q / np.sum(q, axis=-1, keepdims=True)

在 M 步中,取 L(θ,q)\mathcal{L}(\boldsymbol{\theta}, q) 相对于 πc\pi_cμc\boldsymbol{\mu}_{c}Σc\boldsymbol{\Sigma}_{c} 的导数,将结果表达式设置为 00 ( 即执行参数的最大似然估计 ),并应用约束以确保 c=1Cπc=1\sum_{c=1}^C \pi_c = 1Σc)T\boldsymbol{\Sigma}_{c})^T 是半正定的。此处省略细节,仅呈现结果。

πc=1Ni=1Nq(tic=1)(16)\pi_c = {1 \over N} \sum_{i=1}^N q(t_{ic} = 1) \tag{16}

μc=i=1Nq(tic=1)xii=1Nq(tic=1)(17)\boldsymbol{\mu}_{c} = {\sum_{i=1}^N q(t_{ic} = 1) \mathbf{x}_i \over \sum_{i=1}^N q(t_{ic} = 1)} \tag{17}

Σc=i=1Nq(tic=1)(xiμc)(xiμc)Ti=1Nq(tic=1)(18)\boldsymbol{\Sigma}_{c} = {\sum_{i=1}^N q(t_{ic} = 1) (\mathbf{x}_i - \boldsymbol{\mu}_{c}) (\mathbf{x}_i - \boldsymbol{\mu}_{c})^T \over \sum_{i=1}^N q(t_{ic} = 1)} \tag{18}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def m_step(X, q):
"""
Computes parameters from data and posterior probabilities.

Args:
X: data (N, D).
q: posterior probabilities (N, C).

Returns:
tuple of
- prior probabilities (C,).
- mixture component means (C, D).
- mixture component covariances (C, D, D).
"""

N, D = X.shape
C = q.shape[1]
sigma = np.zeros((C, D, D))

# Equation (16)
pi = np.sum(q, axis=0) / N

# Equation (17)
mu = q.T.dot(X) / np.sum(q.T, axis=1, keepdims=True)

# Equation (18)
for c in range(C):
delta = (X - mu[c])
sigma[c] = (q[:, [c]] * delta).T.dot(delta) / np.sum(q[:, c])

return pi, mu, sigma

为了计算下界,使用 E 步和 M 步的结果,首先重排公式 (11) :

L(θ,q)=i=1NEq(ti)logp(xi,tiθ)q(ti)\mathcal{L}(\boldsymbol{\theta}, q) = \sum_{i=1}^{N} \mathbb{E}_{q(\mathbf{t}_i)} \log {p(\mathbf{x}_i, \mathbf{t}_i \lvert \boldsymbol{\theta}) \over q(\mathbf{t}_i)}

=i=1Nc=1Cq(tic=1)logp(xi,tic=1θ)q(tic=1)=\sum_{i=1}^{N} \sum_{c=1}^{C} q(t_{ic} = 1) \log {p(\mathbf{x}_i, t_{ic} = 1 \lvert \boldsymbol{\theta}) \over q(t_{ic} = 1)}

=i=1Nc=1Cq(tic=1){logp(xitic=1,θ)+logp(tic=1θ)logq(tic=1)}(19)=\sum_{i=1}^{N} \sum_{c=1}^{C} q(t_{ic} = 1) \{ \log p(\mathbf{x}_i \lvert t_{ic} = 1, \boldsymbol{\theta}) + \log p(t_{ic} = 1 \lvert \boldsymbol{\theta}) - \log q(t_{ic} = 1) \} \tag{19}

然后以如下形式实现它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def lower_bound(X, pi, mu, sigma, q):
"""
Computes lower bound from data, parameters and posterior probabilities.

Args:
X: observed data (N, D).
pi: prior probabilities (C,).
mu: mixture component means (C, D).
sigma: mixture component covariances (C, D, D).
q: posterior probabilities (N, C).

Returns:
Lower bound.
"""

N, C = q.shape
ll = np.zeros((N, C))

# Equation (19)
for c in range(C):
ll[:,c] = mvn(mu[c], sigma[c]).logpdf(X)
return np.sum(q * (ll + np.log(pi) - np.log(np.maximum(q, 1e-8))))

模型训练交替迭代 E 步和 M 步,直到下界收敛。为了增加逃出局部最大值并找到全局最大值的机会,会随机初始化参数并重新训练多次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
def random_init_params(X, C):
D = X.shape[1]
pi = np.ones(C) / C
mu = mvn(mean=np.mean(X, axis=0), cov=[np.var(X[:, 0]),
np.var(X[:, 1])]).rvs(C).reshape(C, D)
sigma = np.tile(np.eye(2), (C, 1, 1))
return pi, mu, sigma


def train(X, C, n_restarts=10, max_iter=50, rtol=1e-3):
q_best = None
pi_best = None
mu_best = None
sigma_best = None
lb_best = -np.inf

for _ in range(n_restarts):
pi, mu, sigma = random_init_params(X, C)
prev_lb = None

try:
for _ in range(max_iter):
q = e_step(X, pi, mu, sigma)
pi, mu, sigma = m_step(X, q)
lb = lower_bound(X, pi, mu, sigma, q)

if lb > lb_best:
q_best = q
pi_best = pi
mu_best = mu
### General form sigma_best = sigma
lb_best = lb

if prev_lb and np.abs((lb - prev_lb) / prev_lb) < rtol:
break

prev_lb = lb
except np.linalg.LinAlgError:
# Singularity. One of the components collapsed
# onto a specific data point. Start again ...
pass

return pi_best, mu_best, sigma_best, q_best, lb_best

pi_best, mu_best, sigma_best, q_best, lb_best = train(X, C=3)
print(f'Lower bound = {lb_best:.2f}')
Lower bound = -3923.77

收敛后,我们可以使用隐变量的后验来绘制数据点到组份的软分配。

1
2
plot_data(X, color=q_best)
plot_densities(X, mu=mu_best, sigma=sigma_best)

png

4.2 最优的组份数量

Usually, we do not know the optimal number of mixture components a priori. But we can get a hint when plotting the lower bound vs. the number of mixture components.

通常,我们无法先验地知道混合组份的最佳数量。但当绘制下界与混合组份数关系时,可以得到一些提示。

1
2
3
4
5
6
7
8
9
10
11
12
import matplotlib.pyplot as plt

Cs = range(1, 8)
lbs = []

for C in Cs:
lb = train(X, C)[-1]
lbs.append(lb)

plt.plot(Cs, lbs)
plt.xlabel('Number of mixture components')
plt.ylabel('Lower bound');

png

在到达 C=3C = 3 之前,下界值增幅很大,然后或多或少不再增加了。随着组份越多,过拟合的可能性就越大,但具有较高下界值的最简单模型就是三组份的 GMM。根据 “奥卡姆剃刀” 原则,这应当是用于生成数据的最佳组份数量。

确定最佳组份数量的更原则性方法需要对模型参数进行贝叶斯处理。在这种情况下,下界将考虑模型复杂性,我们会看到 C>3C \gt 3 时,下界值在下降,而在 C=3C = 3 处为下界的最大值。有关详细信息,请参阅 [1] 中的第 10.2.4 节。

4.3 scikit-learn 实现

上面的初级实现仅用于说明目的。 Scikit-learn 已经附带了一个可以轻松使用的“GaussianMixture” 类。

1
2
3
4
5
6
7
from sklearn.mixture import GaussianMixture

gmm = GaussianMixture(n_components=3, n_init=10)
gmm.fit(X)

plot_data(X, color=gmm.predict_proba(X))
plot_densities(X, mu=gmm.means_, sigma=gmm.covariances_)

png

结果非常相似。差异来自不同的随机初始化方法。此外,对下界与组份数量关系的绘图,再现了之前的发现。

1
2
3
4
5
6
7
8
9
10
11
Cs = range(1, 8)
lbs = []

for C in Cs:
gmm = GaussianMixture(n_components=C, n_init=10)
gmm.fit(X)
lbs.append(gmm.lower_bound_)

plt.plot(Cs, lbs)
plt.xlabel('Number of mixture components')
plt.ylabel('Lower bound (normalized)');

png

在这个例子中,通过gmm.lower_bound_ 获得的下界值做了归一化,即除以 N=1000N = 1000

5 结论

GMM 中隐变量的推断和参数估计是精确推断的一个例子。精确的后验可以在 E 步中获得,并且在 M 步中存在参数 MLE 的解析解。但是对于许多实际感兴趣的模型,精确推断基本不可能,必须使用近似推断方法。 变分推断 就是其中之一,将在下一篇隐变量模型的文章中进行介绍,并附上一个 变分自动编码器 作为应用示例。

References

  • [1] Christopher M. Bishop. [Pattern Recognition and Machine Learning](http://www.springer.com/de/book/9780387310732) ([PDF](https://www.microsoft.com/en-us/research/uploads/prod/2006/01/Bishop-Pattern-Recognition-and-Machine-Learning-2006.pdf)), Chapter 9.
  • [2] Kevin P. Murphy. [Machine Learning, A Probabilistic Perspective](https://mitpress.mit.edu/books/machine-learning-0), Chapter 11.