EM算法

Expectation Maximization (EM) 是一種以迭代的方式來解決一類特殊最大似然 (Maximum Likelihood) 問題的方法,這類問題通常是無法直接求得最優解,但是如果引入隱含變量,在已知隱含變量的值的情況下,就可以轉化爲簡單的情況,直接求得最大似然解。

我們會看到,上一次說到的 Gaussian Mixture Model 的迭代求解方法可以算是 EM 算法最典型的應用,而最開始說的 K-means 其實也可以看作是 Gaussian Mixture Model 的一個變種(固定所有的 \Sigma_k = \epsilon\mathbf{I} ,並令 \epsilon \rightarrow 0 即可)。然而 EM 實際上是一種通用的算法(或者說是框架),可以用來解決很多類似的問題,我們最後將以一箇中文分詞的例子來說明這一點。

爲了避免問題變得太抽象,我們還是先從上一次的 Gaussian Mixture Model 說起吧。回顧一下我們之前要解決的問題:求以下 Log-likelihood function 的最大值:


但是由於在 \log 函數裏面又有加和,沒法直接求。考慮一下 GMM 生成 sample 的過程:先選一個 Component ,然後再從這個 Component 所對應的那個普通的 Gaussian Distribution 裏進行 sample 。我們可以很自然地引入一個隱含變量 z ,這是一個 K 維向量,如果第 k 個 Component 被選中了,那麼我們講其第 k 個元素置爲 1 ,其餘的全爲 0 。那麼,再來看看,如果除了之前的 sample x_i 的值之外,我們同時還知道了每個 x_i 所對應的隱含變量 z_i 的值,情況又會變成怎麼樣呢?

因爲我們同時觀察到了 xz ,所以我們現在要最大化的似然函數也變爲 \prod_{i=1}^N p(x_i, z_i) 。注意到 p(x, z) 可以表示爲:


z 的概率,當 z 的第 k 個元素爲 1 的時候,亦即第 k 個 Component 被選中的時候,這個概率爲 \pi_k ,統一地寫出來就是:


帶入上面個式子,我們得到 p(x, z) 的概率是一個大的乘積式(對比之前 p(x) 是一個和式)。再替換到最開始的那個 Log-likelihood function 中,得到新的同時關於 sample x 和隱含變量 z 的 Log-likelihood:


情況瞬間逆轉,現在 \log 和求和符號換了個位置,直接作用在普通的高斯分佈上了,一下子就變成了可以直接求解的問題。不過,事情之所以能發展得如此順利,完全依賴於一個我們僞造的假設:隱含變量的值已知。然而實際上我們並不知道這個值。問題的結症在這裏了,如果我們有了這個值,所有的問題都迎刃而解了。回想一下,在類似的地方,我們是如何處理這樣的情況的呢?一個很類似的地方就是(比如,在數據挖掘中)處理缺失數據的情況,一般有幾種辦法:

  • 用取值範圍類的隨機值代替。
  • 用平均值代替。
  • 填 0 或者其他特殊值。

這裏我們採取一種類似於平均值的辦法:取期望。因爲這裏我們至少有 sample x 的值,因此我們可以把這個信息利用起來,針對後驗概率 p(z|x) 來取期望。前面說過,z 的每一個元素只有 0 和 1 兩種取值,因此按照期望的公式寫出來就是:


中間用貝葉斯定理變了一下形,最後得到的式子正是我們在漫談 GMM 中定義的 \gamma(i, k) 。因此,對於上面那個可以直接求解的 Log-likelihood function 中的 z_{ik} ,我們只要用其期望 \mathbb{E}(z_ik) 亦即 \gamma(i, k) 代替即可。

到這裏爲止,看起來是一個非常完美的方法,不過仔細一看,發現還有一個漏洞:之前的 Log-likelihood function 可以直接求最大值是建立在 z_{ik} 是已知情況下,現在雖然我們用 \gamma(i, k) 來代替了 z_{ik},但是實際上 \gamma(i, k) 是一個反過來以非常複雜的關係依賴所要求參數的一個式子,而不是一個“已知的數值”。解決這個問題的辦法就是迭代。

到此爲止,我們就勾勒出了整個 EM 算法的結構,同時也把上一次所講的求解 GMM 的方法又推導了一遍。EM 名字也來源於此:

  • Expectation 一步對應於求關於後驗概率的期望亦即 \gamma(i, k)
  • Maximization 一步則對應於接下來的正常的最大似然的方法估計相關的參數亦即 \pi_k\mu_k\Sigma_k

如果你還沒有厭煩這些公式的話,讓我們不妨再稍微花一點時間,從偏理論一點的角度來簡略地證明一下 EM 這個迭代的過程每一步都會對結果有所改進,除非已經達到了一個(至少是局部的)最優解。

現在我們的討論將不侷限於 GMM ,並使用一些稍微緊湊一點的符號。用 \mathbf{X} 表示所有的 sample ,同時用 \mathbf{Z} 表示所有對應的隱含變量。我們的問題是要通過最大似然的方法估計出 p(\mathbf{X}|\theta) 中的參數 \theta 。在這裏我們假設這個問題很困難,但是要優化 p(\mathbf{X}, \mathbf{Z}|\theta) 卻很容易。這就是 EM 算法能夠解決的那一類問題。

現在我們引入一個關於隱含變量的分佈 q(\mathbf{Z})。注意到對於任意的 q(\mathbf{Z}) ,我們都可以對 Log-likelihood Function 作如下分解:


其中 \text{KL}(q\|p) 是分佈 q(\mathbf{Z})p(\mathbf{Z}|\mathbf{X}, \theta) 之間的 Kullback-Leibler divergence 。由於 Kullback-Leibler divergence 是非負的,並且只有當兩個分佈完全相同的時候纔會取到 0 。因此我們可以得到關係 \mathcal{L}(q, \theta) \leqslant \log p(\mathbf{X}|\theta) ,亦即 \mathcal{L}(q, \theta)\log p(\mathbf{X}|\theta) 的一個下界。

現在考慮 EM 的迭代過程,記上一次迭代得出的參數爲 \theta^{\text{old}},現在我們要選取 q(\mathbf{Z}) 以令 \mathcal{L}(q, \theta^{\text{old}}) 最大,由於 \log p(\mathbf{X}|\theta^{\text{old}}) 並不依賴於 q(\mathbf{Z}) ,因此 \mathcal{L}(q, \theta^{\text{old}}) 的上限(在 \theta^{\text{old}} 固定的時候)是一個定值,它取到這個最大值的條件就是 Kullback-Leibler divergence 爲零,亦即 q(\mathbf{Z}) 等於後驗概率 p(\mathbf{Z}|\mathbf{X}, \theta^{\text{old}}) 。把它帶入到 \mathcal{L}(q, \theta^{\text{old}}) 的表達式中可以得到


其中 const 是常量,而 \mathcal{Q}(\theta, \theta^{\text{old}}) 則正是我們之前所得到的“同時包含了 sample 和隱含變量的 Log-likelihood function 關於後驗概率的期望”,因此這個對應到 EM 中的“E”一步。

在接下來的“M”一步中,我們講固定住分佈 q(\mathbf{Z}) ,再選取合適的 \theta 以將 \mathcal{L}(q, \theta) 最大化,這次其上界 \log p(\mathbf{X}|\theta) 也依賴於變量 \theta ,並會隨着 \mathcal{L}(q, \theta) 的增大而增大(因爲我們有前面的不等式成立)。一般情況下 \log p(\mathbf{X}|\theta) 增大的量會比 \mathcal{L}(q, \theta) 要多一些,這時候 Kullback-Leibler divergence 在新的參數 \theta 下又不爲零了,因此我們可以進入下一輪迭代,重新回到“E”一步去求新的 q(\mathbf{Z}) ;另一方面,如果這裏 Kullback-Leibler divergence 在新的參數下還是等於 0 ,那麼說明我們已經達到了一個(至少是局部的)最優解,迭代過程可以結束了。

上面的推導中我們可以看到每一次迭代 E 和 M 兩個步驟都是在對解進行改進,因此迭代的過程中得到的 likelihood 會逐漸逼近(至少是局部的)最優值。另外,在 M 一步中除了用最大似然之外,也可以引入先驗使用 Maximum a Posteriori (MAP) 的方法來做。還有一些很困難的問題,甚至在迭代的過程中 M 一步也不能直接求出最大值,這裏我們通過把要求放寬──並不一定要求出最大值,只要能夠得到比舊的值更好的結果即可,這樣的做法通常稱作 Generalized EM (GEM)。

當然,一開始我們就說了,EM 是一個通用的算法,並不只是用來求解 GMM 。下面我們就來舉一個用 EM 來做中文分詞的例子。這個例子來源於論文 Self-supervised Chinese Word Segmentation 。我在上次 MSTC 搜索引擎系列小課堂講文本處理的時候提到過。這裏爲了把注意力集中到 EM 上,我略去一些細節的東西,簡單地描述一下基本的模型。

現在我們有一個字符序列 C = c_1c_2\cdots c_T,並希望得到一個模型 \mathcal{M}(依賴於參數 \theta)能用來將其詞的序列 S = s_1s_2\cdots s_M 。按照生成模型的方式來考慮,將 C 看成是由 \mathcal{M} 生成的序列的話,我們自然希望找到那個生成 C 的可能性最大的 \mathcal{M} ,亦即通過最大似然的方式來估計參數 \theta

然而我們不知道似然函數 \log p(C|\theta) 應該如何去優化,因此我們引入 latent variable S ,如果我們知道 S 的話,似然值很容易求得:


其中 p(s_i) 的值是從模型 \mathcal{M} 中已知的。但是現在我們不知道 S 的值,因此我們轉而取其關於後驗概率的期望:


然後將這個期望針對 \theta 最大化即完成了 EM 的一次迭代。具體的做法通常是先把一個初始文本(比如所有的 C 的集合)按照 N-gram 分割(N-gram 在 講 K-medoids 的那篇文章中介紹過)爲 \{w_i\}_N,形成一個最初的辭典,而模型 \mathcal{M} 的參數 \theta 實際上就描述了各個 N-gram 的概率 p(w_i) ,初始值可以直接取爲頻率值。有了辭典之後對於任意的 C ,我們可以根據辭典枚舉出所有可能的分割 S ,而每個分割的後驗概率 p(S|C, \theta) 就是其中的單詞的概率乘積。其他的就是標準的 EM 算法的迭代步驟了。

實際上在實際產品中我們會使用一些帶了更多啓發式規則的分詞方法(比如 MMSEG),而這個方法更大的用處在於從一堆文本中“學習”出一個詞典來(也就是 \mathcal{M} ),並且這個過程是全自動的,主要有兩個優點:

  1. 不需要人蔘與手工分詞、標記等。
  2. 能自動從文本中學習,換句話說,你給它一些某個領域的專業文章,它能從中學習到這個領域的專業詞彙來。

不管怎樣,以上兩點看起來都非常誘人。不過理論離實際往往還是有不少差距的。我不知道實際分詞系統中有沒有在用這樣的方法來做訓練的。之前我曾經用 Wikipedia (繁體中文)上抓下來的一些數據跑過一下小規模的試驗,結果還可以,但是也並不如想像中的完美。因爲當時也並沒有弄明白 EM 是怎麼一回事,加上這個過程本身計算負荷還是非常大的,也就沒有深入下去。也許以後有時間可以再嘗試一下。

總之,EM 是一種應用廣泛的算法,雖然講了點理論也講了例子,但是一沒有貼代碼二沒有貼圖片,似乎實在是不像我的作風,不過精力和篇幅有限,也只能到此爲止了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章