主題模型可以從一系列文章中自動推測討論的主題。這些主題可以被用作總結和整理文章,也可以在機器學習流程的後期階段用於特徵化和降維。
在Spark 1.3中,MLlib現在支援最成功的主題模型之一,隱含狄利克雷分佈(LDA)。LDA也是基於GraphX上構建的第一個MLlib演算法。在這篇博文中,我們概述LDA和及其用例,並且解釋GraphX是實現它最自然的方式。
主題模型
抽象地說,主題模型旨在一系列文章中找到一種結構。學習到這種“結構”之後,一個主題模型能回答以下這樣的問題:X文章討論的是什麼?X文章和Y文章有多相似?如果我對Z文章感興趣,我應該先讀哪些文章?
LDA
主題模型是一個比較廣的領域。Spark 1.3加入了隱含狄利克雷分佈(LDA),差不多是現今最成功的主題模型。最初被開發用於文字分析和群體遺傳學,LDA之後被不斷擴充,應用到從時間序列分析到圖片分析等問題。首先,我們從文字分析的角度描述LDA。
什麼是主題?主題不是LDA的輸入,所以LDA必須要從純文字中推斷主題。LDA將主題定義為詞的分佈。例如,當我們在一個20個新聞組的文章資料集上執行MLlib的LDA,開始的幾個主題是:
看下三個主題中的高權重詞語,我們可以很快了解每個主題在說什麼:運動,空間探索和電腦。LDA的成功很大程度上源自它產生可解釋主題的能力。
用例
除了推斷出這些主題,LDA還可以推斷每篇文章在主題上的分佈。例如,X文章大概有60%在討論“空間探索”,30%關於“電腦”,10%關於其他主題。
這些主題分佈可以有多種用途:
- 聚類: 主題是聚類中心,文章和多個類簇(主題)關聯。聚類對整理和總結文章集合很有幫助。
- 參看Blei教授和Lafferty教授對於Science雜誌的文章生成的總結。點選一個主題,看到該主題下一系列文章。
- 特徵生成:LDA可以生成特徵供其他機器學習演算法使用。如前所述,LDA為每一篇文章推斷一個主題分佈;K個主題即是K個數值特徵。這些特徵可以被用在像邏輯迴歸或者決策樹這樣的演算法中用於預測任務。
- 降維:每篇文章在主題上的分佈提供了一個文章的簡潔總結。在這個降維了的特徵空間中進行文章比較,比在原始的詞彙的特徵空間中更有意義。
在MLlib中使用LDA
我們給出一個使用LDA的小例子。我們在這兒描述這個過程,實際的程式碼在這個Github gist上。本例首先讀取並預處理文章。預處理最重要的部分是選擇詞典。在本例中,我們將文字拆成詞,之後去除(a)非字母詞 (b)4個字元一下的短詞 (c)最常見的20個詞(停用詞)。一般來說,在你自己的資料集上調整這個預處理步驟很重要。
我們執行LDA,使用10個主題和10輪迭代。根據你的資料集選擇主題的數量很重要。其他引數設成預設,我們在Spark文件的Markdown檔案(spark/docs/*.md)上訓練LDA。
我們得到10個主題。下面是5個人工挑選出來的主題,每個主題配以最重要的5個詞語。請注意每個主題有多麼清晰地對應到Spark的一個元件!(打引號的主題標題是為了更清晰手動加的)
在Spark 1.3中LDA有Scala和Java的API。Python的API很快會加入。
實現:GraphX
有許多演算法可以訓練一個LDA模型。我們選擇EM演算法,因為它簡單並且快速收斂。因為用EM訓練LDA有一個潛在的圖結構,在GraphX之上構建LDA是一個很自然的選擇。
LDA主要有兩類資料:詞和文件。我們把這些資料存成一個偶圖(如下所示),左邊是詞節點,右邊是文件節點。每個詞節點儲存一些權重值,表示這個詞語和哪個主題相關;類似的,每篇文章節點儲存當前文章討論主題的估計。
每當一個詞出現在一篇文章中,圖中就有一個邊連線對應的詞節點和文章節點。例如,在上圖中,文章1包含詞語“hockey” 和“system”
這些邊也展示了這個演算法的流通性。每輪迭代中,每個節點通過收集鄰居資料來更新主題權重資料。下圖中,文章2通過從連線的詞節點收集資料來更新它的主題估計。
GraphX因此是LDA自然的選擇。隨著MLlib的成長,我們期望未來可以有更多圖結構的學習演算法!
可擴充套件性
LDA的並行化並不直觀,已經有許多研究論文提出不同的策略來實現。關鍵問題是所有的方法都需要很大量的通訊。這在上圖中很明顯:詞和文件需要在每輪迭代中用新資料更新相鄰節點,而相鄰節點太多了。
我們選擇了EM演算法的部分原因就是它通過很少輪的迭代就能收斂。更少的迭代,更少的通訊。
在Spark中加入LDA之前,我們在一個很大的Wikipedia資料集上做了測試。下面是一些數字:
- 訓練集規模:460萬文件
- 詞典規模:110萬詞彙
- 訓練集規模:11億詞(大約239詞/文章)
- 100個主題
- 16個 worker節點的EC2叢集
- 計時結果:10輪迭代中平均176秒/迭代
接下來是?
Spark的貢獻者正在開發更多LDA演算法:線上變分貝葉斯(一個快速近似演算法)和吉布斯取樣(一個更慢但是有時更準確的演算法)。我們也在增加幫助模組,例如用於自動資料準備的Tokenizers和更多預測方法。
想開始用LDA,今天下載Spark 1.3
檢視例子,瞭解API的細節,檢視MLlib文件
致謝
LDA的開發是許多Spark貢獻者的合作結果。他們是:Joseph K. Bradley、Joseph Gonzalez、David Hall、Guoqiang Li、Xiangrui Meng、Pedro Rodriguez、Avanesov Valeriy 和 Xusen Yin。
更多資源
通過這些綜述學習更多關於主題模型和LDA的內容:
- 主題模型綜述: D. Blei and J. Lafferty. “Topic Models.” In A. Srivastava and M. Sahami, editors, Text Mining: Classification, Clustering, and Applications. Chapman & Hall/CRC Data Mining and Knowledge Discovery Series, 2009.
- Wikipedia on LDA, 包含數學細節。
從這些研究論文中獲得深入瞭解:
- 原始LDA論文
- 一篇清楚解釋包含EM在內多個演算法的文章: Asuncion, Welling, Smyth, and Teh. “On Smoothing and Inference for Topic Models.” UAI, 2009.