Last updated on

EM 演算法筆記:有隱變量時,如何交替估計參數


結論先講

EM 演算法處理的是這類問題:

  1. 我們想用觀測資料估計模型參數。
  2. 模型裡有一部分關鍵變量沒有被直接觀測到。
  3. 若知道這些隱變量,參數會比較容易估;若知道參數,又比較容易推斷隱變量。

因此 EM 不試圖一次解完,而是交替做兩件事:

  • E-step:固定目前參數,估計隱變量的條件分布。
  • M-step:固定這份估計,更新模型參數。

這篇筆記先用兩個例子抓住 EM 的工作邏輯,再補 Jensen Inequality 與 ELBO 推導。若直覺沒有先釐清,推導通常只會變成符號搬運。

先定義問題

先把符號壓到最少:

  • Observed Data:X = {x_i}_{i=1}^N,也就是我們真正量到或看到的資料。
  • Latent Variable:Z,模型內部看不到,但會影響資料生成的變量。
  • Complete Data:(X, Z),如果觀測資料和隱變量都知道,估計問題通常會簡單很多。
  • Parameters:theta,模型要學習的參數。

隱變量的例子不只一種:

  • Gaussian Mixture Model 裡,每筆資料屬於哪個 mixture component。
  • Hidden Markov Model 裡,每個時間點的 hidden state。
  • Topic Model 裡,詞或文件對應的 topic assignment。

EM 期望最大化整理圖,包含基本符號、MLE、E-step、M-step 與典型應用

圖表 2:EM 的總覽整理。先用符號與 posterior 抓住問題結構,再把 E-step 與 M-step 對回更新流程。

如果資料完整,最大似然估計要做的事很直接:

找一組 theta,讓目前看到的資料 X 最可能出現。

寫成 MLE 目標就是:

theta_hat_MLE
= argmax_theta log P(X | theta)

例如一批資料已知來自同一個常態分布,我們可以直接估計它的平均值與變異程度。困難不在最大似然本身,而在資料缺了一個會影響估計的欄位。

隱變量為什麼造成困難

假設資料其實來自兩個成分 A 和 B,但資料表沒有保留每筆樣本的來源。這個來源標籤就是 Z

此時會出現一個依賴循環:

  • 已知 Z,估 theta 會簡單很多。
  • 已知 theta,推斷 Z 也會簡單很多。

EM 的價值就在這裡。它把「互相依賴」改成「交替更新」。

posterior 是這個交替更新的核心:

P(Z | X, theta)
= P(X, Z | theta) / P(X | theta)

分子是 joint probability;分母是 evidence。E-step 做的事,就是在目前參數下取得這個 posterior。

EM 的流程

先把流程寫成可執行的版本:

初始化 theta
重複:
  E-step:用目前 theta 推斷 Z 的條件分布
  M-step:用這個分布形成期望目標,更新 theta
直到參數或目標值變化夠小

這裡有一個要點:E-step 通常不是把缺失標籤硬補成單一答案,而是保留不確定性。

若目前模型判斷某筆資料:

  • 來自 A 的機率是 0.8
  • 來自 B 的機率是 0.2

那麼更新 A 時,這筆資料以 0.8 的權重參與;更新 B 時,它以 0.2 的權重參與。這就是軟分配。

驗證一:身高資料混在一起時怎麼做

先把原教學裡的身高例子寫成可解的模型。

假設我們只量到一批身高 x1, x2, ..., xN,但不知道每筆資料來自群體 A 還是群體 B。為了方便討論,先假設兩群身高都可由常態分布描述:

  • A 的參數:平均值 mu_A、變異數 sigma_A^2
  • B 的參數:平均值 mu_B、變異數 sigma_B^2
  • 混合比例:pi_Api_B

此時隱變量 zi 代表第 i 筆身高屬於哪個群體。若 zi 已知,問題就退化成兩組資料各自做最大似然估計;但現在 zi 不知道,所以先做 EM。

第一步:初始化參數

先給一組初值:

theta_0 = {
  pi_A, mu_A, sigma_A^2,
  pi_B, mu_B, sigma_B^2
}

初值可以來自粗略分群、領域先驗或隨機初始化。它不必一次正確,但不能完全失真,因為 EM 會受初值影響。

第二步:E-step 算責任權重

對每一筆身高 xi,計算它屬於 A 的 posterior probability:

gamma_iA =
  pi_A * Normal(xi | mu_A, sigma_A^2)
  -------------------------------------------------
  pi_A * Normal(xi | mu_A, sigma_A^2)
  + pi_B * Normal(xi | mu_B, sigma_B^2)

同理:

gamma_iB = 1 - gamma_iA

這裡的 gamma_iAgamma_iB 就是 E-step 的輸出。若某個身高落在兩群分布重疊處,它不應被過早硬切,而應對兩群都保留權重。

第三步:M-step 用權重更新參數

先把 A 的有效樣本數寫成:

N_A = sum(gamma_iA)

那麼 A 的平均值更新就是加權平均:

mu_A = sum(gamma_iA * xi) / N_A

變異數與混合比例也同樣用權重更新:

sigma_A^2 = sum(gamma_iA * (xi - mu_A)^2) / N_A
pi_A = N_A / N

B 也做同樣更新。更新後得到新的 theta_1,再回到 E-step。

這個例子驗證了什麼

這個例子把 EM 的原理對得很清楚:

EM 原理身高例子中的對應
觀測資料 X身高數值
隱變量 Z每筆身高屬於 A 或 B
E-step算每筆身高屬於兩群的概率權重
M-step用權重更新平均值、變異數與混合比例

而且它有一個很好的 sanity check:如果每筆資料的群別原本就已知,gamma 會退化成 01,更新式就回到普通的分組最大似然估計。這正好驗證 EM 是在「標籤缺失」時補上概率權重,而不是改變原本的統計目標。

驗證二:兩枚硬幣的第一輪 EM 更新

硬幣例子更適合做數值驗證,因為每一步都算得出來。

假設每一輪連續投 5 次,但我們不知道該輪使用硬幣 A 還是硬幣 B。觀測到的正反面統計如下:

輪次正面數反面數
132
223
314
432
523

目標是估計:

  • p_A:硬幣 A 出現正面的機率
  • p_B:硬幣 B 出現正面的機率

隱變量是「每一輪到底用了 A 還是 B」。

第一步:初始化

先取一組初值:

p_A = 0.2
p_B = 0.7

並先假設 A、B 被選中的 prior 相同。

第二步:E-step 算每輪來自 A 的權重

若某一輪有 h 次正面、t 次反面,先算在兩枚硬幣下出現這組結果的 likelihood:

L_A = p_A^h * (1 - p_A)^t
L_B = p_B^h * (1 - p_B)^t

再把它轉成 A 的責任權重:

r_A = L_A / (L_A + L_B)

用初值 p_A = 0.2p_B = 0.7 計算,可得到:

輪次L_AL_Br_Ar_B
10.005120.030870.1420.858
20.020480.013230.6080.392
30.081920.005670.9350.065
40.005120.030870.1420.858
50.020480.013230.6080.392

這張表就是 E-step 的輸出。第 3 輪只有 1 次正面,較像正面率較低的 A;第 1 與第 4 輪有 3 次正面,較像正面率較高的 B。

第三步:M-step 更新正面率

更新 p_A 時,每輪正面數用 r_A 加權,每輪投擲次數也用 r_A 加權:

p_A_new =
  sum(r_A * 該輪正面數)
  --------------------
  sum(r_A * 該輪投擲數)

代入上表:

sum(r_A) = 2.435
A 的加權正面數 = 4.219
A 的加權總投擲數 = 5 * 2.435 = 12.174
p_A_new = 4.219 / 12.174 = 0.347

同理:

sum(r_B) = 2.565
B 的加權正面數 = 6.781
B 的加權總投擲數 = 5 * 2.565 = 12.826
p_B_new = 6.781 / 12.826 = 0.529

所以做完一輪標準軟分配 EM 後,參數從:

(p_A, p_B) = (0.2, 0.7)

更新成近似:

(p_A, p_B) = (0.347, 0.529)

硬分配直覺版與標準 EM 的差別

有些入門教學會在 E-step 後直接把每一輪指定給 likelihood 較大的硬幣,再重新估計兩枚硬幣的正面率。以上表為例,這會把第 2、3、5 輪分給 A,把第 1、4 輪分給 B,得到一組很直觀的更新值。

這種寫法適合講「先推來源,再估參數」的直覺;但標準 EM 更常保留 r_Ar_B 這種軟權重。原因很直接:當輪次證據不夠強時,硬切會把不確定性丟掉。

這個例子驗證了什麼

EM 原理硬幣例子中的對應
觀測資料 X每輪的正反面統計
隱變量 Z每輪使用的是 A 或 B
E-step用目前 p_Ap_B 算輪次來源權重
M-step用權重重估兩枚硬幣的正面率

這就是 EM 的交替結構。參數先給一個初值,初值產生對隱變量的概率判斷;這個判斷再回頭修正參數。若後續迭代變化很小,就表示目前參數與隱變量分布已經互相一致。

兩個例子的流程圖

下面這張圖把兩個例子的共同結構壓成同一個流程:觀測資料不變,先用目前參數做 E-step 的軟分配,再用權重做 M-step 更新參數,接著重複。

公式推導:Jensen Inequality 與 ELBO

前面兩個例子都在做同一件事:觀測資料固定,隱變量分布和模型參數交替更新。下面把這件事寫成公式。

EM 公式推導整理圖,從 Jensen Inequality 建立 ELBO 並連到 E-step 與 M-step

圖表 1:Jensen Inequality 與 ELBO 推導總覽。這張圖對應下面的公式步驟,可先看全貌再逐段核對。

一、含隱變量時要最大化什麼

假設:

  • 觀測資料是 x
  • 隱變量是 z
  • 模型參數是 theta

我們原本想最大化觀測資料 likelihood:

P(x | theta)

實際最佳化時通常取 log:

log P(x | theta)

但有隱變量時,觀測資料 likelihood 需要把 z 消去:

P(x | theta) = integral_z P(x, z | theta) dz

因此:

log P(x | theta)
= log integral_z P(x, z | theta) dz

困難點就在這裡:log 包住了對隱變量的積分或加總,直接最佳化通常不方便。

二、人為引入一個分布 q(z)

z 引入一個分布 q(z)

log P(x | theta)
= log integral_z [P(x, z | theta) / q(z)] q(z) dz

這一步沒有改變原式,只是把積分改寫成對 q(z) 的期望形式。

三、改寫成期望

依期望定義:

E_q[f(z)] = integral_z f(z) q(z) dz

所以:

log P(x | theta)
= log E_q [ P(x, z | theta) / q(z) ]

到這一步,下一個關鍵就是把 log 從期望外面移進去。

四、用 Jensen Inequality 建立下界

log 是 concave function。對凹函數,Jensen Inequality 給出:

f(E[Y]) >= E[f(Y)]

把:

Y = P(x, z | theta) / q(z)

代入,就得到:

log E_q [ P(x, z | theta) / q(z) ]
>= E_q [ log (P(x, z | theta) / q(z)) ]

因此:

log P(x | theta)
>= E_q [ log P(x, z | theta) - log q(z) ]

右側就是一個對 log P(x | theta) 的 lower bound,通常稱為 ELBO:

ELBO(q, theta)
= E_q [ log P(x, z | theta) - log q(z) ]

也可以把它看成:

ELBO
= expected complete-data log-likelihood
  + entropy of q(z)

五、Jensen 等號何時成立

若要讓 Jensen 的下界貼住原本的 log likelihood,等號條件要求:

P(x, z | theta) / q(z) = c

也就是這個比值對 z 是常數。整理得:

q(z) = P(x, z | theta) / c

對兩側對 z 積分:

integral_z q(z) dz
= (1 / c) integral_z P(x, z | theta) dz

因為 q(z) 是分布:

integral_z q(z) dz = 1

而:

integral_z P(x, z | theta) dz = P(x | theta)

所以:

c = P(x | theta)

代回去:

q(z)
= P(x, z | theta) / P(x | theta)
= P(z | x, theta)

這就是 E-step 為什麼要選 posterior:

q(z) = P(z | x, theta_current)

六、E-step 和 M-step 對應到什麼

在第 t 次迭代,先固定目前參數:

theta^(t)

E-step 設:

q^(t)(z) = P(z | x, theta^(t))

這會讓 ELBO 在目前參數位置貼住 log P(x | theta^(t))

接著 M-step 固定這個 q^(t)(z),更新參數:

theta^(t+1)
= argmax_theta ELBO(q^(t), theta)

由於 q^(t) 固定後,-E_q[log q(z)] 不依賴 theta,因此 M-step 常寫成:

theta^(t+1)
= argmax_theta E_q^(t) [ log P(x, z | theta) ]

這就是前面例子裡的「用目前權重重新估參數」。

七、ELBO、posterior 與 KL divergence

同一件事也可以用 KL divergence 的分解來看:

log P(x | theta)
= ELBO(q, theta)
  + KL(q(z) || P(z | x, theta))

其中:

KL(q || p) >= 0

所以:

ELBO(q, theta) <= log P(x | theta)

這個分解把 posterior 的角色說得很清楚:

  • q(z) 還沒貼近 posterior,KL term 會保留一段 gap。
  • q(z) = P(z | x, theta),KL term 變成 0,ELBO 就貼住 evidence 的 log likelihood。

因此 E-step 不只是「猜 hidden variable」。它在目前參數下把 q(z) 設成 posterior,讓下界緊貼原目標。

八、Jensen 的幾何直覺

對 concave function:

f(t x + (1 - t) y)
>= t f(x) + (1 - t) f(y)

其中:

t in [0, 1]

幾何上,凹函數曲線上的點會高於兩點連線。對 log 來說,這個性質讓:

log E[Y] >= E[log Y]

因此我們能從難直接最佳化的 log likelihood,得到一個較容易處理的 lower bound。

九、這個推導回到 EM 直覺

EM 的邏輯可以重新寫成:

  1. E-step:用目前參數選 posterior,讓 ELBO 在目前點貼住 log likelihood。
  2. M-step:固定這個下界,更新參數去提高 ELBO。
  3. 重複 E/M,讓模型參數與隱變量分布逐步一致。

因此 EM 的關鍵不是「隨便猜一個下界」,而是每一輪都先把下界校準到目前參數,再沿著這個下界往上更新。

十、一句話總結

EM 利用 Jensen Inequality,把難直接最佳化的:

log P(x | theta)

轉成可交替處理的 ELBO,並透過 E-step 與 M-step 反覆更新:

  • E-step 對準隱變量 posterior。
  • M-step 更新模型參數。

這就是它在含隱變量模型中能穩定推進 likelihood 的原因。

什麼時候適合用 EM

EM 比較適合這種條件:

  • 模型裡有明確的隱變量或缺失資料結構。
  • 若資料完整,參數更新相對容易。
  • 直接最大化觀測資料 likelihood 很麻煩,但條件期望可處理。

典型例子包括混合模型、部分隱狀態模型,以及某些缺失資料問題。

怎麼把 EM 用到自己的問題

把 EM 從教材搬到實務時,不要先背 E-step、M-step 的公式。先把問題寫成下面五格:

要先定義的項目要回答的問題
觀測資料 X我真正量到的是什麼?
隱變量 Z哪個關鍵欄位沒看到,但若知道它會讓估計變簡單?
參數 theta我要估的是機率、平均值、變異數、轉移率,還是其他模型參數?
Complete-data likelihood如果 Z 已知,`P(X, Z
驗證方式我怎麼確認 likelihood、參數與分配結果沒有跑歪?

接著才進入實作:

  1. 先挑一組可解釋的初值,必要時跑多組初始化。
  2. E-step 用目前 theta 計算 Z 的 posterior 或期望權重。
  3. M-step 固定這些權重,更新 theta
  4. 每輪記錄觀測資料 log likelihood、參數變化與停止條件。
  5. 收斂後檢查結果是否符合領域常識,而不是只看數值停止變動。

以本文兩個例子對照:

  • 身高混合資料:先問「每筆身高屬於哪一群」這個標籤是不是缺失但重要;若是,E-step 算群別權重,M-step 更新兩群常態分布參數。
  • 兩枚硬幣:先問「每輪用了哪一枚硬幣」是不是缺失但重要;若是,E-step 算輪次來源權重,M-step 更新兩枚硬幣的正面率。

這樣做的好處是:你不是為了使用 EM 而硬套 EM,而是先確認問題本身真的有「完整資料好估、不完整資料難估」的結構。

單調改善與收斂界線

標準 EM 的重要性質是每輪更新不會讓觀測資料 likelihood 下降:

log P(X | theta^(t+1))
>= log P(X | theta^(t))

這也是它常被視為穩定的原因。但「單調改善」不等於「保證找到全域最佳解」。

實務上至少要注意三件事:

  • 初始化會影響結果。
  • 模型假設錯了,收斂也不代表解有解釋力。
  • 資料訊號弱或成分高度重疊時,軟分配可能不穩。

所以實作時不要只看「演算法收斂了」。還要檢查 likelihood 走勢、參數是否合理,以及多組初始化下結果是否一致。

典型應用

EM 的典型使用場景可以先記這幾類:

問題EM 中的隱變量角色
Gaussian Mixture Model每筆資料所屬 mixture component
Hidden Markov Modelhidden state sequence;Baum-Welch 是相關訓練方法
Topic Modelingtopic assignment 或相關潛在結構
Missing Data Estimation未觀測或缺失的資料部分
Variational Inference用更一般的變分分布處理難求 posterior 的情況

它們的共同點不是名字相同,而是都面對「完整資料好處理,不完整資料難直接最佳化」的結構。

和 K-means 的差別

若只看流程,K-means 和 EM 都像是「先分配、再更新」。

差別是:

  • K-means 對群別做硬分配。
  • GMM 的 EM 對群別保留機率權重。

因此如果群之間的邊界模糊,EM 的概率表達通常更貼近問題;代價是模型假設更強,計算也更重。

讀公式時先抓骨架

第一次讀 EM 推導,我會先檢查自己能不能回答這四句:

  1. XZtheta 分別是什麼?
  2. Complete data (X, Z) 會讓哪一步變簡單?
  3. E-step 估的是哪個 posterior 或期望?
  4. M-step 最大化的是哪個目標?

這三句答不出來,先不要急著往 Jensen 不等式和 Q function 後面推。符號再多也只是把問題藏起來。

參考與延伸閱讀

  • July 的文章《如何通俗理解 EM 算法》提供了從最大似然、隱變量到 EM 推導的長篇中文導讀。
  • Chuong B. Do 與 Serafim Batzoglou 的短文 What is the expectation maximization algorithm? 用投幣實驗介紹 EM 的不完整資料觀點。
  • Stanford CS229 的 EM 講義可用來補 Gaussian Mixture Model 與推導細節。