Probabilistic Latent Semantic Analysis
主題模型簡介
plsa,也就是概率隱語義分析,是主題模型的一種。主題模型是什麼呢?先從文檔說起,每篇文檔用bag-of-words模型表示,也就是每篇文檔只與所包含的詞有關,而不考慮這些詞的先後順序。假設文檔集D 有N 篇文檔,主題模型認爲在這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是一個生成模型,它假設了d ,w ,z 之間的關係通過上圖的貝葉斯網絡 所表示。灰色的節點d 和w 表示我們能夠觀測到的變量,也就是具體的文檔與文檔中的詞。白色的節點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) 就是觀測到變量d 與w 的聯合概率分佈。寫出似然函數
L(θ)=∏d∏wp(d,w)n(d,w)
再寫出log似然函數
LL(θ)=∑d∑wn(d,w)logp(d,w)=∑d∑wn(d,w)[logp(d)+logp(w|d)]
其中
p(w|d)=∑zp(w|z)p(z|d)
所以待求解的問題就是
argmaxθLL(θ)=argmaxθ∑d∑wn(d,w)[logp(d)+log∑zp(w|z)p(z|d)]
p(d) 與需要估計的參數無關,這一項直接捨去不影響結果,得到
argmaxθLL(θ)=argmaxθ∑d∑wn(d,w)log∑zp(w|z)p(z|d)
現在問題來了,z 是隱含變量,無法觀測到,怎麼去最大化這個公式呢?假設我們已知在觀測d ,w 下z 的概率分佈p(z|d,w) ,再對上面的公式做一個變換,同時乘上和除以p(z|d,w)
argmaxθLL(θ)=argmaxθ∑d∑wn(d,w)log∑zp(z|d,w)p(w|z)p(z|d)p(z|d,w)
那麼上式log 的右邊就變成了關於z 的函數的期望Ez ,式子變成
argmaxθLL(θ)=argmaxθ∑d∑wn(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θ∑d∑wn(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))∑d∑wn(d,w)pold(z(k)|d,w)(2)
pnew(z(k)|d(i))=∑wn(d(i),w)pold(z(k)|d(i),w)∑w∑zn(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