文本主題模型之LDA(二) LDA求解之Gibbs采樣算法


            文本主題模型之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) 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM