5. LDA 文本建模框架
5.1 遊戲規則機器學習
對於上述的 PLSA 模型,貝葉斯學派顯然是有意見的,doc-topic 骰子θ→m和 topic-word 骰子φ→k都是模型中的參數,參數都是隨機變量,怎麼能沒有先驗分佈呢?因而,相似於對 Unigram Model 的貝葉斯改造, 咱們也能夠以下在兩個骰子參數前加上先驗分佈從而把 PLSA 對應的遊戲過程改造爲一個貝葉斯的遊戲過程。因爲 φ→k和θ→m都對應到多項分佈,因此先驗分佈的一個好的選擇就是Drichlet 分佈,因而咱們就獲得了 LDA(Latent Dirichlet Allocation)模型。ide
在 LDA 模型中, 上帝是按照以下的規則玩文檔生成的遊戲的學習
假設語料庫中有 M 篇文檔,全部的的word和對應的 topic 以下表示
優化
其中, w→m 表示第 m 篇文檔中的詞, z→m 表示這些詞對應的 topic 編號。
5.2 物理過程分解atom
使用機率圖模型表示, LDA 模型的遊戲過程如圖所示。url
這個機率圖能夠分解爲兩個主要的物理過程:
- α→→θ→m→zm,n, 這個過程表示在生成第m 篇文檔的時候,先從第一個罈子中抽了一個doc-topic 骰子 θ→m, 而後投擲這個骰子生成了文檔中第 n 個詞的topic編號zm,n;
- β→→φ→k→wm,n|k=zm,n, 這個過程表示用以下動做生成語料中第m篇文檔的第 n個詞:在上帝手頭的K 個topic-word 骰子 φ→k 中,挑選編號爲 k=zm,n的那個骰子進行投擲,而後生成 word wm,n;
理解 LDA最重要的就是理解這兩個物理過程。 LDA 模型在基於 K 個 topic 生成語料中的 M 篇文檔的過程當中, 因爲是 bag-of-words 模型,有一些物理過程是相互獨立可交換的。由此, LDA 生成模型中, M 篇文檔會對應於 M 個獨立的 Dirichlet-Multinomial 共軛結構; K 個 topic 會對應於 K 個獨立的 Dirichlet-Multinomial 共軛結構。因此理解 LDA 所須要的全部數學就是理解 Dirichlet-Multiomail 共軛,其它都就是理解物理過程。如今咱們進入細節, 來看看 LDA 模型是如何被分解爲 M+K 個Dirichlet-Multinomial 共軛結構的。
由第一個物理過程,咱們知道 α→→θ→m→z→m 表示生成第 m 篇文檔中的全部詞對應的topics,顯然 α→→θ→m 對應於 Dirichlet 分佈, θ→m→z→m 對應於 Multinomial 分佈, 因此總體是一個 Dirichlet-Multinomial 共軛結構;
前文介紹 Bayesian Unigram Model 的小節中咱們對 Dirichlet-Multinomial 共軛結構作了一些計算。藉助於該小節中的結論,咱們能夠獲得
其中 n→m=(n(1)m,⋯,n(K)m), n(k)m 表示第 m篇文檔中第 k 個topic 產生的詞的個數。進一步,利用 Dirichlet-Multiomial 共軛結構,咱們獲得參數 θ→m 的後驗分佈剛好是
因爲語料中 M篇文檔的 topics 生成過程相互獨立,因此咱們獲得 M 個相互獨立的 Dirichlet-Multinomial 共軛結構,從而咱們能夠獲得整個語料中 topics 生成機率
目前爲止,咱們由M篇文檔獲得了 M 個 Dirichlet-Multinomial 共軛結構,還有額外K 個 Dirichlet-Multinomial 共軛結構在哪兒呢?在上帝按照以前的規則玩 LDA 遊戲的時候,上帝是先徹底處理完成一篇文檔,再處理下一篇文檔。文檔中每一個詞的生成都要拋兩次骰子,第一次拋一個doc-topic骰子獲得 topic, 第二次拋一個topic-word骰子獲得 word,每次生成每篇文檔中的一個詞的時候這兩次拋骰子的動做是緊鄰輪換進行的。若是語料中一共有 N 個詞,則上帝一共要拋 2N次骰子,輪換的拋doc-topic骰子和 topic-word骰子。但實際上有一些拋骰子的順序是能夠交換的,咱們能夠等價的調整2N次拋骰子的次序:前N次只拋doc-topic骰子獲得語料中全部詞的 topics,而後基於獲得的每一個詞的 topic 編號,後N次只拋topic-word骰子生成 N 個word。因而上帝在玩 LDA 遊戲的時候,能夠等價的按照以下過程進行:
以上游戲是先生成了語料中全部詞的 topic, 而後對每一個詞在給定 topic 的條件下生成 word。在語料中全部詞的 topic 已經生成的條件下,任何兩個 word 的生成動做都是可交換的。因而咱們把語料中的詞進行交換,把具備相同 topic 的詞放在一塊兒
其中, w→(k) 表示這些詞都是由第 k 個 topic 生成的, z→(k) 對應於這些詞的 topic 編號,因此 z→(k)中的份量都是 k。
對應於機率圖中的第二個物理過程 β→→φ→k→wm,n|k=zm,n,在 k=zm,n 的限制下,語料中任何兩個由 topic k 生成的詞都是可交換的,即使他們再也不同一個文檔中,因此咱們此處再也不考慮文檔的概念,轉而考慮由同一個 topic 生成的詞。考慮以下過程 β→→φ→k→w→(k) ,容易看出, 此時 β→→φ→k 對應於 Dirichlet 分佈, φ→k→w→(k) 對應於 Multinomial 分佈, 因此總體也仍是一個 Dirichlet-Multinomial 共軛結構;
其中 n→k=(n(1)k,⋯,n(V)k), n(t)k 表示第 k 個topic 產生的詞中 word t的個數。進一步,利用 Dirichlet-Multiomial 共軛結構,咱們獲得參數 φ→k 的後驗分佈剛好是
而語料中 K個 topics 生成words 的過程相互獨立,因此咱們獲得 K 個相互獨立的 Dirichlet-Multinomial 共軛結構,從而咱們能夠獲得整個語料中詞生成機率
結合 (*) 和 (**) 因而咱們獲得
此處的符號表示稍微不夠嚴謹, 向量 n→k, n→m 都用 n 表示, 主要經過下標進行區分, k 下標爲 topic 編號, m 下標爲文檔編號。
5.3 Gibbs Sampling
有了聯合分佈 p(w→,z→), 萬能的 MCMC 算法就能夠發揮做用了!因而咱們能夠考慮使用 Gibbs Sampling 算法對這個分佈進行採樣。固然因爲 w→ 是觀測到的已知數據,只有 z→是隱含的變量,因此咱們真正須要採樣的是分佈 p(z→|w→)。在 Gregor Heinrich 那篇頗有名的LDA 模型科普文章 Parameter estimation for text analysis 中,是基於 (***) 式推導 Gibbs Sampling 公式的。此小節中咱們使用不一樣的方式,主要是基於 Dirichlet-Multinomial 共軛來推導 Gibbs Sampling 公式,這樣對於理解採樣中的機率物理過程有幫助。
語料庫z→ 中的第i個詞咱們記爲zi, 其中i=(m,n)是一個二維下標,對應於第m篇文檔的第 n個詞,咱們用 ¬i 表示去除下標爲i的詞。那麼按照 Gibbs Sampling 算法的要求,咱們要求得任一個座標軸 i 對應的條件分佈 p(zi=k|z→¬i,w→) 。假設已經觀測到的詞 wi=t, 則由貝葉斯法則,咱們容易獲得
因爲 zi=k,wi=t 只涉及到第 m 篇文檔和第 k個 topic,因此上式的條件機率計算中, 實際上也只會涉及到以下兩個Dirichlet-Multinomial 共軛結構
- α→→θ→m→z→m
- β→→φ→k→w→(k)
其它的 M+K−2 個 Dirichlet-Multinomial 共軛結構和zi=k,wi=t是獨立的。
因爲在語料去掉第i 個詞對應的 (zi,wi),並不改變咱們以前討論的 M+K 個 Dirichlet-Multinomial 共軛結構,只是某些地方的計數會減小。因此θ→m,φ→k 的後驗分佈都是 Dirichlet:
使用上面兩個式子,把以上想法綜合一下,咱們就獲得了以下的 Gibbs Sampling 公式的推導
=
=
=
=
=
=
=
以上推導估計是整篇文章中最複雜的數學了,表面上看上去複雜,可是推導過程當中的機率物理意義是簡單明瞭的:zi=k,wi=t的機率只和兩個 Dirichlet-Multinomial 共軛結構關聯。而最終獲得的 θ^mk,φ^kt 就是對應的兩個 Dirichlet 後驗分佈在貝葉斯框架下的參數估計。藉助於前面介紹的Dirichlet 參數估計的公式 ,咱們有
因而,咱們最終獲得了 LDA 模型的 Gibbs Sampling 公式
這個公式是很漂亮的, 右邊其實就是 p(topic|doc)⋅p(word|topic),這個機率實際上是 doc→topic→word 的路徑機率,因爲topic 有K 個,因此 Gibbs Sampling 公式的物理意義其實就是在這K 條路徑中進行採樣。
5.4 Training and Inference
有了 LDA 模型,固然咱們的目標有兩個
- 估計模型中的參數 φ→1,⋯,φ→K 和 θ→1,⋯,θ→M;
- 對於新來的一篇文檔docnew,咱們可以計算這篇文檔的 topic 分佈θ→new。
有了 Gibbs Sampling 公式, 咱們就能夠基於語料訓練 LDA 模型,並應用訓練獲得的模型對新的文檔進行 topic 語義分析。訓練的過程就是獲取語料中的 (z,w) 的樣本,而模型中的全部的參數均可以基於最終採樣獲得的樣本進行估計。訓練的流程很簡單:
對於 Gibbs Sampling 算法實現的細節,請參考 Gregor Heinrich 的 Parameter estimation for text analysis 中對算法的描述,以及 PLDA(http://code.google.com/p/plda) 的代碼實現,此處再也不贅述。
由這個topic-word 頻率矩陣咱們能夠計算每個p(word|topic)機率,從而算出模型參數φ→1,⋯,φ→K, 這就是上帝用的 K 個 topic-word 骰子。固然,語料中的文檔對應的骰子參數 θ→1,⋯,θ→M 在以上訓練過程當中也是能夠計算出來的,只要在 Gibbs Sampling 收斂以後,統計每篇文檔中的 topic 的頻率分佈,咱們就能夠計算每個 p(topic|doc) 機率,因而就能夠計算出每個θ→m。因爲參數θ→m 是和訓練語料中的每篇文檔相關的,對於咱們理解新的文檔並沒有用處,因此工程上最終存儲 LDA 模型時候通常沒有必要保留。一般,在 LDA 模型訓練的過程當中,咱們是取 Gibbs Sampling 收斂以後的 n 個迭代的結果進行平均來作參數估計,這樣模型質量更高。
有了 LDA 的模型,對於新來的文檔 docnew, 咱們如何作該文檔的 topic 語義分佈的計算呢?基本上 inference 的過程和 training 的過程徹底相似。對於新的文檔, 咱們只要認爲 Gibbs Sampling 公式中的 φ^kt 部分是穩定不變的,是由訓練語料獲得的模型提供的,因此採樣過程當中咱們只要估計該文檔的 topic 分佈θ→new就行了。
LDA 對於專業作機器學習的兄弟而言,只能算是一個簡單的Topic Model。可是對於互聯網中作數據挖掘、語義分析的工程師,LDA 的門檻並不低。 LDA 典型的屬於這樣一種機器學習模型:要想理解它,須要比較多的數學背景,要在工程上進行實現,卻相對簡單。 Gregor Heinrich 的LDA 模型科普文章 Parameter estimation for text analysis 寫得很是的出色,這是學習 LDA 的必看文章。不過即使是這篇文章,對於工程師也是有門檻的。我寫的這個科普最好對照 Gregor Heinrich 的這篇文章來看, 我用的數學符號也是儘量和這篇文章保持一致。
這份LDA 科普是基於給組內兄弟作報告的 ppt 整理而成的,說是科普其實也不簡單,涉及到的數學仍是太多。在工業界也混了幾年,常常感受到工程師對於學術界的玩的模型有很強的學習和嘗試的慾望,只是學 習成本每每過高。因此我寫 LDA 的初衷就是寫給工業界的工程師們看的,但願把學術界玩的一些模型用相對通俗的方式介紹給工程師;若是這個科普對於讀研究生的一些兄弟姐妹也有所啓發,只能 說那是一個 side effect 。
我我的很喜歡LDA ,它是在文本建模中一個很是優雅的模型,相比於不少其它的貝葉斯模型, LDA 在數學推導上簡潔優美。學術界自 2003 年以來也輸出了不少基於LDA 的 Topic Model 的變體,要想理解這些更加高級的 Topic Model, 首先須要很好的理解標準的 LDA 模型。在工業界, Topic Model 在 Google、Baidu 等大公司的產品的語義分析中都有着重要的應用;因此Topic Model 對於工程師而言,這是一個頗有應用價值、值得學習的模型。我接觸 Topic Model 的時間不長,主要是因爲2年前和 PLDA 的做者 Wangyi 一塊兒合做的過程當中,從他身上學到了不少 Topic Model 方面的知識。關於 LDA 的相關知識,其實能夠寫的還有不少:如何提升 LDA Gibbs Sampling 的速度、如何優化超參數、如何作大規模並行化、LDA 的應用、LDA 的各類變體…… 不過個人主要目標仍是科普如何理解標準的LDA 模型。
學習一個模型的時候我喜歡追根溯源,經常但願把模型中的每個數學推導的細節搞明白,把公式的物理意義想清楚,不過數學推導自己並非我想要的,把數學推導還原爲物理過程纔是我樂意作的事。最後引用一下物理學家費曼的名言結束 LDA 的數學科普:
What I cannot create, I do not understand.
— Richard Feynman