2018年3月13日 星期二

透過Java開發 Spark 2.x ML 的 LDA (Latent Dirichlet allocation) model 的感想

借用 Deep Learning 那門課的一張投影片來代表我最近在做的事,一直不斷的在轉圈圈,但是其實更多時候腦袋都是下圖這種轉圈圈:


主要的挑戰如下:
  1. 第一次用Spark 寫 ML 相關的程式,然後網路上的範例和討論幾乎都是用 scala 和python 寫的,為了要轉成Java版花了不少力氣。
  2. 資料散亂且難以理解,關於LDA 的文章幾乎都是論文等級了,充滿了難以下嚥的數學公式,往往都是直接略過,而且關於LDA 和 Spark ML 相關的中文討論又是以大陸居多,不過也因此挖到不少寶。

Spark ML 內建的Pipeline 主要分為以下四個步驟:



不過後來才發現Spark ML 的 pipeline 是給 supervisor learning 使用的,因為有 label 的 data  可以用來驗證訓練的結果是好還是不好,但是我們這次用到的不論是 LDA 或是 word2vec 都是屬於 unsupervised learning 沒有一個明確的基準點可以驗證,因次不適合用 cross validation 來找出最佳的 hyper parameter 。



那LDA 可以調的參數有哪些些呢?如下圖所示,主要是 K (topic number) , max iteration,doc Concentration和 topic Concentration,不過上網看了許多論文和討論,似乎影響最大的還是K 值。




原本以為只要把這些參數排列組合,找出最大 likelihood 或最小的 perplexity 結果居然看到以下的討論......



在研究中產生許多問題,順便把問題整理在這裡:

1. LDA 跟 word2vec 的差異在哪裡?

LDA 注重的是文章與文章間所有詞的關係,而word2vec 是詞與某篇文章上下文之間的關係,也就是說 word2vec 並沒有考慮語法層面的訊息,一篇文章被看成文字序列(word sequences),只考慮詞與詞之間的位置與邊界關係。

網路上找了一個有趣的解釋,假如你輸入HTC:

普通的word2vec 會找到:Android,cellphone,Taiwan,Google...
但是考慮語法後:Moto,Apple,Nokia,Xiaomi...

雖然看起來都有關連,但是本質上卻是不一樣,真得好難啊....

更多網路資訊:

關於LDA 與 Spark 相關文章:


 





張貼留言