LDA主題模型簡介

LDA的代碼實現:http://blog.csdn.net/u010551621/article/details/45258573

文本建模

我們日常生活中總是產生大量的文本,如果每個文本存儲為一篇文章,那么每篇文檔從人的觀察來說就是有序的詞的序列d=(w1,w1,...,wn)

包含m篇文章的語料庫

統計文本建模的目的就是追問這些觀察到預料庫的詞序列是如何生成的,統計學被人們描述為猜測上帝的游戲,人類產生的所有語料文本我們都可以看成是上帝拋擲骰子生成的,我們觀察到的只是上帝玩這個游戲的結果--詞序列構成的語料,而上帝玩游戲的過程對我們是個黑盒子。所以在文本建模中我們希望可以猜測出上帝是如何玩這個游戲的,具體一點,核心的兩個問題是:

1.上帝都有什么樣的骰子

2.上帝是如何拋擲這些骰子的

第一個問題就是表示模型中都有哪些參數,骰子的每一個面的概率都對應的模型的參數;第二個問題就是游戲規則是什么,上帝可能有各種不同類型的骰子,上帝可能按照一定的規則拋擲這些骰子產生詞序列

1.Unigram Model

假設我們的詞典中一共有V個詞v1,v2,...,vV,那么最簡單的Unigram Model就是認為上帝是按照如下的游戲規則產生文本的

(1)上帝只有一個骰子,這個骰子有V個面,每個面對應一個詞,各個面的概率不一;

(2)每拋出一次骰子,拋出的面就對應的產生于一個詞;如果一篇文檔中有n個詞,那么上帝就是獨立的拋擲n詞骰子產生這n個詞

上帝的唯一的骰子的各個面的概率是記為:

各個面的概率

所以每次投擲骰子類似于一個拋硬幣時的貝努利實驗,只是貝努利實驗中我們拋擲的是兩面的骰子,而此處拋擲的是V面的骰子,我們把拋這個V面的骰子的實驗記為

拋擲V面的骰子實驗
上帝拋擲V個面的骰子

對于一篇文檔:

該文檔被生成的概率:

而文檔和文檔之間被認為是獨立的,所以如果語料中有多篇文檔:

語料庫

該語料的概率是:

語料的概率

在Unigram Model中,我們假設了文檔之間是獨立可交換的,而文檔中的詞也是獨立可交換的,所以一篇文檔相當于一個袋子,里面裝了一些詞,而詞的順序信息就無關重要了,這樣的模型也稱為詞袋模型

假設語料中總的詞頻是N,在所有的N個詞中如果我們關注每個詞vi的發生次數ni,那么:

多項分布的概率

多項分布的概率

此時語料的概率是:

不考慮順序的多項分布概率

當然我們很重要的一個任務是估計模型的參數P,也就是問上帝擁有的這個骰子的各個面的概率有多大,按照頻率派的觀點,使用最大似然估計最大化語料的概率,于是參數pi的估計值就是:

各個面概率估計值

對于以上模型,貝葉斯學派的統計學家會有不同意見,他們會很挑剔的批評只假設上帝擁有一個唯一固定的骰子是不合理的,在貝葉斯學派看來,一切參數都是隨機變量,以上模型的骰子的P不是唯一固定的,它也是一個隨機變量。所以按照貝葉斯學派的觀點,上帝是按照以下的過程在玩游戲的:

貝葉斯Unigram Model假設

1.上帝有一個裝有無窮多骰子的壇子,里面有各式各樣的骰子,每個骰子有V個面;

2.上帝從壇子里面抽了一個骰子出來,然后用這個骰子不斷地拋,然后產生了語料庫中的所有的詞

上帝的這個壇子里,骰子可以是無窮多個,有些類型的骰子數量多,有些類型的骰子數量少,所以從概率分布的角度來看,壇子里面的骰子P服從一個概況分布p(P),這個分布稱為參數P的先驗分布

貝葉斯觀點下的Unigram Model

以上貝葉斯學派的假設之下,語料的概率該如何計算呢?

由于我們并不知道上帝使用了哪個骰子,每一個骰子都是可以被用到的,只是使用的概率被概率分布

決定,對每個具體的骰子P,由該骰子產生的數據的概率是

所以最終數據產生的概率就是對每個骰子產生的數據概率進行積分累加求和

在貝葉斯分析框架下,此處先驗分布

先驗分布

就有很多種選擇了,注意到:

實際上是在計算一個多項分布的概率,所以對先驗分布的一個好的選擇就是多項分布對應的共軛分布,即Dirichlet分布:

Dirichlet分布

此處,

歸一化因子
Dirichlet先驗下的Unigram Model
Unigram Model的概率圖模型

回歸前一小節介紹Dirichlet分布的知識:其中很重要的一點就是:Dirichlet先驗+多項分布的數據=后驗分布為Dirichlet分布

于是在給定參數

參數

的先驗分布

先驗分布

各個詞出現的頻次的數據是

數據分布

為多項分布,所以無需計算,我們就可推出后驗分布:

后驗分布

在貝葉斯框架下,參數

參數

該如何估計呢,由于我們已經有了參數的后驗分布,所以合理的方式是使用后驗分布的極大值點,或者是參數在后驗分布下的平均值,在該文檔中,我們取平均值作為參數的估計值,使用Dirichlet分布的結論可得:

均值

也就是對每個參數,我們用下式作為估計值:

參數的分量的估計值

考慮到

在Dirichlet分布中的物理意義是事件的先驗偽計數,這個估計式子的含義是很直觀的:每個參數的估計值是其對應事件的先驗的偽計數和數據中的計數的和在整體計數中的比例

進一步我們可以計算出文本語料的產生概率是:

貝葉斯框架下語料的概率

2.Topic Model和PLSA

以上的Unigram Mode是一個很簡單的模型,模型中的假設過于簡單,和人類寫文章產生每一個詞的差距過大,有沒有更好的模型呢?

我們可以看看日常生活中人們是如何構思文章的,如果我們要寫一篇文章,首先是要確定結果主題,譬如構思一篇自然語言處理的文章,可能40%會談論語言學,30%談論概率統計,20%談論計算機,還有10%談論其他的主題,每個主題下我們又會想到對應的詞,我們之所以會想到對應的詞是因為這些詞在這些主題下出現的概率很高,我們可以很自然的看到,一篇文章通常是由多個主題構成的,一個主題又是由多個與該主題關系比較大的詞構成的

以上這種直觀的想法由Hoffmn給出的PLSA模型中首先進行了明確的數學化,他認為一篇文章可以由多個主題(topic)構成,每個topic都是詞匯上的概率分布,文章中的每一詞都是由一個固定的topic生成的

topic是vocab上的概率分布

所有人類思考和寫文章的行為都可以認為是上帝的行為,我們可以繼續回到上帝的假設中,那么在PLSA模型中,Hoffman認為上帝是按照如下的游戲規則來生成文本的。

PLSA Topic Model

1.上帝有兩種類型的骰子,一類是doc-topic骰子,每個doc-topic骰子有K個面,每一個面是一個topic的編號;一類是topic-word骰子,每個topic-word骰子有V個面,每個面對應一個詞;

2.上帝一共有K個topic-word骰子,每個骰子有一個編號,編號從1到K

3.生成每篇文檔之前,上帝都先為這篇文章制造一個特定的doc-topic骰子,然后重復如下過程生成文檔中的詞

投擲這個doc-topic骰子,得到一個topic編號z

選擇K個topic-word骰子中編號為z的那個,投擲這個骰子,于是得到一個詞

以上PLSA模型的文檔生成過程可以圖形化的表示為:

PLSA模型的文檔生成過程

我們可以發現在以上的游戲規則下,文檔和文檔之間是獨立可交換的,同一個文檔里的詞也是獨立可交換的,還是一個bag of words模型。游戲中的K個topic-word骰子,我們可以記為

K個topic-word骰子

對于包含M篇文檔的語料

m篇文檔

中的每一篇文檔

第m篇文檔

都會有一個特定的doc-topic骰子

第m篇文檔的topic骰子

所有對應的骰子記為:

所有m篇文檔的topic骰子

為了方便,我們假設每個詞w都是一個編號,對應到topic-word骰子的面,于是在PLSA模型中,第m篇文檔的每個詞的生成概率為:

第m篇文檔的每個詞的生成概率

所以整篇文檔的生成概率為:

整篇文檔的生成概率

由于文檔之間相互獨立,我們也容易寫出整個語料的生成概率。求解PLSA這個Topic Model的過程匯總,模型參數求解可以使用著名的EM算法進行求得局部最優解

3.LDA文本建模

(1)游戲規則

對于上述的PLSA模型,貝葉斯學派顯然是有意見的,doc-topic骰子

第m篇文檔的topic骰子

和topic-word骰子

第K個骰子

都是模型中的參數,參數都是隨機變量,怎么能沒有先驗分布呢?于是,類似于對Unigram Model的貝葉斯改造,我們也可以如下在兩個骰子參數前加上先驗分布從而把PLSA的游戲過程改造為一個貝葉斯的游戲過程。由于doc-topic骰子和topic-word骰子都應到多項分布,所以先驗分布的一個好的選擇就是Dirichlet分布,于是我們就得到了LDA(Latent Dirichlet Allocation)模型

LDA模型

在LDA模型中,上帝是按照如下的規則玩文檔生成的游戲的:

LDA Topic Model

1.上帝有兩大壇骰子,都一個壇子裝的是doc-topic骰子,第二個壇子裝的是topic-word骰子;

2.上帝隨機的從第二壇骰子中獨立的抽取了K個topic-word骰子,編號為1到K;

3.每次生成一篇新的文檔前,上帝先從第一個壇子里隨機抽取一個doc-topic骰子。然后重復以下過程生成文檔中的詞

投擲這個topic-word骰子,得到一個topic編號z

選擇K個topic-word骰子中編號為z的那個,投擲這個骰子,于是得到一個詞

假設語料庫中有M篇文檔,所有的word和對應的topic如下表示

其中

表示第m篇文檔中的詞

表示這些詞對應的topic編號

語料生成過程中的word和topic

(2)物理過程分解

使用概率圖模型表示,LDA模型的游戲過程如圖所示:

LDA圖模型表示

這個概率圖可以分為兩個主要的物理過程:

1.

這個過程表示在生成第m篇文檔時,先從第一個壇子中抽取一個doc-topic骰子

然后投擲這個骰子生成文檔中第n個詞的topic編號

2.

這個過程用如下動作生成語料中的第m篇文檔的第n個詞:在上帝手頭的K個topic-word骰子

中,挑選編號為

的那個骰子進行投擲,然后生成word

理解LDA最重要的就是理解這兩個物理過程。LDA模型在基于K個topic生成語料的M篇文章的過程中,由于是bag of words 模型,有一些物理過程是相互獨立可交換的。由此,LDA生成模型中,M篇文檔會對應M個獨立的Dirichlet-Multinomial共軛結構,K個topic會對應于K個獨立的Dirichlet-Multinomial共軛結構。所以理解LDA所需要的所有數學就是理解Dirichlet-Multinomial共軛結構,其他就都是理解物理過程。現在讓我們進入細節,來看看LDA模型是如何被分解為M+K個Dirichlet-Multinomial共軛結構的

由第一個物理過程,我們知道

是表示生產第m篇文檔中的所有詞對應的topics,顯然,

對應于Dirichlet分布,

對應于Multnomial分布,所以整體是一個Dirichlet-Multinomial共軛結構

前文介紹bayes Unigram Model時對Dirichlet-Multinomial共軛結構做了一些計算,我們在這里可以得到:


進一步,利用Dirichlet-Multinomial共軛結構,可以得到參數

的后驗分布是

由于語料中M篇文檔的topics的生成過程相互獨立,所以我們得到M個相互獨立的Dirichlet-Multinomial共軛結構,從而我們得到整個語料中topics的生成概率

目前我們由M篇文檔生成了M個Dirichlet-Multinomial共軛結構,還有K個Dirichlet-Multinomial共軛結構在哪里呢?在上帝按照LDA規則玩游戲的時候,上帝是完全處理完一篇文檔再處理下一篇文檔,文檔中生成的每一個詞都要拋擲兩次骰子,第一次拋一個doc-topic骰子得到topic,第二次拋一個topic-word骰子得到word,每次生成每篇文檔中的一個詞的時候,這兩次拋骰子的動作是緊鄰輪換進行的,如果預料中有N個詞,那么要拋擲2N次骰子,輪換的拋擲doc-word骰子和topic-word骰子。但實際上有一些拋骰子的動作是可以交換的,我們可以等價的調整2N次拋骰子的順序,前N次只拋doc-topic骰子,得到語料中所有詞的topics,然后基于得到的每個詞的topics編號,后N次只拋topic-word骰子生成N個word,于是上帝在玩LDA游戲的時候可以等價的按照如下過程進行:

1.上帝有兩大壇骰子,第一個壇子裝的是doc-topic骰子,第二個壇子裝的是topic-word骰子;

2.上帝隨機的從第二壇里面獨立的抽取K個topic-word骰子,編號從1到K;

3.每次生成一篇新的文檔前,上帝先從第一個壇子里面隨機抽取doc-topic骰子,然后重復投擲這個doc-word骰子為每個詞都生成一個topic編號z,重復以上過程處理每篇文檔,生成語料中每個詞的topic編號,但是詞尚未生成‘

4.從頭到尾,對語料中的每篇文檔中的每個topic編號z,選擇K個topic-word骰子中編號為z的那個,投擲這個骰子,于是生成對應的word;

以上游戲先是生成了語料中所有詞的topics,然后對每個詞在給定topic下生成生成word,在語料中所有詞的topic已經生成的條件下,任何兩個word的生成動作都是可交換的,于是我們把語料中的詞進行交換,把具有相同topic的詞放到一起

其中

表示這些詞都是由第k個topic生成

對應于詞的topic編號,所以這個向量的各個分量都是k

對應于概率圖中的第二個物理過程,

的限制下,語料中任何兩個由topic k生成的詞都是可交換的,即使他們不在同一個文檔中,所以此處不再考慮文檔的概念,轉而考慮由同一個topic生成的詞,考慮如下過程·

容易看出

對應于Dirichlet分布

對應于Multinomial分布,所以整體也還是對應與一個Dirichlet-Multinomial共軛結構

同樣借助于前面的推導我們可以得到:

其中

第k個topic生成的詞中word t的個數

進一步,利用Dirichlet-Multinomial共軛結構,我們得到參數

的后驗分布恰好是

而語料中K個topics生成詞的過程相互獨,所以我們得到K個相互獨立的Dirichlet-Multinomial共軛結構,從而我們得到整個語料庫中詞生成的概率

結合前面的topic的生成概率,可以得到語料中詞和topic的聯合生成概率

(3)Gibbs Sampling

有了聯合分布

萬能的MCMC算法就可以發揮作用了,于是我們可以考慮用Gibbs Sampling抽樣對這個分布進行采樣了,當然由于

是已經觀測到的已知的數據,只有

是隱含的變量,所以我們真正需要采樣的是分布

在Gregor Heinrich那篇很有名的LDA模型科普文章Parameter estimation for text analysis中,是基于上式即聯合分布來推導Gibbs Sampling公式的,此小節我們使用不同的方式,主要是基于Dirichlet-Multinomial共軛來推導Gibbs Sampling公式的,這樣對于理解采樣中的概率物理過程有幫助

語料

第i個詞對應的topic我們記為


其中i=(m,n)是個二維下標,對應于第m篇文檔的第n個詞,我們用-i表示去除下標為i的詞,那么按照Gibbs Sampling算法的要求,我們要求得任一個坐標軸i對應的條件分布

假設已經觀察到的詞

則由貝葉斯法則,我們容易得到:

由于

只涉及第m篇文檔和第k個topic,所以上式的條件概率計算中,實際上也只會涉及到如下兩個Dirichlet-Multinomial共軛結構

其他M+K-2個Dirichlet-Multinomial共軛結構和

是獨立的,由于語料在去掉第i個詞對應的

并不改變我們之前所說的M+K個Dirichlet-Multinomial共軛結構,只是某些地方的計數會變少,因此

的后驗分布都是Dirichelt分布:

使用上面兩個式子,把以上想法綜合一下,我們就得到了如下的Gibbs Sampling 公式的推導:

對于上面數學式子化簡的的解析:

第一行是根據貝葉斯公式推導而來的;

第二行是對zi和wi的可能發生的背景做了一個積分求和,即生成topic和生成word都是由

決定的;

第三行是因為生成topic的過程和生成word的過程是獨立的,因此可以化簡為相乘的形式;

第四行化簡是根據條件概率公式:p(AB)=p(A)P(B|A)得到的;

第五行和第六行是將對應的分布代入,具體是在去掉語料庫中第i個詞的條件下的第m個doc-topic骰子的各個面的概率后驗分布和第k個topic-word骰子的各個面的概率后驗分布,都是Dirichlet分布;

第七行是給定第m個doc-topic骰子的各個面的概率后驗分布和第k個topic-word骰子的各個面的概率后驗分布情況下,將生成第m篇文檔的第n個詞的topic zi的概率和第m篇文檔的第n個詞wi的概率進行了簡潔記法,其實這個后驗概率分布基于的數據并不包括第m篇文檔的第n個詞對應的topic以及第m篇文檔的第n個詞;

第八行可以這么理解:對于第m篇文檔的第n個詞的topic zi來說,它出現某個值(1到K)的概率是取決于第m篇文檔的doc-topic骰子的各個面的后驗概率分布的,不同的后驗概率分布,生成對應的topic的概率也是不同的,這其中只涉及了第m篇文檔的topic生成的過程,是一個Dirichlet-Multinomial共軛結構,也就是說將第m篇文檔的第n個詞的topic的生成概率乘以決定其取值的那個Dirichlet后驗概率分布的結果,可以看作為這個topic的生成概率的期望,同樣的,對于第m篇文檔的第n個詞也是同樣的分析,這其中我們能看出來只涉及了兩個Dirichlet-Multinomial共軛結構

下面我們就要計算

那么這兩個變量怎么計算呢,我們上面已經說了他們分別表示第m篇文檔的第n個詞的topic的生成概率的期望,我們再想一下,這個生成的概率是不是就對應這個第m篇文檔的doc-topic的骰子的各個面的概率,因為這各個面的概率就是說每個topic取值的概率,那么就是說我們需要求這各個面概率的期望即可,我們知道這各個面概率

的后驗概率就是服從Dirichlet分布的,但是這里是記住是語料庫中去掉第m篇文檔的第n個詞的情況下,上面我們也給出了分布形式,這里我們只需計算m篇文檔的doc-topic的各個面概率的每個分量的期望即可,根據之前學習Dirichlet分布的結論可知:

于是我們最終得到了LDA模型的Gibbs Sampling的公式

這個公式的右邊就是p(topic|doc).p(word|topic),這個概率其實就是doc->topic->word的路徑概率,由于topic有K個,所以Gibbs Sampling 公式的物理意義就是在這K條路徑中進行采樣

doc->topic->word路徑概率

對于這里需要說明一下,因為后面我們需要實現這個Gibbs Sampling 算法下的LDA模型

? ? ? 大家應該知道Gibbs Sampling 算法是用來隨機模型采樣的,對于我們的語料庫而言,我們得到的是語料庫中的詞,要想得到每篇文檔的主題分布,首先得知道每篇文檔的每個詞的主題;

? ? ? 我們通過模擬文章的生成過程,用數學上表述為M+K個Dirichlet-Mutinomial共軛結構,我們的目標是要得到每個詞的topic,因為每個詞的topic都可能有K個取值,那么整個語料的詞有很多個,這個語料的詞的topic分布是個高維分布,我們想要得到這個高維分布平穩以后的樣本就可以作為我們最終語料的詞的topic,也就可以得到語料中的文檔的主題分布;

? ? ? 對高維的分布采樣我們可以使用Gibbs Sampling 算法,大家在這里或許有個疑問,就是前面我們在介紹Gibbs Sampling 算法時,是通過構造馬氏鏈轉移矩陣,使其滿足細致平穩條件,每一輪對樣本的所有的維度進行采樣,在達到平穩分布后,我們取平穩分布后的樣本就是我們的目標樣本,并且有一個好處就是我們不用知道原來的樣本的分布情況,只需要構造馬氏鏈轉移矩陣,使其收斂到最后的平穩分布。那么這里我們雖然同樣是要得到所有的詞的topic的樣本,但是這里存在著馬氏鏈里的關系嗎?也就是說每一個詞的topic會被所有其他詞的topic來決定嗎?大家都知道,LDA模型是建立在上帝玩游戲的規則之上,每一個詞的topic是在服從Dirichlet先驗概率分布的概率向量基礎上按照多項分布產生的,我們可以認為當已知所有其他詞的topic時,我們會得到所有doc-topic骰子和topic-word骰子的各個面概率的后驗分布,這樣我們就可以得到當前詞的topic的分布;

? ? ? 這樣,我們可以在所有其他的詞的topic已知的條件下沿著每一個詞的topic進行輪換的采樣,當然前提是構造前面所說的馬氏鏈轉移矩陣,即當所有其他詞的topic已知時,當前詞的topic的分布。每一輪采樣都得到了所有的詞的topic樣本,經過多次迭代采樣后,會收斂到topic的平穩分布,可以取這些平穩分布后的樣本的平均值,也可以取某一次的值

(4)Training and Inference

有了LDA模型,當然我們的目標有兩個:

估計模型中的參數

對于新來的一篇文章

我們能夠計算這篇文章的topic分布

有了Gibbs Sampling公式,我們就可以基于語料訓練LDA模型,并應用訓練得到的模型對新的文檔進行topic語義分析。訓練的過程就是通過Gibbs Sampling獲取語料中的(z,w)的樣本,而模型中的所有的參數都可以基于最終采樣得到的樣本進行估計。訓練的流程很簡單:

1隨機初始化,對語料庫中每一個詞w,隨機的賦一個topic編號z

2.重新掃描語料庫,對每一個詞w,按照Gibbs Sampling 公式重新采樣它的topic,在語料中進行更新;

3.重復以上語料庫的重新采樣過程直到Gibbs Sampling收斂;

4.統計語料中的topic-word共現頻率矩陣,該矩陣就是LDA的模型

由這個topic-word矩陣我們可以計算每一個p(word|topic)的概率,從而計算出模型參數

這就是上帝用的K個topic-word骰子。當然語料中的文檔對應的骰子參數

在以上訓練過程中也是可以計算出來的,只要在Gibbs Sampling收斂以后,統計每篇文檔中的topic的頻率分布,我們就可以計算每一個p(topic|doc)概率,于是就可以計算出每一個

但是這個參數是和訓練語料中的每篇文檔相關的,對于我們理解新的文檔無用處,所以工程上存儲LDA模型的時候一般不保留,通常在訓練LDA模型的過程中,我們是取Gibbs Sampling收斂之后的n個迭代結果進行平均來做參數估計,這樣模型質量更高

有了LDA的模型,我們對于新來的文檔,該如何做該文檔的topic語義分布的計算呢?基本上,inference的過程和trainning的過程完全類似,對于新的文檔,我們只要認為Gibbs Sampling公式中的

是穩定不變的,所以采樣過程中,我們只要估計該文檔的topic分布

就好了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容