日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LDA的直观解释

發布時間:2024/5/14 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LDA的直观解释 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

緣起

這篇文章的起源是當年看LDA的推導,開始的時候覺得整個數學推導太復雜了,特別是從概率建模推導出Gibbs Sampling演化公式的過程,感覺不太對我的口味了,我更喜歡從自演化的角度來理解,所以就自己嘗試折騰一個“Topic Model”。結果在折騰完之后,和LDA的結果進行對比,神奇地發現基本是一致的。
可惜后來發現其實別人也從LDA的推導結果中觀察出了這個演化規則了。要是我看得更認真一點的話,直接就能看到這個結論了。不過反過來想,既然我不愿意順著別人的思路來推導這個模型,自然也不會認真地觀察最終的結論,所以最終還是要靠這個方法才能得到LDA的直觀理解。

大致介紹一下LDA。LDA是文本分析里面一個很有名的topic
model,它基于一個簡單的詞袋模型,通過概率建模,得到文檔和詞匯的主題分布。這個模型很為人稱道的一個特點,是它的數學推導是比較優雅的,由給定的先驗Dirichlet分布,得到文檔生成的似然函數,然后得到Gibbs
Sampling收斂時的分布,就是topic的對應分布。LDA在前些日子還是挺流行的,網絡上好的介紹文章很多,比如這個blog,新浪的同學寫的LDA漫游指南,還有騰訊的LDA數學八卦,都有很詳細的推導過程。

以下就是我折騰這個“Topic Model”的過程。

直觀topic model的思路

最簡單的想法,當然就是基于聚類的思想,本質上LDA也是一種聚類,比如GMM也是通過概率模型得到似然函數來實現聚類的。同時LDA已經給我們提供了非常好的訓練方法了,那就是Gibbs Sampling,可以簡單地把它理解為一種迭代算法,或者本質一點就是將系統演化到熱力學平衡態的方式,Markov模型的穩態對應的就是熱力學平衡態。那么這就是一個典型的Ising model,我們現在要做的事情非常簡單,就是給出一些更直觀的演化規則,也就是每個詞每一次應該如何決定跳轉到哪個topic

在思考規則之前,先簡化一下問題,方便驗證新的規則是否能得到合理的topic分布。同時還應該找個標準的LDA實現,跟標準結果進行對比。

問題的極端版本

這里先處理極端版本,給定3篇文檔,9個詞,每個文檔擁有3個詞,每個詞只屬于一篇文檔,用簡單的詞項向量來表示文檔如下


d1 = [(1, 10.0), (2, 10.0), (3, 10.0)]
d2 = [(4, 10.0), (5, 10.0), (6, 10.0)]
d3 = [(7, 10.0), (8, 10.0), (9, 10.0)]

1-9就是詞id,后面的10是詞的詞頻。這里權重統一取10是為了后面拓展對比。雖然這里每個文檔出現多次的同一個詞抽象成了詞頻,對實際上在訓練的時候,是應該每個詞(不同位置算兩個)單獨跳轉的。

非常顯然,對于這種情況,如果設定topic數目為3,最合理的topic分布是每篇文章完全1個topic,每個詞也完全對應一個topic。(如果topic數目設為4呢?理想的情況當然是還是只有3個topic是有意義的,比如前面討論cluster算法的魯棒性,這里暫不考慮這個問題)

標準LDA結果

這里的標準LDA實現用了gensim,代碼和結果如下
測試代碼

corpus = [[(1, 10.0), (2, 10.0), (3, 10.0)],[(4, 10.0), (5, 10.0), (6, 10.0)],[(7, 10.0), (8, 10.0), (9, 10.0)]] model = gensim.models.LdaModel(corpus, num_topics=3, update_every=0, passes=20) print 'topic 0:', model.print_topic(0) print 'topic 1:', model.print_topic(1) print 'topic 2:', model.print_topic(2) for i in range(1, 10):print 'word', i, model.get_term_topics(i)

輸出結果(事實上,即便迭代次數設到100,仍然不能保證每次都出來這個理想情況,但大部分時候還是可以的)

topic 0: 0.310*5 + 0.310*6 + 0.310*4 + 0.010*1 + 0.010*3 + 0.010*2 + 0.010*9 + 0.010*7 + 0.010*8 + 0.010*0 topic 1: 0.310*9 + 0.310*8 + 0.310*7 + 0.010*1 + 0.010*3 + 0.010*2 + 0.010*6 + 0.010*4 + 0.010*5 + 0.010*0 topic 2: 0.310*2 + 0.310*3 + 0.310*1 + 0.010*4 + 0.010*5 + 0.010*6 + 0.010*8 + 0.010*7 + 0.010*9 + 0.010*0 word 1 [(2, 0.29958881624461359)] word 2 [(2, 0.29960836529561002)] word 3 [(2, 0.29960656074961889)] word 4 [(0, 0.29960501759439934)] word 5 [(0, 0.29960503256664051)] word 6 [(0, 0.29960502961451951)] word 7 [(1, 0.29957133395083341)] word 8 [(1, 0.29957135950646596)] word 9 [(1, 0.2995714166623073)]

這個結果還是比較符合預期的,每個topic基本就對應一個文檔擁有的3個詞,每個詞只對應一個topic。證明LDA可以處理這種極端簡單的情況,得到符合預期的結果。

直觀規則

現在看看用從最直觀的角度出發怎么構建規則。

初始版本

先來試試最簡單的思路:

1. 文檔應該傾向集中于某些topic,因此詞跳轉到topic的概率,正比于所在文檔的topic分布
2. 詞也應該傾向集中于某些topic,因此跳轉到topic的概率,正比于這個詞在全部文檔中所屬的topic的分布
3. 最終概率取這兩個概率平均歸一

這個想法極其簡單,但還是稍微解釋一下
規則1:一篇文檔的topic總是比較集中的,不可能都是漫無主題的,所以如果這篇文檔的其它詞都集中于某個topic,那么自然這個詞屬于這個topic的可能性也較高
規則2:一個詞所屬的topic啊,當然要看所屬的文檔,但是也要考慮到歷史的進程這個詞的全局分布。如果這個詞在別的地方都是集中于某個topic,當然它屬于這個topic的概率也較高
規則3:就是用最無腦的方式簡單處理一下,對于極端簡化情況,也應該足夠了,但是可以預計到肯定是不合理的,后面再改。

先思考一下,如此簡單的規則,對于前面提出極端簡化情況,預期的結果是否對應穩態,答案顯然是肯定的。每個文檔一個topic,文檔內的詞就都只跳轉到當前topic,而且每個詞的全局topic也是唯一的。

由于是實驗性質,代碼寫得有點隨意,就不展示了,反正也很好實現,直接給上結果。

{1: {0: 10.0}, 2: {0: 10.0}, 3: {0: 10.0}, 4: {2: 10.0}, 5: {2: 10.0}, 6: {2: 10.0}, 7: {1: 10.0}, 8: {1: 10.0}, 9: {1: 10.0}}

上面是迭代到最后每個詞對應topic的頻次(就是未歸一的分布),可以看到每個詞都屬于一個topic,而且屬于同一個文檔的詞都屬于同一個topic,分屬3個topic。嗯,看起來完全正確嘛。

{1: {2: 10.0}, 2: {2: 10.0}, 3: {2: 10.0}, 4: {2: 10.0}, 5: {2: 10.0}, 6: {2: 10.0}, 7: {2: 10.0}, 8: {2: 10.0}, 9: {2: 10.0}}

然而很不幸地,有時候會收斂到這種情況,就是所有詞和文檔都屬于同一個topic。很不幸地,這種情況對于前面的規則,也是一種穩態,而這種穩態顯然沒有任何意義。于是必須修改一下規則了。

版本2

現在的目標是,詞要傾向于分離到各個topic之中,而不是都聚集到一個topic之中。比較自然的想法是,每個topic應該傾向于集中于少數詞,也就是每個詞傾向于跳轉到它占比比例較高的topic。即便一個詞在某個topic下出現次數很多,然而別的詞在這個topic下出現次數更多,那么顯然這個詞也不應該傾向這個topic,而應該傾向于它出現次數比其它詞匯更多的topic。這基本就是tf-idf的思路。

那么我們就修改一下第二條規則
2. 詞跳轉到某個topic的概率,正比于在這個詞在該topic的占比比例

顯然,對于修改后的規則,預期中的合理分布是穩態,而上面得到的第二個結果則不是,稍加擾動就會向合理分布收斂。

{1: {0: 0.333}, 2: {0: 0.333}, 3: {0: 0.333}, 4: {2: 0.333}, 5: {2: 0.333}, 6: {2: 0.333}, 7: {1: 0.333}, 8: {1: 0.333}, 9: {1: 0.333}}

上圖是修改規則各個詞在topic上的分布(未歸一),版本1正比于頻次,所以值是10,這里正比于占比比例,所以是1/3。結果也如前面所料,修改規則后可以很穩定地收斂到合理分布。

問題的微擾動版本

極端版本的問題解決了,就開始嘗試更通用的版本,現在將文檔修改如下


d1 = [(1, 10.0), (2, 10.0), (3, 10.0), (4, 1.0)]
d2 = [(4, 10.0), (5, 10.0), (6, 10.0), (7, 1.0)]
d3 = [(7, 10.0), (8, 10.0), (9, 10.0), (1, 1.0)]

現在文檔之間有共同的詞匯了(1,4,7),但是這些詞的在不同文檔的出現頻次差別很大,因為它們還是主要應該屬于1個Topic,但會有另一個Topic的少量權重

標準LDA結果

topic 0: 0.301*7 + 0.301*9 + 0.301*8 + 0.038*1 + 0.010*4 + 0.010*5 + 0.010*6 + 0.010*3 + 0.010*2 + 0.010*0 topic 1: 0.301*1 + 0.301*3 + 0.301*2 + 0.038*4 + 0.010*5 + 0.010*6 + 0.010*7 + 0.010*8 + 0.010*9 + 0.010*0 topic 2: 0.301*4 + 0.301*6 + 0.301*5 + 0.038*7 + 0.010*1 + 0.010*2 + 0.010*3 + 0.010*8 + 0.010*9 + 0.010*0 word 1 [(0, 0.025377732076891448), (1, 0.29127688616997127)] word 2 [(1, 0.29074483176216914)] word 3 [(1, 0.29074725226352127)] word 4 [(1, 0.025391350433117077), (2, 0.29124987747253384)] word 5 [(2, 0.29072234310628031)] word 6 [(2, 0.29073483184310916)] word 7 [(0, 0.29119614486736145), (2, 0.025381072884006612)] word 8 [(0, 0.29064756923915058)] word 9 [(0, 0.29064775605257226)]

LDA的結果看起來還是比較合理的,1,4,7三個詞在兩個Topic上擁有權重,但差別很明顯,基本分布跟之前的問題差不多

直觀規則

前面一個問題給出的結果是系統在最后一次迭代時的Topic分布,而這次這個問題稍微復雜了,不應該用單次分布,而是取系統平衡之后的多步的平均
隨機兩次結果
結果1

{1: {0: 0.36, 1: 0.279, 2: 0.361}, 2: {0: 0.366, 1: 0.256, 2: 0.378}, 3: {0: 0.374, 1: 0.27, 2: 0.356}, 4: {0: 0.493, 1: 0.081, 2: 0.426}, 5: {0: 0.408, 1: 0.056, 2: 0.535}, 6: {0: 0.471, 1: 0.055, 2: 0.474}, 7: {0: 0.2, 1: 0.615, 2: 0.185}, 8: {0: 0.166, 1: 0.669, 2: 0.164}, 9: {0: 0.18, 1: 0.669, 2: 0.151}}

結果2

{1: {0: 0.726, 1: 0.202, 2: 0.072}, 2: {0: 0.736, 1: 0.199, 2: 0.065}, 3: {0: 0.764, 1: 0.14, 2: 0.096}, 4: {0: 0.088, 1: 0.055, 2: 0.857}, 5: {0: 0.04, 1: 0.04, 2: 0.92}, 6: {0: 0.031, 1: 0.053, 2: 0.916}, 7: {0: 0.156, 1: 0.76, 2: 0.084}, 8: {0: 0.163, 1: 0.808, 2: 0.03}, 9: {0: 0.246, 1: 0.738, 2: 0.016}}

可以看到面對這個稍復雜一點的問題,直觀規則很不幸失效了,雖然有時候能得到還算接近合理的分布(如結果2)。

想想規則1和規則2看起來都沒什么大問題,看來要像最隨意的規則3動手了。顯然,兩個概率之間的疊加,不應該使用平均,因為出了互斥事件,概率之間不具備可加性。更合理的辦法是相乘,或者也可以理解為一種等冪加權(對數平均)。顯然也不一定要等冪,但是為什么不呢?就選擇最簡單的辦法好了。
另外乘法跟加法有個巨大的不同,就是其中一個值為0和接近于0,兩種情況是完全不同的。加法是不怎么受影響的,但是相乘差距就很大了,不能因為某個值為0,整個概率就直接為0。所以要設個最低值,類似樸素貝葉斯的做法。
于是規則3就變成
3. 最終概率取這兩個概率乘積歸一(如果其中一個概率為0,取為0.001)

修改規則后可以穩定地迭代出類似以下的結果

{1: {1: 0.91, 2: 0.09}, 2: {1: 1.0}, 3: {1: 1.0}, 4: {0: 0.923, 1: 0.077}, 5: {0: 1.0}, 6: {0: 1.0}, 7: {0: 0.083, 2: 0.917}, 8: {2: 1.0}, 9: {2: 1.0}}

這個結果和前面gensim跑出來的結果基本是一致的,(1,4,7)都有兩個Topic,而且兩者基本相差一個量級

因此最終的演化規則就是
1. 文檔應該傾向集中于某些topic,因此詞跳轉到topic的概率,正比于所在文檔的topic分布
2. 詞跳轉到某個topic的概率,正比于在這個詞在該topic的占比比例
3. 最終概率取這兩個概率乘積歸一(如果其中一個概率為0,取為0.001)

跟LDA的對比

目前既然得到了一個看上去還算合理的規則,自然就想跟LDA的Gibbs Sampling公式進行對比。正如前文所言,對比發現是一致的(除了模型先驗參數,不過可能喜好貝葉斯的人會覺得這些參數形式很重要),而且也早已有人根據結果指出了這個意義(估計原paper就指出來了)。因此實際上,這就是直接從自演化(聚類)出發得到了LDA的結果。可惜意義并不大,因為從LDA的結果很容易地就能直接觀察出這些規則。

不過,這其實也可以提供一些啟示。實際上很多的問題,都能從目的論和天演論兩種方式進行理解。LDA雖然最終得到了這個結果,但是它是從文檔的生成概率出發得到這個結論的,而不是詞的topic演化。類似的比如LR模型,可以從最大熵推導得到,但如果從模型最終的演化梯度來想,就是一種非常直觀的根據樣品演化特征參數的方式。對于一個算法,從底層演化的角度來理解一般是更直觀的。很難想象一個人在使用LDA的時候,會從頭從文檔生成的角度推導一遍得到結果,但是以上文的角度,很直觀地就可以寫出一個LDA模型了。不過話又說回來,實際項目使用LDA的時候,由于計算效率的考慮,往往會選擇VB法,或者像LightLDA這樣的變種,這又是另外一回事了。

總結

以上是生活随笔為你收集整理的LDA的直观解释的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。