怎麼確定LDA的topic個數?

面試時,由於之前用過LDA做推薦,面試官就問怎麼確定LDA的topic個數,我就實話實說是自己拍的,面試官就一個勁問「你覺得合理嗎?你難道就這麼草率嗎?」搞得我無所適從,請問有哪些方法確定LDA的topic個數呢?


LDA中topic個數的確定是一個困難的問題。當各個topic之間的相似度的最小的時候,就可以算是找到了合適的topic個數。參考一種基於密度的自適應最優LDA模型選擇方法 ,簡略過程如下:

  1. 選取初始K值,得到初始模型,計算各topic之間的相似度
  2. 增加或減少K的值,重新訓練得到模型,再次計算topic之間的相似度
  3. 重複第二步直到得到最優的K

另外,Willi Richert , Luis Pedro Coelho著的《機器學習系統設計》第4章專門討論了LDA主題模型,其中一節講了「Choosing the number of topics」。文中提到

One of the methods for automatically determining the number of topics is called

the ** hierarchical Dirichlet process (HDP)**


有時,如果我們的任務並不在topic本身的時候,比如只是為了文本聚類、分類或是推薦什麼的,這個時候主題的個數相對來說可以比較任意,寧可多一點,也不要少一點;

但有時,如果我們的任務就是著眼於topic本身,比如我們就是想挖掘一些有意義的topic來做主題(事件)探測之類的,那麼topic個數就比較要緊了。

從模型的角度解決這個主題個數的話,可以在LDA的基礎上融入嵌套中餐館過程(nested Chinese Restaurant Process)印度自助餐廳過程(Indian Buffet Process)等。因此就誕生了這樣一些主題模型:

1. hierarchical Latent Dirichlet Allocation (hLDA) (2003_NIPS_Hierarchical topic models and the nested Chinese restaurant process)

2. hierarchical Dirichlet process (HDP) (2006_NIPS_Hierarchical dirichlet processes)

3. Indian Buffet Process Compound Dirichlet Process (ICD) (2010_ICML_The IBP compound Dirichlet process and its application to focused topic modeling)

4. Non-parametric Topic Over Time (npTOT) (2013_SDM_A nonparametric mixture model for topic modeling over time)

5. collapsed Gibbs Samplingalgorithm for the Dirichlet Multinomial Mixture Model (GSDMM) (2014_SIGKDD_A Dirichlet Multinomial Mixture Model-based Approach for Short Text Clustering)

這些主題模型都被叫做非參數主題模型(Non-parametric
Topic Model)
,最初可追溯到David
M. Blei於2003年提出hLDA那篇文章(2003_NIPS_Hierarchical topic models and the nested Chinese restaurant process)。非參數主題模型是基於貝葉斯概率的與參數無關的主題模型。這裡的參數無關主要是指模型本身可以「隨著觀測數據的增長而相應調整」,即主題模型的主題個數能夠隨著文檔數目的變化而相應調整,無需事先人為指定。

但是實際效果(指的是挖掘出的主題的有意義程度的效果),其實是不太理想的。


正如分類問題用Accuracy來評價,LDA也自己評價標準叫Perplexity。Perplexity可以粗略的理解為「對於一篇文章,我們的LDA模型有多不確定它是屬於某個topic的」。topic越多,Perplexity越小,但是越容易overfitting。

我們利用Model Selection找到Perplexity又好,topic個數又少的topic數量。可以畫出Perplexity vs num of topics曲線,找到滿足要求的點。


這個問題在《LDA漫遊指南》一書中做了很好的解答,詳見第4章第4.2節

topic number K:許多讀者問,如何設置主題個數,其實現在沒有特別好的辦(HDP等較為複雜的模型可以自動確定這個參數,但是模型複雜,計算複雜),目前只有交叉驗證(cross validation),通過設置不同的K值訓練後驗證比較求得最佳值,我的建議是一開始不要設置太大而逐步增大實驗,Blei在論文《Latent Dirichlet Allocation》提出過一個方法,採用設置不同的topic數量,畫出topic_number-perplexity曲線;Thomas L. Grif?ths等人在《Finding scientific topics》也提出過一個驗證方法,畫出topic_number-logP(w|T)曲線,然後找到曲線中的縱軸最高點便是topic數量的最佳值。有興趣的讀者可以去讀讀這兩篇論文原文的相應部分。這個參數同時也跟文章數量有關,可以通過一個思想實驗來驗證:設想兩個極端情況:如果僅有一篇文章做訓練,則設置幾百個topic不合適,如果將好幾億篇文章拿來做topic model,則僅僅設置很少topic也是不合適的。


使用gensim包的童鞋注意了,千萬不要用log_perplexity()計算的perplexity指標來比較topic數量的好壞!因為這個函數沒有對主題數目做歸一化,因此不同的topic數目不能直接比較!

(https://groups.google.com/forum/#!searchin/gensim/topic$20coherence|sort:relevance/gensim/krs1Uytq5bY/ePZXIKfwGwAJ )

&<以下是原回答&>

我最近也遇到了這個問題。

剛開始我用的Blei論文里推薦的perplexity指標來評價模型的效果,但是我的結果是topic數目越多,perplexity越大,這跟大多數的論文和前人實踐得到的結果相反。。。網上google了一下竟發現有不少人跟我有一樣的問題,我到現在也不知道是什麼原因~

後來我在gensim包的google group里發現有人提出了相同的疑問,gensim包的作者Radim現身回答說perplexity不是一個好的評價topic質量的指標,這個學術界也有論文闡述了這一點,我看到過。(https://groups.google.com/forum/#!searchin/gensim/perplexity%7Csort:relevance/gensim/TpuYRxhyIOc/98kCvxcpDLcJ )

group裡面另外一位大神推薦使用一個新的指標叫topic coherence來評價模型的好壞,具體可見這裡America』s Next Topic Model。


LDA中如何確定topic數量一直都沒有公認的好方法,原因在於不同業務對於生成topic的要求是存在差異的。

如果LDA的結果是用於某個目標明確的學習任務(比如分類),那麼就直接採用最終任務的指標來衡量就好了,能夠實現分類效果最好的topic個數就是最合適的。

如果沒有這樣的任務怎麼辦?業界最常用的指標包括Perplexity,MPI-score等。以我的經驗,通過觀察Perplexity/MPI-score這些指標隨topic個數的變化確實能夠幫助我們選擇合適的個數值,比如可以找出曲線的拐點。但是這些指標只能作為參考,而不能作為標準。

有的業務需要topic之間相互比較獨立,那麼就可以選擇考察topic之間的相關性作為額外的指標。而有的業務可以容忍topic之間存在overlap,但是對topic中詞的聚合性要求高,這時候就需要尋找一些聚類的指標做評判標準。

最後,肉眼看仍然是我目前發現的最簡單有效的方法。


LDA的結果是為了實現某個purpose的話可以通過evaluate那個purpose來選擇LDA的topic數。。。比如樓主講的做推薦那麼evaluate推薦的結果就好了。。。

然並卵,最終的質量不僅取決於LDA的結果還取決於推薦演算法,如果推薦演算法也涉及比較複雜的參數優化的話把兩個模型參數都優化好只怕不一定很容易。另外取決於推薦演算法,LDA的結果質量未必真的重要。

我認為LDA的結果好壞是有主觀成分的,要說好也得說清楚good for what? 應該不存在一個指標能夠衡量LDA的結果is good for all purposes. 但是有可能存在一些未必看上去多麼有道理的指標可以幫我們找到一個model which is good enough for many purposes. Being good for reducing perplexity does not imply being good for certain applications應該是很多人認可的。。。但是沒有一個合適指標衡量好壞的話用perplexity我覺得也是make sense的,畢竟好算又能說出點道理。。。

我猜,只要能滿足需求,模型以簡單為好,從比較小的topic number開始,計算perplexity或任何其他一個衡量應用層面質量的指標當utility function,直到找到一個滿足需求的model或者utility function不再變好的model應該是一種可行的辦法。。。

工程經驗有限,等大神,求輕拍。。。


需要先驗知識加上一定的實驗


做輿情事件分析的話,大概定多少個話題?


訓練一次48個小時,尼瑪如何做實驗啊。。。


比較直觀的方式是看最後幾次iteration的結果是否足夠收斂;或者用IGP, BWP之類的有效性指標判斷聚類數目是否合理


問一下,如果訓練語料庫中,某一主題的文檔比例明顯高於其他主題,會導致其他主題的文檔被識別為該主題嗎。即語料庫分布不均勻會導致什麼結果


最近也遇到這個問題,期待大神解答。

個人感覺LDA的topic個數需要實驗和storytelling。我覺得其實面試官應該也不知道答案。LDA得到的topic我覺得都有一定成分需要storytelling。


面試被問到這個問題了。可是現實中我就是一點一點試主題個數的。求大神指點。


貌似就是拍腦門子的, 大致定個範圍就行, 主要怕topic冗餘。


推薦閱讀:

程序可以判斷用戶當前的狀態嗎?
想學習推薦系統,如何從小白成為高手?
如何看待人民網三評演算法推薦?
廣告投放和排序效果如何進行多目標優化?

TAG:LDA | 推薦演算法 |