【转】LDA数学八卦
轉自LDA數學八卦
在 Machine Learning 中,LDA 是兩個常用模型的簡稱: Linear Discriminant Analysis 和 Latent Dirichlet Allocation,
在這篇文章中我們主要八卦的是后者。LDA 是一個在文本建模中很著名的模型,類似于 SVD, PLSA 等模型, 可以用于淺層語義分析,在文本語義分析中是一個很有用的模型。很不幸的是,這個模型中涉及的數學知識有點多,
包括 Gamma 函數, Dirichlet 分布, Dirichlet-Multinomial 共軛, Gibbs Sampling,
Variational Inference, 貝葉斯文本建模,PLSA 建模, 以及 LDA 文本建模。
這篇文章的主要目標,就是科普在學習理解LDA 模型中,需要了解的一些重要的數學知識。
預設的讀者是做自然語言處理、機器學習、數據挖掘方向的工程師,
要讀懂這篇科普,需要的數學基礎知識基本上不超過陳希孺先生的《概率論與數理統計》這本書。
文章標題掛上“八卦”兩字, 因為八卦意味著自由、不拘束、可以天馬行空,細節處理上也難免有不嚴謹的地方;
當然我也希望八卦是相對容易理解的,即便他是關于數學的八卦。對于本文中的任何評論,
歡迎發信到我的新浪微博帳號 rickjin, 或者是郵箱 zhihuijin@gmail.com。
文本建模
我們日常生活中總是產生大量的文本,如果每一個文本存儲為一篇文檔,那
每篇文檔從人的觀察來說就是有序的詞的序列 \(d=(w_1, w_2, \cdots, w_n)\)。
統計文本建模的目的就是追問這些觀察到語料庫中的的詞序列是如何生成的。
統計學被人們描述為猜測上帝的游戲,人類產生的所有的語料文本我們都可以看成是一個偉大的上帝在
天堂中拋擲骰子生成的,我們觀察到的只是上帝玩這個游戲的結果 ------ 詞序列構成的語料,
而上帝玩這個游戲的過程對我們是個黑盒子。所以在統計文本建模中,我們希望猜測出上帝是如何玩這個游戲的,
具體一點,最核心的兩個問題是
- 上帝都有什么樣的骰子;
- 上帝是如何拋擲這些骰子的;
第一個問題就是表示模型中都有哪些參數,骰子的每一個面的概率都對應于模型中的參數;
第二個問題就表示游戲規則是什么,上帝可能有各種不同類型的骰子,
上帝可以按照一定的規則拋擲這些骰子從而產生詞序列。
Unigram Model
假設我們的詞典中一共有 \(V\) 個詞 \(v_1, v_2, \cdots v_V\),那么最簡單的 Unigram Model 就是認為上帝是按照如下的游戲規則產生文本的。
算法:Unigram Model
- 上帝只有一個骰子,這個骰子有 \(V\) 個面, 每個面對應一個詞, 各個面的概率不一;
- 每拋一次骰子,拋出的面就對應的產生一個詞;
如果一篇文檔中有 \(n\) 個詞,上帝就是獨立的拋\(n\)次骰子產生這\(n\) 個詞;
上帝的這個唯一的骰子各個面的概率記為 \(\vec{p} = (p_1, p_2, \cdots, p_V)\),所以每次投擲骰子類似于一個拋鋼镚時候的貝努利實驗,只是貝努利實驗中我們拋的是一個兩面的骰子,而此處拋的是一個\(V\)面的骰子,我們把拋這個\(V\)面骰子的實驗記為記為 $w\sim Mult(w|\vec{p}) $。
對于一篇文檔\(d=\vec{w}=(w_1, w_2, \cdots, w_n)\), 該文檔被生成的概率就是
\[ p(\vec{w}) = p(w_1, w_2, \cdots, w_n) = p(w_1)p(w_2) \cdots p(w_n) \]
而文檔和文檔之間我們認為是獨立的, 所以如果語料中有多篇文檔\(\mathcal{W}=(\vec{w_1}, \vec{w_2},...,\vec{w_m})\),則該語料的概率是
\[p(\mathcal{W})= p(\vec{w_1})p(\vec{w_2})\cdots p(\vec{w_m}) \]
在 Unigram Model 中, 我們假設了文檔之間是獨立可交換的,而文檔中的詞也是獨立可交換的,所以一篇文檔相當于一個袋子,里面裝了一些詞,而詞的順序信息就無關緊要了,這樣的模型也稱為詞袋模型(Bag-of-words)。
假設語料中總的詞頻是\(N\), 在所有的 \(N\) 個詞中,如果我們關注每個詞 \(v_i\) 的發生次數 \(n_i\),那么 \(\vec{n}=(n_1, n_2,\cdots, n_V)\) 正好是一個多項分布
\[ p(\vec{n}) = Mult(\vec{n}|\vec{p}, N)= \binom{N}{\vec{n}} \prod_{k=1}^V p_k^{n_k} \]
此時, 語料的概率是
\[\begin{align*} p(\mathcal{W})&= &p(\vec{w_1})p(\vec{w_2}) \cdots p(\vec{w_m})\\ &=&\prod_{k=1}^V p_k^{n_k} \end{align*} \]
當然,我們很重要的一個任務就是估計模型中的參數\(\vec{p}\),也就是問上帝擁有的這個骰子的各個面的概率是多大,按照統計學家中頻率派的觀點,使用最大似然估計最大化\(P(\mathcal{W})\),于是參數\(p_i\)的估計值就是
\[ \hat{p_i} = \frac{n_i}{N} .\]
對于以上模型,貝葉斯統計學派的統計學家會有不同意見,他們會很挑剔的批評只假設上帝擁有唯一一個固定的骰子是不合理的。在貝葉斯學派看來,一切參數都是隨機變量,以上模型中的骰子 \(\vec{p}\)不是唯一固定的,它也是一個隨機變量。所以按照貝葉斯學派的觀點,上帝是按照以下的過程在玩游戲的
貝葉斯 Unigram Model假設
- 帝有一個裝有無窮多個骰子的壇子,里面有各式各樣的骰子,每個骰子有 \(V\) 個面;
上帝從壇子里面抽了一個骰子出來,然后用這個骰子不斷的拋,然后產生了語料中的所有的詞;
上帝的這個壇子里面,骰子可以是無窮多個,有些類型的骰子數量多,有些類型的骰子少,所以從概率分布的角度看,壇子里面的骰子\(\vec{p}\) 服從一個概率分布 \(p(\vec{p})\),這個分布稱為參數\(\vec{p}\) 的先驗分布。
以上貝葉斯學派的游戲規則的假設之下,語料\(\mathcal{W}\)產生的概率如何計算呢?
由于我們并不知道上帝到底用了哪個骰子\(\vec{p}\),所以每個骰子都是可能被使用的,只是使用的概率由先驗分布\(p(\vec{p})\)來決定。
對每一個具體的骰子\(\vec{p}\),由該骰子產生數據的概率是 \(p(\mathcal{W}|\vec{p})\),所以最終數據產生的概率就是對每一個骰子\(\vec{p}\)上產生的數據概率進行積分累加求和
\[ p(\mathcal{W}) = \int p(\mathcal{W}|\vec{p}) p(\vec{p})d\vec{p} \]
在貝葉斯分析的框架下,此處先驗分布\(p(\vec{p})\) 就可以有很多種選擇了,注意到
\[ p(\vec{n}) = Mult(\vec{n}|\vec{p}, N) \]
實際上是在計算一個多項分布的概率,所以對先驗分布的一個比較好的選擇就是多項分布對應的共軛分布,即 Dirichlet 分布
\[ Dir(\vec{p}|\vec{\alpha})=\frac{1}{\Delta(\vec{\alpha})} \prod_{k=1}^V p_k^{\alpha_k -1},\quad \vec{\alpha}=(\alpha_1, \cdots, \alpha_V) \]
此處,\(\Delta(\vec{\alpha})\) 就是歸一化因子\(Dir(\vec{\alpha})\),即
\[ \Delta(\vec{\alpha}) =\int \prod_{k=1}^V p_k^{\alpha_k -1} d\vec{p} . \]
回顧前一個小節介紹的 Drichlet 分布的一些知識,其中很重要的一點就是
\[\text{Dirichlet 先驗 + 多項分布的數據} \longrightarrow \text{后驗分布為 Dirichlet 分布} \]
\[ Dir(\vec{p}|\vec{\alpha}) + MultCount(\vec{n}) = Dir(\vec{p}|\vec{\alpha}+\vec{n}) \]
于是,在給定了參數 \(\vec{p}\)的先驗分布 \(Dir(\vec{p}|\vec{\alpha})\) 的時候,各個詞出現頻次的數據 \(\vec{n} \sim Mult(\vec{n}|\vec{p},N)\) 為多項分布,所以無需計算,我們就可以推出后驗分布是
\[ p(\vec{p}|\mathcal{W},\vec{\alpha}) = Dir(\vec{p}|\vec{n}+ \vec{\alpha}) = \frac{1}{\Delta(\vec{n}+\vec{\alpha})} \prod_{k=1}^V p_k^{n_k + \alpha_k -1} \]
在貝葉斯的框架下,參數\(\vec{p}\)如何估計呢?由于我們已經有了參數的后驗分布,所以合理的方式是使用后驗分布的極大值點,或者是參數在后驗分布下的平均值。
在該文檔中,我們取平均值作為參數的估計值。使用上個小節中\eqref{dir-mean}式的結論,由于 \(\vec{p}\) 的后驗分布為 \(Dir(\vec{p}|\vec{n} + \vec{\alpha})\),于是
\[ E(\vec{p}) = \Bigl(\frac{n_1 + \alpha_1}{\sum_{i=1}^V(n_i + \alpha_i)}, \frac{n_2 + \alpha_2}{\sum_{i=1}^V(n_i + \alpha_i)}, \cdots, \frac{n_V + \alpha_V}{\sum_{i=1}^V(n_i + \alpha_i)} \Bigr) \]
也就是說對每一個 \(p_i\), 我們用下式做參數估計
\[ \hat{p_i} = \frac{n_i + \alpha_i}{\sum_{i=1}^V(n_i + \alpha_i)}\]
考慮到 \(\alpha_i\) 在 Dirichlet 分布中的物理意義是事件的先驗的偽計數,這個估計式子的含義是很直觀的:
每個參數的估計值是其對應事件的先驗的偽計數和數據中的計數的和在整體計數中的比例。
進一步,我們可以計算出文本語料的產生概率為
\[ \begin{align} p(\mathcal{W}|\vec{\alpha}) & = \int p(\mathcal{W}|\vec{p}) p(\vec{p}|\vec{\alpha})d\vec{p} \notag \\ & = \int \prod_{k=1}^V p_k^{n_k} Dir(\vec{p}|\vec{\alpha}) d\vec{p} \notag \\ & = \int \prod_{k=1}^V p_k^{n_k} \frac{1}{\Delta(\vec{\alpha})} \prod_{k=1}^V p_k^{\alpha_k -1} d\vec{p} \notag \\ & = \frac{1}{\Delta(\vec{\alpha})} \int \prod_{k=1}^V p_k^{n_k + \alpha_k -1} d\vec{p} \notag \\ & = \frac{\Delta(\vec{n}+\vec{\alpha})}{\Delta(\vec{\alpha})} \end{align} \]
Topic Model 和 PLSA
以上 Unigram Model 是一個很簡單的模型,模型中的假設看起來過于簡單,和人類寫文章產生每一個詞的過程差距比較大,有沒有更好的模型呢?
我們可以看看日常生活中人是如何構思文章的。如果我們要寫一篇文章,往往是先確定要寫哪幾個主題。
譬如構思一篇自然語言處理相關的文章,可能 40% 會談論語言學、30% 談論概率統計、20% 談論計算機、還有10%談論其它的主題:
- 說到語言學,我們容易想到的詞包括:語法、句子、喬姆斯基、句法分析、主語...;
- 談論概率統計,我們容易想到以下一些詞: 概率、模型、均值、方差、證明、獨立、馬爾科夫鏈、...;
- 談論計算機,我們容易想到的詞是: 內存、硬盤、編程、二進制、對象、算法、復雜度...;
我們之所以能馬上想到這些詞,是因為這些詞在對應的主題下出現的概率很高。我們可以很自然的看到,一篇文章通常是由多個主題構成的、而每一個主題大概可以用與該主題相關的頻率最高的一些詞來描述。
以上這種直觀的想法由Hoffmn 于 1999 年給出的PLSA(Probabilistic Latent Semantic Analysis) 模型中首先進行了明確的數學化。Hoffman 認為一篇文檔(Document) 可以由多個主題(Topic) 混合而成, 而每個Topic 都是詞匯上的概率分布,文章中的每個詞都是由一個固定的 Topic 生成的。下圖是英語中幾個Topic 的例子。
所有人類思考和寫文章的行為都可以認為是上帝的行為,我們繼續回到上帝的假設中,那么在 PLSA 模型中,Hoffman 認為上帝是按照如下的游戲規則來生成文本的。
算法:PLSA Topic Model
- 上帝有兩種類型的骰子,一類是 doc-topic 骰子,每個 doc-topic 骰子有 \(K\) 個面,每個面是一個 topic 的編號;
一類是 topic-word 骰子,每個 topic-word 骰子有 \(V\) 個面, 每個面對應一個詞;
- 上帝一共有 \(K\) 個 topic-word 骰子, 每個骰子有一個編號,編號從 \(1\) 到\(K\);
- 生成每篇文檔之前,上帝都先為這篇文章制造一個特定的 doc-topic 骰子,然后重復如下過程生成文檔中的詞
- 投擲這個 doc-topic 骰子,得到一個 topic 編號 \(z\)
選擇 \(K\) 個 topic-word 骰子中編號為\(z\)的那個,投擲這個骰子,于是得到一個詞
以上PLSA 模型的文檔生成的過程可以圖形化的表示為
我們可以發現在以上的游戲規則下,文檔和文檔之間是獨立可交換的,同一個文檔內的詞也是獨立可交換的,還是一個 bag-of-words 模型。游戲中的\(K\) 個topic-word 骰子,我們可以記為 \(\vec{\varphi}_1, \cdots, \vec{\varphi}_K\),對于包含\(M\)篇文檔的語料 \(C=(d_1, d_2, \cdots, d_M)\) 中的每篇文檔\(d_m\),都會有一個特定的doc-topic骰子\(\vec{\theta}_m\),所有對應的骰子記為 \(\vec{\theta}_1, \cdots, \vec{\theta}_M\)。為了方便,我們假設每個詞\(w\) 都是一個編號,對應到topic-word 骰子的面。于是在 PLSA 這個模型中,第\(m\)篇文檔 \(d_m\) 中的每個詞的生成概率為
\[ p(w|d_m) = \sum_{z=1}^K p(w|z)p(z|d_m) = \sum_{z=1}^K \varphi_{zw} \theta_{mz}\]
所以整篇文檔的生成概率為
\[ p(\vec{w}|d_m) = \prod_{i=1}^n \sum_{z=1}^K p(w_i|z)p(z|d_m) =\prod_{i=1}^n \sum_{z=1}^K \varphi_{zw_i} \theta_{dz} \]
由于文檔之間相互獨立,我們也容易寫出整個語料的生成概率。求解PLSA 這個 Topic Model 的過程匯總,模型參數并容易求解,可以使用著名的 EM 算法進行求得局部最優解,由于該模型的求解并不是本文的介紹要點,有興趣的同學參考 Hoffman 的原始論文,此處略去不講。
LDA 文本建模
游戲規則
對于上述的 PLSA 模型,貝葉斯學派顯然是有意見的,doc-topic 骰子\(\vec{\theta}_m\)和 topic-word 骰子\(\vec{\varphi}_k\)都是模型中的參數,參數都是隨機變量,怎么能沒有先驗分布呢?于是,類似于對 Unigram Model 的貝葉斯改造, 我們也可以如下在兩個骰子參數前加上先驗分布從而把 PLSA 對應的游戲過程改造為一個貝葉斯的游戲過程。
由于 \(\vec{\varphi}_k\)和\(\vec{\theta}_m\)都對應到多項分布,所以先驗分布的一個好的選擇就是Drichlet 分布,于是我們就得到了 LDA(Latent Dirichlet Allocation)模型。
在 LDA 模型中, 上帝是按照如下的規則玩文檔生成的游戲的
算法:LDA Topic Model
- 上帝有兩大壇子的骰子,第一個壇子裝的是 doc-topic 骰子,第二個壇子裝的是 topic-word 骰子;
- 上帝隨機的從第二個壇子中獨立的抽取了 \(K\) 個 topic-word 骰子,編號為 \(1\) 到\(K\);
每次生成一篇新的文檔前,上帝先從第一個壇子中隨機抽取一個 doc-topic 骰子,然后重復如下過程生成文檔中的詞
- 投擲這個 doc-topic 骰子,得到一個 topic 編號 \(z\)
- 選擇 \(K\) 個 topic-word 骰子中編號為\(z\)的那個,投擲這個骰子,于是得到一個詞
假設語料庫中有 \(M\) 篇文檔,所有的的word和對應的 topic 如下表示
\[ \begin{align*} \vec{\mathbf{w}} & = (\vec{w}_1, \cdots, \vec{w}_M) \\ \vec{\mathbf{z}} & = (\vec{z}_1, \cdots, \vec{z}_M) \end{align*} \]
其中, \(\vec{w}_m\) 表示第\(m\) 篇文檔中的詞, \(\vec{z}_m\) 表示這些詞對應的 topic 編號。
物理過程分解
使用概率圖模型表示, LDA 模型的游戲過程如圖所示。
這個概率圖可以分解為兩個主要的物理過程:
\(\vec{\alpha}\rightarrow \vec{\theta}_m \rightarrow z_{m,n}\), 這個過程表示在生成第\(m\) 篇文檔的時候,先從第一個壇子中抽了一個doc-topic 骰子 \(\vec{\theta}_m\),然后投擲這個骰子生成了文檔中第 \(n\) 個詞的topic編號\(z_{m,n}\);
\(\vec{\beta} \rightarrow \vec{\varphi}_k \rightarrow w_{m,n} | k=z_{m,n}\),這個過程表示用如下動作生成語料中第\(m\)篇文檔的第 \(n\)個詞:在上帝手頭的\(K\) 個topic-word 骰子 \(\vec{\varphi}_k\) 中,挑選編號為 \(k=z_{m,n}\)的那個骰子進行投擲,然后生成 word \(w_{m,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 共軛結構的。
由第一個物理過程,我們知道\(\vec{\alpha}\rightarrow \vec{\theta}_m \rightarrow \vec{z}_{m}\)表示生成第 \(m\) 篇文檔中的所有詞對應的topics,顯然 $\vec{\alpha}\rightarrow \vec{\theta}_m $ 對應于 Dirichlet 分布,\(\vec{\theta}_m \rightarrow \vec{z}_{m}\) 對應于 Multinomial 分布, 所以整體是一個Dirichlet-Multinomial 共軛結構;
\[ \vec{\alpha}\underbrace{\xrightarrow{\hspace*{2cm}}}_{Dirichlet} \vec{\theta}_m\underbrace{\xrightarrow{\hspace*{2cm}}}_{Multinomial} \vec{z}_{m} \]
前文介紹 Bayesian Unigram Model 的小節中我們對 Dirichlet-Multinomial 共軛結構做了一些計算。借助于該小節中的\eqref{likelihood-dir-mult}式,我們可以得到
\[ p(\vec{z}_m |\vec{\alpha}) = \frac{\Delta(\vec{n}_m+\vec{\alpha})}{\Delta(\vec{\alpha})} \]
其中 \(\vec{n}_m = (n_{m}^{(1)}, \cdots, n_{m}^{(K)})\),\(n_{m}^{(k)}\) 表示第\(m\)篇文檔中第\(k\) 個topic 產生的詞的個數。進一步,利用 Dirichlet-Multiomial 共軛結構,我們得到參數 \(\vec{\theta}_m\) 的后驗分布恰好是
\[Dir(\vec{\theta}_m| \vec{n}_m + \vec{\alpha}).\]
由于語料中 \(M\)篇文檔的 topics 生成過程相互獨立,所以我們得到 \(M\) 個相互獨立的Dirichlet-Multinomial 共軛結構,從而我們可以得到整個語料中 topics 生成概率
\[ \begin{align} p(\vec{\mathbf{z}} |\vec{\alpha}) & = \prod_{m=1}^M p(\vec{z}_m |\vec{\alpha}) \notag \\ &= \prod_{m=1}^M \frac{\Delta(\vec{n}_m+\vec{\alpha})}{\Delta(\vec{\alpha})} \end{align} \]
目前為止,我們由\(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 游戲的時候,
可以等價的按照如下過程進行:
算法:LDA Topic Model 2
- 上帝有兩大壇子的骰子,第一個壇子裝的是 doc-topic 骰子,第二個壇子裝的是 topic-word 骰子;
- 帝隨機的從第二個壇子中獨立的抽取了 \(K\) 個 topic-word 骰子,編號從 \(1\) 到\(K\);
- 每次生成一篇新的文檔前,上帝先從第一個壇子中隨機抽取一個 doc-topic 骰子,然后重復投擲這個 doc-topic 骰子,為每個詞生成一個 topic 編號\(z\);重復如上過程處理每篇文檔,生成語料中每個詞的 topic 編號,但是詞尚未生成;
從頭到尾,對語料中的每篇文檔中的每個 topic 編號 \(z\), 選擇 \(K\) 個 topic-word 骰子中編號為\(z\)的那個,投擲這個骰子,于是生成對應的word;
以上游戲是先生成了語料中所有詞的 topic, 然后對每個詞在給定 topic 的條件下生成 word。在語料中所有詞的 topic 已經生成的條件下,任何兩個 word 的生成動作都是可交換的。于是我們把語料中的詞進行交換,把具有相同 topic 的詞放在一起
\[ \begin{align*} \vec{\mathbf{w}}' &= (\vec{w}_{(1)}, \cdots, \vec{w}_{(K)}) \\ \vec{\mathbf{z}}' &= (\vec{z}_{(1)}, \cdots, \vec{z}_{(K)}) \end{align*} \]
其中,\(\vec{w}_{(k)}\) 表示這些詞都是由第 \(k\) 個 topic 生成的,\(\vec{z}_{(k)}\) 對應于這些詞的 topic 編號,所以\(\vec{z}_{(k)}\)中的分量都是\(k\)。
對應于概率圖中的第二個物理過程\(\vec{\beta} \rightarrow \vec{\varphi}_k \rightarrow w_{m,n} | k=z_{m,n}\),在 \(k=z_{m,n}\) 的限制下,語料中任何兩個由 topic \(k\) 生成的詞都是可交換的,即便他們不再同一個文檔中,所以我們此處不再考慮文檔的概念,轉而考慮由同一個 topic 生成的詞。
考慮如下過程\(\vec{\beta} \rightarrow \vec{\varphi}_k \rightarrow \vec{w}_{(k)}\) ,容易看出, 此時 $\vec{\beta} \rightarrow \vec{\varphi}_k $ 對應于 Dirichlet 分布,$ \vec{\varphi}k \rightarrow \vec{w}{(k)}$ 對應于 Multinomial 分布, 所以整體也還是一個Dirichlet-Multinomial 共軛結構;
\[ \vec{\beta}\underbrace{\xrightarrow{\hspace*{2cm}}}_{Dirichlet} \vec{\varphi}_k \underbrace{\xrightarrow{\hspace*{2cm}}}_{Multinomial} \vec{w}_{(k)} \]
同樣的借助于 likelihood-dir-mult 式,我們可以得到
\[ p(\vec{w}_{(k)} |\vec{\beta}) = \frac{\Delta(\vec{n}_k+\vec{\beta})}{\Delta(\vec{\beta})} \]
其中 \(\vec{n}_k = (n_{k}^{(1)}, \cdots, n_{k}^{(V)})\),\(n_{k}^{(t)}\) 表示第\(k\) 個topic 產生的詞中 word \(t\)的個數。
進一步,利用 Dirichlet-Multiomial 共軛結構,我們得到參數 $ \vec{\varphi}_k$ 的后驗分布恰好是
\[Dir( \vec{\varphi}_k| \vec{n}_k + \vec{\beta}).\]
而語料中 \(K\)個 topics 生成words 的過程相互獨立,所以我們得到 \(K\) 個相互獨立的Dirichlet-Multinomial 共軛結構,從而我們可以得到整個語料中詞生成概率
\[ \begin{align} p(\vec{\mathbf{w}} |\vec{\mathbf{z}},\vec{\beta}) &= p(\vec{\mathbf{w}}' |\vec{\mathbf{z}}',\vec{\beta}) \notag \\ &= \prod_{k=1}^K p(\vec{w}_{(k)} | \vec{z}_{(k)}, \vec{\beta}) \notag \\ &= \prod_{k=1}^K \frac{\Delta(\vec{n}_k+\vec{\beta})}{\Delta(\vec{\beta})} \end{align} \]
結合 \eqref{corpus-topic-prob} 和 \eqref{corpus-word-prob} 于是我們得到
\[ \begin{align} p(\vec{\mathbf{w}},\vec{\mathbf{z}} |\vec{\alpha}, \vec{\beta}) &= p(\vec{\mathbf{w}} |\vec{\mathbf{z}}, \vec{\beta}) p(\vec{\mathbf{z}} |\vec{\alpha}) \notag \\ &= \prod_{k=1}^K \frac{\Delta(\vec{n}_k+\vec{\beta})}{\Delta(\vec{\beta})} \prod_{m=1}^M \frac{\Delta(\vec{n}_m+\vec{\alpha})}{\Delta(\vec{\alpha})} \end{align} \]
此處的符號表示稍微不夠嚴謹, 向量 \(\vec{n}_k\), \(\vec{n}_m\) 都用 \(n\) 表示, 主要通過下標進行區分,\(k\) 下標為 topic 編號, \(m\) 下標為文檔編號。
Gibbs Sampling
有了聯合分布 \(p(\vec{\mathbf{w}},\vec{\mathbf{z}})\), 萬能的 MCMC 算法就可以發揮作用了!于是我們可以考慮使用 Gibbs Sampling 算法對這個分布進行采樣。當然由于 \(\vec{\mathbf{w}}\) 是觀測到的已知數據,只有 \(\vec{\mathbf{z}}\)是隱含的變量,所以我們真正需要采樣的是分布 \(p(\vec{\mathbf{z}}|\vec{\mathbf{w}})\)。在 Gregor Heinrich那篇很有名的LDA 模型科普文章 \emph{Parameter estimation for text analysis} 中,是基于\eqref{lda-corpus-likelihood} 式推導 Gibbs Sampling 公式的。此小節中我們使用不同的方式,主要是基于Dirichlet-Multinomial 共軛來推導 Gibbs Sampling 公式,這樣對于理解采樣中的概率物理過程有幫助。
語料庫\(\vec{\mathbf{z}}\) 中的第\(i\)個詞對應的 topic 我們記為\(z_i\), 其中\(i=(m,n)\)是一個二維下標,對應于第\(m\)篇文檔的第 \(n\)個詞,我們用 \(\neg i\) 表示去除下標為\(i\)的詞。那么按照 Gibbs Sampling 算法的要求,我們要求得任一個坐標軸 \(i\) 對應的條件分布 \(p(z_i = k|\vec{\mathbf{z}}_{\neg i}, \vec{\mathbf{w}})\) 。
假設已經觀測到的詞 \(w_i = t\), 則由貝葉斯法則,我們容易得到
\[ \begin{align*} p(z_i = k|\vec{\mathbf{z}}_{\neg i}, \vec{\mathbf{w}}) \propto p(z_i = k, w_i = t |\vec{\mathbf{z}}_{\neg i}, \vec{\mathbf{w}}_{\neg i}) \\ \end{align*} \]
由于\(z_i = k, w_i = t\) 只涉及到第 \(m\) 篇文檔和第\(k\)個 topic,所以上式的條件概率計算中,實際上也只會涉及到如下兩個Dirichlet-Multinomial 共軛結構
- \(\vec{\alpha} \rightarrow \vec{\theta}_m \rightarrow \vec{z}_{m}\)
- \(\vec{\beta} \rightarrow \vec{\varphi}_k \rightarrow \vec{w}_{(k)}\)
其它的 \(M+K-2\) 個 Dirichlet-Multinomial 共軛結構和\(z_i = k, w_i = t\)是獨立的。
由于在語料去掉第\(i\) 個詞對應的 \((z_i, w_i)\),并不改變我們之前討論的 \(M+K\) 個 Dirichlet-Multinomial 共軛結構,只是某些地方的計數會減少。所以\(\vec{\theta}_m, \vec{\varphi}_k\) 的后驗分布都是 Dirichlet:
\[ \begin{align*} p(\vec{\theta}_m|\vec{\mathbf{z}}_{\neg i}, \vec{\mathbf{w}}_{\neg i}) &= Dir(\vec{\theta}_m| \vec{n}_{m,\neg i} + \vec{\alpha}) \\ p(\vec{\varphi}_k|\vec{\mathbf{z}}_{\neg i}, \vec{\mathbf{w}}_{\neg i}) &= Dir( \vec{\varphi}_k| \vec{n}_{k,\neg i} + \vec{\beta}) \end{align*} \]
使用上面兩個式子,把以上想法綜合一下,我們就得到了如下的 Gibbs Sampling 公式的推導
\[ \begin{align*} p(z_i = k|\vec{\mathbf{z}}_{\neg i}, \vec{\mathbf{w}}) & \propto p(z_i = k, w_i = t |\vec{\mathbf{z}}_{\neg i}, \vec{\mathbf{w}}_{\neg i}) \\ &= \int p(z_i = k, w_i = t, \vec{\theta}_m,\vec{\varphi}_k | \vec{\mathbf{z}}_{\neg i}, \vec{\mathbf{w}}_{\neg i}) d \vec{\theta}_m d \vec{\varphi}_k \\ &= \int p(z_i = k, \vec{\theta}_m|\vec{\mathbf{z}}_{\neg i}, \vec{\mathbf{w}}_{\neg i}) \cdot p(w_i = t, \vec{\varphi}_k | \vec{\mathbf{z}}_{\neg i}, \vec{\mathbf{w}}_{\neg i}) d \vec{\theta}_m d \vec{\varphi}_k \\ &= \int p(z_i = k |\vec{\theta}_m) p(\vec{\theta}_m|\vec{\mathbf{z}}_{\neg i}, \vec{\mathbf{w}}_{\neg i}) \cdot p(w_i = t |\vec{\varphi}_k) p(\vec{\varphi}_k|\vec{\mathbf{z}}_{\neg i}, \vec{\mathbf{w}}_{\neg i}) d \vec{\theta}_m d \vec{\varphi}_k \\ &= \int p(z_i = k |\vec{\theta}_m) Dir(\vec{\theta}_m| \vec{n}_{m,\neg i} + \vec{\alpha}) d \vec{\theta}_m \\ & \hspace{0.2cm} \cdot \int p(w_i = t |\vec{\varphi}_k) Dir( \vec{\varphi}_k| \vec{n}_{k,\neg i} + \vec{\beta}) d \vec{\varphi}_k \\ &= \int \theta_{mk} Dir(\vec{\theta}_m| \vec{n}_{m,\neg i} + \vec{\alpha}) d \vec{\theta}_m \cdot \int \varphi_{kt} Dir( \vec{\varphi}_k| \vec{n}_{k,\neg i} + \vec{\beta}) d \vec{\varphi}_k \\ &= E(\theta_{mk}) \cdot E(\varphi_{kt}) \\ &= \hat{\theta}_{mk} \cdot \hat{\varphi}_{kt} \\ \end{align*} \]
以上推導估計是整篇文章中最復雜的數學了,表面上看上去復雜,但是推導過程中的概率物理意義是簡單明了的:$z_i = k, w_i = t $的概率只和兩個 Dirichlet-Multinomail 共軛結構關聯。而最終得到的 \(\hat{\theta}_{mk}, \hat{\varphi}_{kt}\)就是對應的兩個 Dirichlet 后驗分布在貝葉斯框架下的參數估計。
借助于前面介紹的Dirichlet 參數估計的公式 \eqref{dirichlet-parameter-estimation},我們有
\[ \begin{align*} \hat{\theta}_{mk} &= \frac{n_{m,\neg i}^{(k)} + \alpha_k}{\sum_{k=1}^K (n_{m,\neg i}^{(k)} + \alpha_k)} \\ \hat{\varphi}_{kt} &= \frac{n_{k,\neg i}^{(t)} + \beta_t}{\sum_{t=1}^V (n_{k,\neg i}^{(t)} + \beta_t)} \end{align*} \]
于是,我們最終得到了 LDA 模型的 Gibbs Sampling 公式
\[ p(z_i = k|\vec{\mathbf{z}}_{\neg i}, \vec{\mathbf{w}}) \propto \frac{n_{m,\neg i}^{(k)} + \alpha_k}{\sum_{k=1}^K (n_{m,\neg i}^{(k)} + \alpha_k)} \cdot \frac{n_{k,\neg i}^{(t)} + \beta_t}{\sum_{t=1}^V (n_{k,\neg i}^{(t)} + \beta_t)} \]
這個公式是很漂亮的, 右邊其實就是 \(p(topic|doc) \cdot p(word|topic)\),這個概率其實是 \(doc \rightarrow topic \rightarrow word\) 的路徑概率,由于topic 有\(K\) 個,所以 Gibbs Sampling 公式的物理意義其實就是在這\(K\) 條路徑中進行采樣。
Training and Inference
有了 LDA 模型,當然我們的目標有兩個
- 估計模型中的參數 \(\vec{\varphi}_1, \cdots, \vec{\varphi}_K\) 和 \(\vec{\theta}_1, \cdots, \vec{\theta}_M\);
- 對于新來的一篇文檔\(doc_{new}\),我們能夠計算這篇文檔的 topic 分布\(\vec{\theta}_{new}\)。
有了 Gibbs Sampling 公式, 我們就可以基于語料訓練 LDA 模型,并應用訓練得到的模型對新的文檔進行topic 語義分析。訓練的過程就是通過Gibbs Sampling 獲取語料中的 \((z,w)\) 的樣本,而模型中的所有的參數都可以基于最終采樣得到的樣本進行估計。訓練的流程很簡單:
** LDA Training**
- 隨機初始化:對語料中每篇文檔中的每個詞\(w\),隨機的賦一個 topic 編號\(z\);
- 重新掃描語料庫,對每個詞\(w\), 按照 Gibbs Sampling 公式重新采樣它的 topic,在語料中進行更新;
- 重復以上語料庫的重新采樣過程直到 Gibbs Sampling 收斂;
統計語料庫的 topic-word 共現頻率矩陣,該矩陣就是 LDA的模型;
對于 Gibbs Sampling 算法實現的細節,請參考 Gregor Heinrich 的 \emph{Parameter estimation for text analysis}中對算法的描述,以及 \href{http://code.google.com/p/plda}{PLDA} 的代碼實現,此處不再贅述。
由這個topic-word 頻率矩陣我們可以計算每一個\(p(word|topic)\)概率,從而算出模型參數\(\vec{\varphi}_1, \cdots, \vec{\varphi}_K\), 這就是上帝用的 \(K\) 個 topic-word 骰子。當然,語料中的文檔對應的骰子參數 \(\vec{\theta}_1, \cdots, \vec{\theta}_M\) 在以上訓練過程中也是可以計算出來的,只要在 Gibbs Sampling 收斂之后,統計每篇文檔中的 topic 的頻率分布,我們就可以計算每一個 \(p(topic|doc)\) 概率,于是就可以計算出每一個\(\vec{\theta}_m\)。由于參數\(\vec{\theta}_m\) 是和訓練語料中的每篇文檔相關的,對于我們理解新的文檔并無用處,所以工程上最終存儲 LDA 模型時候一般沒有必要保留。通常,在 LDA 模型訓練的過程中,我們是取 Gibbs Sampling 收斂之后的 \(n\) 個迭代的結果進行平均來做參數估計,這樣模型質量更高。
有了 LDA 的模型,對于新來的文檔 \(doc_{new}\), 我們如何做該文檔的 topic 語義分布的計算呢?基本上 inference 的過程和 training 的過程完全類似。對于新的文檔, 我們只要認為 Gibbs Sampling 公式中的 \(\hat{\varphi}_{kt}\) 部分是穩定不變的,是由訓練語料得到的模型提供的,所以采樣過程中我們只要估計該文檔的 topic 分布\(\vec{\theta}_{new}\)就好了。
LDA Inference
- 隨機初始化:對當前文檔中的每個詞\(w\),隨機的賦一個 topic 編號\(z\);
- 重新掃描當前文檔,按照 Gibbs Sampling 公式,對每個詞\(w\), 重新采樣它的 topic;
- 重復以上過程直到 Gibbs Sampling 收斂;
統計文檔中的topic分布,該分布就是 \(\vec{\theta}_{new}\)
后記
LDA 對于專業做機器學習的兄弟而言,只能算是一個簡單的Topic Model。但是對于互聯網中做數據挖掘、語義分析的工程師,LDA 的門檻并不低。LDA 典型的屬于這樣一種機器學習模型:要想理解它,需要比較多的數學背景,要在工程上進行實現,卻相對簡單。Gregor Heinrich 的LDA 模型科普文章 \emph{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
轉載于:https://www.cnblogs.com/gasongjian/p/7631978.html
總結
以上是生活随笔為你收集整理的【转】LDA数学八卦的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kcp-go源码解析
- 下一篇: javascript总for of和fo