你從未測量的那個變量
到現在為止,你已經見過那些學習「從輸入到輸出」映射的模型,也熟悉了貝氏式的習慣——讓先驗、似然、後驗貫穿每一次預測。本篇要加進一個看似不起眼、卻能重新組織一大片機器學習的想法:有時候,最能解釋你資料的那個變量,恰恰是你從未真正記錄下來的。顧客身上有一個你從沒問過的「細分群體」;一封郵件有一個沒人標註過的「主題」;一段語音錄音裡,藏著一串隱藏在波形之下的音素。我們把這樣一個未被觀測到的成因,叫做潛變量。
潛變量不是某種花招或近似——它是我們用來編碼「對看不見的結構的一種信念」的方式。我們假設資料是分兩步生成的:先由「自然」抽出一個隱藏的取值,然後它再產出我們真正測量到的那個觀測。這一階裡大部分的機器裝置,都是為了回答隨之而來的一個難題:如果我們永遠只能看見第二步,又該如何去推斷第一步?
混合模型:一群隱藏的源頭
最乾淨俐落的例子是混合模型。想像一千個人的身高,你從沒按任何標準給他們分過組。這張直方圖上有兩個柔和的隆起。用單獨一條鐘形曲線去擬合它,效果很差;但用兩條鐘形曲線——一條中心偏低、一條偏高——擬合起來卻漂亮極了。這裡的潛變量很簡單,就是「每個人屬於哪一個隆起」。當這些成分曲線是高斯分佈時,這就是高斯混合模型,簡稱 GMM:每個資料點都被假設來自 K 個簇之一,但「它來自哪一個」的標籤是隱藏的。
這裡有一個先有雞還是先有蛋的死結。如果有人把隱藏標籤直接交給你,那擬合每個高斯分佈就是小事一樁——把每組裡的點求個平均就行。反過來,如果有人把高斯分佈交給你,那猜每個點的標籤也很容易——把它分給「讓它最可能出現」的那條曲線。可你兩樣都沒有。你想僅憑這些沒有標籤的身高,同時找出簇的形狀和軟分配。直接做極大似然沒法一步乾淨地解出來,因為那個似然要對每一種可能的隱藏分配求和。
期望最大化:先猜,再精修,重複
走出這個雞生蛋死結的辦法,是別再強求一次性同時得到兩個答案,而是用自舉的方式一點點拉起來。這就是期望最大化演算法,簡稱 EM。先給簇的形狀隨便來個粗糙的初猜。然後交替做兩步。在 E 步裡,把形狀固定住,為每個點算出它來自每個簇的機率——這些軟「責任度」就是你當前對隱藏標籤的最佳信念。在 M 步裡,把這些軟標籤固定住,重新估計每個簇的中心和散佈,並按每個點「歸屬程度」的大小給它加權。
- 初始化:為 K 個簇的均值、散佈和混合權重選一組粗略的起始值——哪怕是隨機的也行。
- E 步:固定當前的簇,算出每個點的軟責任度——也就是它屬於每個簇的機率。
- M 步:固定責任度,把每個簇的均值、散佈和權重,重新估計為各點的「按責任度加權的平均」。
- 反覆執行 E 步和 M 步,直到擬合不再改善——可以保證資料的似然永遠不會下降。
每一輪都把簇推向一個更能解釋資料的配置,而一條漂亮的定理保證了資料的似然在相鄰兩輪之間絕不下降。但要誠實地看清這換來的是什麼:EM 爬到的是一個*局部*最優,不一定是全域最好的那個。一個糟糕的初始化可能讓它卡在一個平庸的解上,這也是為什麼實踐者會從不同的起點跑好幾遍,再留下最好的那個。EM 不是什麼能找出隱藏真相的魔法;它是在一片你本來無從搜索的地形上,做的一次有紀律、單調上升的爬山。
當隱藏的那一面太大:變分推斷
EM 的 E 步需要潛變量的精確後驗——也就是給定資料後,每個隱藏取值的確切機率。對 GMM 來說,這個後驗只是一張關於 K 個簇的小巧表格,所以 E 步很便宜。可假設隱藏的那一面是一個高維的連續向量,而觀測是由一個盤根錯節的神經網路產出的。這時精確後驗就成了一個無法求解的積分——沒有乾淨的公式,而對所有可能性求和又毫無指望。EM 那個乾淨的 E 步,悄無聲息地就崩了。
變分推斷就是這場救援。我們不去計算那個不可能算出的真後驗,而是挑一族我們*能*駕馭的更簡單的分佈——比方說普通的高斯分佈——然後在這一族裡頭尋找那個能盡可能緊貼真後驗的成員。我們就這樣把「推斷」變成了「最佳化」:調節我們這個替身分佈的參數,讓它與真相之間的距離最小。我們要最小化的這個「距離」,就是 KL 散度——衡量一個分佈離另一個分佈有多遠的標準尺子。
VAE:潛變量遇上深度學習
把變分推斷和神經網路拼到一起,你就得到了變分自編碼器,簡稱 VAE——它是這一階的機率思想與你早已熟悉的深度學習之間,最乾淨俐落的橋樑之一。它的圖景是兩個面對面的網路。一個編碼器讀入一張圖像,但它輸出的不是單獨一個編碼,而是潛向量上的一個*分佈*——一個均值加一份散佈。一個解碼器從那個分佈裡採一個點,再試著從這個點重建出原始圖像。
x --[encoder]--> q(z|x) = mean, spread
| sample z
v
z --[decoder]--> reconstruction of x
loss = reconstruction error + KL( q(z|x) || prior )訓練目標,就是上一節那個 ELBO 換上了工作服。它含有兩個互相拉扯的項。重建項獎勵解碼器忠實地重建出輸入。KL 項則把每一個編碼出的分佈往一個簡單的共享先驗——通常是標準高斯——上拉,好讓潛空間不至於碎裂成一座座互不相連的孤島。正是這第二股拉力,讓 VAE 具有了*生成*能力:因為潛空間平滑而有條理,你可以把編碼器扔掉,從先驗裡抽一個全新的隨機 z,讓它穿過解碼器,就得到一個訓練集裡從未存在過的全新樣本。
把整條脈絡看成「同一個想法穿了三套戲服」會很有幫助。GMM 是一個潛變量模型,它的隱藏變量是一個離散的簇標籤。VAE 也是一個潛變量模型,它的隱藏變量是一個連續向量,它的解碼器是一個深度網路。而 EM 和變分推斷,是幹同一件活——對隱藏的那一面做推斷——的兩種辦法,一種精確而小巧,一種近似而能擴展。同一副骨架,不同的肌肉。
它給了你什麼——又沒給你什麼
有一種誠實的說法值得記牢:潛變量是一種*建模假設*,而不是一個被發現的事實。當一個 GMM 把你的顧客分成三個簇時,它之所以找到三個簇,是因為你要的就是三個、又因為高斯分佈是個方便的說法——而不是因為大自然恰好就蓋了「三種人」的章。潛在結構是不是真實的,全看你的假設與世界相符到什麼程度;換一個 K、換一族分佈,講出來的會是另一個故事。把找出來的那些簇當成一面有用的透鏡,而不是一條定律。
另外,要留意用詞。一個會生成人臉的 VAE 並不在「想像」或「理解」任何東西——它只是在從一個被塑造得「能讓重建看起來合理」的平滑潛空間裡採樣。它那些模糊、略顯過分平滑的輸出,正是我們所做近似的直接指紋:一個簡單的先驗、一族選定的分佈、一個下界而非精確的似然。不過,這一整套機器裝置帶來的回報,是真切而具體的。你得到了一種辦法:能從無標籤的資料裡學習、能把觀測壓縮成一段有意義的潛編碼、能生成新樣本,而且——對這一整階來說至關重要——能給你對隱藏那一面的信念附上誠實的不確定性,而不是假裝你對它瞭如指掌。