1. 程式人生 > >我是這樣一步步理解--主題模型(Topic Model)、LDA(案例程式碼)

我是這樣一步步理解--主題模型(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模型應用:一眼看穿希拉里的郵件


作者:@mantchs

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

歡迎大家加入討論!共同完善此專案!群號:【541954936】