EM 演算法筆記:有隱變量時,如何交替估計參數
結論先講
EM 演算法處理的是這類問題:
- 我們想用觀測資料估計模型參數。
- 模型裡有一部分關鍵變量沒有被直接觀測到。
- 若知道這些隱變量,參數會比較容易估;若知道參數,又比較容易推斷隱變量。
因此 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。

圖表 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_A與pi_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_iA 和 gamma_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 會退化成 0 或 1,更新式就回到普通的分組最大似然估計。這正好驗證 EM 是在「標籤缺失」時補上概率權重,而不是改變原本的統計目標。
驗證二:兩枚硬幣的第一輪 EM 更新
硬幣例子更適合做數值驗證,因為每一步都算得出來。
假設每一輪連續投 5 次,但我們不知道該輪使用硬幣 A 還是硬幣 B。觀測到的正反面統計如下:
| 輪次 | 正面數 | 反面數 |
|---|---|---|
| 1 | 3 | 2 |
| 2 | 2 | 3 |
| 3 | 1 | 4 |
| 4 | 3 | 2 |
| 5 | 2 | 3 |
目標是估計:
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.2、p_B = 0.7 計算,可得到:
| 輪次 | L_A | L_B | r_A | r_B |
|---|---|---|---|---|
| 1 | 0.00512 | 0.03087 | 0.142 | 0.858 |
| 2 | 0.02048 | 0.01323 | 0.608 | 0.392 |
| 3 | 0.08192 | 0.00567 | 0.935 | 0.065 |
| 4 | 0.00512 | 0.03087 | 0.142 | 0.858 |
| 5 | 0.02048 | 0.01323 | 0.608 | 0.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_A、r_B 這種軟權重。原因很直接:當輪次證據不夠強時,硬切會把不確定性丟掉。
這個例子驗證了什麼
| EM 原理 | 硬幣例子中的對應 |
|---|---|
觀測資料 X | 每輪的正反面統計 |
隱變量 Z | 每輪使用的是 A 或 B |
| E-step | 用目前 p_A、p_B 算輪次來源權重 |
| M-step | 用權重重估兩枚硬幣的正面率 |
這就是 EM 的交替結構。參數先給一個初值,初值產生對隱變量的概率判斷;這個判斷再回頭修正參數。若後續迭代變化很小,就表示目前參數與隱變量分布已經互相一致。
兩個例子的流程圖
下面這張圖把兩個例子的共同結構壓成同一個流程:觀測資料不變,先用目前參數做 E-step 的軟分配,再用權重做 M-step 更新參數,接著重複。
公式推導:Jensen Inequality 與 ELBO
前面兩個例子都在做同一件事:觀測資料固定,隱變量分布和模型參數交替更新。下面把這件事寫成公式。

圖表 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 的邏輯可以重新寫成:
- E-step:用目前參數選 posterior,讓 ELBO 在目前點貼住 log likelihood。
- M-step:固定這個下界,更新參數去提高 ELBO。
- 重複 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、參數與分配結果沒有跑歪? |
接著才進入實作:
- 先挑一組可解釋的初值,必要時跑多組初始化。
- E-step 用目前
theta計算Z的 posterior 或期望權重。 - M-step 固定這些權重,更新
theta。 - 每輪記錄觀測資料 log likelihood、參數變化與停止條件。
- 收斂後檢查結果是否符合領域常識,而不是只看數值停止變動。
以本文兩個例子對照:
- 身高混合資料:先問「每筆身高屬於哪一群」這個標籤是不是缺失但重要;若是,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 Model | hidden state sequence;Baum-Welch 是相關訓練方法 |
| Topic Modeling | topic assignment 或相關潛在結構 |
| Missing Data Estimation | 未觀測或缺失的資料部分 |
| Variational Inference | 用更一般的變分分布處理難求 posterior 的情況 |
它們的共同點不是名字相同,而是都面對「完整資料好處理,不完整資料難直接最佳化」的結構。
和 K-means 的差別
若只看流程,K-means 和 EM 都像是「先分配、再更新」。
差別是:
- K-means 對群別做硬分配。
- GMM 的 EM 對群別保留機率權重。
因此如果群之間的邊界模糊,EM 的概率表達通常更貼近問題;代價是模型假設更強,計算也更重。
讀公式時先抓骨架
第一次讀 EM 推導,我會先檢查自己能不能回答這四句:
X、Z、theta分別是什麼?- Complete data
(X, Z)會讓哪一步變簡單? - E-step 估的是哪個 posterior 或期望?
- 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 與推導細節。