概率模型(Probabilistic Model)裡面,我們通常會利用最大似然估計(Maximum Likelihood Estimation, MLE)或者最大後驗估計(Maximum A Posterior, MAP)來估計一些模型的參數,即 max_	heta ln p(X|	heta) ,然而很多概率模型涉及到隱變數 Z ,所以會變成 max_	heta ln left( sum_Z p(X, Z|	heta) 
ight) ,由於求和項是在對數裡面,這給優化帶來了很大的困難。而EM演算法就是針對這種帶隱變數的極大似然估計提出來的演算法。

本文將會主要介紹EM演算法。對於EM演算法的介紹會包括:EM演算法的兩種推導、EM在高斯混合模型裡面的詳細推導。

  1. EM演算法

1 EM演算法

1.1 簡介

EM演算法的全稱為Expectation Maximization,即期望-最大化演算法。從名字可以看出EM演算法包括兩個步驟,其一是求期望,其二是最大化。重複兩個步驟,迭代直到模型收斂。那麼EM演算法是計算誰的期望,又是最大化誰呢?

在概率模型中,經常會假定數據樣本 x sim p(x|	heta) ,其中 	heta 是模型的參數,也是要求解的目標。給定觀測數據集 X = { x_1, x_2, cdots, x_n} ,我們要做的就是計算數據的對數似然(Log Likelihood):

LL(	heta) = sum_{i=1}^n ln p(x|	heta)

最大化上面的式子,然後即可求解得到目標參數,舉例來說, p(x|	heta) 通常是指數分佈家族,所以求解起來很方便。

然而,在實際情況中,會有很多隱變數,每個觀測樣本 x 對應於一個隱變數 z ,此時有:

p(x|	heta) = sum_z p(x, z|	heta)

上面公式是通過聯合概率分佈的邊際分佈求得觀測數據 x 的分佈,這個過程叫做邊際化(Marginalization),此時進行對數似然最大化得到:

ln p(X|	heta) = sum_{i=1}^n ln left( sum_z p(x_i, z|	heta) 
ight)

可以看到上式對數函數裡面出現了對隱變數 z 的求和項,這就導致了計算變得複雜了,有時是不可行的,因為對隱變數求和可能會導致計算的複雜性變為指數級別。

1.2 雛形

那麼對於帶有隱變數的模型該如何最大似然估計呢?下面提供一種方案。首先,假定隱變數 z 是已知的,那麼聯合概率 p(x, z | 	heta) ,也是已知的,那麼我們此時稱 {X, Z} 為完整數據,所以我們就對完整數據做極大似然估計,有:

ln p(X, Z | 	heta) = sum_{i=1}^n ln p(x_i, z_i | 	heta)

此時,注意對數裡面沒有了求和項,因為我們假定給定 x_i ,隱變數 z_i 的值是已知的,因此就不需要再進行求和消去隱變數了。

但是,實際上我們對隱變數的觀察只取決於隱變數的後驗概率分佈 p(z|x, 	heta) ,這將是EM演算法的一個核心分佈,需要特別加以重視。那麼我們接著上面的思路,由於 Z 是不可知的,但是我們上面對完整數據進行最大似然估計時假設了 Z 是已知的,那麼這不就矛盾了麼?也就意味著我們上面的建議,直接求完整數據 最大似然是不可行的。那麼該如何求呢?

引入近似方法,先建立完整數據的似然 ln p(X, Z | 	heta) ,然後再利用隱變數的後驗概率分佈 p(Z|X,	heta^{old}) 將似然裡面的隱變數積分掉,那麼得到的結果就是:

max_{	heta} sum_Z p(Z|X, 	heta^{old})ln p(X, Z | 	heta)

上面的優化目標是對 ln p(X|	heta) 的一個近似,後面會指出實際上是一個下界,上面的函數也叫 Q(	heta, 	heta^{old}) ,需要注意的是隱變數的後驗概率分佈使用的參數是 	heta^{old} ,是上一輪迭代之後的結果,如果是按照 	heta 來優化,那麼上面的式子又變成不可行的了,因為 p(Z|X,	heta) 會很難求。

所以從 上面 就可以 簡單 看出EM的兩步分別為:

  • Expectation: 計算函數 Q(	heta, 	heta^{old}) = sum_Z p(Z|X, 	heta^{old})ln p(X, Z | 	heta) ,這一步是根據上一輪迭代得到的隱變數的後驗概率分佈來對完整數據的似然進行求期望,因此叫做E步;
  • Maximization: 求解優化目標 	heta^* = max_{	heta} Q(	heta, 	heta^{old}) ,更新 	heta^{old} = 	heta^{*} ,這一步就是最大化Q函數,因此叫做M步。

迭代上面兩步直到收斂即可獲得 max_{	heta} ln p(X|	heta) 的近似解。

1.3 推導

上面從如何解決帶隱變數的極大似然估計著手提出的一種方案,但是沒有理論證明,下面將從兩個角度來說明EM演算法,即EM演算法的兩種推導方式。

第一種推導方法是利用Jensen不等式來推導,先來簡單聊一下什麼是Jensen不等式,簡單說一下就是:在凸函數中,函數值的期望要大於等於期望的函數值

用數學 表述 則是 ,對於凸函數 f(x) ,總有:

E[f(x)] geq f(E[x])

那麼考慮對數似然 ln p(X|	heta)

ln p(X | 	heta) \ = ln left( sum_Z p(X, Z | 	heta) 
ight) \ = ln left( sum_Z p(Z |X, 	heta^{old})frac{p(X, Z | 	heta)}{p(Z |X, 	heta^{old})} 
ight) \ = ln left( E_{Z sim p(Z |X, 	heta^{old})} left[ frac{p(X, Z | 	heta)}{p(Z |X, 	heta^{old})}
ight] 
ight) \ geq E_{Z sim p(Z |X, 	heta^{old})} left[ ln left(  frac{p(X, Z | 	heta)}{p(Z |X, 	heta^{old})}
ight) 
ight]

根據Jensen不等式得到了對數似然的一個下界,所以我們只要最大化這個下界即可,而我們最大化的目標參數是 	heta ,與 	heta^{old} 無關,所以實際上只需要最大化下面的式子:

max_{	heta} E_{Z sim p(Z |X, 	heta^{old})} ln p(X, Z | 	heta) \

很容易得到這就是上面的Q函數,所以EM演算法的一種解釋是 :

  • E步:尋找 ln p(X | 	heta) 的一個下界 Q(	heta, 	heta^{old}) ,這個下界的計算中涉及到了利用隱變數的後驗概率進行求期望的過程,所以叫E步;
  • M步:最大化 Q(	heta, 	heta^{old})

EM的整個迭代示意圖可以利用下面的圖Figure 1來表示,紅色曲線代表的是對數似然,因為函數太複雜,不容易求梯度,所以引入近似下界,第一步迭代引入的下界為藍色曲線,然後尋找這個曲線的最大值;然後第二次迭代引入的下界為綠色曲線。

Figure 1 : EM演算法迭代示例圖

注意到上圖中出現了一個函數 mathcal{L} (q, 	heta) ,這個是接下來要引入的第二種推導的公式裡面的重要函數,稱作Elob函數

第二種推導主要是基於一個叫做Variational Lower Bound的式子,下面先介紹這個Bound的推導過程:

ln p(X|	heta) = ln left( frac{p(X, Z|	heta)}{p(Z|X, 	heta)} 
ight) = ln left( frac{p(X, Z|	heta)}{q(Z)}frac{q(Z)}{p(Z|X, 	heta)} 
ight) \

上式是做了個簡單的處理,第一個等號是根據貝葉斯公式推導的,第二個等號很顯然成立,其中 q(Z) 是我們引入的變分分佈。下面對兩邊分別根據 Zsim q(Z) 求期望得到:

E_{Zsim q(Z)}left[ ln p(X|	heta) 
ight] = E_{Zsim q(Z)}left[ ln frac{p(X, Z|	heta)}{q(Z)}
ight] + E_{Zsim q(Z)}left[ln frac{q(Z)}{p(Z|X, 	heta)} 
ight]

化簡上式 得到 :

 ln p(X|	heta) = E_{Zsim q(Z)}left[ ln frac{p(X, Z|	heta)}{q(Z)}
ight] + E_{Zsim q(Z)}left[ln frac{q(Z)}{p(Z|X, 	heta)} 
ight]

記:

 mathcal{L}(q, 	heta) = E_{Zsim q(Z)}left[ ln frac{p(X, Z|	heta)}{q(Z)}
ight] \ KL(q, p) = E_{Zsim q(Z)}left[ln frac{q(Z)}{p(Z|X, 	heta)} 
ight]

這就得到了著名的Variational Lower Bound,這三項分佈為對數似然,Elob函數和KL-divergence:

ln p(X|	heta) = mathcal{L}(q, 	heta) + KL(q, p)

因為KL-divergence一定大於零,所以Elob函數是對數似然函數的一個下界,並且當 q(Z) = p(Z|X, 	heta) 時,KL-divergence為零,此時對數似然和Elob函數一致,但是為了方便求解,取 q(Z) = p(Z|X, 	heta^{old}) ,此時 KLleft( p(Z|X,	heta^{old}), p(Z|X,	heta) 
ight) geq 0 ,所以最大化Elob函數就是一個近似最大化對數似然:

max_{	heta} mathcal{L}(q, 	heta) = E_{Zsim p(Z|X, 	heta^{old})}left[ ln frac{p(X, Z|	heta)}{p(Z|X, 	heta^{old})}
ight]

上面就是EM演算法的兩種推導方式,其中Variational Lower Bound在變分推斷裡面會再次用到。

1.4 高斯混合模型GMM

下面給出一個例子,高斯混合模型(Gaussian Mixture Model)。在高斯混合模型裡面,假定數據是有K個高斯分佈產生的,每個高斯分佈有自己的均值和方差,記為 {mu_k, Sigma_k} 。對於每一個數據點 x ,先通過一個先驗分佈 pi = { pi_1, pi_2, cdots, pi_K} 來選擇一個隱變數 z ,先驗分佈滿足 pi_k geq 0, sum_{k=1}^K pi_k = 1z 是一個K維的0-1向量,其中只有一個維度的值為1,其餘全為0,代表的是選擇第幾個高斯分量。那麼有:

p(z_k = 1) = pi_k \ p(z) = prod_{k=1}^K pi_k^{z_k}

那麼給定 z ,樣本 x 的條件分佈為:

p(x | z_k = 1) = mathcal{N}(x | mu_k, Sigma_k) \ p(x | z) = prod_{k=1}^K mathcal{N}(x | mu_k, Sigma_k)^{z_k}

那麼邊際分佈 p(x) 為:

p(x) = sum_z p(x|z)p(z) = sum_z left( prod_{k=1}^K left( pi_k mathcal{N}(x | mu_k, Sigma_k) 
ight)^{z_k} 
ight) = sum_{k=1}^K pi_k mathcal{N}(x | mu_k, Sigma_k)

那麼對數似然為:

ln p(X | pi, mu, Sigma) = sum_{n=1}^N lnleft( sum_{k=1}^K pi_k mathcal{N}(x | mu_k, Sigma_k) 
ight)

可以看到上式的似然裡面有一個在對數裡面的求和項,這個是我們不希望的,所以採用EM演算法。首先,考慮完整數據 {X, Z} 的對數似然,這裡假定了 z 是已知的,那麼有:

p(x, z) = p(x|z)p(z) = prod_{k=1}^{K} left( pi_k mathcal{N}(x | mu_k, Sigma_k) 
ight)^{z_{k}}

可以看出上面的聯合概率分佈(完整數據的分佈)是沒有求和項的。所以有:

ln p(X, Z | pi, mu, Sigma) = sum_{n=1}^N sum_{k=1}^K z_{nk}lnleft(  pi_k mathcal{N}(x | mu_k, Sigma_k) 
ight)

那麼根據EM演算法,下面求隱變數的後驗概率分佈,由貝葉斯公式:

p(z|x) propto p(x|z)p(z) = prod_{k=1}^{K} left( pi_k mathcal{N}(x | mu_k, Sigma_k) 
ight)^{z_{k}} \

那麼有:

p(Z|X,mu,Sigma,pi) propto prod_{n=1}^{N} prod_{k=1}^{K} left( pi_k mathcal{N}(x_n | mu_k, Sigma_k) 
ight)^{z_{nk}}

根據上面的後驗概率分佈對完整數據的對數似然求期望就得到了Q函數,完整數據的對數似然裡面只有一個 z_{nk} 需要求期望。記 	heta = { mu, Sigma, pi } ,根據上面的後驗概率以及 p(z|x) ,因為每個數據點對應的 z_n 是獨立的,可以求出:

p(z_{nk} |x_n, 	heta) propto  left(pi_k mathcal{N}(x_n | mu_k, Sigma_k) 
ight)^{z_{nk}}

那麼有:

p(z_{nk} |x_n, 	heta) = frac{ left(pi_k mathcal{N}(x_n | mu_k, Sigma_k) 
ight)^{z_{nk}} } { sum_{z_{nj}} left(pi_j mathcal{N}(x_n | mu_j, Sigma_j) 
ight)^{z_{nj}}  }

z_{nk} 求期望得到:

E_{z sim p(Z|X, 	heta^{old})}left[ z_{nk} 
ight] \ = E_{z_{nk} sim p(z_{nk}|x_n, 	heta^{old})}left[ z_{nk} 
ight] \ = frac{sum_{z_{nk}}  z_{nk} left(pi_k mathcal{N}(x_n | mu_k, Sigma_k) 
ight)^{z_{nk}} }{ sum_{z_{nj}} left(pi_j mathcal{N}(x_n | mu_j, Sigma_j) 
ight)^{z_{nj}} } \ = frac{pi_k mathcal{N}(x_n | mu_k, Sigma_k) }{ sum_{j=1}^K pi_j mathcal{N}(x_n | mu_j, Sigma_j) }

記上式為 gamma(z_{nk})

gamma(z_{nk}) = E_{z sim p(Z|X, 	heta^{old})}left[ z_{nk} 
ight]  =  frac{pi_k mathcal{N}(x_n | mu_k, Sigma_k) }{ sum_{j=1}^K pi_j mathcal{N}(x_n | mu_j, Sigma_j) }

那麼最後得到的Q函數為:

E_{Z sim p(Z|X, 	heta^{old})}left[ ln p(X,Z| mu, Sigma, pi) 
ight] = sum_{n=1}^N sum_{k=1}^K gamma(z_{nk})lnleft(  pi_k mathcal{N}(x | mu_k, Sigma_k) 
ight)

然後最大化上面的式子,對 pi_k, mu_k, Sigma_k 求導即可得到相應的更新,在對 pi_k 最大化時要滿足約束 sum_k pi_k = 1 ,可以利用拉格朗日乘子法。對 Sigma_k 的求導需要用到矩陣行列式和矩陣逆的求導法則:

frac{ partial |X|}{partial X} = |X|X^{-1} \ dX^{-1} = -X^{-1}(dX) X^{-1} \ frac{partial a^TXa}{partial X} = aa^T

矩陣求導法則會經常用到,可以參考維基和知乎:

https://en.wikipedia.org/wiki/Matrix_calculus?

en.wikipedia.org

長軀鬼俠:矩陣求導術(上)?

zhuanlan.zhihu.com
圖標

多元高斯分佈的形式為:

p(x|mu, Sigma) = frac{1}{sqrt{(2pi)^k|Sigma|}}expleft( -frac{1}{2}(x - mu)^TSigma^{-1} (x-mu) 
ight)

下面考慮 pi_k ,第一個推導符號是根據拉格朗日對偶對參數求導為零得到,第二個推導符號是對k進行求和並且 sum_k pi_k = 1 得到,第三個推導即求出了 pi

LL(pi, lambda) = sum_{n=1}^N sum_{k=1}^K gamma(z_{nk}) lnpi_k -lambda(sum_{k=1}^K pi_k -1) \ frac{partial LL(pi, lambda)}{partial pi_k} = sum_{n=1}^N gamma(z_{nk}) frac{1}{pi_k} -lambda = 0 \ Rightarrow sum_{n=1}^N gamma(z_{nk}) =pi_k lambda \ Rightarrow lambda = sum_{n=1}^N sum_{k=1}^K gamma(z_{nk}) \ Rightarrow pi_k = frac{sum_{n=1}^N gamma(z_{nk})}{sum_{n=1}^N sum_{k=1}^K gamma(z_{nk})}

考慮 mu

LL(mu) = sum_{n=1}^N sum_{k=1}^K gamma(z_{nk}) left( -frac{1}{2}(x_n - mu_k)^T Sigma_k^{-1} (x_n - mu_k) 
ight) \ frac{partial LL(mu)}{partial mu_k} =  -sum_{n=1}^N gamma(z_{nk}) Sigma_k^{-1} (x_n - mu_k) = 0 \ Rightarrow mu_k = frac{sum_{n=1}^N gamma(z_{nk}) x_n}{sum_{n=1}^N gamma(z_{nk})}

對於 Sigma

LL(Sigma) = sum_{n=1}^N sum_{k=1}^K gamma(z_{nk}) left( -frac{1}{2}(x_n - mu_k)^T Sigma_k^{-1} (x_n - mu_k) -frac{1}{2}ln{|Sigma|}
ight) \ frac{partial LL(Sigma)}{partial Sigma_k} =  -frac{1}{2}sum_{n=1}^N gamma(z_{nk}) left( Sigma_k^{-1} (x_n - mu_k)(x_n - mu_k)^TSigma_k^{-1} - Sigma_k^{-1}  
ight)= 0 \ Rightarrow Sigma_k = frac{sum_{n=1}^N gamma(z_{nk}) (x_n - mu_k)(x_n - mu_k)^T}{sum_{n=1}^N gamma(z_{nk})}

上面就是GMM的完整推導,總結一下步驟:

  • E步:求 gamma(z_{nk})
  • M步:求 pi, mu, Sigma

參考文獻

1. Pattern Recognition and Machine Learning


推薦閱讀:
相關文章