背景
我們生活中總是産生大量的文本,分析這些觀察到的語料庫是如何生成的就需要對文本進行模組化。常見的文本模組化方法包括:Unigram、PLSA、LDA 、詞向量模型(CBOW、Skip-gram)等。LDA模型是一種主題模型(topic model),屬于詞袋(不關心詞與詞之間的次序)模型。
模型描述
人類所産生的所有語料文本我們都可以看成是上帝抛骰子生成的。我們觀察到的隻是上帝玩這個遊戲的結果——詞序列構成的語料,而上帝玩這個遊戲的過程對我們來說是個黑盒子。是以在統計文本模組化中,我們希望猜測出上帝是如何玩這個遊戲的。具體一點,最核心的問題是:
- 上帝都有什麼樣的骰子?
- 上帝是如何抛這些骰子的?
第一個問題就對應着模型包含哪些參數,第二個問題就對應着遊戲的規則,上帝可以按照一定的規則抛骰子進而産生詞序列。
LDA算法:
LDA過程圖示:
LDA 機率圖模型:
整個語料庫共包含 M 篇 文檔。其中第 m(m∈[1,M]) 篇文檔中的第 n(n∈Nm) 個詞記為 wm,n 。這個機率圖模型可以分解成兩個主要的過程:
- α⃗ →θ⃗ m→zm,n ,這個過程表示在生成第 m 篇文檔的時候,先從第一個壇子中抽取一個 doc-topic 骰子 θ⃗ m ,然後抛這個骰子生成了第 m 篇文檔中的第 n 個詞的 topic 編号 zm,n ;
- β⃗ →φ⃗ k→wm,n|k=zm,n ,目前上帝從第二個壇子中獨立抽取了 K 個 top-word 骰子,這個過程表示采用如下過程生成語料中第 m 篇文檔的第 n 個詞。在上帝手中的 K 個topic-word 骰子 φ⃗ k(k∈[1,K]) 中,挑選編号為 k=zm,n (第1步得到的結果)的那個骰子進行投擲,然後生成 word wm,n 。
LDA 模型求解
LDA模型求解的目标主要包括以下兩個方面
- 估計模型中的隐含變量 φ⃗ 1,…,φ⃗ K 和 θ⃗ 1,…,θ⃗ M ;
- 對于新來的一篇文檔 docnew ,計算這篇文檔的topic分布 θ⃗ new 。
總體思路
隐含變量 Θ 和 Φ 後驗機率分布難以精确求解,可以通過采樣的方法來近似求解。從LDA機率圖模型可以發現:
- zm,n 服從 參數為 θ⃗ m 的 multinomial 分布,若能獲得 zm,n 的觀測值就很容易得到 θ⃗ m 的後驗機率分布。
- 若 zm,n 可以被觀測到,假定 zm,n=k ,則第 m 篇文檔的第 n 個詞 wm,n 服從參數為 φ⃗ k 的multinomial分布,就能很容易的估計 φ⃗ k 的後驗機率分布。
但遺憾的是 z⃗ 也是隐含變量,不能被直接觀測到。一種可行的方法是:我們首先計算 z⃗ 的後驗機率分布 p(z⃗ |w⃗ ) ,然後對該後驗機率分布進行采樣。将得到的樣本作為隐含變量 z⃗ 的觀察值,這樣就可以對 Θ 和 Φ 的後驗機率分布進行估計。
計算 z⃗ 的後驗機率分布 p(z⃗ |w⃗ )
(1) 這裡首先介紹一個定理:
若随機變量 θ⃗ =(θ1,…,θK) 服從參數為 α⃗ =(α1,…,αK) 的Dirichlet分布。随機變量 x 服從參數為 θ⃗ 的 multinomial 分布(共 K 個類),重複進行 N 次試驗,得到 x⃗ 。如下圖所示:
α⃗ ⟶⏟Dirichletθ⃗ ⟶⏟Multinomialx⃗
n⃗ =(n1,…,nK) 表示 x⃗ 中各個類别出現的次數,即 n⃗ ∼Multi(θ⃗ ,N) ,有下式成立:
p(x⃗ |α⃗ )=Δ(α⃗ +n⃗ )Δ(α⃗ ) (∗)
證明如下:
p(x⃗ |α⃗ )=∫p(θ⃗ |α⃗ )⋅p(x⃗ |θ⃗ ) dθ⃗ =∫Dir(θ⃗ |α⃗ )⋅Multi(θ⃗ ,N) dθ⃗ =∫1Δ(α)∏k=1Kθαk−1k⋅∏k=1Kθnkk dθ⃗ =1Δ(α⃗ )∫∏k=1Kθαk+nk−1k dθ⃗ =Δ(α⃗ +n⃗ )Δ(α⃗ )
(2)在LDA機率圖模型的第一個實體過程中, α⃗ →θ⃗ m→z⃗ m 表示生成第 m 篇文檔中所有詞對應的 topic。顯然 α⃗ →θ⃗ m 對應于Dirichlet分布, θ⃗ m→z⃗ m 對應于 Multinomial 分布,是以整個過程是一個 Dirichlet-Multinomial 共轭結構。
α⃗ ⟶⏟Dirichletθ⃗ m⟶⏟Multinomialz⃗ m
根據定理 (∗) 有:
p(z⃗ m|α⃗ )=Δ(α⃗ +n⃗ m)Δ(α⃗ )
其中 n⃗ m=(n(1)m,…,n(K)m) 。 n(k)m 表示在第 m 篇文檔中第 k 個topic 産生的詞的個數。
由于語料中 M 篇文檔的 topic 生成過程是互相獨立的,是以我們得到 M 個互相獨立的 Dirichlet-Multinomial 共轭結構。進而整個語料中 topic 生成的機率為:
p(z⃗ |α⃗ )=∏m=1Mp(z⃗ m|α⃗ )=∏m=1MΔ(α⃗ +n⃗ m)Δ(α⃗ )
(3)在LDA機率圖模型的第二個實體過程中, β⃗ →φ⃗ k→w⃗ k 表示語料中由 topic k 生成詞的過程。其中 w⃗ k 表示語料中由 topic k 生成的所有詞。顯然 β⃗ →φ⃗ k 對應于 Dirichlet 分布,而 φ⃗ k→w⃗ k 對應于 Multinomial 分布,是以整個過程是一個 Dirichlet-Multinomial 共轭結構。
β⃗ ⟶⏟Dirichletφ⃗ k⟶⏟Multinomialw⃗ k
根據定理 (∗) 有:
p(w⃗ k|z⃗ ,β⃗ )=Δ(β⃗ +n⃗ k)Δ(β⃗ )
其中 n⃗ k=(n(1)k,…,n(V)k) 。 V 表示詞典中不重複的詞的數目,n(t)k 表示在語料中由第 k 個topic 産生的第 t 個詞的數目。
因為語料中 K 個topic 生成詞的過程是互相獨立的,是以我們得到了 K 個互相獨立的 Dirichlet-Multinomial 共轭結構,進而整個語料中詞生成的機率為:
p(w⃗ |z⃗ ,β⃗ )=∏k=1Kp(w⃗ k|z⃗ ,β⃗ )=∏k=1KΔ(β⃗ +n⃗ k)Δ(β⃗ )
(4)綜合步驟(2)和(3)可以得到聯合分布函數:
p(z⃗ ,w⃗ |α⃗ ,β⃗ )=p(z⃗ |α⃗ )p(w⃗ |z⃗ ,β⃗ )=∏m=1MΔ(α⃗ +n⃗ m)Δ(α⃗ )∏k=1KΔ(β⃗ +n⃗ k)Δ(β⃗ )
這裡向量 n⃗ m 和 n⃗ k 都用 n 表示,通過下标進行區分:k 下标為 topic 編号, m 下标為文檔編号。
(5)下面采用Gibbs采樣算法對 z⃗ 的後驗機率分布 p(z⃗ |w⃗ |α⃗ ,β⃗ ) (不引起歧義的情況下,簡記為 p(z⃗ |w⃗ ) ) 進行采樣。Gibbs 采樣算法關鍵在于條件機率分布的求解。
假定我們要求解第 m 篇文檔中 第 n 個詞 i=(m,n) 所對應主題 zi=k(k∈[1,K]) 的條件機率分布。假定 wi=t(t∈[1,V]) 。記 w⃗ ={wi=t,w⃗ ¬i} , z⃗ ={zi=k,z⃗ ¬i} , i=(m,n) 有下式成立:
p(zi=k|z⃗ ¬i,w⃗ )=p(w⃗ ,z⃗ )p(w⃗ ,z⃗ ¬i)=p(w⃗ |z⃗ )p(w⃗ ¬i|z⃗ ¬i)p(wi)⋅p(z⃗ )p(z⃗ ¬i)∝p(w⃗ |z⃗ )p(w⃗ ¬i|z⃗ ¬i)⋅p(z⃗ )p(z⃗ ¬i)=∏Kk=1Δ(β⃗ +n⃗ k)Δ(β⃗ )∏Kk=1Δ(β⃗ +n⃗ k,¬i)Δ(β⃗ )⋅∏Mm=1Δ(α⃗ +n⃗ m)Δ(α⃗ )∏Mm=1Δ(α⃗ +n⃗ m,¬i)Δ(α⃗ )=Δ(β⃗ +n⃗ k)Δ(β⃗ +n⃗ k,¬i)⋅Δ(α⃗ +n⃗ m)Δ(α⃗ +n⃗ m,¬i)=∏Vt=1Γ(βt+n(t)k)Γ(∑Vt=1(βt+n(t)k))∏Vt=1Γ(βt+n(t)k,¬i)Γ(∑Vt=1(βt+n(t)k,¬i))⋅∏Kk=1Γ(αk+n(k)m)Γ(∑Kk=1(αk+n(k)m))∏Kk=1Γ(αk+n(k)m,¬i)Γ(∑Kk=1(αk+n(k)m,¬i))=Γ(βt+n(t)k)Γ(∑Vt=1(βt+n(t)k,¬i))Γ(βt+n(t)k,¬i)Γ(∑Vt=1(βt+n(t)k))⋅Γ(αk+n(k)m)Γ(∑Kk=1(αk+n(k)m,¬i))Γ(αk+n(k)m,¬i)Γ(∑Kk=1(αk+n(k)m))=βt+n(t)k,¬i∑Vt=1(βt+n(t)k,¬i)⋅αk+n(k)m,¬i∑Kk=1(αk+n(k)m,¬i)
其中由倒數第二步推出倒數第一步使用了 Γ 函數的性質: xΓ(x)=Γ(x+1) 。
在不考慮位置 i=(m,n) 位置的詞時,根據Dirichlet參數的估計公式, αk+n(k)m,¬i∑Kk=1(αk+n(k)m,¬i) 剛好是對第 m 篇文檔主題分布 θm 的第 k 個分量 θmk的估計。而 βt+n(t)k,¬i∑Vt=1(βt+n(t)k,¬i) 剛好是對第 k 個主題生成第 t 個詞的機率 φkt 的估計。
θ̂ mk=αk+n(k)m,¬i∑Kk=1(αk+n(k)m,¬i)
φ̂ kt=βt+n(t)k,¬i∑Vt=1(βt+n(t)k,¬i)
我們最終得到了LDA模型Gibbs Sampling 公式:
p(zi=k|z⃗ ¬i,w⃗ )∝θ̂ mk⋅φ̂ kt
整個公式很漂亮就是 p(topic|doc)⋅p(word|topic) ,是以這個機率其實是 doc→topic→word 的路徑機率,由于 topic 有 K 個,是以 Gibbs Sampling 公式的實體意義就是在這 K 條路徑中進行采樣。
有了Gibbs Sampling 采樣公式,我們就可以基于語料訓練LDA模型。LDA的訓練過程如下所是:
(6)根據前面介紹的總體思路,當Gibbs采樣過程收斂後就可以對參數 Θ 和 Φ 的後驗機率分布進行估計。
θ̂ mk=n(k)m+αk∑Kk=1(n(k)m+αk) ∀m∈[1,M], ∀k∈[1,K]
φ̂ kt=n(t)k+βt∑Vt=1(n(t)k+βt) ∀k∈[1,K], ∀t∈[1,V]
(7)有了LDA模型,對于新來的文檔 docnew ,我們如何做該文檔的 topic 語義分布的計算呢?基本上inference和training 的過程完全類似。不同之處是:對于新的文檔,我們隻要認為 Gibbs Sampling 公式中 Φ 是已知的(由訓練好的模型提供),是以采樣過程我們隻需要估計該文檔的topic分布 θ⃗ new 就好了。過程如下所示:
參考文獻
Gregor Heinrich, Parameter estimation for text analysis
靳志輝,LDA數學八卦,2013
鄒博,主題模型LDA,2014