這篇文章由Databricks的Feynman Liang和Joseph Bradley,以及Intel的Yuhao Yang撰寫。
在使用LDA之前,請先 下載Spark 1.5或是 申請試用版的Databricks。
人們正在推特上討論什么呢?為了關注分布式計算,我該閱讀哪些資訊文章呢?這些問題都能夠被話題模型所解答,它是分析文檔集所涵蓋話題類別的一種技術。本文將要討論Spark 1.4和1.5使用強大的隱含狄利克雷分布 (Latent Dirichlet Allocation,LDA)算法對話題模型的性能提升。
Spark 1.4和1.5引入了一種增量式計算LDA的在線算法,在已訓練的LDA模型上支持更多的查詢方式,以及支持似然率(likelihood)和復雜度(perplexity)的性能評估。我們給出了一個例子,用超過450萬條維基百科詞條的文檔集訓練一個話題模型。
話題模型和LDA
話題模型分析一個大規(guī)模的文檔集,并且自動推測其所討論的話題。舉個例子,我們用Spark的LDA算法訓練450萬條維基百科詞條,可以得到下表中的這些話題。
表一:用維基百科文檔集訓練得到的LDA話題示例
此外,LDA告訴我們每篇文檔分別屬于哪些話題;文檔X有30%的概率屬于話題1(“政治”)以及70%的概率屬于話題5(“航線”)。隱含狄利克雷分布(LDA)是實踐中最成功的話題模型之一。閱讀我們 之前的文章了解更多關于LDA的介紹。
一種新的在線變分學習算法
在線變分預測是一種訓練LDA模型的技術,它以小批次增量式地處理數(shù)據。由于每次處理一小批數(shù)據,我們可以輕易地將其擴展應用到大數(shù)據集上。MLlib按照 Hoffman論文里最初提出的算法實現(xiàn)了一種在線變分學習算法。
性能對比
上表所示的話題是用新開發(fā)的在線變分學習算法訓練得到。如果我們對比時間開銷,可以發(fā)現(xiàn)新算法相比原來的EM算法效率有顯著提升:
圖1:在線學習算法比之前的EM算法速度更快
實驗細節(jié)
我們首先對數(shù)據預處理,濾去常見的英語停用詞,并且將詞表限制在10000個常用單詞之內。然后用在線LDA優(yōu)化器迭代100次訓練得到100個LDA話題模型。我們的實驗在 Databricks上進行,訓練用到了16個節(jié)點的AWS r3.2x大集群,數(shù)據存放在S3。具體代碼詳見 github。
改進的預測、評估和查詢
預測新文檔的話題
除了描述訓練文檔集的話題之外,Spark 1.5支持讓用戶預測新測試文檔所屬的話題,使得已訓練的LDA模型更有用。
用似然率和復雜度評估模型
在訓練完一個LDA模型之后,我們通常關心模型在數(shù)據集上的表現(xiàn)如何。我們增加了兩種方式來評估效果: 似然率和 復雜度。
支持更多的查詢方式
新的版本添加了一些新的查詢方式,用戶可以用在已訓練的LDA模型上。例如,現(xiàn)在我們不僅能獲得每篇文檔的top k個話題(“這篇文檔討論了什么話題?”),也能得到每個話題下排名靠前的文檔(“若要學習X話題,我該閱讀哪些文檔?”)。
運行LDA的小技巧
- 確保迭代次數(shù)足夠多。前期的迭代返回一些無用的(極其相似的)話題,但是繼續(xù)迭代多次后結果明顯改善。我們注意到這對EM算法尤其有效。
- 對于數(shù)據中特殊停用詞的處理方法,通常的做法是運行一遍LDA,觀察各個話題,挑出各個話題中的停用詞,把他們?yōu)V除,再運行一遍LDA。
- 確定話題的個數(shù)是一門藝術。有些算法可以自動選擇話題個數(shù),但是領域知識對得到好的結果至關重要。
- 特征變換類的Pipeline API對于LDA的文字預處理工作極其有用;重點查看Tokenizer,StopwordsRemover和CountVectorizer接口。
下一步是什么?
Spark貢獻者正在積極地優(yōu)化我們的LDA實現(xiàn)方式。正在進行的工作有: 吉布斯采樣(一種更慢但是有時更準確的算法), 流式LDA算法和 分層狄利克雷處理(自動選擇話題個數(shù))。
感謝
LDA的開發(fā)得益于眾多Spark貢獻者的通力合作。
Feynman Liang、Yuhao Yang、Joseph KBradley等人完成了最近這次優(yōu)化, 其它眾多朋友對早期版本亦有貢獻。
原文鏈接: Large Scale Topic Modeling: Improvements to LDA>