1. 程式人生 > >LDA主題模型簡介-&&-淺談gibbs sampling(LDA實驗)

LDA主題模型簡介-&&-淺談gibbs sampling(LDA實驗)

上個學期到現在陸陸續續研究了一下主題模型(topic model)這個東東。何謂“主題”呢?望文生義就知道是什麼意思了,就是諸如一篇文章、一段話、一個句子所表達的中心思想。不過從統計模型的角度來說, 我們是用一個特定的詞頻分佈來刻畫主題的,並認為一篇文章、一段話、一個句子是從一個概率模型中生成的。

D. M. Blei在2003年(準確地說應該是2002年)提出的LDA(Latent Dirichlet Allocation)模型(翻譯成中文就是——潛在狄利克雷分配模型)讓主題模型火了起來, 今年3月份我居然還發現了一個專門的LDA的R軟體包(7月份有更新),可見主題模型方興未艾呀。主題模型是一種語言模型,是對自然語言進行建模,這個在資訊檢索中很有用。

LDA主題模型涉及到貝葉斯理論、Dirichlet分佈、多項分佈、圖模型、變分推斷、EM演算法、Gibbs抽樣等知識,不是很好懂,LDA那篇30 頁的文章我看了四、五遍才基本弄明白是咋回事。那篇文章其實有點老了,但是很經典,從它衍生出來的文章現在已經有n多n多了。主題模型其實也不只是LDA 了,LDA之前也有主題模型,它是之前的一個突破,它之後也有很多對它進行改進的主題模型。需要注意的是,LDA也是有名的Linear Discriminant Analysis(線性判別分析)的縮寫。

LDA是一種非監督機器學習技術,可以用來識別大規模文件集(document collection)或語料庫(corpus)中潛藏的主題資訊。它採用了詞袋(bag of words)的方法,這種方法將每一篇文件視為一個詞頻向量,從而將文字資訊轉化為了易於建模的數字資訊。但是詞袋方法沒有考慮詞與詞之間的順序,這簡化了問題的複雜性,同時也為模型的改進提供了契機。每一篇文件代表了一些主題所構成的一個概率分佈,而每一個主題又代表了很多單詞所構成的一個概率分佈。由於 Dirichlet分佈隨機向量各分量間的弱相關性(之所以還有點“相關”,是因為各分量之和必須為1),使得我們假想的潛在主題之間也幾乎是不相關的,這與很多實際問題並不相符,從而造成了LDA的又一個遺留問題。

對於語料庫中的每篇文件,LDA定義瞭如下生成過程(generative process):

  1. 對每一篇文件,從主題分佈中抽取一個主題;

  2. 從上述被抽到的主題所對應的單詞分佈中抽取一個單詞;

  3. 重複上述過程直至遍歷文件中的每一個單詞。

更形式化一點說,語料庫中的每一篇文件與 T(通過反覆試驗等方法事先給定)個主題的一個多項分佈相對應,將該多項分佈記為θ。每個主題又與詞彙表(vocabulary)中的 V個單詞的一個多項分佈相對應,將這個多項分佈記為 ϕ。上述詞彙表是由語料庫中所有文件中的所有互異單片語成,但實際建模的時候要剔除一些停用詞(stopword),還要進行一些詞幹化(stemming)處理等。θ

ϕ分別有一個帶有超引數(hyperparameter)αβ的Dirichlet先驗分佈。對於一篇文件dd中的每一個單詞,我們從該文件所對應的多項分佈θθ中抽取一個主題z,然後我們再從主題zz所對應的多項分佈ϕ中抽取一個單詞w。將這個過程重複Nd次,就產生了文件d,這裡的Nd是文件d的單詞總數。這個生成過程可以用如下的圖模型表示:

plate notation - graphical model

這個圖模型表示法也稱作“盤子表示法”(plate notation)。圖中的陰影圓圈表示可觀測變數(observed variable),非陰影圓圈表示潛在變數(latent variable),箭頭表示兩變數間的條件依賴性(conditional dependency),方框表示重複抽樣,重複次數在方框的右下角。

該模型有兩個引數需要推斷(infer):一個是“文件-主題”分佈θ,另外是T個“主題-單詞”分佈ϕ。通過學習(learn)這兩個引數,我們可以知道文件作者感興趣的主題,以及每篇文件所涵蓋的主題比例等。推斷方法主要有LDA模型作者提出的變分-EM演算法,還有現在常用的Gibbs抽樣法。

LDA模型現在已經成為了主題建模中的一個標準。如前所述,LDA模型自從誕生之後有了蓬勃的擴充套件,特別是在社會網路和社會媒體研究領域最為常見。

先把問題描述一下:
如果我們已知了topic內的每個詞的詞頻,比如下圖中topic1 中money 2 次,loan 3次…那麼任意給一個文件我們可以對裡面每一個詞算一個產生這個詞的概率即 P(w=wi|t=tj)

如下圖,doc1 中的money 百分之百的來自於topic1 。doc2 中的詞用topic1 無法全部解釋,必須藉助topic2 。

但現在問題是,如果我們只有一堆文件,Doc1,Doc2,Doc3,且拍腦袋的大概知道會有2個topic,那麼怎麼產生著兩個topic才能最好的解釋這三個文件呢?

生成過程

因此我們要計算一個概率,即文件中的這個詞活脫脫的呈現在我們面前的概率P(wi),我們儘可能想辦法讓這個概率最大。就好像XX廠長成功了,我們要羅織功勞,讓XX廠長成功這件事,最可信。

那麼這個概率計算的方法如下圖,簡單來說就是 P(wi) = P(wi|topic) * P(topic|doc)*p(doc),我們省略p(doc)【求解沒有意義】於是得到下面公式。

生成過程

現在問題又來了,如果給定一個文件di的一個詞wi,他最大可能是來自哪個topic呢?

即 求解P(topic|(di,wi))?

我們知道,P(topic|(wi,di))和P((wi,di)|topic)有關係,那麼P((wi,di)|topic)=P(wi|topic)P(doc|topic),即我們要使得P(wi|topic)P(doc|topic) 這兩個東東的liklyhood最大。

也就是論文中的CWT和CDT,而下圖公式左邊 (CWT+β)/(∑CWT+Wβ) 表示的含義就是P(wi|topic),即topic產生wi的能力。後面一個是P(doc|topici)。

生成過程

為了驗證有效性,我對論文中的這個例子做了實驗,很遺憾沒有做到他的結果,但我感覺應該是對的,其中α,大家可以調大調小了試試看,調大了的結果是每個文件接近同一個topic,即讓p(wi|topici)發揮的作用小,這樣p(di|topici)發揮的作用就大。 其中的β,調大的結果是讓p(di|topici)發揮的作用變下,而讓p(wi|topici)發揮的作用變大,體現在每個topic更集中在幾個詞彙上面,或者而每個詞彙都儘可能的百分百概率轉移到一個topic上。
大家可以看下論文,用我的程式碼實際感覺下資料的變化。

以下to @老師木 @王威廉 @李沐mu @等高手:
我覺得論文中的結果也很奇怪,如果在更新wi的類標號的時候,比如更新第一個doc的第二詞,money,money出現了6次(2黑,4白),如果第一個更新為白,後面怎麼可能更新為黑呢?如果不可能,為什麼論文作者在64次迭代後,會有一些文件同一個word會打上不同的類標籤,比如doc2,的bank,打了4黑1白?

我嘗試過update放在每個更新之後,發現也做不到,很神奇,也許論文作者原始文件的term出現順序不是我寫的那樣。