(十)EM算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(十)EM算法相关的知识,希望对你有一定的参考价值。

参考技术A

 EM算法的英文全称是 Expectation Maximization Algorithm——期望极大化算法 ,它采用迭代的方式逼近带隐变量的似然函数。通过对似然函数的一个下界求偏导,得到每一步参数估计的过程。
 这个名称由于缺乏作用对象,让人一头雾水。这里的期望是什么?为什么我们要极大化这个期望,我们试图优化什么?
 这里的期望的含义其实是针对 极大似然估计 中的 似然函数 来说的,这里的期望就是似然函数的一个 下界 ,我们的目的是求这样一个期望: 这个下界是根据 詹森不等式(Jensen\'s inequality) 放缩得到的,为什么要放缩呢?因为我们试图找出一个下界,极大化这个带参数的下界之后,可以无限近似于似然函数。你想,如果这个做法ok的话,意味着什么?意味着我们可以通过这个过程找出极大似然估计或最大后验估计的参数近似解。这也意味着我们可以搞一个迭代法来得到一个近似解。但是即便我说的天花乱坠,这个下界要是不收敛那也白搭。而下界要收敛必须满足两个条件:
 1.这个下界的取值要单调递增(因为每回迭代的结果要比上一次的取值更大)
 2.这个下界必须有上界(这个上界就是对数似然函数,且这一点可以由詹森不等式保证,这个也是EM的核心)
大白话就是 单调有界必有极限

我们来证明一下它确实是收敛的。
 首先,在极大似然估计中,我们的目的是根据手头上的 个样本,最大化 后,将参数 估计出来;引入对数: ;此时引入辅助变量 ;我们的对数似然函数就变成了:

设置变分函数: ;那么:

根据琴生不等式,对数函数为凸函数(因为 :等号在 为常数时取到):

上面的这个下界,就是用来逼近原对数似然函数的,这里我们已经证明了算法收敛的一个条件, 有界性 ;但是在继续进行下一步的时候,我们还有一个问题没搞清楚,那就是变分函数 的具体形式,实际上,我们可以通过琴生不等式等号成立的条件导出我们要的这个变分函数q。
令 为常数:
接着我们代入变分函数 的形式,定义这个下界的第一项:

定义下界的第二项:

对于第二项,我们看看随着迭代步数的增大,它是否是递增的,

我们将不同参数的 与 看作是两个分布,那么这个结果实际上是一个KL散度,它表征两个分布的相似度,其结果总是大于等于0的。
大于等于0的原因:

所以:

H为一个递增的序列,那么剩下的就是Q是否递增了,基于前面提到的这个下界是有上界的,上界就是我们的对数似然函数。在这个前提下,现在我们只要证明,Q递增是整个下界递增的充分必要条件即可。
必要性:

当整个下界递增,即:
那么:
所以 单调递增,必要性得证。
充分性:
因为:
前面已经证明:

又因为:

所以:

即,在 递增的情况下,整个下界递增。
充分性得证。
证毕。

 这个算法名称里提及的期望究竟是什么?
我们说了这么多,实际都是要做一件事,那就是:

由于前面证明过整个下界有界。且只要找到让第i次迭代的Q函数最大的 作为下一次迭代的参数,我们就可以让Q递增,让算法收敛。
我们来看看Q的形式。

这就是为什么叫期望最大算法的原因。

 我们以概率PCA,来展开EM的应用:
 当然这里的应用只涉及变分函数已知情况下的应用,并不涉及广义EM的内容,日后看完文献在来唠唠广义EM,AVE,GAN等内容。
 我们先来算一下PPCA的EM期望的形式:

在 概率PCA 中,我们有提到:


所以:


所以期望里面是这个式子:

我们的目的是要估计出 和 ;那么我们分别对它们求偏导:

所以:


因为:

代入偏导中

所以:

我们偏导得到的结果就是:

我们会发现我们还有两个估计量没解决,一个是一阶估计量 ,另一个是二阶估计量
在概率PCA中,我们提到过:

那么我们就有了一阶估计量:

二阶估计量可以通过简单的计算得到:

剩下的代入即可.

结果展示:

EM算法:GMM训练算法

目录

EM算法(1):K-means 算法

EM算法(2):GMM训练算法

EM算法(3):EM算法运用

EM算法(4):EM算法证明

 

 

 

                EM算法(2):GMM训练算法

1. 简介

  GMM模型全称为Gaussian Mixture Model,即高斯混合模型。其主要是针对普通的单个高斯模型提出来的。我们知道,普通高斯模型对实际数据拟合效果还不错,但是其有一个致命的缺陷,就是其为单峰函数,如果数据的真实分布为复杂的多峰分布,那么单峰高斯的拟合效果就不够好了。

  与单峰高斯模型不同,GMM模型是多个高斯模型的加权和,具体一点就是:

            $p(\\mathbf{x})\\ =\\ \\sum_k\\pi_k\\mathcal{N}(\\mathbf{x}|\\mu_k,\\Sigma_k)$  

  这是一个多峰分布,理论上,只要k足够大,GMM模型能拟合任何分布。

2. 困难

  GMM模型比普通高斯模型拟合能力更强了,但是对其训练的难度也增加了。回忆一下,在训练普通高斯模型时,我们是对其分布函数去ln进行求导,具体一点就是:

            $\\frac{\\partial lnp(\\mathbf{x})}{\\partial \\mathbf{\\theta}}\\ =\\ 0$

  那么对于普通高斯函数来说,$lnp(\\mathbf{x}) = C - \\frac{1}{2}(\\mathbf{x}-\\mu)^T\\Sigma^{-1}(\\mathbf{x}-\\mu)$,可以看到,ln将分布函数中的指数形式消除了,那么对其求导很容易得到闭式解。但是对于GMM模型来说就不是这么简单了。我们可以计算一下,其概率函数取ln形式为:

            $lnp(\\mathbf{x}) = ln\\{ \\sum_k\\pi_k\\mathcal{N}(\\mathbf{x}|\\mu_k,\\Sigma_k)\\}$

  我们可以看到,因为在ln里面还有加法,所以其无法消除其中的指数形式,导致其最优化问题没有闭式解。所以想要用calculus的方式来解决GMM模型训练的问题是不行的。

3. Inspiration from k-means algorithm

  没有什么事情是一步解决不了的,如果有,那就用两步。

                        --沃 · 兹基硕德

  我们重新来看看GMM模型的表达式,其由多个高斯函数相加而成,你可以想想一个空间中有很多高斯函数,它们分别在各自中心点所在的位置。一个一维的三个高斯混合的模型示意如下:

          

  那么对于任何一个点,都有其最靠近的一个峰。比如在中间峰处的点,其概率几乎全是来自于第二个高斯分布。那么我们就可以这样想,是不是每个点都有其更加偏向的高斯峰呢?等等,这个想法好像在哪里见过?k-means算法中的第一步不就是干的这事吗?将每个点都分配给最近的一个类。但是,我们这里怎么去度量距离呢?继续使用点到中心的距离?这样好像把每个高斯的方差忽略掉了。那么既然是概率模型,最好的方法就是用概率来比较。对于一个点$\\mathbf{x}$,第k个高斯对其的贡献为$\\pi_k\\mathcal{N}(\\mathbf{x}|\\mu_k,\\Sigma_k)$,那么把$\\mathbf{x}$分配给贡献最大的一个,这样看起来把各个因素考虑进去,似乎很合理了。

  但是,我们发现,如果一个点处于两个峰之间呢,这样把其归为任何一个峰都不太好吧?当然,k-means也没有解决这个问题,但是我们这里是概率模型,我们有更好的描述方法,我们可以计算一个点$\\mathbf{x}$属于每个高斯的概率。这样的考虑就比较全面了。那么点$\\mathbf{x}$属于每个高斯的概率自然就取这个高斯对其的贡献$\\pi_k\\mathcal{N}(\\mathbf{x}|\\mu_k,\\Sigma_k)$。为了使其成为一个概率,我们还需要对其归一化,所以得到第n个数据点属于第k个高斯的概率:

            $\\gamma_{nk}=\\frac{\\pi_k\\mathcal{N}(\\mathbf{x}_n|\\mu_k,\\Sigma_k)}{\\sum_j\\pi_j\\mathcal{N}(\\mathbf{x}_n|\\mu_j,\\Sigma_j)}$

  按照k-means算法,第二步就是把$\\gamma_{nk}$当做已知去做最优化。这里既然是要拟合分布,那么就使用最大似然的方法,最大化$lnp(\\mathbf{X})$。那么这里就有一个问题了:在k-means算法中,目标函数是有$r_{nk}$这一项的,然而$lnp(\\mathbf{X})$中并没有$\\gamma_{nk}$这一项呀,我怎么把其当做已知的呢?这里我们不急,暂时不去管这个,我们先计算$\\frac{\\partial lnp(\\mathbf{X})}{\\partial \\mu_k}$:

            $\\frac{\\partial lnp(\\mathbf{X})}{\\partial \\mu_k}\\ =\\ -\\ \\sum_n\\frac{\\pi_k\\mathcal{N}(\\mathbf{x}_n|\\mu_k,\\Sigma_k)}{\\sum_j\\pi_j\\mathcal{N}(\\mathbf{x}_n|\\mu_j,\\Sigma_k)}\\Sigma_k(\\mathbf{x}_n\\ -\\ \\mu_k) $      (1)

  我们的$\\gamma_{nk}$是不是已经出现了,那么上式可以简写为:

            $\\ -\\ \\sum_n\\gamma_{nk}\\Sigma_k(\\mathbf{x}_n\\ -\\ \\mu_k)$

  令其等于0,可以得到:

            $\\mu_k\\ =\\ \\frac{\\sum_n\\gamma_{nk}\\mathbf{x}_n}{\\sum_n\\gamma_{nk}}$              (2)

  可以看到,其与k-means算法第二步中心点的计算方法$\\mu_k=\\frac{\\sum_nr_{nk}\\mathbf{x}_n}{\\sum_nr_{nk}}$非常相似。

  类似的,对$\\Sigma_k$求导,可以得到:

            $\\Sigma_k\\ =\\ \\frac{\\sum_n\\gamma_{nk}(\\mathbf{x}_n-\\mu_k)(\\mathbf{x}_n-\\mu_k)^T}{\\sum_n\\gamma_{nk}}$        (3)

  对$\\pi_k$求导,可以得到:

            $\\pi_k\\ =\\ \\frac{\\sum_n\\gamma_{nk}}{\\sum_k\\sum_n\\gamma_{nk}}$               (4)

  自此,GMM训练方法就得到了,第一步,使用式(1)计算所有点的属于各个高斯的概率;第二步,利用式(2),(3),(4)更新均值、方差和权值。重复这两步直到收敛。

4. 与EM算法的关系

  这里我们是从k-means算法出发得到的GMM训练算法,那么其与EM算法的关系与k-means算法和EM算法的关系类似。同样,我们后面可以看到,利用EM算法可以推导出GMM训练算法。

以上是关于(十)EM算法的主要内容,如果未能解决你的问题,请参考以下文章

EM算法:EM算法证明

EM算法:EM算法详解

EM算法详解

期望最大化算法(Expectation-Maximum,简称EM)算法+EM算法+EM的应用

机器学习EM算法

机器学习EM算法