我是這樣一步步理解--主題模型(Topic Model)、LDA(案例代碼)

1. LDA模型是什麼

LDA可以分爲以下5個步驟:

  • 一個函數:gamma函數。
  • 四個分佈:二項分佈、多項分佈、beta分佈、Dirichlet分佈。
  • 一個概念和一個理念:共軛先驗和貝葉斯框架。
  • 兩個模型:pLSA、LDA。
  • 一個採樣:Gibbs採樣

關於LDA有兩種含義,一種是線性判別分析(Linear Discriminant Analysis),一種是概率主題模型:隱含狄利克雷分佈(Latent Dirichlet Allocation,簡稱LDA),本文講後者。

按照wiki上的介紹,LDA由Blei, David M.、Ng, Andrew Y.、Jordan於2003年提出,是一種主題模型,它可以將文檔集 中每篇文檔的主題以概率分佈的形式給出,從而通過分析一些文檔抽取出它們的主題(分佈)出來後,便可以根據主題(分佈)進行主題聚類或文本分類。同時,它是一種典型的詞袋模型,即一篇文檔是由一組詞構成,詞與詞之間沒有先後順序的關係。此外,一篇文檔可以包含多個主題,文檔中每一個詞都由其中的一個主題生成。

人類是怎麼生成文檔的呢?首先先列出幾個主題,然後以一定的概率選擇主題,以一定的概率選擇這個主題包含的詞彙,最終組合成一篇文章。如下圖所示(其中不同顏色的詞語分別對應上圖中不同主題下的詞)。

那麼LDA就是跟這個反過來:根據給定的一篇文檔,反推其主題分佈。

在LDA模型中,一篇文檔生成的方式如下:

  • 從狄利克雷分佈 α\alpha 中取樣生成文檔 i 的主題分佈 θi\theta_i
  • 從主題的多項式分佈 θi\theta_i 中取樣生成文檔i第 j 個詞的主題 zi,jz_{i,j}
  • 從狄利克雷分佈 β\beta 中取樣生成主題 zi,jz_{i,j} 對應的詞語分佈 ϕzi,j\phi_{z_{i,j}}
  • 從詞語的多項式分佈 ϕzi,j\phi_{z_{i,j}} 中採樣最終生成詞語 wi,jw_{i,j}

其中,類似Beta分佈是二項式分佈的共軛先驗概率分佈,而狄利克雷分佈(Dirichlet分佈)是多項式分佈的共軛先驗概率分佈。此外,LDA的圖模型結構如下圖所示(類似貝葉斯網絡結構):

1.1 5個分佈的理解

先解釋一下以上出現的概念。

  1. 二項分佈(Binomial distribution)

    二項分佈是從伯努利分佈推進的。伯努利分佈,又稱兩點分佈或0-1分佈,是一個離散型的隨機分佈,其中的隨機變量只有兩類取值,非正即負{+,-}。而二項分佈即重複n次的伯努利試驗,記爲 Xb(n,p)X\sim_{}b(n,p)。簡言之,只做一次實驗,是伯努利分佈,重複做了n次,是二項分佈。

  2. 多項分佈

    是二項分佈擴展到多維的情況。多項分佈是指單次試驗中的隨機變量的取值不再是0-1的,而是有多種離散值可能(1,2,3…,k)。比如投擲6個面的骰子實驗,N次實驗結果服從K=6的多項分佈。其中:

    i=1kpi=1,pi>0\sum_{i=1}^{k}p_i=1,p_i>0

  3. 共軛先驗分佈

    貝葉斯統計中,如果後驗分佈先驗分佈屬於同類,則先驗分佈與後驗分佈被稱爲共軛分佈,而先驗分佈被稱爲似然函數的共軛先驗

  4. Beta分佈

    二項分佈的共軛先驗分佈。給定參數 α>0\alpha>0β>0\beta>0,取值範圍爲[0,1]的隨機變量 x 的概率密度函數:

    f(x;α,β)=1B(α,β)xα1(1x)β1f(x;\alpha,\beta)=\frac{1}{B(\alpha,\beta)}x^{\alpha-1}(1-x)^{\beta-1}

    其中:

    1B(α,β)=Γ(α+β)Γ(α)Γ(β)\frac{1}{B(\alpha,\beta)}=\frac{\Gamma(\alpha+\beta)}{\Gamma(\alpha)\Gamma(\beta)}

    Γ(z)=0tz1etdt\Gamma(z)=\int_{0}^{\infty}t^{z-1}e^{-t}dt

    注:這便是所謂的gamma函數,下文會具體闡述。

  5. 狄利克雷分佈

    是beta分佈在高維度上的推廣。Dirichlet分佈的的密度函數形式跟beta分佈的密度函數如出一轍:

    f(x1,x2,...,xk;α1,α2,...,αk)=1B(α)i=1kxiαi1f(x_1,x_2,...,x_k;\alpha_1,\alpha_2,...,\alpha_k)=\frac{1}{B(\alpha)}\prod_{i=1}^{k}x_i^{\alpha^i-1}

    其中

    B(α)=i=1kΓ(αi)Γ(i=1kαi),xi=1B(\alpha)=\frac{\prod_{i=1}^{k}\Gamma(\alpha^i)}{\Gamma(\sum_{i=1}^{k}\alpha^i)},\sum_{}x_i=1

至此,我們可以看到二項分佈和多項分佈很相似,Beta分佈和Dirichlet 分佈很相似。

如果想要深究其原理可以參考:通俗理解LDA主題模型,也可以先往下走,最後在回過頭來看詳細的公式,就更能明白了。

總之,可以得到以下幾點信息。

  • beta分佈是二項式分佈的共軛先驗概率分佈:對於非負實數 α\alphaβ\beta ,我們有如下關係:

    Beta(pα,β)+Count(m1,m2)=Beta(pα+m1,β+m2)Beta(p|\alpha,\beta)+Count(m_1,m_2)=Beta(p|\alpha+m_1,\beta+m_2)

    其中 (m1,m2)(m_1,m_2) 對應的是二項分佈 B(m1+m2,p)B(m_1+m_2,p) 的記數。針對於這種觀測到的數據符合二項分佈,參數的先驗分佈和後驗分佈都是Beta分佈的情況,就是Beta-Binomial 共軛。”

  • 狄利克雷分佈(Dirichlet分佈)是多項式分佈的共軛先驗概率分佈,一般表達式如下:

    Dir(pα)+MultCount(m)=Dir(pα+m)Dir(\vec{p}|\vec\alpha)+MultCount(\vec{m})=Dir(p|\vec{\alpha}+\vec{m})

    針對於這種觀測到的數據符合多項分佈,參數的先驗分佈和後驗分佈都是Dirichlet 分佈的情況,就是 Dirichlet-Multinomial 共軛。 ”

  • 貝葉斯派思考問題的固定模式:

    先驗分佈 π(θ)\pi(\theta)+ 樣本信息 XX = 後驗分佈 π(θx)\pi(\theta|x)

1.2 3個基礎模型的理解

在講LDA模型之前,再循序漸進理解基礎模型:Unigram model、mixture of unigrams model,以及跟LDA最爲接近的pLSA模型。爲了方便描述,首先定義一些變量:

  • ww 表示詞,VV 表示所有單詞的個數(固定值)。
  • zz 表示主題,kk 是主題的個數(預先給定,固定值)。
  • D=(W1,...,WM)D=(W_1,...,W_M) 表示語料庫,其中的M是語料庫中的文檔數(固定值)。
  • W=(w1,w2,...,wN)W=(w_1,w_2,...,w_N) 表示文檔,其中的N表示一個文檔中的詞數(隨機變量)。
  1. Unigram model

    對於文檔W=(w1,w2,...,wN)W=(w_1,w_2,...,w_N),用 p(wn)p(w_n) 表示詞 wnw_n 的先驗概率,生成文檔w的概率爲:

    p(W)=n=1Np(wn)p(W)=\prod_{n=1}^{N}p(w_n)

  2. Mixture of unigrams model

    該模型的生成過程是:給某個文檔先選擇一個主題z,再根據該主題生成文檔,該文檔中的所有詞都來自一個主題。假設主題有 z1,...,znz_1,...,z_n,生成文檔w的概率爲:

    p(W)=p(z1)n=1Np(wnz1)+...+p(zk)n=1Np(wnzk)=zp(z)n=1Np(wnz)p(W)=p(z_1)\prod_{n=1}^{N}p(w_n|z_1)+...+p(z_k)\prod_{n=1}^{N}p(w_n|z_k)=\sum_{z}p(z)\prod_{n=1}^{N}p(w_n|z)

  3. PLSA模型

    理解了pLSA模型後,到LDA模型也就一步之遙——給pLSA加上貝葉斯框架,便是LDA。

    在上面的Mixture of unigrams model中,我們假定一篇文檔只有一個主題生成,可實際中,一篇文章往往有多個主題,只是這多個主題各自在文檔中出現的概率大小不一樣。比如介紹一個國家的文檔中,往往會分別從教育、經濟、交通等多個主題進行介紹。那麼在pLSA中,文檔是怎樣被生成的呢?

    假定你一共有K個可選的主題,有V個可選的詞,咱們來玩一個扔骰子的遊戲。

    **一、**假設你每寫一篇文檔會製作一顆K面的“文檔-主題”骰子(扔此骰子能得到K個主題中的任意一個),和K個V面的“主題-詞項” 骰子(每個骰子對應一個主題,K個骰子對應之前的K個主題,且骰子的每一面對應要選擇的詞項,V個面對應着V個可選的詞)。

    比如可令K=3,即製作1個含有3個主題的“文檔-主題”骰子,這3個主題可以是:教育、經濟、交通。然後令V = 3,製作3個有着3面的“主題-詞項”骰子,其中,教育主題骰子的3個面上的詞可以是:大學、老師、課程,經濟主題骰子的3個面上的詞可以是:市場、企業、金融,交通主題骰子的3個面上的詞可以是:高鐵、汽車、飛機。

    **二、**每寫一個詞,先扔該“文檔-主題”骰子選擇主題,得到主題的結果後,使用和主題結果對應的那顆“主題-詞項”骰子,扔該骰子選擇要寫的詞。

    先扔“文檔-主題”的骰子,假設(以一定的概率)得到的主題是教育,所以下一步便是扔教育主題篩子,(以一定的概率)得到教育主題篩子對應的某個詞:大學。

    上面這個投骰子產生詞的過程簡化下便是:“先以一定的概率選取主題,再以一定的概率選取詞”。

    **三、**最後,你不停的重複扔“文檔-主題”骰子和”主題-詞項“骰子,重複N次(產生N個詞),完成一篇文檔,重複這產生一篇文檔的方法M次,則完成M篇文檔。

    上述過程抽象出來即是PLSA的文檔生成模型。在這個過程中,我們並未關注詞和詞之間的出現順序,所以pLSA是一種詞袋方法。生成文檔的整個過程便是選定文檔生成主題,確定主題生成詞。

    反過來,既然文檔已經產生,那麼如何根據已經產生好的文檔反推其主題呢?這個利用看到的文檔推斷其隱藏的主題(分佈)的過程(其實也就是產生文檔的逆過程),便是主題建模的目的:自動地發現文檔集中的主題(分佈)。

    文檔d和詞w是我們得到的樣本,可觀測得到,所以對於任意一篇文檔,其 P(wjdi)P(w_j|d_i) 是已知的。從而可以根據大量已知的文檔-詞項信息 P(wjdi)P(w_j|d_i),訓練出文檔-主題 P(zkdi)P(z_k|d_i) 和主題-詞項 P(wjzk)P(w_j|z_k),如下公式所示:

    P(wjdi)=k=1KP(wjzk)P(zkdi)P(w_j|d_i)=\sum_{k=1}^{K}P(w_j|z_k)P(z_k|d_i)

    故得到文檔中每個詞的生成概率爲:

    P(di,wj)=P(di)P(wjdi)=P(di)k=1KP(wjzk)P(zkdi)P(d_i,w_j)=P(d_i)P(w_j|d_i)=P(d_i)\sum_{k=1}^{K}P(w_j|z_k)P(z_k|d_i)

    由於 P(di)P(d_i) 可事先計算求出,而 P(wjzk)P(w_j|z_k)^{}P(zkdi)P(z_k|d_i) 未知,所以 θ=(P(wjzk),P(zkdi))\theta=(P(w_j|z_k),P(z_k|d_i)) 就是我們要估計的參數(值),通俗點說,就是要最大化這個θ。

    用什麼方法進行估計呢,常用的參數估計方法有極大似然估計MLE、最大後驗證估計MAP、貝葉斯估計等等。因爲該待估計的參數中含有隱變量z,所以我們可以考慮EM算法。詳細的EM算法可以參考之前寫過的 EM算法 章節。

1.3 LDA模型

事實上,理解了pLSA模型,也就差不多快理解了LDA模型,因爲LDA就是在pLSA的基礎上加層貝葉斯框架,即LDA就是pLSA的貝葉斯版本(正因爲LDA被貝葉斯化了,所以才需要考慮歷史先驗知識,才加的兩個先驗參數)。

下面,咱們對比下本文開頭所述的LDA模型中一篇文檔生成的方式是怎樣的:

  • 按照先驗概率 P(di)P(d_i) 選擇一篇文檔 did_i
  • 從狄利克雷分佈(即Dirichlet分佈)α\alpha 中取樣生成文檔 did_i 的主題分佈 θi\theta_i,換言之,主題分佈 θi\theta_i 由超參數爲 α\alpha 的Dirichlet分佈生成。
  • 從主題的多項式分佈 θi\theta_i 中取樣生成文檔 did_i 第 j 個詞的主題 zi,jz_{i,j}
  • 從狄利克雷分佈(即Dirichlet分佈)β\beta 中取樣生成主題 zi,jz_{i,j} 對應的詞語分佈 ϕzi,j\phi_{z_{i,j}},換言之,詞語分佈 ϕzi,j\phi_{z_{i,j}} 由參數爲 β\beta 的Dirichlet分佈生成。
  • 從詞語的多項式分佈 ϕzi,j\phi_{z_{i,j}} 中採樣最終生成詞語 wi,jw_{i,j}

LDA中,選主題和選詞依然都是兩個隨機的過程,依然可能是先從主題分佈{教育:0.5,經濟:0.3,交通:0.2}中抽取出主題:教育,然後再從該主題對應的詞分佈{大學:0.5,老師:0.3,課程:0.2}中抽取出詞:大學。

那PLSA跟LDA的區別在於什麼地方呢?區別就在於:

PLSA中,主題分佈和詞分佈是唯一確定的,能明確的指出主題分佈可能就是{教育:0.5,經濟:0.3,交通:0.2},詞分佈可能就是{大學:0.5,老師:0.3,課程:0.2}。
但在LDA中,主題分佈和詞分佈不再唯一確定不變,即無法確切給出。例如主題分佈可能是{教育:0.5,經濟:0.3,交通:0.2},也可能是{教育:0.6,經濟:0.2,交通:0.2},到底是哪個我們不再確定(即不知道),因爲它是隨機的可變化的。但再怎麼變化,也依然服從一定的分佈,即主題分佈跟詞分佈由Dirichlet先驗隨機確定。正因爲LDA是PLSA的貝葉斯版本,所以主題分佈跟詞分佈本身由先驗知識隨機給定。

換言之,LDA在pLSA的基礎上給這兩參數 (P(zkdi)P(wjzk))(P(z_k|d_i)、P(w_j|z_k)) 加了兩個先驗分佈的參數(貝葉斯化):一個主題分佈的先驗分佈Dirichlet分佈 α\alpha,和一個詞語分佈的先驗分佈Dirichlet分佈 β\beta

綜上,LDA真的只是pLSA的貝葉斯版本,文檔生成後,兩者都要根據文檔去推斷其主題分佈和詞語分佈(即兩者本質都是爲了估計給定文檔生成主題,給定主題生成詞語的概率),只是用的參數推斷方法不同,在pLSA中用極大似然估計的思想去推斷兩未知的固定參數,而LDA則把這兩參數弄成隨機變量,且加入dirichlet先驗。

所以,pLSA跟LDA的本質區別就在於它們去估計未知參數所採用的思想不同,前者用的是頻率派思想,後者用的是貝葉斯派思想。

LDA參數估計:Gibbs採樣,詳見文末的參考文獻。

2. 怎麼確定LDA的topic個數?

  1. 基於經驗 主觀判斷、不斷調試、操作性強、最爲常用。
  2. 基於困惑度(主要是比較兩個模型之間的好壞)。
  3. 使用Log-邊際似然函數的方法,這種方法也挺常用的。
  4. 非參數方法:Teh提出的基於狄利克雷過程的HDP法。
  5. 基於主題之間的相似度:計算主題向量之間的餘弦距離,KL距離等。

3. 如何用主題模型解決推薦系統中的冷啓動問題?

推薦系統中的冷啓動問題是指在沒有大量用戶數據的情況下如何給用戶進行個性化推薦,目的是最優化點擊率、轉化率或用戶 體驗(用戶停留時間、留存率等)。冷啓動問題一般分爲用戶冷啓動、物品冷啓動和系統冷啓動三大類。

  • 用戶冷啓動是指對一個之前沒有行爲或行爲極少的新用戶進行推薦;
  • 物品冷啓動是指爲一個新上市的商品或電影(這時沒有與之相關的 評分或用戶行爲數據)尋找到具有潛在興趣的用戶;
  • 系統冷啓動是指如何爲一個 新開發的網站設計個性化推薦系統。

解決冷啓動問題的方法一般是基於內容的推薦。以Hulu的場景爲例,對於用 戶冷啓動來說,我們希望根據用戶的註冊信息(如:年齡、性別、愛好等)、搜 索關鍵詞或者合法站外得到的其他信息(例如用戶使用Facebook賬號登錄,並得 到授權,可以得到Facebook中的朋友關係和評論內容)來推測用戶的興趣主題。 得到用戶的興趣主題之後,我們就可以找到與該用戶興趣主題相同的其他用戶, 通過他們的歷史行爲來預測用戶感興趣的電影是什麼。

同樣地,對於物品冷啓動問題,我們也可以根據電影的導演、演員、類別、關鍵詞等信息推測該電影所屬於的主題,然後基於主題向量找到相似的電影,並將新電影推薦給以往喜歡看這 些相似電影的用戶。可以使用主題模型(pLSA、LDA等)得到用戶和電影的主題。

以用戶爲例,我們將每個用戶看作主題模型中的一篇文檔,用戶對應的特徵 作爲文檔中的單詞,這樣每個用戶可以表示成一袋子特徵的形式。通過主題模型 學習之後,經常共同出現的特徵將會對應同一個主題,同時每個用戶也會相應地 得到一個主題分佈。每個電影的主題分佈也可以用類似的方法得到。

**那麼如何解決系統冷啓動問題呢?**首先可以得到每個用戶和電影對應的主題向量,除此之外,還需要知道用戶主題和電影主題之間的偏好程度,也就是哪些主題的用戶可能喜歡哪些主題的電影。當系統中沒有任何數據時,我們需要一些先驗知識來指定,並且由於主題的數目通常比較小,隨着系統的上線,收集到少量的數據之後我們就可以對主題之間的偏好程度得到一個比較準確的估計。

4. 參考文獻

通俗理解LDA主題模型

5. 代碼實現

LDA模型應用:一眼看穿希拉里的郵件


作者:@mantchs

GitHub:https://github.com/NLP-LOVE/ML-NLP

歡迎大家加入討論!共同完善此項目!羣號:【541954936】NLP面試學習羣

我的博客即將同步至騰訊雲+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=2uu2jp8vgf8k0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章