L5.1 當那個要加總的量算不出來,可以退到哪裡?
本篇重用M5.0保險為什麼存在:Convex Function 與 Jensen 不等式·M5.1用錯的機率表下注一年會多輸多少:KL Divergence 與 Cross-Entropy·M1.3快篩陽性:Bayes 與 Posterior
起點:一個多出來的變數
要怎麼替「這個模型有多符合資料」打一個分數? 給了一個乾淨的分數:把模型給實際資料的機率取對數。那一篇悄悄用掉一個前提—— 要算得出來。
很多有用的模型都不滿足它,而且理由都一樣:模型裡有一個你沒看到的變數。
- 一堆點看起來分成幾群,但每個點屬於哪一群沒有寫在資料上。
- 一張圖片背後有一組「內容編碼」,但資料只有像素。
- 一段語音背後有一串音素狀態,但錄音只有波形。
把那個看不到的變數叫 。模型是 ——聯合機率通常很好寫,因為它就是「先抽一個 ,再依 生出 」這個故事。但你要的分數需要的是 的邊際機率:
這個積分幾乎總是沒有封閉解。 兩個群集的時候它只是兩項相加,還好;但 是一串 個離散狀態時是 項, 是一個 維的連續向量時是一個 維積分。而每一步梯度下降都要算一次。
一個要對所有可能的隱藏狀態加總的量算不出來,
但我們其實只需要它變大——
有沒有一個算得出來、而且保證不會高估它的替身?
課堂提問Q1
造一個 的下界。有兩條路:一條用 Jensen 不等式,三行就到;另一條繞得遠一點,但會順便算出那個下界差了多少。兩條走一次,然後說明為什麼第二條才是這一篇真正的主角。
先想一想,再展開看整理後的答案
第一條路(Jensen)。 引進任何一個 上的分布 ,只要它在 有質量的地方都有質量:
最後一步是 Jensen(保險為什麼存在:Convex Function 與 Jensen 不等式): 是凹的,所以 。右邊那個量就是 ELBO(evidence lower bound):
它算得出來——裡面只有聯合機率(好寫)和 (你自己選的),沒有積分不掉的東西。三行結束。
但這條路只告訴你「」,沒告訴你差多少。 而「差多少」正是你最需要知道的:如果差距是 ,最大化 ELBO 就幾乎等於最大化 log-likelihood;如果差距是 而且會隨 亂跑,那最大化 ELBO 可能把你帶到完全錯的地方。
第二條路(直接算差)。 不用不等式,寫一個恆等式。注意 ,代進 ELBO:
也就是
這是一個等式,不是不等式。 它比第一條路多給了三件事:
- 下界成立的理由變成 ,Jensen 只是這件事的一個影子。
- 鬆緊有了名字:ELBO 差 log-likelihood 多少,完全等於你選的 離真後驗 多遠。
- 緊的條件是可判斷的: 時等號成立,此時 ELBO 精確等於 log-likelihood。
第三點會在第三節直接變成一個演算法。
那個差真的就是 KL
先把等式當成一個可以驗的宣稱。
設定:兩個成分的一維 Gaussian 混合,、、、。這個模型小到 可以精確算出來(兩項相加),所以 ELBO 的每一分鬆緊都看得見。
取 。真後驗是 ,而 。讓 是一個 的伯努利,掃 :
r = 0.0500 ELBO = -2.9758 gap = 1.4067 KL(q‖p(z|x)) = 1.4067
r = 0.2000 ELBO = -2.4530 gap = 0.8840 KL = 0.8840
r = 0.5000 ELBO = -1.8186 gap = 0.2495 KL = 0.2495
r = 0.8134 ELBO = -1.5691 gap = 0.0000 KL = 0.0000 ← q = 真後驗
r = 0.8000 ELBO = -1.5697 gap = 0.0006 KL = 0.0006
r = 0.9500 ELBO = -1.6507 gap = 0.0816 KL = 0.0816
換三個不同的 、兩個不同的 ,逐位仍然吻合:
x = -2.0 r = 0.3 gap = 0.830826 KL = 0.830826
x = -2.0 r = 0.6 gap = 2.201990 KL = 2.201990
x = 0.0 r = 0.3 gap = 0.132907 KL = 0.132907
x = 0.0 r = 0.6 gap = 0.004070 KL = 0.004070
x = +2.0 r = 0.3 gap = 3.050125 KL = 3.050125
x = +2.0 r = 0.6 gap = 1.421288 KL = 1.421288
下界的鬆緊不是一個模糊的「近似誤差」,它有一個名字:你猜的後驗離真後驗的 KL。
第一張表裡有一列特別值得停: 比最佳的 偏了 ,但 ELBO 只掉了 ,也就是相對誤差 。原因是 KL 在最小值附近是二次的(和 要怎麼替「這個模型有多符合資料」打一個分數? 第三節那個 同一個理由):偏了 ,代價是 。
這件事是整個變分方法能用的根本原因。 真後驗算不出來、只能用一個受限的家族去近似——但只要近似「大致對」,下界就已經很緊了。反過來, 那一列(偏得離譜)掉了 ,那就不是小事。
EM:交替把兩個東西抬起來
第二節的等式對任何 都成立。把它當成一個有兩組變數的最佳化問題—— 和 ——立刻得到一個演算法:輪流固定一個、最大化另一個。
- E-step:固定 ,對 最大化 。由等式, 不含 ,所以最大化 等於最小化 ,答案是 ,而此時 ELBO 精確等於 log-likelihood。
- M-step:固定 ,對 最大化 。 固定時 ,而聯合機率是好寫的,所以這一步通常有封閉解。
實測。 筆從上面那個混合抽出來的資料,故意從一個很差的起點(、)開始:
init ELBO = -1119.412 log-lik = -1094.282
iter 1 E 後 ELBO = -1094.282 (= log-lik -1094.282) M 後 ELBO = -998.819 mu = -0.113, +0.966
iter 2 E 後 ELBO = -978.036 (= log-lik -978.036) M 後 ELBO = -949.100 mu = -0.271, +1.268
iter 3 E 後 ELBO = -923.753 (= log-lik -923.753) M 後 ELBO = -906.253 mu = -0.594, +1.475
iter 4 E 後 ELBO = -898.532 (= log-lik -898.532) M 後 ELBO = -894.940 mu = -0.762, +1.517
iter 5 E 後 ELBO = -893.098 (= log-lik -893.098) M 後 ELBO = -891.803 mu = -0.854, +1.500
iter 6 E 後 ELBO = -890.823 (= log-lik -890.823) M 後 ELBO = -890.030 mu = -0.919, +1.475
真值 mu = -1.000, +1.500
三件事直接從表上讀得出來。
一,每一個 E 後的 ELBO 精確等於當時的 log-likelihood(、、…,一位小數都不差)。這就是「E-step 把 KL 壓成零」的實測。
二,ELBO 從頭到尾單調不減:。兩種 step 都在最大化同一個 ,所以它只能上升。
三,log-likelihood 也單調不減,而且這是推論不是巧合:E 後 ;接下來的 M-step 讓 上升;而 恆成立。所以下一輪 E 後的 一定不低於這一輪。
E-step 把下界頂到天花板,M-step 把天花板抬高;兩步都在推同一個量,所以它不會倒退。
但要注意這個保證有多弱。 單調不減不等於收斂到全域最佳——上表跑到第六輪 是 ,還在往真值 爬;而換一個更糟的起點,EM 可以停在一個把兩個成分都放在同一個地方的局部解。這是 同一張地圖從不同地方出發:損失曲面與初始化 那件事在機率模型上的版本,初始化一樣重要。
展開細節為什麼 M-step 常常有封閉解,而直接對 log p 做梯度下降沒有
直接最大化 時,那個 卡在加總的外面,微分會產生一個帶分母的式子,把所有成分耦合在一起。
M-step 最大化的是 —— 在加總裡面。於是每個成分的參數各自獨立,而且如果 是指數族,那就是一個加權的最大似然,有封閉解。以 Gaussian 混合為例:
也就是「用後驗當權重的加權平均」。上表的 M-step 就是這兩行。
值得注意的是:這個好處不是免費的。ELBO 把 搬進加總裡,代價正是那個 項——你換掉的是「精確但難算」,換來的是「好算但有一個已知大小的缺口」。
後驗也算不出來的時候
EM 假設 E-step 做得到,也就是真後驗 寫得出來。 是離散且不多的時候可以(上面就是),但 是一個連續向量、 是一個神經網路的時候,後驗完全沒有封閉形式。
這時候退一步:不要求 等於後驗,只在一個可參數化的家族裡找最近的那個。而且不要對每個 各解一次最佳化,改成訓練一個網路 直接把 映到那個 的參數(這叫 amortized inference——把每個資料點的推論成本攤提到一次訓練裡)。整個目標變成對 和 同時做梯度上升:
(這只是把 ELBO 裡的 重新分組,不是新的東西。)
兩項的拉鋸很好讀:第一項要 帶足夠的資訊去還原 ,第二項要 的分布貼著先驗。而第二項可以被壓到零——如果 強到不需要 就能生出 ,那最省事的解是讓 完全不看 、直接等於先驗。這叫 posterior collapse:ELBO 看起來還不錯,但 什麼都沒學到。
這件事在上面那個混合模型裡就能量出來——把兩個成分的距離慢慢縮小, 能承載的資訊量(也就是那個 KL 項在 上的期望)跟著塌:
|μ₁-μ₀| = 4.00 E_x[KL(p(z|x) ‖ p(z))] = 0.556150 nats
|μ₁-μ₀| = 2.00 0.291858
|μ₁-μ₀| = 1.00 0.094910
|μ₁-μ₀| = 0.50 0.025576
|μ₁-μ₀| = 0.20 0.004182
|μ₁-μ₀| = 0.05 0.000262
|μ₁-μ₀| = 0.00 0.000000
注意它掉得多快:距離減半,資訊量掉到四分之一以下()。也就是說,「 有用」和「 完全沒用」之間沒有一段平坦的過渡帶——一旦訓練往「不靠 」的方向走一點,那個方向的回報就更小,於是走得更遠。這是一個正回饋,而正回饋通常需要外力才停得下來,實務上的對策(KL 退火、在 KL 項上設下界、削弱 decoder)全都是在提供那個外力。
注意 這個方向會挑一個 mode 就停
變分法用的是 (把你猜的放在前面),這個順序不是隨便選的——它是第二節那個恆等式自然給出的,也是唯一一個期望對 取、因而抽得出樣本的方向。但它有一個系統性的偏好。
實測:目標 是 (雙峰,標準差 ),用單一 Gaussian 去逼近:
最小化 KL(q‖p) :mu = +1.9998 sigma = 0.5004 值 0.6931
最小化 KL(p‖q) :mu = -0.0000 sigma = 2.0616 值 0.7236前者挑了一個峰、寬度精確等於那個峰的寬度( 對真值 ),另一個峰整個放棄(它付的代價正好是 ,也就是丟掉一半質量)。後者把兩個峰一起蓋住,標準差 剛好是真實分布的標準差,但中間那塊機率其實是零的區域被它填滿了。
兩個方向各自在避免不同的災難: 罰的是「 有質量但 沒有」(所以它不敢跨過空隙), 罰的是「 有質量但 沒有」(所以它不敢漏掉任何一塊)。用錯的機率表下注一年會多輸多少:KL Divergence 與 Cross-Entropy 的不對稱性在這裡不是一個技術細節,它直接決定你會得到哪一種錯誤。
實務上的後果:用 ELBO 訓練出來的模型,傾向低估真實分布的散佈。這在生成的時候看得見——樣本偏保守、偏典型。
拖動 ,看下界和那塊 KL 一起動
互動 demo:一次走半步:E-step 把縫補成精確的 0,M-step 把貼好的下界往上推。
回到情境:這套東西什麼時候可靠
這一切依賴什麼。
一,聯合機率 要好寫。整個方法的立足點就是「聯合好寫、邊際難算」;如果連聯合都寫不出來,ELBO 沒有著力點。
二, 的家族要罩得住真後驗的形狀。上面的 Remark 已經量過代價:家族不夠時,缺口不只是變大,它還會往特定方向偏。而且這個缺口是看不見的——你能算 ELBO,但算不出 ,所以你無從得知自己差多遠。
三,「ELBO 變大」不等於「模型變好」。因為 ,ELBO 上升可能是 上升,也可能只是 變準了。比較兩個不同架構的 ELBO 尤其危險:缺口大小不同,比較的不是同一個東西。
ELBO 是一個你算得出來的量, 是一個你想要的量,而兩者的差是一個你通常量不到的量——這三句話要一起記。
先消化一下
參考文獻
- Jordan, M., Ghahramani, Z., Jaakkola, T. & Saul, L. An Introduction to Variational Methods for Graphical Models. Machine Learning 37, 1999.(把 ELBO 與 EM 放在同一個變分框架下的經典整理。)
- Kingma, D. & Welling, M. Auto-Encoding Variational Bayes. ICLR 2014.(amortized inference 與重參數化技巧,本篇第四節那個目標函數的出處。)
- Blei, D., Kucukelbir, A. & McAuliffe, J. Variational Inference: A Review for Statisticians. JASA 112, 2017.( 方向的不對稱性、mean-field 近似的偏差,以及變分法與 MCMC 的取捨。)