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

1. LDA模型是什麼

LDA能夠分爲如下5個步驟:git

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

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

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

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

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

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

  • 從狄利克雷分佈 \(\alpha\) 中取樣生成文檔 i 的主題分佈 \(\theta_i\)
  • 從主題的多項式分佈 \(\theta_i\) 中取樣生成文檔i第 j 個詞的主題 \(z_{i,j}\)
  • 從狄利克雷分佈 \(\beta\) 中取樣生成主題 \(z_{i,j}\) 對應的詞語分佈 \(\phi_{z_{i,j}}\)
  • 從詞語的多項式分佈 \(\phi_{z_{i,j}}\) 中採樣最終生成詞語 \(w_{i,j}\)

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

1.1 5個分佈的理解

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

  1. 二項分佈(Binomial distribution)優化

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

  2. 多項分佈

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

    \[\sum_{i=1}^{k}p_i=1,p_i>0\]

  3. 共軛先驗分佈

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

  4. Beta分佈

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

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

    其中:

    \[\frac{1}{B(\alpha,\beta)}=\frac{\Gamma(\alpha+\beta)}{\Gamma(\alpha)\Gamma(\beta)}\]

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

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

  5. 狄利克雷分佈

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

    \[f(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(\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|\alpha,\beta)+Count(m_1,m_2)=Beta(p|\alpha+m_1,\beta+m_2)\]

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

  • 狄利克雷分佈(Dirichlet分佈)是多項式分佈的共軛先驗機率分佈,通常表達式以下:

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

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

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

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

1.2 3個基礎模型的理解

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

  • \(w\) 表示詞,\(V\) 表示全部單詞的個數(固定值)。
  • \(z\) 表示主題,\(k\) 是主題的個數(預先給定,固定值)。
  • \(D=(W_1,...,W_M)\) 表示語料庫,其中的M是語料庫中的文檔數(固定值)。
  • \(W=(w_1,w_2,...,w_N)\) 表示文檔,其中的N表示一個文檔中的詞數(隨機變量)。
  1. Unigram model

    對於文檔\(W=(w_1,w_2,...,w_N)\),用 \(p(w_n)\) 表示詞 \(w_n\) 的先驗機率,生成文檔w的機率爲:

    \[p(W)=\prod_{n=1}^{N}p(w_n)\]

  2. Mixture of unigrams model

    該模型的生成過程是:給某個文檔先選擇一個主題z,再根據該主題生成文檔,該文檔中的全部詞都來自一個主題。假設主題有 \(z_1,...,z_n\),生成文檔w的機率爲:

    \[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個可選的詞,我們來玩一個扔骰子的遊戲。

    1、假設你每寫一篇文檔會製做一顆K面的「文檔-主題」骰子(扔此骰子能獲得K個主題中的任意一個),和K個V面的「主題-詞項」 骰子(每一個骰子對應一個主題,K個骰子對應以前的K個主題,且骰子的每一面對應要選擇的詞項,V個面對應着V個可選的詞)。

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

    2、每寫一個詞,先扔該「文檔-主題」骰子選擇主題,獲得主題的結果後,使用和主題結果對應的那顆「主題-詞項」骰子,扔該骰子選擇要寫的詞。

    先扔「文檔-主題」的骰子,假設(以必定的機率)獲得的主題是教育,因此下一步即是扔教育主題篩子,(以必定的機率)獲得教育主題篩子對應的某個詞:大學。

    上面這個投骰子產生詞的過程簡化下即是:「先以必定的機率選取主題,再以必定的機率選取詞」。

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

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

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

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

    \[P(w_j|d_i)=\sum_{k=1}^{K}P(w_j|z_k)P(z_k|d_i)\]

    故獲得文檔中每一個詞的生成機率爲:

    \[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(d_i)\) 可事先計算求出,而 \(P(w_j|z_k)^{}\)\(P(z_k|d_i)\) 未知,因此 \(\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(d_i)\) 選擇一篇文檔 \(d_i\)
  • 從狄利克雷分佈(即Dirichlet分佈)\(\alpha\) 中取樣生成文檔 \(d_i\) 的主題分佈 \(\theta_i\),換言之,主題分佈 \(\theta_i\) 由超參數爲 \(\alpha\) 的Dirichlet分佈生成。
  • 從主題的多項式分佈 \(\theta_i\) 中取樣生成文檔 \(d_i\) 第 j 個詞的主題 \(z_{i,j}\)
  • 從狄利克雷分佈(即Dirichlet分佈)\(\beta\) 中取樣生成主題 \(z_{i,j}\) 對應的詞語分佈 \(\phi_{z_{i,j}}\),換言之,詞語分佈 \(\phi_{z_{i,j}}\) 由參數爲 \(\beta\) 的Dirichlet分佈生成。
  • 從詞語的多項式分佈 \(\phi_{z_{i,j}}\) 中採樣最終生成詞語 \(w_{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(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面試學習羣

相關文章
相關標籤/搜索