文字主題模型之LDA(二) LDA求解之Gibbs取樣演算法

劉建平Pinard發表於2017-05-18

            文字主題模型之LDA(一) LDA基礎

    文字主題模型之LDA(二) LDA求解之Gibbs取樣演算法

    文字主題模型之LDA(三) LDA求解之變分推斷EM演算法

    本文是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) 

相關文章