我是這樣一步步理解--主題模型(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 的主題分布 \(\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個可選的詞,咱們來玩一個扔骰子的游戲。

    一、假設你每寫一篇文檔會制作一顆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(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模型應用:一眼看穿希拉里的郵件

機器學習通俗易懂系列文章

3.png


作者:@mantchs

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

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


免責聲明!

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



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