LDA的直观解释
緣起
這篇文章的起源是當(dāng)年看LDA的推導(dǎo),開始的時(shí)候覺得整個(gè)數(shù)學(xué)推導(dǎo)太復(fù)雜了,特別是從概率建模推導(dǎo)出Gibbs Sampling演化公式的過程,感覺不太對(duì)我的口味了,我更喜歡從自演化的角度來理解,所以就自己嘗試折騰一個(gè)“Topic Model”。結(jié)果在折騰完之后,和LDA的結(jié)果進(jìn)行對(duì)比,神奇地發(fā)現(xiàn)基本是一致的。
可惜后來發(fā)現(xiàn)其實(shí)別人也從LDA的推導(dǎo)結(jié)果中觀察出了這個(gè)演化規(guī)則了。要是我看得更認(rèn)真一點(diǎn)的話,直接就能看到這個(gè)結(jié)論了。不過反過來想,既然我不愿意順著別人的思路來推導(dǎo)這個(gè)模型,自然也不會(huì)認(rèn)真地觀察最終的結(jié)論,所以最終還是要靠這個(gè)方法才能得到LDA的直觀理解。
大致介紹一下LDA。LDA是文本分析里面一個(gè)很有名的topic
model,它基于一個(gè)簡(jiǎn)單的詞袋模型,通過概率建模,得到文檔和詞匯的主題分布。這個(gè)模型很為人稱道的一個(gè)特點(diǎn),是它的數(shù)學(xué)推導(dǎo)是比較優(yōu)雅的,由給定的先驗(yàn)Dirichlet分布,得到文檔生成的似然函數(shù),然后得到Gibbs
Sampling收斂時(shí)的分布,就是topic的對(duì)應(yīng)分布。LDA在前些日子還是挺流行的,網(wǎng)絡(luò)上好的介紹文章很多,比如這個(gè)blog,新浪的同學(xué)寫的LDA漫游指南,還有騰訊的LDA數(shù)學(xué)八卦,都有很詳細(xì)的推導(dǎo)過程。
以下就是我折騰這個(gè)“Topic Model”的過程。
直觀topic model的思路
最簡(jiǎn)單的想法,當(dāng)然就是基于聚類的思想,本質(zhì)上LDA也是一種聚類,比如GMM也是通過概率模型得到似然函數(shù)來實(shí)現(xiàn)聚類的。同時(shí)LDA已經(jīng)給我們提供了非常好的訓(xùn)練方法了,那就是Gibbs Sampling,可以簡(jiǎn)單地把它理解為一種迭代算法,或者本質(zhì)一點(diǎn)就是將系統(tǒng)演化到熱力學(xué)平衡態(tài)的方式,Markov模型的穩(wěn)態(tài)對(duì)應(yīng)的就是熱力學(xué)平衡態(tài)。那么這就是一個(gè)典型的Ising model,我們現(xiàn)在要做的事情非常簡(jiǎn)單,就是給出一些更直觀的演化規(guī)則,也就是每個(gè)詞每一次應(yīng)該如何決定跳轉(zhuǎn)到哪個(gè)topic。
在思考規(guī)則之前,先簡(jiǎn)化一下問題,方便驗(yàn)證新的規(guī)則是否能得到合理的topic分布。同時(shí)還應(yīng)該找個(gè)標(biāo)準(zhǔn)的LDA實(shí)現(xiàn),跟標(biāo)準(zhǔn)結(jié)果進(jìn)行對(duì)比。
問題的極端版本
這里先處理極端版本,給定3篇文檔,9個(gè)詞,每個(gè)文檔擁有3個(gè)詞,每個(gè)詞只屬于一篇文檔,用簡(jiǎn)單的詞項(xiàng)向量來表示文檔如下
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是詞的詞頻。這里權(quán)重統(tǒng)一取10是為了后面拓展對(duì)比。雖然這里每個(gè)文檔出現(xiàn)多次的同一個(gè)詞抽象成了詞頻,對(duì)實(shí)際上在訓(xùn)練的時(shí)候,是應(yīng)該每個(gè)詞(不同位置算兩個(gè))單獨(dú)跳轉(zhuǎn)的。
非常顯然,對(duì)于這種情況,如果設(shè)定topic數(shù)目為3,最合理的topic分布是每篇文章完全1個(gè)topic,每個(gè)詞也完全對(duì)應(yīng)一個(gè)topic。(如果topic數(shù)目設(shè)為4呢?理想的情況當(dāng)然是還是只有3個(gè)topic是有意義的,比如前面討論cluster算法的魯棒性,這里暫不考慮這個(gè)問題)
標(biāo)準(zhǔn)LDA結(jié)果
這里的標(biāo)準(zhǔn)LDA實(shí)現(xiàn)用了gensim,代碼和結(jié)果如下
測(cè)試代碼
輸出結(jié)果(事實(shí)上,即便迭代次數(shù)設(shè)到100,仍然不能保證每次都出來這個(gè)理想情況,但大部分時(shí)候還是可以的)
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)]這個(gè)結(jié)果還是比較符合預(yù)期的,每個(gè)topic基本就對(duì)應(yīng)一個(gè)文檔擁有的3個(gè)詞,每個(gè)詞只對(duì)應(yīng)一個(gè)topic。證明LDA可以處理這種極端簡(jiǎn)單的情況,得到符合預(yù)期的結(jié)果。
直觀規(guī)則
現(xiàn)在看看用從最直觀的角度出發(fā)怎么構(gòu)建規(guī)則。
初始版本
先來試試最簡(jiǎn)單的思路:
1. 文檔應(yīng)該傾向集中于某些topic,因此詞跳轉(zhuǎn)到topic的概率,正比于所在文檔的topic分布
2. 詞也應(yīng)該傾向集中于某些topic,因此跳轉(zhuǎn)到topic的概率,正比于這個(gè)詞在全部文檔中所屬的topic的分布
3. 最終概率取這兩個(gè)概率平均歸一
這個(gè)想法極其簡(jiǎn)單,但還是稍微解釋一下
規(guī)則1:一篇文檔的topic總是比較集中的,不可能都是漫無主題的,所以如果這篇文檔的其它詞都集中于某個(gè)topic,那么自然這個(gè)詞屬于這個(gè)topic的可能性也較高
規(guī)則2:一個(gè)詞所屬的topic啊,當(dāng)然要看所屬的文檔,但是也要考慮到歷史的進(jìn)程這個(gè)詞的全局分布。如果這個(gè)詞在別的地方都是集中于某個(gè)topic,當(dāng)然它屬于這個(gè)topic的概率也較高
規(guī)則3:就是用最無腦的方式簡(jiǎn)單處理一下,對(duì)于極端簡(jiǎn)化情況,也應(yīng)該足夠了,但是可以預(yù)計(jì)到肯定是不合理的,后面再改。
先思考一下,如此簡(jiǎn)單的規(guī)則,對(duì)于前面提出極端簡(jiǎn)化情況,預(yù)期的結(jié)果是否對(duì)應(yīng)穩(wěn)態(tài),答案顯然是肯定的。每個(gè)文檔一個(gè)topic,文檔內(nèi)的詞就都只跳轉(zhuǎn)到當(dāng)前topic,而且每個(gè)詞的全局topic也是唯一的。
由于是實(shí)驗(yàn)性質(zhì),代碼寫得有點(diǎn)隨意,就不展示了,反正也很好實(shí)現(xiàn),直接給上結(jié)果。
{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}}上面是迭代到最后每個(gè)詞對(duì)應(yīng)topic的頻次(就是未歸一的分布),可以看到每個(gè)詞都屬于一個(gè)topic,而且屬于同一個(gè)文檔的詞都屬于同一個(gè)topic,分屬3個(gè)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}}然而很不幸地,有時(shí)候會(huì)收斂到這種情況,就是所有詞和文檔都屬于同一個(gè)topic。很不幸地,這種情況對(duì)于前面的規(guī)則,也是一種穩(wěn)態(tài),而這種穩(wěn)態(tài)顯然沒有任何意義。于是必須修改一下規(guī)則了。
版本2
現(xiàn)在的目標(biāo)是,詞要傾向于分離到各個(gè)topic之中,而不是都聚集到一個(gè)topic之中。比較自然的想法是,每個(gè)topic應(yīng)該傾向于集中于少數(shù)詞,也就是每個(gè)詞傾向于跳轉(zhuǎn)到它占比比例較高的topic。即便一個(gè)詞在某個(gè)topic下出現(xiàn)次數(shù)很多,然而別的詞在這個(gè)topic下出現(xiàn)次數(shù)更多,那么顯然這個(gè)詞也不應(yīng)該傾向這個(gè)topic,而應(yīng)該傾向于它出現(xiàn)次數(shù)比其它詞匯更多的topic。這基本就是tf-idf的思路。
那么我們就修改一下第二條規(guī)則
2. 詞跳轉(zhuǎn)到某個(gè)topic的概率,正比于在這個(gè)詞在該topic的占比比例
顯然,對(duì)于修改后的規(guī)則,預(yù)期中的合理分布是穩(wěn)態(tài),而上面得到的第二個(gè)結(jié)果則不是,稍加擾動(dòng)就會(huì)向合理分布收斂。
{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}}上圖是修改規(guī)則各個(gè)詞在topic上的分布(未歸一),版本1正比于頻次,所以值是10,這里正比于占比比例,所以是1/3。結(jié)果也如前面所料,修改規(guī)則后可以很穩(wěn)定地收斂到合理分布。
問題的微擾動(dòng)版本
極端版本的問題解決了,就開始嘗試更通用的版本,現(xiàn)在將文檔修改如下
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)]
現(xiàn)在文檔之間有共同的詞匯了(1,4,7),但是這些詞的在不同文檔的出現(xiàn)頻次差別很大,因?yàn)樗鼈冞€是主要應(yīng)該屬于1個(gè)Topic,但會(huì)有另一個(gè)Topic的少量權(quán)重
標(biāo)準(zhǔn)LDA結(jié)果
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的結(jié)果看起來還是比較合理的,1,4,7三個(gè)詞在兩個(gè)Topic上擁有權(quán)重,但差別很明顯,基本分布跟之前的問題差不多
直觀規(guī)則
前面一個(gè)問題給出的結(jié)果是系統(tǒng)在最后一次迭代時(shí)的Topic分布,而這次這個(gè)問題稍微復(fù)雜了,不應(yīng)該用單次分布,而是取系統(tǒng)平衡之后的多步的平均
隨機(jī)兩次結(jié)果
結(jié)果1
結(jié)果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}}可以看到面對(duì)這個(gè)稍復(fù)雜一點(diǎn)的問題,直觀規(guī)則很不幸失效了,雖然有時(shí)候能得到還算接近合理的分布(如結(jié)果2)。
想想規(guī)則1和規(guī)則2看起來都沒什么大問題,看來要像最隨意的規(guī)則3動(dòng)手了。顯然,兩個(gè)概率之間的疊加,不應(yīng)該使用平均,因?yàn)槌隽嘶コ馐录?#xff0c;概率之間不具備可加性。更合理的辦法是相乘,或者也可以理解為一種等冪加權(quán)(對(duì)數(shù)平均)。顯然也不一定要等冪,但是為什么不呢?就選擇最簡(jiǎn)單的辦法好了。
另外乘法跟加法有個(gè)巨大的不同,就是其中一個(gè)值為0和接近于0,兩種情況是完全不同的。加法是不怎么受影響的,但是相乘差距就很大了,不能因?yàn)槟硞€(gè)值為0,整個(gè)概率就直接為0。所以要設(shè)個(gè)最低值,類似樸素貝葉斯的做法。
于是規(guī)則3就變成
3. 最終概率取這兩個(gè)概率乘積歸一(如果其中一個(gè)概率為0,取為0.001)
修改規(guī)則后可以穩(wěn)定地迭代出類似以下的結(jié)果
{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}}這個(gè)結(jié)果和前面gensim跑出來的結(jié)果基本是一致的,(1,4,7)都有兩個(gè)Topic,而且兩者基本相差一個(gè)量級(jí)
因此最終的演化規(guī)則就是
1. 文檔應(yīng)該傾向集中于某些topic,因此詞跳轉(zhuǎn)到topic的概率,正比于所在文檔的topic分布
2. 詞跳轉(zhuǎn)到某個(gè)topic的概率,正比于在這個(gè)詞在該topic的占比比例
3. 最終概率取這兩個(gè)概率乘積歸一(如果其中一個(gè)概率為0,取為0.001)
跟LDA的對(duì)比
目前既然得到了一個(gè)看上去還算合理的規(guī)則,自然就想跟LDA的Gibbs Sampling公式進(jìn)行對(duì)比。正如前文所言,對(duì)比發(fā)現(xiàn)是一致的(除了模型先驗(yàn)參數(shù),不過可能喜好貝葉斯的人會(huì)覺得這些參數(shù)形式很重要),而且也早已有人根據(jù)結(jié)果指出了這個(gè)意義(估計(jì)原paper就指出來了)。因此實(shí)際上,這就是直接從自演化(聚類)出發(fā)得到了LDA的結(jié)果。可惜意義并不大,因?yàn)閺腖DA的結(jié)果很容易地就能直接觀察出這些規(guī)則。
不過,這其實(shí)也可以提供一些啟示。實(shí)際上很多的問題,都能從目的論和天演論兩種方式進(jìn)行理解。LDA雖然最終得到了這個(gè)結(jié)果,但是它是從文檔的生成概率出發(fā)得到這個(gè)結(jié)論的,而不是詞的topic演化。類似的比如LR模型,可以從最大熵推導(dǎo)得到,但如果從模型最終的演化梯度來想,就是一種非常直觀的根據(jù)樣品演化特征參數(shù)的方式。對(duì)于一個(gè)算法,從底層演化的角度來理解一般是更直觀的。很難想象一個(gè)人在使用LDA的時(shí)候,會(huì)從頭從文檔生成的角度推導(dǎo)一遍得到結(jié)果,但是以上文的角度,很直觀地就可以寫出一個(gè)LDA模型了。不過話又說回來,實(shí)際項(xiàng)目使用LDA的時(shí)候,由于計(jì)算效率的考慮,往往會(huì)選擇VB法,或者像LightLDA這樣的變種,這又是另外一回事了。
總結(jié)
- 上一篇: linux系统安装u盘教程deepin,
- 下一篇: @Target: