第20章 潜在狄利克雷分配
习题20.1
推导狄利克雷分布数学期望公式。
解答:
解答思路:
- 给出狄利克雷分布
- 写出狄利克雷分布的数学期望计算公式
- 利用概率分布的归一化性质,推导规范化因子的形式
- 将规范化因子代入原式,分别计算多元随机变量每个分量的期望
解答步骤:
第1步:狄利克雷分布
根据书中第20章的定义20.2的狄利克雷分布的定义:
定义20.2(狄利克雷分布) 若多元连续随机变量
的概率密度函数为 其中
,则称随机变量 服从参数为 的狄利克雷分布,记作 。 令
则狄利克雷分布的密度函数可以写成
第2步:写出狄利克雷分布的数学期望计算公式
已知概率分布
可得,狄利克雷分布的数学期望
其中,多元连续随机变量
分别计算
第3步:利用概率分布的归一化性质,推导规范化因子的形式
对于每个分量
记上式右边的积分部可对应如下狄利克雷分布的密度函数
其中
根据归一化条件:
可得:
第3步:将规范化因子代入原式,分别计算多元随机变量每个分量的期望。
将公式(2)代入公式(1),可得分量
因此,狄利克雷分布的数学期望:
习题20.2
针对17.2.2节的文本例子,使用LDA模型进行话题分析。
解答:
解答思路:
- 给出LDA吉布斯抽样算法
- 自编程实现基于吉布斯抽样算法的LDA模型
- 针对17.2.2节的文本例子,使用LDA模型进行话题分析
解答步骤:
第1步:LDA吉布斯抽样算法
根据书中第20章的算法20.2的LDA吉布斯抽样算法:
算法20.2(LDA吉布斯抽样算法)
输入:文本的单词序列;
输出:文本的话题序列的后验概率分布 的样本计数,模型的参数 和 的估计值;
参数:超参数和 ,话题个数 。
(1)设所有计数矩阵的元素,计数向量的元素 初值为0;
(2)对所有文本,对第 个文本中的所有单词 ,抽样话题 ;增加文本-话题计数 ,增加文本-话题和计数 ,增加话题-单词计数 ,增加话题-单词和计数 ;
(3)循环执行以下操作,直到进入燃烧期。对所有文本,对第 个文本中的所有单词 ;
(a)当前的单词是第 个单词,话题指派 是第 个话题;减少计数 ;
(b)按照满条件分布进行抽样得到新的第
个话题,分配给 ;
(c)增加计数;
(d)得到更新的两个计数矩阵和 ,表示后验概率分布 的样本计数;
(4)利用得到的样本计数,计算模型参数
第2步:自编程实现基于吉布斯抽样算法的LDA模型
import numpy as np
class GibbsSamplingLDA:
def __init__(self, iter_max=1000):
self.iter_max = iter_max
self.weights_ = []
def fit(self, words, K):
"""
:param words: 单词-文本矩阵
:param K: 话题个数
:return: 文本话题序列z
"""
# M, Nm分别为文本个数和单词个数
words = words.T
M, Nm = words.shape
# 初始化超参数alpha, beta,其中alpha为文本的话题分布相关参数
# beta为话题的单词分布相关参数
alpha = np.array([1 / K] * K)
beta = np.array([1 / Nm] * Nm)
# 初始化参数theta, varphi,其中theta为文本关于话题的多项分布参数,
# varphi为话题关于单词的多项分布参数
theta = np.zeros([M, K])
varphi = np.zeros([K, Nm])
# 输出文本的话题序列z
z = np.zeros(words.shape, dtype='int')
# (1)设所有计数矩阵的元素n_mk、n_kv,计数向量的元素n_m、n_k初值为 0
n_mk = np.zeros([M, K])
n_kv = np.zeros([K, Nm])
n_m = np.zeros(M)
n_k = np.zeros(K)
# (2)对所有M个文本中的所有单词进行循环
for m in range(M):
for v in range(Nm):
# 如果单词v存在于文本m
if words[m, v] != 0:
# (2.a)抽样话题
z[m, v] = np.random.choice(list(range(K)))
# 增加文本-话题计数
n_mk[m, z[m, v]] += 1
# 增加文本-话题和计数
n_m[m] += 1
# 增加话题-单词计数
n_kv[z[m, v], v] += 1
# 增加话题-单词和计数
n_k[z[m, v]] += 1
# (3)对所有M个文本中的所有单词进行循环,直到进入燃烧期
zi = 0
for i in range(self.iter_max):
for m in range(M):
for v in range(Nm):
# (3.a)如果单词v存在于文本m,那么当前单词是第v个单词,
# 话题指派z_mv是第k个话题
if words[m, v] != 0:
# 减少计数
n_mk[m, z[m, v]] -= 1
n_m[m] -= 1
n_kv[z[m, v], v] -= 1
n_k[z[m, v]] -= 1
# (3.b)按照满条件分布进行抽样
max_zi_value, max_zi_index = -float('inf'), z[m, v]
for k in range(K):
zi = ((n_kv[k, v] + beta[v]) / (n_kv[k, :].sum() + beta.sum())) * \
((n_mk[m, k] + alpha[k]) / (n_mk[m, :].sum() + alpha.sum()))
# 得到新的第 k‘个话题,分配给 z_mv
if max_zi_value < zi:
max_zi_value, max_zi_index = zi, k
z[m, v] = max_zi_index
# (3.c) (3.d)增加计数并得到两个更新的计数矩阵的n_kv和n_mk
n_mk[m, z[m, v]] += 1
n_m[m] += 1
n_kv[z[m, v], v] += 1
n_k[z[m, v]] += 1
# (4)利用得到的样本计数,计算模型参数
for m in range(M):
for k in range(K):
theta[m, k] = (n_mk[m, k] + alpha[k]) / (n_mk[m, :].sum() + alpha.sum())
for k in range(K):
for v in range(Nm):
varphi[k, v] = (n_kv[k, v] + beta[v]) / (n_kv[k, :].sum() + beta.sum())
self.weights_ = [varphi, theta]
return z.T, n_kv, n_mk第3步:针对17.2.2节的文本例子,使用LDA模型进行话题分析
17.2.2节的文本例子中的数据如下:
使用LDA模型进行话题分析:
gibbs_sampling_lda = GibbsSamplingLDA(iter_max=1000)
# 输入文本-单词矩阵,共有9个文本,11个单词
words = np.array([[0, 0, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 1],
[0, 1, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 0, 0, 1, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 2, 0, 0, 1],
[1, 0, 1, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 1, 1, 0, 0, 0, 0]])
K = 3 # 假设话题数量为3
# 设置精度为3
np.set_printoptions(precision=3, suppress=True)
z, n_kv, n_mk = gibbs_sampling_lda.fit(words, K)
varphi = gibbs_sampling_lda.weights_[0]
theta = gibbs_sampling_lda.weights_[1]
print("文本的话题序列z:")
print(z)
print("样本的计数矩阵N_KV:")
print(n_kv)
print("样本的计数矩阵N_MK:")
print(n_mk)
print("模型参数varphi:")
print(varphi)
print("模型参数theta:")
print(theta)文本的话题序列z:
[[0 0 2 2 0 0 0 0 0]
[0 0 0 0 0 2 0 0 2]
[0 2 0 0 0 0 0 2 0]
[0 0 0 0 0 0 2 0 2]
[2 0 0 0 0 2 0 0 0]
[2 2 2 2 2 2 2 2 2]
[2 0 2 0 0 0 0 0 0]
[0 0 0 0 0 0 2 0 2]
[0 0 0 0 0 2 0 0 2]
[2 0 2 0 0 0 0 2 0]
[0 0 0 2 2 0 0 0 0]]
样本的计数矩阵N_KV:
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[2. 2. 2. 2. 2. 9. 2. 2. 2. 3. 2.]]
样本的计数矩阵N_MK:
[[0. 0. 4.]
[0. 0. 2.]
[0. 0. 4.]
[0. 0. 3.]
[0. 0. 2.]
[0. 0. 4.]
[0. 0. 3.]
[0. 0. 3.]
[0. 0. 5.]]
模型参数varphi:
[[0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091]
[0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091]
[0.067 0.067 0.067 0.067 0.067 0.293 0.067 0.067 0.067 0.1 0.067]]
模型参数theta:
[[0.067 0.067 0.867]
[0.111 0.111 0.778]
[0.067 0.067 0.867]
[0.083 0.083 0.833]
[0.111 0.111 0.778]
[0.067 0.067 0.867]
[0.083 0.083 0.833]
[0.083 0.083 0.833]
[0.056 0.056 0.889]]
习题20.3
找出LDA的吉布斯抽样算法、变分EM算法中利用狄利克雷分布的部分,思考LDA中使用狄利克雷分布的重要性。
解答:
解答思路:
- 写出LDA的吉布斯抽样算法中利用狄利克雷分布的部分
- 写出变分EM算法中利用狄利克雷分布的部分
- 写出LDA中使用狄利克雷分布的重要性
解答步骤:
在话题模型中,假设话题是单词的多项分布,文本是话题的多项分布,而狄利克雷分布是多项分布的先验,在进行贝叶斯学习时,需要使用狄利克雷分布作为先验分布,因此要先找出LDA的吉布斯抽样算法和变分EM算法中的多项分布,再找出对应的狄利克雷分布。
第1步:LDA的吉布斯抽样算法
根据书中第20.3节的LDA模型基本想法:
LDA模型的学习通常采用收缩的吉布斯抽样方法,基本想法是,通过对隐变量
和 积分,得到边缘概率分布 (也是联合分布),其中变量 是可观测的,变量 是不可观测的;对后验概率分布 进行吉布斯抽样,得到分布 的样本集合;再利用这个样本集合对参数 和 进行估计,最终得到LDA模型 的所有参数估计。
根据书中第20.3.2节的抽样分布的表达式:
- 处理第一个因子
该分布表示在给定话题
根据书中第20.3.2节的公式(20.22):
其中
表示第 个话题生成单词集合第 个单词的概率, 是数据中第 个话题生成第 个单词的次数。
现引入该多项分布的共轭先验,有
对上式两边求
根据假设
根据书中第20.3.3节的公式(20.32):
- 参数
的估计
后验概率满足这里
是第 个话题的单词的计数。
- 处理第二个因子
该分布表示在给定文本的话题分布参数
根据书中第20.3.2节的公式(20.24):
其中
表示第 个文本生成第 个话题的概率, 是数据中第 个文本生成第 个话题的次数。
现引入该多项分布的共轭先验,有
对上式两边求
根据假设
根据书中第20.3.3节的公式(20.30):
- 参数
的估计
后验概率满足这里
是第 个文本的话题的计数。
第2步:LDA的变分EM算法
根据书中第20.4.3节的变分EM算法:
将变分EM算法应用到LDA模型的学习上,首先定义具体的变分分布,推导证据下界的表达式,接着推导变分分布的参数和LDA模型的参数估计,最后给出LDA模型的变分EM算法。 为简单起见,一次只考虑一个文本,记作
。文本的单词序列 ,对应的话题序列 ,以及话题分布 ,随机变量 , 和 的联合分布是 其中
是可观测变量, 和 是隐变量, 和 是参数。
根据第1步已证明
另一部分
根据书中第20.4.3节的公式(20.43):
其中
是狄利克雷分布参数, 是多项分布参数,变量 和 的各个分量都是条件独立的。
由于
根据书中第20.4.3节的公式(20.44):
由此得到一个文本的证据下界
展开证据下界式
每一项都是对应的概率分布关于变分分布
- 第一项包含
,含有狄利克雷分布; - 第二项
为多项分布,其中参数 在变分分布中已假设为狄利克雷分布 ,含有狄利克雷分布; - 第三项
为多项分布,其中参数 的分布可以根据归一化性质消掉,剩余部分均为多项分布,因此不含狄利克雷分布; - 第四项
已假设为狄利克雷分布; - 第五项
,其中参数 的分布根据归一化性质消掉,剩余均为多项分布,故不含狄利克雷分布。
第3步:LDA中使用狄利克雷分布的重要性
由于LDA话题模型天然具备多项分布的性质,因此在进行贝叶斯学习时,则不可避免地需要引入狄利克雷分布作为多项分布的共轭先验,没有狄利克雷分布就无法进行话题模型的贝叶斯估计。
习题20.4
给出LDA的吉布斯抽样算法和变分EM算法的算法复杂度。
解答:
解答思路:
计算LDA的吉布斯抽样算法的算法复杂度
计算LDA的变分EM算法的算法复杂度:根据书上409页算法20.4和411页算法20.5,同样计算循环次数以及每次循环的代价,注意这里需要分别考虑 E 步和 M 步的代价,最后加起来即为 LDA 变分EM算法的复杂度。
解答步骤:
第1步:LDA的吉布斯抽样算法的算法复杂度
根据书中第20章的算法20.2(LDA吉布斯抽样算法),假设迭代次数为
第1、2步均为初始化相关,对于所有文本
,需要进行 次循环,即文本数量;对于第 个文本中的所有单词 ,需要进行 次循环,即第 个文本包含的单词数,因此一共进行 次循环,故复杂度为 第3步为迭代,每次循环过程中,第3.a、3.c和3.d步均为固定更新,算法复杂度均为1
第3.b步涉及到随机采样,该公式第一个因子表示话题生成该位置单词的概率,计算复杂度为
,即词典大小;第二个因子表示该位置的文本生成话题的概率,计算复杂度为 ,即话题数量;由于词典大小远大于话题数量,这里可以近似认为计算复杂度为
因此,总算法复杂度为
第2步:LDA的变分EM算法
根据书中第20章的算法20.5(LDA的变分EM算法),假设迭代次数为
E步:估计变分参数
,假设重复 次后收敛,根据书中第409页算法20.4(LDA的变分参数估计算法)中的第4、5步的循环次数为 次;第6步在计算 时的算法复杂度为 ,其余计算的复杂度均为1
则每次总算法复杂度为M步:估计模型参数
,根据书中公式(20.63)
对
其算法复杂度为
再通过证据下界的最大化估计参数
计算其关于
则每次总算法复杂度为
最后一共进行了
习题20.5
证明变分EM算法收敛。
解答:
解答思路:
- 给出变分EM算法
- 给出EM算法的收敛性
- 证明在变分EM算法中,证据下界随着迭代进行单调递增
解答步骤:
第1步:变分EM算法
根据书中第20章的算法20.3:
假设模型式联合概率分布
,其中 是观测变量, 是隐变量, 是参数。目标是通过观测数据的概率(证据) 的最大化,估计模型的参数 。使用变分推理,导入平均场 ,定义证据下界 通过迭代,分别以
和 为变量时对证据下界进行最大化,就得到变分EM算法。 算法20.3(变分EM算法)
循环执行以下E步和M步,直到收敛。
(1)E步:固定,求 对 的最大化。
(2)M步:固定,求 对 的最大化。
给出模型参数的估计值。
第2步:EM算法的收敛性
根据书中第9.2节的定理9.1:
定理9.1 设
为观测数据的似然函数, 为EM算法得到的参数估计序列, 为对应的似然函数序列,则 是单调递增的,即
根据书中第9.2节的定理9.2:
定理9.2 设
为观测数据的对数似然函数, 为EM算法得到的参数估计序列, 为对应的对数似然函数序列。
(1)如果有上界,则 收敛到某一值 ;
(2)在函数与 满足一定条件下,由EM算法得到的参数估计序列 的收敛值 是 的稳定点。
第3步:证明在变分EM算法中,证据下界随着迭代进行单调递增
对于证据下界
假设迭代次数从
- E步:固定
,求 对 的最大化,由于 并不依赖于 ,所以 的最大值出现在KL散度等于0的时候,即 与后验概率分布 相等的时候,此时有证据下界等于对数似然函数,即
如下图所示
- M步:固定
求 对 的最大化,更新模型参数 ,此时下界 增⼤,有
由于
如下图所示
结合公式(2)、(3)、(4),可得
即证得在变分EM算法中,
