文字主題模型之LDA(二) LDA求解之Gibbs取樣演算法
本文是LDA主題模型的第二篇,讀這一篇之前建議先讀文字主題模型之LDA(一) LDA基礎,同時由於使用了基於MCMC的Gibbs取樣演算法,如果你對MCMC和Gibbs取樣不熟悉,建議閱讀之前寫的MCMC系列MCMC(四)Gibbs取樣。
1. Gibbs取樣演算法求解LDA的思路
首先,回顧LDA的模型圖如下:
在Gibbs取樣演算法求解LDA的方法中,我們的$\alpha, \eta$是已知的先驗輸入,我們的目標是得到各個$z_{dn}, w_{kn}$對應的整體$\vec z,\vec w$的概率分佈,即文件主題的分佈和主題詞的分佈。由於我們是採用Gibbs取樣法,則對於要求的目標分佈,我們需要得到對應分佈各個特徵維度的條件概率分佈。
具體到我們的問題,我們的所有文件聯合起來形成的詞向量$\vec w$是已知的資料,不知道的是語料庫主題$\vec z$的分佈。假如我們可以先求出$w,z$的聯合分佈$p(\vec w,\vec z)$,進而可以求出某一個詞$w_i$對應主題特徵$z_i$的條件概率分佈$p(z_i=k| \vec w,\vec z_{\neg i})$。其中,$\vec z_{\neg i}$代表去掉下標為$i$的詞後的主題分佈。有了條件概率分佈$p(z_i=k| \vec w,\vec z_{\neg i})$,我們就可以進行Gibbs取樣,最終在Gibbs取樣收斂後得到第$i$個詞的主題。
如果我們通過取樣得到了所有詞的主題,那麼通過統計所有詞的主題計數,就可以得到各個主題的詞分佈。接著統計各個文件對應詞的主題計數,就可以得到各個文件的主題分佈。
以上就是Gibbs取樣演算法求解LDA的思路。
2. 主題和詞的聯合分佈與條件分佈的求解
從上一節可以發現,要使用Gibbs取樣求解LDA,關鍵是得到條件概率$p(z_i=k| \vec w,\vec z_{\neg i})$的表示式。那麼這一節我們的目標就是求出這個表示式供Gibbs取樣使用。
首先我們簡化下Dirichlet分佈的表示式,其中$\triangle(\alpha)$是歸一化引數:$$Dirichlet(\vec p| \vec \alpha) = \frac{\Gamma(\sum\limits_{k=1}^K\alpha_k)}{\prod_{k=1}^K\Gamma(\alpha_k)}\prod_{k=1}^Kp_k^{\alpha_k-1} = \frac{1}{\triangle( \vec \alpha)}\prod_{k=1}^Kp_k^{\alpha_k-1}$$
現在我們先計算下第d個文件的主題的條件分佈$p(\vec z_d|\alpha)$,在上一篇中我們講到$\alpha \to \theta_d \to \vec z_d$組成了Dirichlet-multi共軛,利用這組分佈,計算$p(\vec z_d| \vec \alpha)$如下:$$ \begin{align} p(\vec z_d| \vec \alpha) & = \int p(\vec z_d | \vec \theta_d) p(\theta_d | \vec \alpha) d \vec \theta_d \\ & = \int \prod_{k=1}^Kp_k^{n_d^{(k)}} Dirichlet(\vec \alpha) d \vec \theta_d \\ & = \int \prod_{k=1}^Kp_k^{n_d^{(k)}} \frac{1}{\triangle( \vec \alpha)}\prod_{k=1}^Kp_k^{\alpha_k-1}d \vec \theta_d \\ & = \frac{1}{\triangle( \vec \alpha)} \int \prod_{k=1}^Kp_k^{n_d^{(k)} + \alpha_k-1}d \vec \theta_d \\ & = \frac{\triangle(\vec n_d + \vec \alpha)}{\triangle( \vec \alpha)} \end{align}$$
其中,在第d個文件中,第k個主題的詞的個數表示為:$n_d^{(k)}$, 對應的多項分佈的計數可以表示為 $$\vec n_d = (n_d^{(1)}, n_d^{(2)},...n_d^{(K)})$$
有了單一一個文件的主題條件分佈,則可以得到所有文件的主題條件分佈為:$$p(\vec z|\vec \alpha) = \prod_{d=1}^Mp(\vec z_d|\vec \alpha) = \prod_{d=1}^M \frac{\triangle(\vec n_d + \vec \alpha)}{\triangle( \vec \alpha)} $$
同樣的方法,可以得到,第k個主題對應的詞的條件分佈$p(\vec w|\vec z, \vec \eta)$為:$$p(\vec w|\vec z, \vec \eta) =\prod_{k=1}^Kp(\vec w_k|\vec z, \vec \eta) =\prod_{k=1}^K \frac{\triangle(\vec n_k + \vec \eta)}{\triangle( \vec \eta)}$$
其中,第k個主題中,第v個詞的個數表示為:$n_k^{(v)}$, 對應的多項分佈的計數可以表示為 $$\vec n_k = (n_k^{(1)}, n_k^{(2)},...n_k^{(V)})$$
最終我們得到主題和詞的聯合分佈$p(\vec w, \vec z| \vec \alpha, \vec \eta)$如下:$$p(\vec w, \vec z) \propto p(\vec w, \vec z| \vec \alpha, \vec \eta) = p(\vec z|\vec \alpha) p(\vec w|\vec z, \vec \eta) = \prod_{d=1}^M \frac{\triangle(\vec n_d + \vec \alpha)}{\triangle( \vec \alpha)}\prod_{k=1}^K \frac{\triangle(\vec n_k + \vec \eta)}{\triangle( \vec \eta)} $$
有了聯合分佈,現在我們就可以求Gibbs取樣需要的條件分佈$p(z_i=k| \vec w,\vec z_{\neg i})$了。需要注意的是這裡的i是一個二維下標,對應第d篇文件的第n個詞。
對於下標$i$,由於它對應的詞$w_i$是可以觀察到的,因此我們有:$$p(z_i=k| \vec w,\vec z_{\neg i}) \propto p(z_i=k, w_i =t| \vec w_{\neg i},\vec z_{\neg i})$$
對於$z_i=k, w_i =t$,它只涉及到第d篇文件和第k個主題兩個Dirichlet-multi共軛,即:$$\vec \alpha \to \vec \theta_d \to \vec z_d $$$$\vec \eta \to \vec \beta_k \to \vec w_{(k)}$$
其餘的$M+K-2$個Dirichlet-multi共軛和它們這兩個共軛是獨立的。如果我們在語料庫中去掉$z_i,w_i$,並不會改變之前的$M+K$個Dirichlet-multi共軛結構,只是向量的某些位置的計數會減少,因此對於$\vec \theta_d, \vec \beta_k$,對應的後驗分佈為:$$p(\vec \theta_d | \vec w_{\neg i},\vec z_{\neg i}) = Dirichlet(\vec \theta_d | \vec n_{d, \neg i} + \vec \alpha) $$$$p(\vec \beta_k | \vec w_{\neg i},\vec z_{\neg i}) = Dirichlet(\vec \beta_k | \vec n_{k, \neg i} + \vec \eta) $$
現在開始計算Gibbs取樣需要的條件概率:$$ \begin{align} p(z_i=k| \vec w,\vec z_{\neg i}) & \propto p(z_i=k, w_i =t| \vec w_{\neg i},\vec z_{\neg i}) \\ & = \int p(z_i=k, w_i =t, \vec \theta_d , \vec \beta_k| \vec w_{\neg i},\vec z_{\neg i}) d\vec \theta_d d\vec \beta_k \\ & = \int p(z_i=k, \vec \theta_d | \vec w_{\neg i},\vec z_{\neg i})p(w_i=t, \vec \beta_k | \vec w_{\neg i},\vec z_{\neg i}) d\vec \theta_d d\vec \beta_k \\ & = \int p(z_i=k|\vec \theta_d )p( \vec \theta_d | \vec w_{\neg i},\vec z_{\neg i})p(w_i=t|\vec \beta_k)p(\vec \beta_k | \vec w_{\neg i},\vec z_{\neg i}) d\vec \theta_d d\vec \beta_k \\ & = \int p(z_i=k|\vec \theta_d ) Dirichlet(\vec \theta_d | \vec n_{d, \neg i} + \vec \alpha) d\vec \theta_d \\ & * \int p(w_i=t|\vec \beta_k) Dirichlet(\vec \beta_k | \vec n_{k, \neg i} + \vec \eta) d\vec \beta_k \\ & = \int \theta_{dk} Dirichlet(\vec \theta_d | \vec n_{d, \neg i} + \vec \alpha) d\vec \theta_d \int \beta_{kt} Dirichlet(\vec \beta_k | \vec n_{k, \neg i} + \vec \eta) d\vec \beta_k \\ & = E_{Dirichlet(\theta_d)}(\theta_{dk})E_{Dirichlet(\beta_k)}(\beta_{kt})\end{align}$$
在上一篇LDA基礎裡我們講到了Dirichlet分佈的期望公式,因此我們有:$$E_{Dirichlet(\theta_d)}(\theta_{dk}) = \frac{n_{d, \neg i}^{k} + \alpha_k}{\sum\limits_{s=1}^Kn_{d, \neg i}^{s} + \alpha_s}$$$$E_{Dirichlet(\beta_k)}(\beta_{kt})= \frac{n_{k, \neg i}^{t} + \eta_t}{\sum\limits_{f=1}^Vn_{k, \neg i}^{f} + \eta_f}$$
最終我們得到每個詞對應主題的Gibbs取樣的條件概率公式為:$$p(z_i=k| \vec w,\vec z_{\neg i}) = \frac{n_{d, \neg i}^{k} + \alpha_k}{\sum\limits_{s=1}^Kn_{d, \neg i}^{s} + \alpha_s} \frac{n_{k, \neg i}^{t} + \eta_t}{\sum\limits_{f=1}^Vn_{k, \neg i}^{f} + \eta_f}$$
有了這個公式,我們就可以用Gibbs取樣去取樣所有詞的主題,當Gibbs取樣收斂後,即得到所有詞的取樣主題。
利用所有采樣得到的詞和主題的對應關係,我們就可以得到每個文件詞主題的分佈$\theta_d$和每個主題中所有詞的分佈$\beta_k$。
3. LDA Gibbs取樣演算法流程總結
現在我們總結下LDA Gibbs取樣演算法流程。首先是訓練流程:
1) 選擇合適的主題數$K$, 選擇合適的超引數向量$\vec \alpha,\vec \eta$
2) 對應語料庫中每一篇文件的每一個詞,隨機的賦予一個主題編號$z$
3) 重新掃描語料庫,對於每一個詞,利用Gibbs取樣公式更新它的topic編號,並更新語料庫中該詞的編號。
4) 重複第3步的基於座標軸輪換的Gibbs取樣,直到Gibbs取樣收斂。
5) 統計語料庫中的各個文件各個詞的主題,得到文件主題分佈$\theta_d$,統計語料庫中各個主題詞的分佈,得到LDA的主題與詞的分佈$\beta_k$。
下面我們再來看看當新文件出現時,如何統計該文件的主題。此時我們的模型已定,也就是LDA的各個主題的詞分佈$\beta_k$已經確定,我們需要得到的是該文件的主題分佈。因此在Gibbs取樣時,我們的$E_{Dirichlet(\beta_k)}(\beta_{kt})$已經固定,只需要對前半部分$E_{Dirichlet(\theta_d)}(\theta_{dk})$進行取樣計算即可。
現在我們總結下LDA Gibbs取樣演算法的預測流程:
1) 對應當前文件的每一個詞,隨機的賦予一個主題編號$z$
2) 重新掃描當前文件,對於每一個詞,利用Gibbs取樣公式更新它的topic編號。
3) 重複第2步的基於座標軸輪換的Gibbs取樣,直到Gibbs取樣收斂。
4) 統計文件中各個詞的主題,得到該文件主題分佈。
4. LDA Gibbs取樣演算法小結
使用Gibbs取樣演算法訓練LDA模型,我們需要先確定三個超引數$K, \vec \alpha,\vec \eta$。其中選擇一個合適的$K$尤其關鍵,這個值一般和我們解決問題的目的有關。如果只是簡單的語義區分,則較小的$K$即可,如果是複雜的語義區分,則$K$需要較大,而且還需要足夠的語料。
由於Gibbs取樣可以很容易的並行化,因此也可以很方便的使用大資料平臺來分散式的訓練海量文件的LDA模型。以上就是LDA Gibbs取樣演算法。
後面我們會介紹用變分推斷EM演算法來求解LDA主題模型,這個方法是scikit-learn和spark MLlib都使用的LDA求解方法。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)