原文:https://zhuanlan.zhihu.com/p/67107370
摘要
GMM(Gaussian Mixture Model, 高斯混合模型)被誉为万能分布近似器, 其拥有强悍的数据建模能力. GMM使用若干个高斯分布的加权和作为对观测数据集进行建模的基础分布, 而由中心极限定理我们知道, 大量独立同分布的随机变量的均值在做适当标准化之后会依分布收敛于高斯分布, 这使得高斯分布具有普适性的建模能力, 继而奠定了使用高斯分布作为主要构成部件的GMM进行数据建模的理论基础. GMM是典型的概率图模型 , GMM与其变种k-means(k均值)算法都是工业实践中经常使用的聚类工具. 由于GMM在建模时引入了隐变量的概念, 致使我们无法直接使用MLE(Maximum Likelihood Estimate, 极大似然估计)进行参数估计,进而引入了EM(Expectation Maximization algorithm, 最大期望算法)算法来对含有隐变量的模型进行训练. EM算法通过迭代地构造似然函数下限的方式不断地提升似然函数的取值, 从而完成对含有隐变量模型的参数估计, 其典型的应用包括GMM、HMM(Hidden Markov Model, 隐马尔可夫模型) 的参数估计. 本文将从一个问题实例出发, 引出使用GMM和EM算法对问题进行解决的思路, 阐述其背后的数学原理, 最后给出完整的解决方案. 本文组织如下:
- 阐述一个不完全数据的问题实例;
- 使用GMM模型对不完全数据的分布进行建模;
- 使用EM算法对带隐变量的模型进行参数估计;
- 使用EM算法对GMM模型进行求解的具体过程;
- 求解不完全数据问题实例的概率分布;
- 阐述k-means算法与GMM模型的关系;
- 总结.
关键词: 高斯混合模型, EM算法, 概率图模型, 机器学习
不完全数据的问题实例
假设我们有数据集 , 数据集 中的每个样本 分别是从 个高斯分布 中的某一个采样得到的, 但具体是哪一个高斯分布我们不得而知, 即我们无法观察采样的过程. 如下图所示, 图中含有1000个样本点, 每个样本点是从3个高斯分布中的某一个进行采样得到的. 由于我们无法观测到采样的具体过程, 所以某一个样本点 归属于哪个高斯分布我们并不知晓, 故在图中所有样本点均使用同一颜色进行表示. 如果我们现在想要对产生数据的分布进行建模, 估计每个高斯分布的参数, 并对每个点属于哪一个高斯分布进行预测, 我们应该如何操作呢? 为了解决这个问题, 我们需要引进一些额外的变量.
三个高斯分布采样得到的数据集
为了能清晰地描述数据集 的生成过程, 我们引入一个随机变量 来进行辅助, 这个随机变量 服从概率分布 , 其取值为 , 但分布 的具体参数我们并不知晓, 即概率 是未知的. 有了随机变量 的辅助, 数据集 的生成便可分为两个步骤: 首先, 我们从分布 采样得到一个值 用来确定样本 将从哪一个高斯分布进行采样产生; 然后, 我们对第 个高斯分布 进行采样, 从而产生我们的样本, 其中均值向量 , 协方差矩阵 是第 个高斯分布的待估参数.
因为我们无法直接观察到数据集 的整个产生过程, 观测值只有 , 而无法得知每个样本具体从哪一个高斯分布采样得到, 即 的取值无从知晓, 所以我们无法轻易地获得分布 和分布 的参数估计值. 我们将 称为完全数据, 而将 称为不完全数据. 由于随机变量 不可被直接观察, 所以我们称之为隐变量. 对于这种含有隐变量的不完全数据, 我们该如何来对其分布进行建模呢? 答案便是GMM模型.
GMM模型对不完全数据的分布进行建模
GMM模型使用 个高斯分布的加权和作为其概率密度函数, 具体地
(1)中, 模型的参数 , 为了保证概率密度函数在区间 上的积分为1, 我们有
所以对于(1), 参数 需要满足 , 此处参数 即为隐变量 所服从的分布 的参数值, 即 . 由(1)可以看出, GMM模型对不完全数据分布的建模是通过求其边缘分布 得到的.
假如我们能观察到数据集 的整个产生过程, 即样本 是由第 个高斯分布采样得到是可以观察到的, 此时观测值为完全数据 , 那我们就能很轻松地对分布 和分布 进行参数估计了, 具体地, 对于分布
(3)中使用来自同一个高斯分布的样本 构造出了第 个高斯分布的NLL(Negative Log Likelihood, 负对数似然) 函数并进行最小化以得到参数 . 而对于分布 , 我们可通过统计不同高斯分布所产生的样本个数来对其参数 进行估计. 至此, 所有的未知参数都得到了很好的估计. 样本 生成的概率可由
得到.
但是, 由于事实上观测数据只有不完全数据 , 所以(3)(4)的参数估计方法无法使用. 我们尝试直接对数据集 使用(1)来构造NLL函数并使用MLE来指导参数的估计, 具体地
通过求解带约束的最优化问题
求解(6)这个最优化问题相对比较困难, 原因有两个: 一NLL函数中, 对数函数的自变量带有连加操作; 二带有约束. 那么我们该如何对(5)进行参数估计呢? 答案便是EM算法 .
EM算法对带隐变量的模型进行参数估计
虽然直接求解(6)的最优化问题比较困难, 但是EM算法并没有摒弃使用MLE来指导NLL函数的优化以获得参数估计值的思路, 相反, EM算法延续了MLE的思路, 通过不断地构造对数似然函数的下界函数, 并对这个较为容易求解的下界函数进行最优化, 以增大对数似然函数取值的下界, 使得在不断的迭代操作后, 对数似然函数的取值能逼近最大值, 从而完成参数的估计.
要厘清EM算法的流程, 我们需要先了解Jensen's inequality ,
In the context of probability theory, it is generally stated in the following form: if X is a random variable and φ is a convex function, then , notice that the equality holds if X is constant (degenerate random variable) or if φ is linear.
受Jensen's inequality的启发, 如果我们能在(5)中对数函数的连加操作里面构造出一个关于 的期望, 那我们就能将连加操作移至对数函数的外面了, 具体地, 对于对数似然函数我们有
需要注意的是, 由于对数函数的凹凸性正好相反, 所以此处Jensen's inequality中的符号应该取反. 在(7)中, 我们借助在第 次迭代中得到的参数估计值 来获得 关于 的后验分布
此时的后验概率 是一个可计算的常数. 再使用这个关于 的后验分布构造期望
而后由Jensen's inequality即可得到
(10)对于 均成立, 所以由(8)(9)(10)我们最终可得(7).
我们不妨将(7)中的下界函数记为
则对数似然函数与下界函数有
由(12)我们可知, 借助Jensen's inequality我们构造出了对数似然函数 的一个下界函数 , 而对这个下界函数进行最优化是较为简单的事情, 所以我们可对下界函数进行求解, 以提升对数似然函数的函数值, 这便是EM算法的核心内容. 具体地, 我们将EM算法分为两步:
对于第 次迭代,
- 借助第 次迭代的参数估计值 , 构造对数似然函数的下界函数
(13)的构成部件亦既是EM算法中的Expectation;
2. 对(13)进行最优化, 得到当前的参数估计值
(14)亦既是EM算法中的Maximum. 通过不断地迭代, 直至对数似然函数收敛.
当然, 要想以上述流程完成参数估计, 我们还需要保证对数似然函数是能收敛的, 即
对于(10), 当 时有 不受 取值影响为常数, 此时Jensen's inequality等号成立, 故有
而对于 , 由(7)我们有
由(14)(16)(17)可得
由(18)EM算法的收敛性得以保证, 我们可以使用其来对GMM模型进行参数估计了.
EM算法对GMM模型进行求解的具体过程
由上一节我们知道, 使用EM算法来对GMM模型进行参数估计的核心是要构造出其期望函数作为下界函数, 并对下界函数进行最优化. 假设我们已经得到GMM模型第 次迭代的参数估计值为 , 由(8)我们可获得 关于 的后验分布为
(19)是可以被直接计算出来的常数, 我们将其记为 . 由(19)所表示的 的后验分布与(11), 我们可得GMM模型的对数似然函数的下界函数为
而(20)中
整合(20)(21)并去掉与优化无关的项, 可得下界函数的最终形式
有了下界函数(22), 我们就可以来求得第 次迭代的参数估计值了.
对于均值向量 , 令其偏导数为零
对于协方差矩阵 , 令其偏导数为零
对于隐变量所服从的分布 的参数 , 因为需要满足 , 由(22)使用拉格朗日乘子法并去掉与所求变量无关的项, 得到拉格朗日函数
对(25)进行偏导数求解并令其为0, 可得
由(23)(24)(26)我们可得下界函数 的最优解为
由(27)我们就可以给出EM算法对GMM模型进行求解的具体过程:
对于第 次迭代,
- 借助第 次迭代的参数估计值 , 构造GMM模型对数似然函数的下界函数
2. 对(E-step)进行最优化, 得到当前的参数估计值
求解不完全数据问题实例的概率分布
由前述章节我们已经得到了使用EM算法对GMM模型进行求解的具体过程, 现在我们就可以来解决本文开头所阐述的不完全数据问题实例了. 对其中的1000个样本点, 我们使用GMM模型来对其分布进行建模, 在每次迭代中, 我们先利用第 次迭代的参数估计值 求出 关于 的后验分布 , 再根据M-step求出第 次的参数估计值, 后反复迭代直至收敛.
使用EM算法求得高斯分布概率密度函数等高线示意图
上图为使用EM算法对GMM模型进行参数估计后得到的各个高斯分布概率密度函数的等高线示意图, 可以看到, 各个高斯分布概率密度函数的等高线形状与数据的分布情况有非常高的吻合程度.
样本点所属高斯分布的预测着色示意图
上图为1000个样本点所属高斯分布的预测着色示意图, 在使用EM算法得到GMM模型的参数估计值后, 只需计算 即可得到样本点所属高斯分布的预测值.
训练代码的主体如下:
for t in range(1, 1000):
# 求出 z_i 关于 x_i 的后验分布 q_{ik}
q = compute_q(alpha, mu, sigma, samples, total, n_gauss)
# 计算均值向量的估计值
for k in range(n_gauss):
mu[k] = np.sum(
np.stack((q[:, k], q[:, k]), axis=1) * samples,
axis=0) / np.sum(q[:, k])
# 计算协方差矩阵的估计值
for k in range(n_gauss):
res_mat = np.mat("0.0 0.0; 0.0 0.0")
for i in range(total):
vec = np.mat(samples[i]) - np.mat(mu[k])
res_mat += (q[i, k] * np.matmul(vec.T, vec))
res_mat /= np.sum(q[:, k])
sigma[k] = res_mat
# 计算隐变量分布的参数估计值
for k in range(n_gauss):
alpha[k] = (np.sum(q[:, k]) / total)
k-means算法与GMM模型的关系
在前面我们曾提到, k-means 算法是GMM模型的一个变种, 那具体这二者之间是一个怎么样的关系呢? 为了回答这个问题, 我们需要先对GMM模型做几个限制:
- 不完全数据 中的每个样本将不再依概率 归属于每个高斯分布, 后验概率 将只有一个取值为1, 其余皆取值为0, 即每次迭代中每个样本将以概率为1只归属于一个确定的高斯分布, 而不是以后验 归属于各个高斯分布;
- 各个高斯分布的协方差矩阵为单位矩阵 ;
- 隐变量 为均匀分布, 即样本是等概率从各个高斯分布中采样得到.
有了以上的限制, 我们可以来重新审视M-step所表达的意义了
我们来分析一下(M-step-constraint)的操作. 首先, 由于协方差矩阵 , 所以后验概率 中的高斯分布概率密度函数值实际上反比于样本 与对应高斯分布均值向量 的欧氏距离, 即 , 所以样本 将以概率为1被归于与之欧氏距离最小的均值向量所属的高斯分布; 然后, 使用归属于同个高斯分布的样本的均值更新对应高斯分布的均值向量. 算法流程具体为
对于第 次迭代,
- 根据样本 与第 次迭代各个高斯分布的均值向量 的欧氏距离 将样本标记为属于与之距离最小的高斯分布;
- 使用标记为属于同一个高斯分布的样本的均值向量更新对应高斯分布的均值向量.
这恰恰是k-means算法的完整描述, 只是在聚类操作中我们习惯使用"簇"的概念来表达此处的高斯分布. 由此可见, 我们能从GMM模型的EM算法求解过程中, 通过加以限制得到k-means算法, 亦既k-means算法是GMM模型的一个特例.
总结
GMM模型是典型的概率图模型, 其优异的数学性质使之在拟合数据分布时有很强的建模能力. 求解GMM模型的EM算法给带隐变量的模型的参数估计提供了强有力的武器, 其在工业界中亦得到广泛应用.