最近針對項目中涉及到的APP描述信息分類問題,有針對性地學習了LDA主題模型,發現涉及內容較多,有必要記錄一下。接下來從簡單到復雜:
什么是主題模型?

所謂主題模型,就是給定一篇文檔,我去判斷這篇文章是屬於什么類別的文檔,例如文章中出現吳恩達,可能就是一篇機器學習相關文檔。現在我們給出一篇文檔,我們的目的就是判斷這篇文檔是什么類型的。
直觀版
假設某企業想要招聘一個工程師,他們收到了很多簡歷,他們想通過簡歷來判斷誰是大牛,誰是小白。簡歷中一般包含了很多個人特征,例如:1.北京郵電大學畢業2.百度實習3.經常穿條紋襯衫4.參加過數據競賽,等等。由以下這三個要素,構成了這家企業的人力總監判斷基礎:

這位人力總監要做的事情是: (假設這位HR是小白)
1.拿出一份份簡歷,記錄下來每份簡歷包含的特征,但他可能不知道這一切代表着什么
2.他根據這些特征開始猜測,看到了簡歷A,里面提到學生畢業於北郵,他猜這個學生八成是個優秀碼農,但一看他沒有競賽經歷,有點擔憂,可能覺得這個學生只是個理論帝。
3.接着又開始看B看C等等
經過大量查閱簡歷和與應聘者的實際接觸,他慢慢總結經驗,調整自己的預期。
但如果這個HR是一個老司機,他可以通過經驗統計來調整自己的猜想:
1.比如他曾面試了一個競賽金牌的應聘者,發現這個應聘者能力很強。這證明競賽可能真的很有用。
2.但如果他面試了一個沒有項目經歷的人,發現這個人技術不行,那可能這個項目經歷很重要。
他根據自己經歷過的東西,大概進行一個組合,去猜測是大牛還是小白。
HR根據自己已有的概念,認為某些特征對自己招人特別有幫助,他可能就會更加關注這些內容,找出更加適合的人。
以上,就是我們用現實的例子模擬的LDA模型來區分簡歷好壞
在文本的主題分類中,我們的例子和實際之間的聯系如下:

其實這樣的一個區分應聘者好壞的程度,就類似於根據文檔區分主題的過程。特征和單詞可以組成簡歷和文檔,我們通過簡歷和文檔中的特征和單詞來區分好壞應聘者或者主題。
什么是LDA?
Latent Dirichlet Allocation:
* 是一種無監督的貝葉斯模型(這個 貝葉斯模型 將會在公式版里面闡述)
* 是一種主題模型,它可以將文檔集中每篇文檔的主題按照概率分布的形式給出。同時它是一種無監督學習算法,在訓練時不需要手工標注的訓練集,需要的僅僅是文檔集以及指定主題的數量k即可。此外LDA的另一個優點是,對於每一個主題均可找出一些詞語來描述它。(有監督學習可以使用詞頻或者詞向量來對文本進行具體的分類。我們可以通過描述每個主題的TOP詞匯來猜測這個主題大概是什么意思)
* 是一種典型的詞袋模型,即它認為一篇文檔是由一組詞構成的一個集合,詞與詞之間沒有順序以及先后的關系。一篇文檔可以包含多個主題,文檔中每一個詞都由其中的一個主題生成。
什么是貝葉斯模型?

第一行其實就是一個條件概率,就是兩者同時發生的概率,等於在θ發生的情況下,y發生的概率乘以θ發生的概率。
第二行就是把條件概率公式帶入到另一個條件概率公式中,這個公式就是貝葉斯公式。這個公式其實就是通過貝葉斯公式將前后兩者進行了一個交換律。
當已知y去推斷出現θ的概率不好得出時,我們可以進行這樣一個變換。
先驗,后驗與似然

在整個貝葉斯學派中,世界上的概率分為先驗、后驗與似然。先驗指在事情沒發生的時候,我對這個事情的判斷。似然是指現在發生了這件事情,這件事情對我產生了影響,最終得到了后驗知識。大概直觀版就是這樣,接下來加入一些公式。
標准版
我們用LDA找尋的就是之前例子里HR統計出來的經驗:
一份簡歷的每個特征都是因為本人有一定的概率是好/壞程序員,並從好/壞這個分類中以一定概率選擇某些特征而組成的。
一篇文章的每個詞都是以一定概率選擇了某個主題,並從這個主題中以一定概率選擇某個詞語而組成的。

所以根據貝葉斯公式,我們現在可以把這三者列成一個鏈式關系(其中有一些變量的約減)。
也就是說,從后往前看,當我們確定一篇文檔以后,我們可以判斷它屬於每個主題的概率是多少,當選取了某個固定主題后,我們可以判斷在這個主題下,得出某個具體單詞的概率是多少。把兩項相乘后,我們可以得到當給出一篇文檔后,我們生成這些單詞的概率是多少。
重點在於,第一項我們可以通過已有文檔統計得出,后兩者可以通過頻度計算得出。文檔屬於哪個分布,我們計算下來。主題出現了哪個單詞,同樣記錄下來。這些都是通過每一次經驗慢慢得到的。我們可以通過第一項來判斷現在的乘積是否符合要求。
P(單詞|文檔)是某個單詞出現在某篇文檔中的個數除以這篇文檔詞語總數

所以在做LDA的時候,我們需要計算得到兩個概率分布。這兩個分布的乘積,可以讓我們來印證在某篇文檔條件下,出現某個詞的概率是多少。我們可以調整這兩個分布,直到等號前后可以擬合。
一開始我們從文檔主題分布抽取一個主題(例如體育),再從這個主題詞匯分布中抽取一個詞。來判斷這個乘積和文檔詞匯的概率擬合與否,如果擬合說明主題選對了;如果不擬合,我們再繼續選擇下一個主題,選擇對應主題下的一個單詞。來不斷更新概率分布。值得注意的是,這里的詞是所有文檔中的所有詞,所以對應於不同的主題,它都畫在這個主題詞匯分布圖中,只不過大小高低可能不一樣。
這個分布改變的依據是根據,這個文檔本身有這個詞的事實來改變。
LDA生成過程
對於語料庫中的每篇文檔,LDA定義了如下生成過程:
1.對每一篇文檔,從主題分布中抽取一個主題
2.從上述被抽到的主題所對應的單詞分布中抽取一個單詞
3.重復上述過程直至遍歷文檔中的每一個單詞
針對1過程,一開始並不知道我抽到的主題對不對,我們一開始就隨機設它是一個怎樣的分布,例如正態分布。

這兩個結果向量其實就是前面描述到的,文檔主題分布、主題詞匯分布。
第一個向量的表述形式是這樣的,它對整個文檔集合中具體的一篇文檔d,得出它對應不同topic的概率,(topic一個有k個),其中pti對應這篇文檔每一個具體topic的概率,可以通過 屬於某個topic的單詞數 除以 這篇文檔的詞總數 得到。(這里,不同topic可能包含相同的詞)
同理,對應某一個具體的topic,我們從整個詞匯表中的m個詞中,我們去看針對一個具體的主題,它的詞匯分布在整個詞匯表中大概是個什么樣子的。
這兩個概率都可以通過遍歷文檔得出,而這兩個概率結果的乘積就等於 基於這個文檔生成這個詞的概率(這個概率乘積是用對應的值來乘,而不是這兩個分布);如果等式兩邊不成立,證明這兩個分布不太對,我們需要不斷更新。
所以,LDA的核心公式如下:

直觀的看這個公式,就是以topic作為中間層,可以通過當前的θd和φt給出了文檔d中出現單詞w的概率。其中p(t|d)利用θd計算得到,p(w|t)利用φt計算得到。
實際上,利用當前的θd和φt,我們可以為一個文檔中的一個單詞計算它對應任意一個topic時的p(w|d),然后根據這些結果來更新這個詞對應的topic。然后,如果這個更新改變了這個單詞所對應的topic,就會反過來影響θd和φt。
等式后面可以通過概率統計形式來得出,相乘結果去擬合等式前面的部分。神奇的地方就在於,我們通過改變topic的具體形式,來達到等式成立這個目的。其中topic是一個隱含層,舉一個例子,一開始topic可能包含的詞匯有(劉翔,周傑倫),直到最后收斂為(周傑倫,費玉清)。也就是通過中間層去慢慢修改theta和fai這兩個分布,最終擬合成我們這個符合客觀事實的,即 文檔主題 和 主題詞匯分布。
不過需要關注的是,我們其實需要求的是P(t|d),這個等式是為了學習出這樣一個符合條件的分布。即我們可以通過給出一個文檔,直接確定出這個文檔主題的分布。

一開始可以隨機對這兩個分布給一個正態分布,相當於給這兩個分布一個先驗值,(因為這個東西可以通過等式擬合來修正),通過似然數據來對先驗進行調整,最后得到后驗概率。
其實這里就大概說明了LDA所做的事情。

