源代码:
本文是关于隐变量模型的第 1 篇,介绍了期望最大化 (EM) 算法及其在高斯混合模型中的应用。
1. 概述
给定概率模型 p ( x ∣ θ ) p(\mathbf{x} \lvert \boldsymbol{\theta}) p ( x ∣ θ ) 和 N N N 个观测值值 X = { x 1 , … , x N } \mathbf{X} = \{ \mathbf{x}_1, \ldots, \mathbf{ x}_N \} X = { x 1 , … , x N } 。 我们希望找到一个能够使似然 p ( X ∣ θ ) p(\mathbf{X} \lvert \boldsymbol{\theta}) p ( X ∣ θ ) 最大化的参数 θ \boldsymbol{\theta} θ 。这也被称为 最大似然估计 (MLE)。
θ M L E = a r g m a x θ p ( X ∣ θ ) (1) \boldsymbol{\theta}_{MLE} = \underset{\boldsymbol{\theta}}{\mathrm{argmax}} \quad p(\mathbf{X} \lvert \boldsymbol{\theta})
\tag{1}
θ M L E = θ argmax p ( X ∣ θ ) ( 1 )
如果模型是一个简单概率分布( 例如单高斯分布 ),则 θ M L E = { μ M L E , Σ M L E } \boldsymbol{\theta}_{MLE} = \{ \boldsymbol{\mu}_{MLE}, \boldsymbol{\Sigma}_{MLE} \} θ M L E = { μ M L E , Σ M L E } 可能有解析解。更复杂模型通常会采用 梯度下降法 ,只要 p ( X ∣ θ ) p(\mathbf{X} \lvert \boldsymbol{\theta}) p ( X ∣ θ ) 相对于 θ \boldsymbol{\theta} θ 可微,就可以将负对数似然 − log p ( X ∣ θ ) -\log p(\mathbf{X} \lvert \boldsymbol{\theta}) − log p ( X ∣ θ ) 作为损失函数。 但这不一定是最有效的方法。
2. 高斯混合模型
通常可以通过引入隐变量 来简化最大似然估计。隐变量模型假设观测值 x i \mathbf{x}_i x i 是由一些潜在的隐变量引起的,该变量不能直接观测,但可以从观测到的变量和参数中推断出来。例如,下图显示了二维空间中的观测结果,可以看到其整体分布似乎不像是单个高斯那样简单的分布。
1 2 3 4 5 6 7 8 from latent_variable_models_util import n_true, mu_true, sigma_truefrom 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' )
我们可以看到更高密度的集群。此外,与整体分布相比,集群内的分布看起来更像高斯分布。事实上,这些数据是使用下面代码,从三个高斯分布混合生成的,如下图所示。
1 2 plot_data(X, color=T) plot_densities(X, mu=mu_true, sigma=sigma_true)
其背后的概率模型被称为高斯混合模型 (GMM) ,是由 C C C 个高斯组份加权总和的结果,见公式(2),在本例中 C = 3 C=3 C = 3 。
p ( x ∣ θ ) = ∑ c = 1 C π c N ( 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}
p ( x ∣ θ ) = c = 1 ∑ C π c N ( x ∣ μ c , Σ c ) ( 2 )
π c \pi_c π c 、μ c \boldsymbol{\mu}_{c} μ c 和 Σ c \boldsymbol{\Sigma}_{c} Σ c 分别是组份 c c c 的权重(标量)、均值(向量)和协方差(矩阵)。权重是非负的,总和为 1 1 1 ,即 ∑ c = 1 C π c = 1 \sum_{c=1}^{C} \pi_c = 1 ∑ c = 1 C π 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} \} θ = { π 1 , μ 1 , Σ 1 , … , π C , μ C , Σ C } 表示所有模型参数的集合。如果引入一个离散的隐变量 t \mathbf{t} t 来确定对各组份观测值的分配,则我们可以根据条件分布 p ( x ∣ t , θ ) p(\mathbf{x} \lvert \mathbf{t}, \boldsymbol{\theta}) p ( x ∣ t , θ ) 和先验分布 p ( t ∣ θ ) p(\mathbf{t} \lvert \boldsymbol{\theta}) p ( t ∣ θ ) ,定义观测变量和隐变量的联合分布 p ( x , t ∣ θ ) p(\mathbf{x}, \mathbf{t} \lvert \boldsymbol{\theta}) p ( x , t ∣ θ ) 。
p ( x , t ∣ θ ) = p ( x ∣ t , θ ) 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 ( x , t ∣ θ ) = p ( x ∣ t , θ ) p ( t ∣ θ ) ( 3 )
其中 p ( x ∣ t c = 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 ( x ∣ t c = 1 , θ ) = N ( x ∣ μ c , Σ c ) 并且 p ( t c = 1 ∣ θ ) = π c p(t_c = 1 \lvert \boldsymbol{\theta}) = \pi_c p ( t c = 1 ∣ θ ) = π c 。 t \mathbf{t} t 的值采用单热编码向量( one-hot coding )。例如, t 2 = 1 t_2 = 1 t 2 = 1 指第二个组份, 当总共有 C = 3 C=3 C = 3 个组份时,这意味着 t = ( 0 , 1 , 0 ) T \mathbf{t} = (0,1,0)^T t = ( 0 , 1 , 0 ) T 。边缘分布 p ( x ∣ θ ) p(\mathbf{x} \lvert \boldsymbol{\theta}) p ( x ∣ θ ) 是通过对 t \mathbf{t} t 的所有可能状态求和获得的。
p ( x ∣ θ ) = ∑ c = 1 C p ( t c = 1 ∣ θ ) p ( x ∣ t c = 1 , θ ) = ∑ c = 1 C π c N ( 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*}
p ( x ∣ θ ) = c = 1 ∑ C p ( t c = 1 ∣ θ ) p ( x ∣ t c = 1 , θ ) = c = 1 ∑ C π c N ( x ∣ μ c , Σ c ) ( 4 )
对于每个观测值值 x i \mathbf{x}_i x i ,对应一个隐变量 t i \mathbf{t}_i t i ,如下面概率图模型的符号所示。
用大写的 X \mathbf{X} X 表示所有观测构成的集合,用大写的 T \mathbf{T} T 表示所有隐变量构成的集合。如果我们能够直接观测 T \mathbf{T} T ,则很容易通过最大化 完整数据似然 p ( X , T ∣ θ ) p(\mathbf{X}, \mathbf{T} \lvert \boldsymbol{\theta}) p ( X , T ∣ θ ) 以得到最佳的 θ \boldsymbol{\theta} θ 。因为这种情况下,每个数据点分配给哪个组份是明确的,并且可以通过拟合获得每个组份的高斯分布(此时实际上已经变成监督学习任务了)。但目前的限制性条件是只能观测到 X \mathbf{X} X ,所以我们只能通过最大化 边缘似然 (或 不完整的数据似然 ) p ( X ∣ θ ) p(\mathbf{X} \lvert \boldsymbol{\theta}) p ( X ∣ θ ) 来推导。 通过使用似然的对数,有:
θ M L E = a r g m a x θ log p ( X ∣ θ ) = a r g m a x θ log ∑ T p ( 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*}
θ M L E = θ argmax log p ( X ∣ θ ) = θ argmax log T ∑ p ( X , T ∣ θ ) ( 5 )
上式涉及对数内关于隐变量的累积求和,并且阻碍了对优化问题的解析解。
3. 期望最大算法
虽然无法直接观测到隐变量的值,但我们可以通过似然和先验得到其后验分布。根据贝叶斯定理,我们从一个初步的参数值 θ o l d \boldsymbol{\theta}^{old} θ o l d 开始。在固定 θ o l d \boldsymbol{\theta}^{old} θ o l d 的情况下, T \mathbf{T} T 的后验为:
p ( T ∣ X , θ o l d ) = p ( X ∣ T , θ o l d ) p ( T ∣ θ o l d ) ∑ T p ( X ∣ T , θ o l d ) p ( T ∣ θ o l d ) (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 ( T ∣ X , θ o l d ) = ∑ T p ( X ∣ T , θ o l d ) p ( T ∣ θ o l d ) p ( X ∣ T , θ o l d ) p ( T ∣ θ o l d ) ( 6 )
依据该后验,我们可以定义完整数据似然 p ( X , T ∣ θ ) p(\mathbf{X}, \mathbf{T} \lvert \boldsymbol{\theta}) p ( X , T ∣ θ ) 的期望(对数形式):
Q ( θ , θ o l d ) = ∑ T p ( T ∣ X , θ o l d ) log p ( X , T ∣ θ ) = E p ( T ∣ X , θ o l d ) log p ( 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*}
Q ( θ , θ o l d ) = T ∑ p ( T ∣ X , θ o l d ) log p ( X , T ∣ θ ) = E p ( T ∣ X , θ o l d ) log p ( X , T ∣ θ ) ( 7 )
将该期望作为目标,相对于 θ \boldsymbol{\theta} θ 做最大化,并得到一个更新后的参数向量 θ n e w \boldsymbol{\theta}^{new} θ n e w 。
θ n e w = a r g m a x θ Q ( θ , θ o l d ) (8) \boldsymbol{\theta}^{new} = \underset{\boldsymbol{\theta}}{\mathrm{argmax}} \mathcal{Q}(\boldsymbol{\theta}, \boldsymbol{\theta}^{old})
\tag{8}
θ n e w = θ argmax Q ( θ , θ o l d ) ( 8 )
在式 (7) 中,求和是在对数之外进行的,这在 GMM 情形下,使得 θ n e w \boldsymbol{\theta}^{new} θ n e w 能够得到解析解。然后令 θ o l d ← θ n e w \boldsymbol{\theta}^{old} \leftarrow \boldsymbol{\theta}^{new} θ o l d ← θ n e w ,并重复上述步骤直到 θ \boldsymbol{\theta} θ 收敛。这就是 期望最大化(EM)算法 的本质。它包括一个计算期望的步骤( E-step ),以更新隐变量的后验;以及一个最大化步骤( M-step ),该步骤依据更新后的隐变量的后验,通过完整数据似然的期望最大化,进一步更新模型参数 θ \boldsymbol{\theta} θ 。可以证明EM 算法总是收敛到 p ( X ∣ θ ) p(\mathbf{X} \lvert \boldsymbol{\theta}) p ( X ∣ θ ) 的局部最大值。
以下小节以更一般的形式描述了 EM 算法。
3.1 一般形式
通过为每个观测 x i \mathbf{x}_i x i 引入一个隐变量 t i \mathbf{t}_i t i ,可以将对数边缘似然定义为:
log p ( X ∣ θ ) = ∑ i = 1 N log p ( x i ∣ θ ) = ∑ i = 1 N log ∑ c = 1 C p ( x i , t i c = 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*}
log p ( X ∣ θ ) = i = 1 ∑ N log p ( x i ∣ θ ) = i = 1 ∑ N log c = 1 ∑ C p ( x i , t i c = 1 ∣ θ ) ( 9 )
接下来我们在隐变量 t i \mathbf{t}_i t i 上引入一个分布 q ( t i ) q(\mathbf{t}_i) q ( t i ) ,它可以是任何概率分布。 然后用该分布左乘和左除式( 9 ),得到:
log p ( X ∣ θ ) = ∑ i = 1 N log ∑ c = 1 C q ( t i c = 1 ) p ( x i , t i c = 1 ∣ θ ) q ( t i c = 1 ) = ∑ i = 1 N log E q ( t i ) p ( x i , t i ∣ θ ) q ( t i ) \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 p ( X ∣ θ ) = i = 1 ∑ N log c = 1 ∑ C q ( t i c = 1 ) q ( t i c = 1 ) p ( x i , t i c = 1 ∣ θ ) = i = 1 ∑ N log E q ( t i ) q ( t i ) p ( x i , t i ∣ θ ) ( 10 )
现在得到一个期望的凹函数 (log \log log 函数),它允许我们应用 Jensen 不等式 来定义 log p ( X ∣ θ ) \log p(\mathbf{X} \lvert \boldsymbol{\theta}) log p ( X ∣ θ ) 的 下界 L \mathcal{L} L 。
log p ( X ∣ θ ) = ∑ i = 1 N log E q ( t i ) p ( x i , t i ∣ θ ) q ( t i ) ≥ ∑ i = 1 N E q ( t i ) log p ( x i , t i ∣ θ ) q ( t i ) = E q ( T ) log p ( 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*}
log p ( X ∣ θ ) = i = 1 ∑ N log E q ( t i ) q ( t i ) p ( x i , t i ∣ θ ) ≥ i = 1 ∑ N E q ( t i ) log q ( t i ) p ( x i , t i ∣ θ ) = E q ( T ) log q ( T ) p ( X , T ∣ θ ) = L ( θ , q ) ( 11 )
该下界是 θ \boldsymbol{\theta} θ 和 q q q 的函数。当从对数边缘似然中减去下界时,我们应该得到非负的结果。
log p ( X ∣ θ ) − L ( θ , q ) = log p ( X ∣ θ ) − E q ( T ) log p ( X , T ∣ θ ) q ( T ) = E q ( T ) log p ( X ∣ θ ) q ( T ) p ( X , T ∣ θ ) = E q ( T ) log q ( T ) p ( T ∣ X , θ ) = K L ( q ( T ) ∣ ∣ p ( T ∣ X , θ ) ) \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*}
log p ( X ∣ θ ) − L ( θ , q ) = log p ( X ∣ θ ) − E q ( T ) log q ( T ) p ( X , T ∣ θ ) = E q ( T ) log p ( X , T ∣ θ ) p ( X ∣ θ ) q ( T ) = E q ( T ) log p ( T ∣ X , θ ) q ( T ) = KL ( q ( T ) ∣∣ p ( T ∣ X , θ )) ( 12 )
最终得到了 q ( T ) q(\mathbf{T}) q ( T ) 与隐变量的真实后验 p ( T ∣ X , θ ) p(\mathbf{T} \lvert \mathbf{X}, \boldsymbol{\theta}) p ( T ∣ X , θ ) 之间的 K L KL K L 散度。我们最终为下界写出以下表达式:
L ( θ , q ) = log p ( X ∣ θ ) − K L ( q ( T ) ∣ ∣ p ( T ∣ X , θ ) ) (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}
L ( θ , q ) = log p ( X ∣ θ ) − KL ( q ( T ) ∣∣ p ( T ∣ X , θ )) ( 13 )
在 EM 算法的 E 步中, 保持 θ \boldsymbol{\theta} θ 固定,相对于 q q q 最大化 L ( θ , q ) \mathcal{L}(\boldsymbol{\theta}, q) L ( θ , q ) 被最大化,进而更新 q q q 。
q n e w = a r g m a x q L ( θ o l d , q ) = a r g m i n q K L ( q ( T ) ∣ ∣ p ( T ∣ X , θ o l d ) ) \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*}
q n e w = q argmax L ( θ o l d , q ) = q argmin KL ( q ( T ) ∣∣ p ( T ∣ X , θ o l d )) ( 14 )
L ( θ , q ) \mathcal{L}(\boldsymbol{\theta}, q) L ( θ , q ) 的最大化等价于 KL ( q ( T ) ∣ ∣ p ( T ∣ X , θ ) ) \text{KL}(q(\mathbf{T}) \mid\mid p(\mathbf{T} \lvert \mathbf {X}, \boldsymbol{\theta})) KL ( q ( T ) ∣∣ p ( T ∣ X , θ )) 的最小化,因为 log p ( X ∣ θ ) \log p(\mathbf{X} \lvert \boldsymbol{\theta}) log p ( X ∣ θ ) 不依赖于 q q q 。
如果能够获得真实的后验,就像在 GMM 的情况下一样,可以将 q ( T ) q(\mathbf{T}) q ( T ) 设置为 p ( T ∣ X , θ ) p(\mathbf{T} \lvert \mathbf{X}, \boldsymbol{\theta} ) p ( T ∣ X , θ ) , K L KL K L 散度变为 0 0 0 。如果真正的后验是不可处理的,则必须使用近似值。一类近似技术称为 变分推断 ,它使用特定形式的 q q q 来近似真实后验。例如,q q q 可能来自某个受参数控制的分布族,可以通过选择 q q q 的参数以使 K L KL K L 散度最小化。第 2 部分更详细地介绍了变分推断。
在 M 步中,保持 q q q 固定, 相对于模型参数 θ \boldsymbol{\theta} θ 最大化 L ( θ , q ) \mathcal{L}(\boldsymbol{\theta}, q) L ( θ , q ) ,进而更新 θ \boldsymbol{\theta} θ 。使用式 (11) 可以得到:
θ n e w = a r g m a x θ L ( θ , q n e w ) = a r g m a x θ E q n e w ( T ) log p ( X , T ∣ θ ) q n e w ( T ) = a r g m a x θ E q n e w ( T ) log p ( X , T ∣ θ ) − E q n e w ( T ) log q n e w ( T ) = a r g m a x θ E q n e w ( T ) log p ( X , T ∣ θ ) + c o n s t . \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*}
θ n e w = θ argmax L ( θ , q n e w ) = θ argmax E q n e w ( T ) log q n e w ( T ) p ( X , T ∣ θ ) = θ argmax E q n e w ( T ) log p ( X , T ∣ θ ) − E q n e w ( T ) log q n e w ( T ) = θ argmax E q n e w ( T ) log p ( X , T ∣ θ ) + const. ( 15 )
如果真正的后验是已知的, 则式 (15) 变为式 (7) ,除了在优化过程中可以忽略的常数项。同样,让 θ o l d ← θ n e w \boldsymbol{\theta}^{old} \leftarrow \boldsymbol{\theta}^{new} θ o l d ← θ n e w 并重复这些步骤直到收敛。下一节将 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} \} θ = { π 1 , μ 1 , Σ 1 , π 2 , μ 2 , Σ 2 , π 3 , μ 3 , Σ 3 } . The prior probability for component c c c is p ( t c = 1 ∣ θ ) = π c p(t_c = 1 \lvert \boldsymbol{\theta}) = \pi_c p ( t c = 1 ∣ θ ) = π c and the conditional distribution of x \mathbf{x} x given the latent variable value for this component is p ( x ∣ t c = 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 ( x ∣ t c = 1 , θ ) = N ( x ∣ μ c , Σ c ) .
具有 3 个组份的 GMM 模型参数是 θ = { π 1 , μ 1 , Σ 1 , p i 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} \} θ = { π 1 , μ 1 , Σ 1 , p i 2 、 μ 2 、 Σ 2 、 π 3 、 μ 3 、 Σ 3 } 。组份 c c c 的先验概率为 p ( t c = 1 ∣ θ ) = π c p(t_c = 1 \lvert \boldsymbol{\theta}) = \pi_c p ( t c = 1 ∣ θ ) = π c ,且给定该组份的隐变量值时, x \mathbf{x} 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 npfrom scipy.stats import multivariate_normal as mvn
在 E 步中,使用式( 6 )将隐变量的近似后验 q ( T ) q(\mathbf{T}) q ( T ) 初值设置为后验 p ( T ∣ X , θ ) p(\mathbf{T} \lvert \mathbf{X}, \boldsymbol{\theta}) p ( T ∣ X , θ ) ,并给出计算后验概率的函数:
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)) 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) L ( θ , q ) 相对于 π c \pi_c π c 、μ c \boldsymbol{\mu}_{c} μ c 和 Σ c \boldsymbol{\Sigma}_{c} Σ c 的导数,将结果表达式设置为 0 0 0 ( 即执行参数的最大似然估计 ),并应用约束以确保 ∑ c = 1 C π c = 1 \sum_{c=1}^C \pi_c = 1 ∑ c = 1 C π c = 1 和 Σ c ) T \boldsymbol{\Sigma}_{c})^T Σ c ) T 是半正定的。此处省略细节,仅呈现结果。
π c = 1 N ∑ i = 1 N q ( t i c = 1 ) (16) \pi_c = {1 \over N} \sum_{i=1}^N q(t_{ic} = 1) \tag{16}
π c = N 1 i = 1 ∑ N q ( t i c = 1 ) ( 16 )
μ c = ∑ i = 1 N q ( t i c = 1 ) x i ∑ i = 1 N q ( t i c = 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 = 1 N q ( t i c = 1 ) ∑ i = 1 N q ( t i c = 1 ) x i ( 17 )
Σ c = ∑ i = 1 N q ( t i c = 1 ) ( x i − μ c ) ( x i − μ c ) T ∑ i = 1 N q ( t i c = 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}
Σ c = ∑ i = 1 N q ( t i c = 1 ) ∑ i = 1 N q ( t i c = 1 ) ( x i − μ c ) ( x i − μ c ) T ( 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)) pi = np.sum (q, axis=0 ) / N mu = q.T.dot(X) / np.sum (q.T, axis=1 , keepdims=True ) 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 = 1 N E q ( t i ) log p ( x i , t i ∣ θ ) q ( t i ) \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)}
L ( θ , q ) = i = 1 ∑ N E q ( t i ) log q ( t i ) p ( x i , t i ∣ θ )
= ∑ i = 1 N ∑ c = 1 C q ( t i c = 1 ) log p ( x i , t i c = 1 ∣ θ ) q ( t i c = 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 = 1 ∑ N c = 1 ∑ C q ( t i c = 1 ) log q ( t i c = 1 ) p ( x i , t i c = 1 ∣ θ )
= ∑ i = 1 N ∑ c = 1 C q ( t i c = 1 ) { log p ( x i ∣ t i c = 1 , θ ) + log p ( t i c = 1 ∣ θ ) − log q ( t i c = 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}
= i = 1 ∑ N c = 1 ∑ C q ( t i c = 1 ) { log p ( x i ∣ t i c = 1 , θ ) + log p ( t i c = 1 ∣ θ ) − log q ( t i c = 1 )} ( 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)) 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 lb_best = lb if prev_lb and np.abs ((lb - prev_lb) / prev_lb) < rtol: break prev_lb = lb except np.linalg.LinAlgError: 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:.2 f} ' )
Lower bound = -3923.77
收敛后,我们可以使用隐变量的后验来绘制数据点到组份的软分配。
1 2 plot_data(X, color=q_best) plot_densities(X, mu=mu_best, sigma=sigma_best)
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 pltCs = 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' );
在到达 C = 3 C = 3 C = 3 之前,下界值增幅很大,然后或多或少不再增加了。随着组份越多,过拟合的可能性就越大,但具有较高下界值的最简单模型就是三组份的 GMM。根据 “奥卡姆剃刀” 原则,这应当是用于生成数据的最佳组份数量。
确定最佳组份数量的更原则性方法需要对模型参数进行贝叶斯处理。在这种情况下,下界将考虑模型复杂性,我们会看到 C > 3 C \gt 3 C > 3 时,下界值在下降,而在 C = 3 C = 3 C = 3 处为下界的最大值。有关详细信息,请参阅 [1] 中的第 10.2.4 节。
4.3 scikit-learn 实现
上面的初级实现仅用于说明目的。 Scikit-learn 已经附带了一个可以轻松使用的“GaussianMixture” 类。
1 2 3 4 5 6 7 from sklearn.mixture import GaussianMixturegmm = 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_)
结果非常相似。差异来自不同的随机初始化方法。此外,对下界与组份数量关系的绘图,再现了之前的发现。
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)' );
在这个例子中,通过gmm.lower_bound_
获得的下界值做了归一化,即除以 N = 1000 N = 1000 N = 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.