LSA(Latent Semantic Analysis), 潛在語義分析。試圖利用文檔中隱藏的潛在的概念來進行文檔分析與檢索,可以達到比直接的關鍵詞匹配得到更好的效果。python
假設有 nn 篇文檔,這些文檔中的單詞總數爲 mm (能夠先進行分詞、去詞根、去中止詞操做),咱們能夠用一個 m∗nm∗n的矩陣 XX 來表示這些文檔,這個矩陣的每一個元素 XijXij 表示第 ii 個單詞在第 jj 篇文檔中出現的次數(也可用tf-idf值)。下文例子中獲得的矩陣見下圖。
LSA試圖將原始矩陣降維到一個潛在的概念空間(維度不超過 nn ),而後每一個單詞或文檔均可以用該空間下的一組權值向量(也可認爲是座標)來表示,這些權值反應了與對應的潛在概念的關聯程度的強弱。
這個降維是經過對該矩陣進行奇異值分解(SVD, singular value decomposition)作到的,計算其用三個矩陣的乘積表示的等價形式,以下:
\[ X=U \Sigma V^{T} \]
其中 UU 爲 m * n
維,ΣΣ 爲對角陣 n * n
維,VV 爲 n * n
維。
ΣΣ 矩陣中對角線上的每個值就是SVD過程當中獲得的奇異值,其大小反映了其對應的潛在概念的重要程度。
而後咱們能夠自行設定降維後的潛在概念的維度 \(k(k<n)k(k<n)\) , 能夠獲得:
\[ X_{k}=U_{k} \Sigma_{k} V_{k}^{T} \]
其中 \(U_k\) 是將 \(U\) 僅保留前 \(k\) 列的結果,\(Σk\) 是僅保留前 \(k\) 行及前 \(k\) 列的結果,\(V_k\) 是將 \(V\) 僅保留前 \(k\) 列的結果。
\(X_k\) 則是將 \(X\) 降維到 \(k\) 維的近似結果,這個 \(k\) 越接近 \(n\), \(X_k\) 與 \(X\) 也越接近,但咱們的目標並非越接近越好,LSA認爲 \(k\) 值不宜過大(保留了冗餘的潛在概念)也不宜太小。算法
LSA使用線性代數方法,對document-word矩陣進行SVD分解。PLSA則使用了一個機率圖模型,引入了一個隱變量topic(能夠認爲是文檔的主題),而後進行統計推斷。函數
在語義分析問題中,存在同義詞和一詞多義這兩個嚴峻的問題,LSA能夠很好的解決同義詞問題,卻沒法妥善處理一詞多義問題。
PLSA則能夠同時解決同義詞和一詞多義兩個問題。spa
咱們知道文檔(一個句子、一個段落或一篇文章)都有它本身的主題,從大的方面講有經濟、政治、文化、體育、音樂、法律、動漫、遊戲、法律等等主題,PLSA模型就引入了一個隱變量topic來表示這個主題。
PLSA的機率圖模型以下圖所示:code
其中 DD 表示文檔(document),\(Z\) 表示主題(topic), \(W\) 表示單詞(word),其中箭頭表示了變量間的依賴關係,好比 \(D\) 指向 \(Z\),表示一篇文檔決定了該文檔的主題,\(Z\) 指向 \(W\) 表示由該主題生成一個單詞,方框右下角的字母表示該方框執行的次數,\(N\) 表示共生成了 \(N\) 篇文檔,\(M\) 表示一篇文檔按照document-topic分佈生成了 \(M\) 次主題,每一次按照生成的主題的topic-word分佈生成單詞。每一個文檔的單詞數能夠不一樣。
PLSA引入了隱藏變量 \(Z\),認爲 \({D,W,Z}{D,W,Z}\) 表示完整的數據集(the complete data set), 而原始的真實數據集 \({D,W}{D,W}\) 是不完整的數據集(incomplete data)。
假設 \(Z\) 的取值共有 \(K\) 個。PLSA模型假設的文檔生成過程以下blog
\[ \begin{aligned} p\left(d_{i}, w_{j}\right) &=\sum_{k=1}^{K} p\left(d_{i}, w_{j}, z_{k}\right) \\ &=\sum_{k=1}^{K} p\left(d_{i}\right) p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right) \\ &=p\left(d_{i}\right) \sum_{k=1}^{K} p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right) \end{aligned} \]遊戲
第一個等式是對三者的聯合機率分佈對其中的隱藏變量 \(Z\) 的全部取值累加,第二個等式根據圖模型的依賴關係將聯合機率展開爲條件機率,第三個等式只是簡單的乘法結合律。這樣就計算出了第 \(i\) 篇文檔與第 \(j\) 個單詞的聯合機率分佈。ip
咱們能夠獲得完整數據的對數似然爲:
\[ \begin{aligned} L &=\sum_{i=1}^{N} \sum_{j=1}^{M} n\left(d_{i}, w_{j}\right) \log \left(p\left(d_{i}, w_{j}\right)\right) \\ &=\sum_{i=1}^{N} \sum_{j=1}^{M} n\left(d_{i}, w_{j}\right) \log \left(p\left(d_{i}\right) \sum_{k=1}^{K} p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right)\right) \\ &=\sum_{i=1}^{N} n\left(d_{i}\right) \log \left(p\left(d_{i}\right)\right)+\sum_{i=1}^{N} \sum_{j=1}^{M} n\left(d_{i}, w_{j}\right) \log \sum_{k=1}^{K} p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right) \end{aligned} \]
\(p(z_k|d_i)\) 和 \(p(w_j|z_k)\) 是PLSA模型須要求解的參數,文檔
能夠看以前所寫的關於EM 算法的blog,對於其中的函數 \(Q\), 如今給出PLSA中 \(Q\) 函數的形式
\[ \begin{aligned} Q\left(\theta, \theta^{o l d}\right) &=\sum_{i=1}^{N} \sum_{j=1}^{M} n\left(d_{i}, w_{j}\right) \sum_{k=1}^{K} p\left(z_{k} | d_{i}, w_{j}\right) \log p\left(d_{i}, w_{j}, z_{k} ; \theta\right) \\ &=\sum_{i=1}^{N} \sum_{j=1}^{M} n\left(d_{i}, w_{j}\right) \sum_{k=1}^{K} p\left(z_{k} | d_{i}, w_{j}\right) \log \left[p\left(d_{i}\right) p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right)\right] \end{aligned} \]
注意到這是由於如前文所說,在本問題中,認爲\({D,W,Z}\) 是完整的數據集。
因爲 \(p(d_i)∝n(d_i) ,\) 表示第 \(i\) 篇文檔的單詞總數,這一項估計並不重要,所以上式去掉該項,獲得:
\[ Q\left(\theta, \theta^{o l d}\right)=\sum_{i=1}^{N} \sum_{j=1}^{M} n\left(d_{i}, w_{j}\right) \sum_{k=1}^{K} p\left(z_{k} | d_{i}, w_{j}\right) \log \left[p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right)\right] \]
能夠看到對數中是參數的乘積,再也不包含求和的部分。
咱們注意到,參數存在下面的兩個約束:
\[ \begin{array}{l}{\sum_{j=1}^{M} p\left(w_{j} | z_{k}\right)=1} \\ {\sum_{k=1}^{K} p\left(z_{k} | d_{i}\right)=1}\end{array} \]
所以可使用拉格朗日乘子法(Lagrange multiplier)求取使得 \(Q\) 函數最大時對應的參數。
寫出拉格朗日函數:
\[ Lagrange=Q+\sum_{k=1}^{K} \tau_{k}\left(1-\sum_{j=1}^{M} p\left(w_{j} | z_{k}\right)\right)+\sum_{i=1}^{N} \rho_{i}\left(1-\sum_{k=1}^{K} p\left(z_{k} | d_{i}\right)\right) \]
對拉格朗日函數中的 \(p(w_j|z_k)\) 求偏導,令其等於零,獲得:
\[ \sum_{i=1}^{N} n\left(d_{i}, w_{j}\right) p\left(z_{k} | d_{i}, w_{j}\right)-\tau_{k} p\left(w_{j} | z_{k}\right)=0,1 \leq j \leq M, 1 \leq k \leq K \]
對該式 \(1≤k≤K\) 全部取值下等式兩邊累加,能夠消去 \(p(z_{k}|d_i)\), 從而獲得 \(ρ_i\) 的表達式,迴帶到上式獲得下式:
\[ p\left(z_{k} | d_{i}\right)=\frac{\sum_{j=1}^{M} n\left(d_{i}, w_{j}\right) p\left(z_{k} | d_{i}, w_{j}\right)}{n\left(d_{i}\right)} \]
這樣就獲得了EM算法的M-Step從新估計參數的公式。
那麼在E-Step如何計算 \(z\) 的後驗機率呢?根據下式計算,第一個等式是貝葉斯法則,第二個等式是根據圖模型將聯合機率展開,第三個等式是分子分母同時除以一個因子。
\[ \begin{aligned} p\left(z_{k} | d_{i}, w_{j}\right) &=\frac{p\left(d_{i}, w_{j}, z_{k}\right)}{p\left(d_{i}, w_{j}\right)} \\ &=\frac{p\left(d_{i}\right) p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right)}{\sum_{l=1}^{K} p\left(d_{i}\right) p\left(z_{l} | d_{i}\right) p\left(w_{j} | z_{l}\right)} \\ &=\frac{p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right)}{\sum_{l=1}^{K} p\left(z_{l} | d_{i}\right) p\left(w_{j} | z_{l}\right)} \end{aligned} \]get
咱們知道,PLSA也定義了一個機率圖模型,假設了數據的生成過程,可是不是一個徹底的生成過程:沒有給出先驗。所以PLSA給出的是一個最大似然估計(ML)或者最大後驗估計(MAP)。
LDA拓展了PLSA,定義了先驗,所以LDA給出的是一個完整的貝葉斯估計。
這裏先給出本文公式中以及python代碼中使用到的符號及其含義。關於編號,公式中從1開始編號,代碼中從0開始編號,只是爲了方便。
LDA 的生成過程:
對於全部的主題 \(\mathrm{k} \in[1, \mathrm{K}]\), do
樣本混合元素:\(\overrightarrow{\varphi_{k}} \sim \operatorname{Dir}(\vec{\beta})\)
隊友全部的文本 \(\mathrm{i} \in[1, \mathrm{N}]\):
樣本混合的比例:\(\overrightarrow{\theta_{i}} \sim \operatorname{Dir}(\vec{\alpha})\)
樣本混合的長度:\(N_{i} \sim \operatorname{Poiss}(\xi)\)
對於全部的元素:\(j \in\left[1, \mathrm{N}_{i}\right]\) 在文本 \(i\) 中:
樣本主題的標籤:\(z_{i, j} \sim \operatorname{Mult}\left(\overrightarrow{\theta_{i}}\right)\)
樣本單詞的類別:\(w_{i, j} \sim M u l t\left(\overrightarrow{\varphi_{z_{i, j}}}\right)\)
由該生成過程以及dirichlet-multinomial共軛可得:
\[ \begin{array}{l}{p(\vec{z} | \vec{\alpha})=\prod_{i=1}^{N} \frac{\Delta\left(\overrightarrow{n_{i}}+\vec{\alpha}\right)}{\Delta(\vec{\alpha})}} \\\\ {p(\vec{w} | \vec{z}, \vec{\beta})=\prod_{z=1}^{K} \frac{\Delta\left(\overrightarrow{n_{z}}+\vec{\beta}\right)}{\Delta(\vec{\beta})}}\end{array} \\ \]
\[ \begin{aligned} p(\vec{w}, \vec{z} | \vec{\alpha}, \vec{\beta}) &=p(\vec{w} | \vec{z}, \vec{\beta}) p(\vec{z} | \vec{\alpha}) \\ &=\prod_{z=1}^{K} \frac{\Delta\left(\vec{n}_{z}+\vec{\beta}\right)}{\Delta(\vec{\beta})} \prod_{i=1}^{N} \frac{\Delta\left(\overrightarrow{n_{i}}+\vec{\alpha}\right)}{\Delta(\vec{\alpha})} \end{aligned} \]
根據上面的機率圖模型,能夠得出第i篇文檔的complete-data似然性爲:
\[ p\left(\vec{w}_{i}, \vec{z}_{i}, \overrightarrow{\theta_{i}}, \Phi | \vec{\alpha}, \vec{\beta}\right)=\prod_{j=1}^{N_{i}} p\left(w_{i, j} | \overrightarrow{\varphi_{z_{i j}}}\right) p\left(z_{i, j} | \overrightarrow{\theta_{i}}\right) \cdot p\left(\overrightarrow{\theta_{i}} | \vec{\alpha}\right) \cdot p(\Phi | \vec{\beta}) \]
第i篇文檔第j個單詞在詞表中編號爲w的機率爲:
\[ p\left(w_{i, j}=w | \overrightarrow{\theta_{i}}, \Phi\right)=\sum_{k=1}^{K} p\left(w_{i, j}=w | \overrightarrow{\varphi_{k}}\right) p\left(z_{i, j}=k | \overrightarrow{\theta_{i}}\right) \]
整個數據集的似然性爲:
\[ p(\mathcal{D} | \Theta, \Phi)=\prod_{i=1}^{N} p\left(\overrightarrow{w_{i}} | \overrightarrow{\theta_{i}}, \Phi\right)=\prod_{i=1}^{N} \prod_{j=1}^{N_{i}} p\left(w_{i, j} | \overrightarrow{\theta_{i}}, \Phi\right) \]
PLSA中的機率圖模型因爲沒有先驗,模型比LDA簡單一些,認爲文檔決定topic,topic決定單詞,寫出了整個數據集的對數似然性,而後因爲要求解的參數以求和的形式出如今了對數函數中,沒法經過直接求導使用梯度降低或牛頓法來使得這個對數似然最大,所以使用了EM算法。
LDA一樣可使用EM算法求解參數,但須要在E步計算隱變量的後驗機率時使用變分推斷進行近似,一種更簡單的方法是使用gibbs sampling。
這部分的公式推導以下:
\[ p\left(z_{l}=z | \overrightarrow{z_{l}-l}, \vec{w}\right)=\frac{p(\vec{w}, \vec{z})}{p\left(\vec{w}, \vec{z}_{\neg l}\right)} \\\\ =\frac{p(\vec{w} | \vec{z}) p(\vec{z})}{p\left(\vec{w}_{l} | \vec{z}_{l}\right) p\left(w_{l}\right) p\left(\vec{z}_{l}\right)} \propto \frac{p(\vec{w} | \vec{z}) p(\vec{z})}{p\left(\vec{w}_{\eta} | \overrightarrow{z_{\eta}}\right) p\left(\overrightarrow{z_{\eta}}\right)} \\\\ =\frac{\Delta\left(\overrightarrow{n_{i}}+\vec{\alpha}\right)}{\Delta\left(n_{i, l}+\vec{\alpha}\right)} \cdot \frac{\Delta\left(\overrightarrow{n_{z}}+\vec{\beta}\right)}{\Delta\left(\overrightarrow{n_{z}, \eta}+\vec{\beta}\right)} \\\\ =\frac{\Gamma\left(n_{i z}+\alpha_{z}\right) \Gamma\left(\sum_{z=1}^{K}\left(n_{i z, \eta}+\alpha_{z}\right)\right)}{\Gamma\left(n_{i z, \eta}+\alpha_{z}\right) \Gamma\left(\sum_{z=1}^{K}\left(n_{i z}+\alpha_{z}\right)\right)} \cdot \frac{\Gamma\left(n_{z w}+\beta_{w}\right) \Gamma\left(\sum_{w=1}^{M}\left(n_{z w, l}+\beta_{w}\right)\right)}{\Gamma\left(n_{z w, \eta}+\beta_{w}\right) \Gamma\left(\sum_{w=1}^{M}\left(n_{z w}+\beta_{w )}\right)\right.}\\\\=\frac{n_{i z, 7 l}+\alpha_{z}}{\sum_{z=1}^{K}\left(n_{i z, 7 l}+\alpha_{z}\right)} \cdot \frac{n_{z w, l}+\beta_{w}}{\sum_{w=1}^{M}\left(n_{z w, 7}+\beta_{w}\right)}\propto \frac{n_{z w, 7 l}+\beta_{w}}{\sum_{w=1}^{M}\left(n_{z w, 7}+\beta_{w}\right)} \cdot\left(n_{i z, 7 l}+\alpha_{z}\right)\\\\=\frac{n z w[z, w]}{n z[z]} \cdot(n d z[i, z]) \]
下面解釋一下這個推導過程,前兩個等號是利用了貝葉斯公式,第三步的正比於符號這一行是去掉了一項常數 \(p(w_l)\),第四步利用了前面計算好的 \(p(\vec{w}, \vec{z})\) 聯合機率公式,第5、六步是將函數展開並化簡,第七步的正比於符號是去掉了一項不依賴於z的項(即z取何值該項都相同),最後一行給出了對應代碼中的表達。 這樣咱們就獲得了吉布斯採樣公式,每一輪gibbs sampling的迭代中依次遍歷每一個二維下標 ll, 即遍歷每篇文檔的每個單詞,從新採樣這個下標對應的topic編號。