https://blog.csdn.net/lin_limin/article/details/81048411会对GMM和EM做详细介绍
本文参考:
http://www.ituring.com.cn/article/497545(GMM模型)
https://blog.csdn.net/xmu_jupiter/article/details/50889023(GMM模型)
http://www.cnblogs.com/wjy-lulu/p/7010258.html(EM算法)
https://blog.csdn.net/zouxy09/article/details/8537620(EM算法)
什么是高斯混合模型(Gaussian Mixture Model)
高斯混合模型(Gaussian Mixture Model)通常简称GMM,是一种业界广泛使用的聚类算法,该方法使用了高斯分布作为参数模型,并使用了期望最大(Expectation Maximization,简称EM)算法进行训练。
本文对该方法的原理进行了通俗易懂的讲解,期望读者能够更直观地理解方法原理。文本的最后还分析了高斯混合模型了另一种常见聚类算法K-means的关系,实际上在特定约束条件下,K-means算法可以被看作是高斯混合模型(GMM)的一种特殊形式(达观数据 陈运文)。
1. 什么是高斯分布?
高斯分布(Gaussian distribution)有时也被称为正态分布(normal distribution),是一种在自然界大量的存在的、最为常见的分布形式。在提供精确数学定义前,先用一个简单的例子来说明。
如果我们对大量的人口进行身高数据的随机采样,并且将采得的身高数据画成柱状图,将会得到如下图1所示的图形。这张图模拟展示了334个成人的统计数据,可以看出图中最多出现的身高在180cm左右2.5cm的区间里。
图1 由334个人的身高数据构成的正态分布直方图
这个图形非常直观的展示了高斯分布的形态。接下来看下严格的高斯公式定义,高斯分布的概率密度函数公式如下:
2. 高斯混合模型(GMM)
如上图,这是一个关于身高的生态分布曲线,关于175-180对称,中间高两边低,相信大家在高中已经很了解了,这里就不再阐述。
现在,我们引用《统计学习方法》-李航 书中的定义,如下图:
根据定义,我们可以理解为,GMM是多个高斯分布的加权和,并且权重α之和等于1。这里不难理解,因为GMM最终反映出的是一个概率,而整个模型的概率之和为1,所以权重之和即为1。高斯混合模型实则不难理解,接下来我们介绍GMM的训练(求解)方法。
PS.从数学角度看,对于一个概率模型的求解,即为求其最大值。从深度学习角度看,我们希望降低这个概率模型的损失函数,也就是希望训练模型,获得最大值。训练和求解是不同专业,但相同目标的术语。
高斯混合模型是对高斯模型进行简单的扩展,GMM使用多个高斯分布的组合来刻画数据分布。
举例来说:想象下现在咱们不再考察全部用户的身高,而是要在模型中同时考虑男性和女性的身高。假定之前的样本里男女都有,那么之前所画的高斯分布其实是两个高斯分布的叠加的结果。相比只使用一个高斯来建模,现在我们可以用两个(或多个)高斯分布(陈运文):
该公式和之前的公式非常相似,细节上有几点差异。首先分布概率是K个高斯分布的和,每个高斯分布有属于自己的μ和σ 参数,以及对应的权重参数,权重值必须为正数,所有权重的和必须等于1,以确保公式给出数值是合理的概率密度值。换句话说如果我们把该公式对应的输入空间合并起来,结果将等于1。
回到之前的例子,女性在身高分布上通常要比男性矮,画成图的话如图3。
图3 男性和女性身高的概率分布图
图3的y-轴所示的概率值,是在已知每个用户性别的前提下计算出来的。但通常情况下我们并不能掌握这个信息(也许在采集数据时没记录),因此不仅要学出每种分布的参数,还需要生成性别的划分情况( \varphi_{i}\varphi_{i} )。当决定期望值时,需要将权重值分别生成男性和女性的相应身高概率值并相加。
注意,虽然现在模型更复杂了,但仍然可使用与之前相同的技术进行模型训练。在计算期望值时(很可能通过已被混合的数据生成),只需要一个更新参数的最大化期望策略。
3. 最大似然估计
想要了解EM算法,我们首先需要了解最大似然估计这个概念。我们通过一个简单的例子来解释一下。
假设,我们需要调查学校男女生的身高分布。我们用抽样的思想,在校园里随机抽取了100男生和100女生,共计200个人(身高样本数据)。我们假设整个学校的身高分布服从于高斯分布。但是这个高斯分布的均值u和方差∂2我们不知道,这两个参数就是我们需要估计的值。记作θ=[u, ∂]T。
由于每个样本都是独立地从p(x|θ)中抽取的,并且所有的样本都服从于同一个高斯分布p(x|θ)。那么我们从整个学校中,那么我抽到男生A(的身高)的概率是p(xA|θ),抽到男生B的概率是p(xB|θ)。而恰好抽取出这100个男生的概率,就是每个男生的概率乘积。用下式表示:
这个概率反映了,在概率密度函数的参数是θ时,得到X这组样本的概率。在公式中,x已知,而θ是未知,所以它是θ的函数。这个函数放映的是在不同的参数θ取值下,取得当前这个样本集的可能性,因此称为参数θ相对于样本集X的似然函数(likehood function)。记为L(θ)。
我们先穿插一个小例子,来阐述似然的概念。
某位同学与一位猎人一起外出打猎,一只野兔从前方窜过。只听一声枪响,野兔应声到下,如果要你推测,这一发命中的子弹是谁打的?你就会想,只发一枪便打中,由于猎人命中的概率一般大于这位同学命中的概率,看来这一枪是猎人射中的。
这个例子所作的推断就体现了极大似然法的基本思想,我们并不知道具体是谁打的兔子,但是我们可以估计到一个看似正确的参数。回到男生身高的例子中。在整个学校中我们一次抽到这100个男生(样本),而不是其他的人,那么我们可以认为这100个男生(样本)出现的概率最大,用上面的似然函数L(θ)来表示。
所以,我们就只需要找到一个参数θ,其对应的似然函数L(θ)最大,也就是说抽到这100个男生(的身高)概率最大。这个叫做θ的最大似然估计量,记为:
因为L(θ)是一个连乘函数,我们为了便于分析,可以定义对数似然函数,运用对数的运算规则,把连乘转变为连加:
PS.这种数学方法在MFCC中我们曾经用过。
此时,我们要求θ,只需要使θ的似然函数L(θ)极大化,然后极大值对应的θ就是我们的估计。在数学中求一个函数的最值问题,即为求导,使导数为0,解方程式即可(前提是函数L(θ)连续可微)。在深度学习中,θ是包含多个参数的向量,运用高等数学中的求偏导,固定其中一个变量的思想,即可求出极致点,解方程。
总结而言:
最大似然估计,只是一种概率论在统计学的应用,它是参数估计的方法之一。说的是已知某个随机样本满足某种概率分布,但是其中具体的参数不清楚,参数估计就是通过若干次试验,观察其结果,利用结果推出参数的大概值。最大似然估计是建立在这样的思想上:已知某个参数能使这个样本出现的概率最大,我们当然不会再去选择其他小概率的样本,所以干脆就把这个参数作为估计的真实值。
求最大似然函数估计值的一般步骤:
(1)写出似然函数;
(2)对似然函数取对数,并整理;(化乘为加)
(3)求导数,令导数为0,得到似然方程;
(4)解似然方程,得到的参数即为所求。
4. EM算法
期望最大(Expectation Maximization, 简称EM)算法,称为机器学习十大算法之一。它是一种从不完全数据或有数据丢失的数据集(存在隐含变量)中求解概率模型参数的最大似然估计方法。
现在,我们重新回到男女生身高分布的例子。我们通过抽取100个男生身高,并假设身高分布服从于高斯分布,我们通过最大化其似然函数,可以求的高斯分布的参数θ=[u, ∂]T了,对女生同理。但是,假如这200人,我们只能统计到其身高数据,但是没有男女信息(其实就是面对200个样本,抽取得到的每个样本都不知道是从哪个分布抽取的,这对于深度学习的样本分类很常见)。这个时候,我们需要对样本进行两个东西的猜测或者估计了。
EM算法就可以解决这个问题。假设我们想估计知道A和B两个参数,在开始状态下二者都是未知的,但如果知道了A的信息就可以得到B的信息,反过来知道了B也就得到了A。可以考虑首先赋予A某种初值,以此得到B的估计值,然后从B的当前值出发,重新估计A的取值,这个过程一直持续到收敛为止。
在男女生身高分布的例子中,我们运用EM算法的思想。首先随便猜一下男生的高斯分布参数:均值和方差。假设均值是1.7米,方差是0.1米,然后计算出每个人更可能属于第一个还是第二个正态分布中。这是第一步,Expectation。在分开了两类之后,我们可以通过之前用的最大似然,通过这两部分,重新估算第一个和第二个分布的高斯分布参数:均值和方差。这是第二步,Maximization。然后更新这两个分布的参数。这是可以根据更新的分布,重新调整E(Expectation)步骤...如此往复,迭代到参数基本不再发生变化。
这里原作者提到了一个数学思维,很受启发,转给大家看一眼(比较鸡汤和啰嗦,大家可以跳过)
这时候你就不服了,说你老迭代迭代的,你咋知道新的参数的估计就比原来的好啊?为什么这种方法行得通呢?有没有失效的时候呢?什么时候失效呢?用到这个方法需要注意什么问题呢?呵呵,一下子抛出那么多问题,搞得我适应不过来了,不过这证明了你有很好的搞研究的潜质啊。呵呵,其实这些问题就是数学家需要解决的问题。在数学上是可以稳当的证明的或者得出结论的。那咱们用数学来把上面的问题重新描述下。(在这里可以知道,不管多么复杂或者简单的物理世界的思想,都需要通过数学工具进行建模抽象才得以使用并发挥其强大的作用,而且,这里面蕴含的数学往往能带给你更多想象不到的东西,这就是数学的精妙所在啊)
5. EM算法的简单理解方式
在提出EM算法的推导过程之前,先提出中形象的理解方式,便于大家理解整个EM算法,如果只是实现深度学习模型,个人认为可以不需要去看后面的算法推导,看这个就足够了。
坐标上升法(Coordinate ascent):
图中的直线式迭代优化的途径,可以看到每一步都会向最优值靠近,而每一步前进的路线都平行于坐标轴。那么我们可以将其理解为两个未知数的方程求解。俩个未知数求解的方式,其实是固定其中一个未知数,求另一个未知数的偏导数,之后再反过来固定后者,求前者的偏导数。EM算法的思想,其实也是如此。使用坐标上升法,一次固定一个变量,对另外的求极值,最后逐步逼近极值。对应到EM上,E步:固定θ,优化Q;M步:固定Q,优化θ;交替将极值推向最大。
6. EM算法推导
现在很多深度学习框架可以简单调用EM算法,实际上这一段大家可以不用看,直接跳过看最后的总结即可。但是如果你希望了解一些内部的逻辑,可以看一下这一段推导过程。
假设我们有一个样本集{x(1),…,x(m)},包含m个独立的样本(右上角为样本序号)。但每个样本i对应的类别z(i)是未知的(相当于聚类),也即隐含变量。故我们需要估计概率模型p(x,z)的参数θ(在文中可理解为高斯分布),但是由于里面包含隐含变量z,所以很难用最大似然求解,但如果z知道了,那我们就很容易求解了。
首先放出似然函数公式,我们接下来对公式进行化简:
对于参数估计,我们本质上的思路是想获得一个使似然函数最大化的参数θ,现在多出一个未知变量z,公式(1)。那么我们的目标就转变为:找到适合的θ和z让L(θ)最大。
对于多个未知数的方程分别对未知的θ和z分别求偏导,再设偏导为0,即可解方程。
因为(1)式是和的对数,当我们在求导的时候,形式会很复杂。
这里我们需要做一个数学转化。我们对和的部分,乘以一个相等的函数,得到(2)式,利用Jensen不等式的性质,将(2)式转化为(3)式。(Jensen不等式数学推到比较复杂,知道结果即可)
Note:
Jensen不等式表述如下:
如果f是凸函数,X是随机变量,那么:E[f(X)]>=f(E[X])
特别地,如果f是严格凸函数,当且仅当X是常量时,上式取等号。参考链接: https://blog.csdn.net/zouxy09/article/details/8537620
至此,上面的式(2)和式(3)不等式可以写成:似然函数L(θ)>=J(z,Q),那么我们可以通过不断的最大化这个下界J(z,Q)函数,来使得L(θ)不断提高,最终达到它的最大值。
现在,我们推导出了在固定参数θ后,使下界拉升的Q(z)的计算公式就是后验概率,解决了Q(z)如何选择的问题。这一步就是E步,建立L(θ)的下界。接下来的M步,就是在给定Q(z)后,调整θ,去极大化L(θ)的下界J(在固定Q(z)后,下界还可以调整的更大)。
总结而言
EM算法是一种从不完全数据或有数据丢失的数据集(存在隐藏变量)中,求解概率模型参数的最大似然估计方法。
EM的算法流程:
1>初始化分布参数θ;
重复2>, 3>直到收敛:
2>E步骤(Expectation):根据参数初始值或上一次迭代的模型参数来计算出隐性变量的后验概率,其实就是隐性变量的期望。作为隐藏变量的现估计值:
3>M步骤(Maximization):将似然函数最大化以获得新的参数值:
这个不断迭代的过程,最终会让E、M步骤收敛,得到使似然函数L(θ)最大化的参数θ。
在L(θ)的收敛证明:
7. k-means和GMM的关系
在特定条件下,k-means和GMM方法可以互相用对方的思想来表达。在k-means中根据距离每个点最接近的类中心来标记该点的类别,这里存在的假设是每个类簇的尺度接近且特征的分布不存在不均匀性。这也解释了为什么在使用k-means前对数据进行归一会有效果。高斯混合模型则不会受到这个约束,因为它对每个类簇分别考察特征的协方差模型。
K-means算法可以被视为高斯混合模型(GMM)的一种特殊形式。整体上看,高斯混合模型能提供更强的描述能力,因为聚类时数据点的从属关系不仅与近邻相关,还会依赖于类簇的形状。n维高斯分布的形状由每个类簇的协方差来决定。在协方差矩阵上添加特定的约束条件后,可能会通过GMM和k-means得到相同的结果。
实践中如果每个类簇的协方差矩阵绑定在一起(就是说它们完全相同),并且矩阵对角线上的协方差数值保持相同,其他数值则全部为0,这样能够生成具有相同尺寸且形状为圆形类簇。在此条件下,每个点都始终属于最近的中间点对应的类。(达观数据 陈运文)
在k-means方法中使用EM来训练高斯混合模型时对初始值的设置非常敏感。而对比k-means,GMM方法有更多的初始条件要设置。实践中不仅初始类中心要指定,而且协方差矩阵和混合权重也要设置。可以运行k-means来生成类中心,并以此作为高斯混合模型的初始条件。由此可见并两个算法有相似的处理过程,主要区别在于模型的复杂度不同。
整体来看,所有无监督机器学习算法都遵循一条简单的模式:给定一系列数据,训练出一个能描述这些数据规律的模型(并期望潜在过程能生成数据)。训练过程通常要反复迭代,直到无法再优化参数获得更贴合数据的模型为止。
GMM和K-means直观对比
最后我们比较GMM和K-means两个算法的步骤。
GMM:
先计算所有数据对每个分模型的响应度
根据响应度计算每个分模型的参数
迭代
K-means:
先计算所有数据对于K个点的距离,取距离最近的点作为自己所属于的类
根据上一步的类别划分更新点的位置(点的位置就可以看做是模型参数)
迭代
可以看出GMM和K-means还是有很大的相同点的。GMM中数据对高斯分量的响应度就相当于K-means中的距离计算,GMM中的根据响应度计算高斯分量参数就相当于K-means中计算分类点的位置。然后它们都通过不断迭代达到最优。不同的是:GMM模型给出的是每一个观测点由哪个高斯分量生成的概率,而K-means直接给出一个观测点属于哪一类。