1. Model
下图是PLSA的贝叶斯网络表示
关于图中的符号
- :文档
- :主题
- :词
- :文档数量
- :所有文档出现的词数
图中的两个条件概率分布都设定为多项式分布
这是一个文档生成模型,其参数就是两个多项式分布
2. Training
PLSA通常使用EM算法进行训练
定义一些符号
- :M个文档的集合
- :第篇文档
- :第个单词
- :第个主题
- :主题个数
- :中的总词数
- :中出现的次数
- :中出现且其主题为的次数
在EM中的E-Step中,需要先计算隐含变量的后验概率
\begin{align} p(z_k|d_i,w_j) = \frac{p(w_j|z_k)p(z_k|d_i)}{\sum_{l=1}^Kp(w_j|z_l)p(z_l|d_i)} \end{align}
在M-Step中,需要最大化此后验概率下对数似然函数的期望
似然函数
\begin{align} L=\prod_{i=1}^M\prod_{j=1}^N\prod_{k=1}^Kp(d_i,w_j,z_k)^{n(d_i,w_j,z_k)} \end{align}
取对数
\begin{align} \log L &= \sum_{i=1}^M\sum_{j=1}^N\sum_{k=1}^Kn(d_i,w_j,z_k)\log p(d_i,w_j,z_k) \\ &=\sum_{i=1}^M\sum_{j=1}^N\sum_{k=1}^Kn(d_i,w_j,z_k)\left[\log p(d_i) + \log p(z_k|d_i) + \log p(w_j|z_k)\right] \end{align}
期望
\begin{align} E(\log L) = \sum_{i=1}^M\sum_{j=1}^N\sum_{k=1}^Kn(d_i,w_j)p(z_k|d_i,w_j)\left[\log p(d_i) + \log p(z_k|d_i)p(w_j|z_k)\right] \end{align}
由于对所求参数无影响,从优化目标中删除
\begin{align} E(\log L) = \sum_{i=1}^M\sum_{j=1}^Nn(d_i,w_j)\sum_{k=1}^Kp(z_k|d_i,w_j)\left[ \log p(z_k|d_i)p(w_j|z_k)\right] \end{align}
所求变量还需满足如下约束
\begin{align} & \sum_{k=1}^K p(z_k|d_i) = 1 \\ & \sum_{j=1}^Np(w_j|z_k) = 1 \end{align}
使用拉格朗日乘子法
\begin{align} H = E(\log L) + \sum_{k=1}^K \tau_k\left(1-\sum_{j=1}^Np(w_j|z_k)\right) + \sum_{i=1}^M\rho_i\left(1 - \sum_{k=1}^K p(z_k|d_i)\right) \end{align}
根据拉格朗日乘子法
\begin{align} &\frac{\partial H}{\partial p(w_j|z_k)} = \left[\sum_{i=1}^M\frac{n(d_i,w_j)p(z_k|d_i,w_j)}{p(w_j|z_k)}\right] - \tau_k=0 \\ &\frac{\partial H}{\partial p(z_k|d_i)} = \left[\sum_{j=1}^N\frac{n(d_i,w_j)p(z_k|d_i,w_j)}{p(z_k|d_i)}\right] - \rho_i = 0 \end{align}
于是有
\begin{align} p(w_j|z_k) &= \frac{\sum_{i=1}^Mn(d_i,w_j)p(z_k|d_i,w_j)}{\tau_k} \\ p(z_k|d_i) &= \frac{\sum_{j=1}^Nn(d_i,w_j)p(z_k|d_i,w_j)}{\rho_i} \end{align}
代入到原本的两个约束条件,得到
\begin{align} \tau_k&=\sum_{j=1}^N\sum_{i=1}^Mn(d_i,w_j)p(z_k|d_i,w_j) \\ \rho_i &= \sum_{k=1}^K\sum_{j=1}^Nn(d_i,w_j)p(z_k|d_i,w_j) =n(d_i) \end{align}
于是E-Step的更新式为 \begin{align} p(w_j|z_k) &= \frac{\sum_{i=1}^Mn(d_i,w_j)p(z_k|d_i,w_j)}{\sum_{m=1}^N\sum_{i=1}^Mn(d_i,w_m)p(z_k|d_i,w_m)} \\ p(z_k|d_i) &= \frac{\sum_{j=1}^Nn(d_i,w_j)p(z_k|d_i,w_j)}{n(d_i)} \end{align}
3. Distributed Method
总结一下计算过程
\begin{align} p(z_k|d_i,w_j) &= \frac{p(w_j|z_k)p(z_k|d_i)}{\sum_{l=1}^Kp(w_j|z_l)p(z_l|d_i)} \\ p(w_j|z_k) &= \frac{\sum_{i=1}^Mn(d_i,w_j)p(z_k|d_i,w_j)}{\sum_{m=1}^N\sum_{i=1}^Mn(d_i,w_m)p(z_k|d_i,w_m)} \\ p(z_k|d_i) &= \frac{\sum_{j=1}^Nn(d_i,w_j)p(z_k|d_i,w_j)}{n(d_i)} \end{align}
设计了一个朴素的方法
3.1 存储
- 以为,为,存于parameter server,称为word_cnt_table
- 以为,为,存于parameter server,称为posterior_table
- 以为,为,存于parameter server,称为pwz_table
- 以为,为,存于parameter server,称为pzd_table
3.2 计算
以下流程都是以数据流为单位,因此每一步均是并行的
3.2.1 更新后验
- 生成数据流,其中
- 读取pwz_table和pzd_table的数据进行转换
- 计算
- 将写入posterior_table
3.2.2 更新pwz
- 生成数据流,其中
- 读取word_cnt_table进行转换
- 读取posterior_table进行转换
- 计算
- Reduce操作
- Reduce操作,将结果存入pwz_tmp_table
- 使用第5步输出的数据流,读取pwz_tmp_table进行转换,写入pwz_table
3.2.3 更新pzd
- 生成数据流,其中
- 读取word_cnt_table进行转换
- 读取posterior_table进行转换
- 计算
- Reduce操作
- 计算,写入pzd_table