一口气讲完 LSA — PlSA —LDA在自然语言处理中的使用

Posted wevolf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一口气讲完 LSA — PlSA —LDA在自然语言处理中的使用相关的知识,希望对你有一定的参考价值。

自然语言处理之LSA

LSA(Latent Semantic Analysis), 潜在语义分析。试图利用文档中隐藏的潜在的概念来进行文档分析与检索,能够达到比直接的关键词匹配获得更好的效果。

LSA的核心思想

假设有 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\) 值不宜过大(保留了冗余的潜在概念)也不宜过小。

自然语言处理之PLSA

LSA使用线性代数方法,对document-word矩阵进行SVD分解。PLSA则使用了一个概率图模型,引入了一个隐变量topic(可以认为是文档的主题),然后进行统计推断。

为何提出PLSA

在语义分析问题中,存在同义词和一词多义这两个严峻的问题,LSA可以很好的解决同义词问题,却无法妥善处理一词多义问题。
PLSA则可以同时解决同义词和一词多义两个问题。

概率图模型

我们知道文档(一个句子、一个段落或一篇文章)都有它自己的主题,从大的方面讲有经济、政治、文化、体育、音乐、法律、动漫、游戏、法律等等主题,PLSA模型就引入了一个隐变量topic来表示这个主题。
PLSA的概率图模型如下图所示:

技术图片

其中 DD 表示文档(document),\(Z\) 表示主题(topic), \(W\) 表示单词(word),其中箭头表示了变量间的依赖关系,比如 \(D\) 指向 \(Z\),表示一篇文档决定了该文档的主题,\(Z\) 指向 \(W\) 表示由该主题生成一个单词,方框右下角的字母表示该方框执行的次数,\(N\) 表示共生成了 \(N\) 篇文档,\(M\) 表示一篇文档按照document-topic分布生成了 \(M\) 次主题,每一次按照生成的主题的topic-word分布生成单词。每个文档的单词数可以不同。
PLSA引入了隐藏变量 \(Z\),认为 \(D,W,ZD,W,Z\) 表示完整的数据集(the complete data set), 而原始的真实数据集 \(D,WD,W\) 是不完整的数据集(incomplete data)。
假设 \(Z\) 的取值共有 \(K\) 个。PLSA模型假设的文档生成过程如下

  1. \(p(d_i)\) 的概率选择一个文档 \(d_i\)
  2. \(p(z_k|d_i)\) 的概率选择一个主题 \(z_k\)
  3. \(p(w_j|z_k)\) 的概率生成一个单词 \(w_j\)
    根据图模型,可以得到观测数据的联合分布:

\[ \beginaligned 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) \endaligned \]

第一个等式是对三者的联合概率分布对其中的隐藏变量 \(Z\) 的所有取值累加,第二个等式根据图模型的依赖关系将联合概率展开为条件概率,第三个等式只是简单的乘法结合律。这样就计算出了第 \(i\) 篇文档与第 \(j\) 个单词的联合概率分布。

我们可以得到完整数据的对数似然为:
\[ \beginaligned 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) \endaligned \]
\(p(z_k|d_i)\)\(p(w_j|z_k)\) 是PLSA模型需要求解的参数,

使用EM求解PLSA

可以看之前所写的关于EM 算法的blog,对于其中的函数 \(Q\), 现在给出PLSA中 \(Q\) 函数的形式
\[ \beginaligned 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] \endaligned \]
注意到这是因为如前文所说,在本问题中,认为\(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] \]
可以看到对数中是参数的乘积,不再包含求和的部分。
我们注意到,参数存在下面的两个约束:
\[ \beginarrayl\sum_j=1^M p\left(w_j | z_k\right)=1 \\ \sum_k=1^K p\left(z_k | d_i\right)=1\endarray \]
因此可以使用拉格朗日乘子法(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\) 的后验概率呢?根据下式计算,第一个等式是贝叶斯法则,第二个等式是根据图模型将联合概率展开,第三个等式是分子分母同时除以一个因子。
\[ \beginaligned p\left(z_k | d_i, w_j\right) &=\fracp\left(d_i, w_j, z_k\right)p\left(d_i, w_j\right) \\ &=\fracp\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) \\ &=\fracp\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) \endaligned \]

自然语言处理之LDA

我们知道,PLSA也定义了一个概率图模型,假设了数据的生成过程,但是不是一个完全的生成过程:没有给出先验。因此PLSA给出的是一个最大似然估计(ML)或者最大后验估计(MAP)。
LDA拓展了PLSA,定义了先验,因此LDA给出的是一个完整的贝叶斯估计。

这里先给出本文公式中以及python代码中使用到的符号及其含义。关于编号,公式中从1开始编号,代码中从0开始编号,只是为了方便。

LDA 的生成过程:

对于所有的主题 \(\mathrmk \in[1, \mathrmK]\), do

? 样本混合元素:\(\overrightarrow\varphi_k \sim \operatornameDir(\vec\beta)\)

队友所有的文本 \(\mathrmi \in[1, \mathrmN]\)

样本混合的比例:\(\overrightarrow\theta_i \sim \operatornameDir(\vec\alpha)\)

样本混合的长度:\(N_i \sim \operatornamePoiss(\xi)\)

对于所有的元素:\(j \in\left[1, \mathrmN_i\right]\) 在文本 \(i\) 中:

样本主题的标签:\(z_i, j \sim \operatornameMult\left(\overrightarrow\theta_i\right)\)

样本单词的类别:\(w_i, j \sim M u l t\left(\overrightarrow\varphi_z_i, j\right)\)

由该生成过程以及dirichlet-multinomial共轭可得:
\[ \beginarraylp(\vecz | \vec\alpha)=\prod_i=1^N \frac\Delta\left(\overrightarrown_i+\vec\alpha\right)\Delta(\vec\alpha) \\\\ p(\vecw | \vecz, \vec\beta)=\prod_z=1^K \frac\Delta\left(\overrightarrown_z+\vec\beta\right)\Delta(\vec\beta)\endarray \\]

\[ \beginaligned p(\vecw, \vecz | \vec\alpha, \vec\beta) &=p(\vecw | \vecz, \vec\beta) p(\vecz | \vec\alpha) \\ &=\prod_z=1^K \frac\Delta\left(\vecn_z+\vec\beta\right)\Delta(\vec\beta) \prod_i=1^N \frac\Delta\left(\overrightarrown_i+\vec\alpha\right)\Delta(\vec\alpha) \endaligned \]

根据上面的概率图模型,可以得出第i篇文档的complete-data似然性为:
\[ p\left(\vecw_i, \vecz_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(\mathcalD | \Theta, \Phi)=\prod_i=1^N p\left(\overrightarroww_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。

gibbs sampling

这部分的公式推导如下:
\[ p\left(z_l=z | \overrightarrowz_l-l, \vecw\right)=\fracp(\vecw, \vecz)p\left(\vecw, \vecz_\neg l\right) \\\\ =\fracp(\vecw | \vecz) p(\vecz)p\left(\vecw_l | \vecz_l\right) p\left(w_l\right) p\left(\vecz_l\right) \propto \fracp(\vecw | \vecz) p(\vecz)p\left(\vecw_\eta | \overrightarrowz_\eta\right) p\left(\overrightarrowz_\eta\right) \\\\ =\frac\Delta\left(\overrightarrown_i+\vec\alpha\right)\Delta\left(n_i, l+\vec\alpha\right) \cdot \frac\Delta\left(\overrightarrown_z+\vec\beta\right)\Delta\left(\overrightarrown_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.\\\\=\fracn_i z, 7 l+\alpha_z\sum_z=1^K\left(n_i z, 7 l+\alpha_z\right) \cdot \fracn_z w, l+\beta_w\sum_w=1^M\left(n_z w, 7+\beta_w\right)\propto \fracn_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)\\\\=\fracn z w[z, w]n z[z] \cdot(n d z[i, z]) \]
下面解释一下这个推导过程,前两个等号是利用了贝叶斯公式,第三步的正比于符号这一行是去掉了一项常数 \(p(w_l)\),第四步利用了前面计算好的 \(p(\vecw, \vecz)\) 联合概率公式,第五、六步是将函数展开并化简,第七步的正比于符号是去掉了一项不依赖于z的项(即z取何值该项都相同),最后一行给出了对应代码中的表达。
这样我们就得到了吉布斯采样公式,每一轮gibbs sampling的迭代中依次遍历每个二维下标 ll, 即遍历每篇文档的每一个单词,重新采样这个下标对应的topic编号。

以上是关于一口气讲完 LSA — PlSA —LDA在自然语言处理中的使用的主要内容,如果未能解决你的问题,请参考以下文章

LSA,pLSA原理及其代码实现

EM算法及其应用GMM/pLSA/LDA

概率潜在语义分析(Probabilistic Latent Semantic Analysis,PLSA)

一口气讲完数据仓建模方法--数据仓库架构师碎碎念

潜在语义分析plsa中文档概率p(d)到底是啥?

LDA(文档主题模型)