plsa(Probabilistic Latent Semantic Analysis) 概率隱語義分析

Probabilistic Latent Semantic Analysis

主題模型簡介

plsa,也就是概率隱語義分析,是主題模型的一種。主題模型是什麼呢?先從文檔說起,每篇文檔用bag-of-words模型表示,也就是每篇文檔只與所包含的詞有關,而不考慮這些詞的先後順序。假設文檔集DN 篇文檔,主題模型認爲在這N 篇文檔中一共隱含了Z 個主題,每篇文檔都可能屬於一個或多個主題,這可以用給定文檔d 時所屬主題z 的概率分佈p(z|d) 表示。同理,一個主題下可以包含若干個詞w ,用概率分佈p(w|z) 表示。

所以,如果我們有文檔集D ,又求出對應這個文檔集的主題模型,那這有什麼意義呢?最明顯的意義就是,這相當於給文檔聚類了,並且聚類的結果有更合理的解釋性。因爲我們不但可以知道每一篇文檔d 屬於哪個類別z ,我們還可以根據概率p(w|z) 知道這個主題的關鍵詞是哪些,從而給這個主題z 設置合理的標籤。知道文檔所屬的類別,我們就可以判斷兩篇文檔在語義上是否相似了。雖然可以直接根據文檔向量的餘弦距離來判斷它們是否相似,但是這對近義詞就無能爲力,比如兩篇同樣介紹電子產品的文檔,一篇大量用“蘋果”這個關鍵詞,而另一篇大量用“iPhone”,那麼通過餘弦距離判斷的這兩個維度上肯定是不相似的。而“蘋果”、“iPhone”兩個詞都與電子產品關係很大,所以這兩篇文檔可以都屬於同一個主題,也就可以斷定他們語義上是相似的。

主題模型的用處還是很多的,在推薦系統,輿情監控等等,都有廣泛的用途。

plsa原理

介紹完主題模型的基本概念,就要回到本文的重點,給定一個文檔集D ,如何估計主題模型的參數呢?接下來說明如何用plsa來求出這些參數。先放一張圖

概率圖

首先介紹一下圖中參數:d 代表每一篇文檔,z 表示每一個隱含主題,w 表示具體的單詞。N 表示每篇文檔的單詞數,M 表示文檔集D 內的文檔數。

plsa是一個生成模型,它假設了dwz 之間的關係通過上圖的貝葉斯網絡 所表示。灰色的節點dw 表示我們能夠觀測到的變量,也就是具體的文檔與文檔中的詞。白色的節點z 就是隱含的主題變量。每篇文檔的生成過程是
1. 以概率p(d) 選定文檔。
2. 以概率p(z|d) 選定一個主題。
3. 以概率p(w|z) 從主題中選定單詞。

我們需要估計的參數就是p(z|d)p(w|z) ,後文有些地方用θ 來表示他們。先不管我們知不知道z 是什麼,用極大似然估計試試。n(d,w) 表示某篇文檔d 中的詞w 出現的次數,這個直接統計得到。p(d,w) 就是觀測到變量dw 的聯合概率分佈。寫出似然函數

L(θ)=dwp(d,w)n(d,w)

再寫出log似然函數

LL(θ)=dwn(d,w)logp(d,w)=dwn(d,w)[logp(d)+logp(w|d)]

其中

p(w|d)=zp(w|z)p(z|d)

所以待求解的問題就是

argmaxθLL(θ)=argmaxθdwn(d,w)[logp(d)+logzp(w|z)p(z|d)]

p(d) 與需要估計的參數無關,這一項直接捨去不影響結果,得到

argmaxθLL(θ)=argmaxθdwn(d,w)logzp(w|z)p(z|d)

現在問題來了,z 是隱含變量,無法觀測到,怎麼去最大化這個公式呢?假設我們已知在觀測dwz 的概率分佈p(z|d,w) ,再對上面的公式做一個變換,同時乘上和除以p(z|d,w)

argmaxθLL(θ)=argmaxθdwn(d,w)logzp(z|d,w)p(w|z)p(z|d)p(z|d,w)

那麼上式log 的右邊就變成了關於z 的函數的期望Ez ,式子變成

argmaxθLL(θ)=argmaxθdwn(d,w)logEz[p(w|z)p(z|d)p(z|d,w)]

根據Jensen不等式

logEz[p(w|z)p(z|d)p(z|d,w)]Ez[logp(w|z)p(z|d)p(z|d,w)]

那麼在已知p(z|d,w) 的條件下我們就可以得到LL(θ) 的一個下界函數Q(θ) ,如果這個下界函數可以求最大化,我們就最大化它以估計我們所需的參數。然後根據新的參數求p(z|d,w) ,再寫出新的下界函數,再最大化…反覆迭代直至收斂。這就是將EM算法應用到plsa的求解中。

其中

Ez[logp(w|z)p(z|d)p(z|d,w)]=zp(z|d,w)[logp(w|z)P(z|d)logp(z|d,w)]

logp(z|d,w) 與我們所需要求的參數無關(因爲假設它是已知的值),將它捨去不影響求解。需要求解的問題就變成了

argmaxθQ(θ)=argmaxθdwn(d,w)zp(z|d,w)logp(w|z)P(z|d)

根據貝葉斯定理,可以得到

p(z|d,w)=p(d,z,w)p(d,w)=p(d)p(z|d)p(w|z)p(d)zp(z|d)p(w|z)=p(z|d)p(w|z)zp(z|d)p(w|z)(1)

補充說明一下,求p(z|d,w) 是求解p(z(k)|d(i),w(j)) ,也就是我們需要遍歷每一個隱含主題z ,每一篇文檔d ,每一個詞w 。而此時的p(z(k)|d(i))p(w(j)|z(k)) 我們是當做已知的,初始化的時候隨機給一個值。

到這裏已經講完了用EM算法的E步。歸納一下,在plsa的情境下,E步就是求出所有的p(z(k)|d(i),w(j))

接下來是M步,最大化Q(θ) ,求出新的參數p(z|d)p(w|z) 。應用拉格朗日數乘法求解出新的參數

pnew(w(j)|z(k))=dn(d,w(j))pold(z(k)|d,w(j))dwn(d,w)pold(z(k)|d,w)(2)

pnew(z(k)|d(i))=wn(d(i),w)pold(z(k)|d(i),w)wzn(d,w)pold(z|d(i),w)(3)

總結一下,plsa剛開始理解很難,只要理解了怎麼求期望(E步),怎麼求最大化(M步),然後根據推導出來的公式編程就很簡單了。基本上就分爲統計所有的n(d,w) ,選定主題數|Z| ,然後初始化所有的參數p(z(k)|d(i))p(w(j)|z(k)) ,接下來根據不斷的迭代,每一次迭代先用公式(1)求p(z|d,w) ,然後根據公式(2)和(3)更新參數。直到收斂,收斂條件可以是|Q(θt+1)Q(θt)|<ϵ ,也可以是兩次迭代參數的差值小於某個閾值。

完整的Python實現代碼見我的github

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章