【笔记】生成模型基础与应用 - 第3章
C3 主题模型:主题模型是一类用于文本分析的非监督学习方法,旨在从文本数据中发现隐藏的主题结构…
C3 主题模型
Topic models:以非监督学习的方式对文本的隐含结构进行发现或生成的模型
主题模型是一类用于文本分析的非监督学习方法,旨在从文本数据中发现隐藏的主题结构。这些主题模型的目标是识别文本集合中的主题,而无需事先标记的主题标签或监督信息。主题模型最常见的应用之一是用于文本数据的主题建模,其中文档被看作是多个主题的混合,而每个主题又由一组词汇表示。
主题模型的发展:
- LSA
- PLSA
- LDA 2003
- HDP 2005
单词向量空间
- 将文档中每个单词的出现的频数(或加权的频数)表示为向量
- 可以事先定义 有效单词的 语料库,只提取文档中有效单词的出现频率生成向量(也可以视为不在语料库中的单词其权值为0),所有的语料库中的有效单词用集合W表示
- 一个文档就表示成:d=(fw1,fw2,....,fwN),每个fi都是有效单词i出现的次数
- 一个文档集中的所有文档(设一共有N个文档组成了集合D)组成了一个向量集合,即 单词向量空间
- 对于两个不同的文档di, dj,可以使用它们之间的数学度量,来表示文本之间的语义相似度:
- 单词向量空间的表示方法:
- 1、单词-文本矩阵:将单词在每个文档的出现频率向量作为列向量,组成的矩阵。通常为稀疏矩阵
单词-文本矩阵的例子:
- 计算机处理稀疏矩阵,非常浪费算力,因此,需要一个等价的数据结构来表示相同给信息,于是提出了下面这种表示方法。
- 2、单词频率-逆文本频率(TF-IDF): 统计单词wi在文本dk中出现的权值 :
TF−IDF(wi,dk)=len(dk)f(wi,dk)logdf(wi)N
- tf(w,b):单词w在文本b中的出现频数
- len(b):文本b中的单词总数
- df(w):整个文本集合中,含有单词w的文本数
- N:整个文本集合的大小(含有的文本数量)
单词向量空间的优缺点优点:模型简单、计算效率高缺点:内积计算的相似度不一定能准确表达两个文档间的相似度
话题向量空间
- 定义话题:假设所有的文本中一共含有K个话题
- 假设每个话题都是一个M维度的向量t,t由语料库(集合W)中的M个单词组成。
t=(w1,w2,...,wM)T
- 这样,一共K个话题就组成了一个话题向量空间,记为T=[t1,t2,...,tk]=[w11 w12... wMK]【单词-话题矩阵】
- 根据单词向量空间的定义,可以推导出:
- 假设一篇文本x在单词向量空间中被表示为:x=(fw1,fw2,....,fwN),而在话题空间中被表示为:$$y = g(x) = (f_{t_1},f_{t_2},…,f_{t_k})$$
- 为了方便,我们将话题的出现频率 记为ft1=y1,ft2=y2...这样,一个文档x,它可以表示为所有话题和单词的线性组合:
x=t1y1+t2y2+...tkyk
- 如果我们定义话题-文本矩阵Y,即将每个话题表示的文本y组合起来,则由上述的线性组合关系,对整个文档集合D,即可由话题向量空间的 话题矩阵T 来表示。
- 因此,单词-文本矩阵、单词-话题矩阵和话题-文本矩阵具有如下的关系:
XMN=TMKYKN
潜在语义分析即是 将文本在 单词向量空间的表示 通过 线性变换 转换为** 在话题向量空间中的表示**的方法
期望最大化算法
在讲潜在语义分析之前,必须要了解一下什么是贝叶斯概率模型的潜变量,以及对潜变量模型的估计算法。期望最大化算法(Exception Maximization Algorithm,简称EM算法)是一种启发式的迭代算法,用于对含有隐变量的概率模型 的参数做 极大似然估计
假设我们有这样一个概率模型:
- 有三枚硬币A,B,C,抛掷它们正面朝上的概率不同,记为r,p,q
- 重复执行以下试验(Ex(X)表示对事件X做一次实验,1表示正面向上,0表示反面向上):
Ex(Y)=Ex(B) if Ex(A)==1 else Ex(C)
- 即抛硬币A,如果是正面抛硬币B,否则抛硬币C,你只能观测到最后一次抛掷硬币的结果。
- 那么如何估计三个参数r,p,q呢?
- 因为这个随机事件包含两个概率模型的 复合。因此我们无法直接对结果建模,数学家们由此提出,能否加入“隐变量”Z:
-
- 用它来表示试验中抛掷A硬币的中间结果(虽然我们并不能直接观测到),假设共抛了n次,第i次观测结果的值记作zi
-假设我们只看最终结果Y,将参数表示为向量θ=(r,p,q),则实际要观测的事件Y的似然可以表示为:
P(Y∣θ)=P(Y,Z∣θ)=i=1∑nP(yi,zi∣θ)=i=1∑nP(zi∣θ)P(yi∣zi,θ)=rp∑(yi=1)(1−p)∑(yi=0)+(1−r)q∑(yi=1)(1−q)∑(yi=0)
直接使用MLE估计这个似然函数?不行,包含三个未知变量,且需要求log和的极大值,算不出解析解。
既然没有准确的解析解,数学家于是提出了用迭代法逼近最大值的求解办法,这就是EM算法。我们先定义好两种情况的似然函数,既然要求极大似然,我们对似然函数直接取log,定义对数似然函数:
- 不将隐变量Z视为随机变量的情况【称为:不完全数据】
LY(θ)=log[i=1∏nP(yi∣θ)]=i=1∑nlog[zi∈ Ex(Z)∑P(yi,zi∣θ)]
LY,Z(θ)=log[i=1∏nP(yi,zi∣θ)]=i=1∑nlog[P(yi,zi∣θ)]
我们假设θ从一个初始值θ0开始,每次迭代的时候更新(下标+1),那么我们希望 在已知观测结果Y的情况下,让完全数据的对数似然函数LY,Z(θ)尽可能取得最大的期望,由此定义Q函数:
Q(θ,θt)=E[LY,Z(θ)∣Y,θt]=zi∈ Ex(Z)∑P(Z∣Y,θt)log[P(Y,Z∣θ)]
其中,θt是第t步更新的参数,Q是关于θ的函数,让它最大,则需要对θ求偏导,并取导数为0。此时θt取一个新值,即:
\theta_{t+1} = argmax_\theta{Q(\theta,\theta_t)}
$$【MLE】
这是采用极大似然估计的方法,如果你说要考虑先验概率(即MAP方法),那么每次更新是需要加上先验函数的对数值:
\theta_{t+1} = argmax_\theta{Q(\theta,\theta_t)} + logP(\theta)
【MAP】
> 现在我们试着对刚才的问题应用EM算法:
> - 先假设$\theta^{(0)} = (0.5,0.5,0.5)$(为了下标不打架,我们用上括号标记步数t)
> - 则$P(Z|Y,\theta_t)$表示:
> - 假设第$i$次的最终**观测结果是**$y_i(=1 \ or\ 0)$**,这个结果是由 抛硬币B**$(z_i=1)$** 还是 抛硬币C**$(z_i=0)$** 得到的概率,将其记为**$p_i$**,**我们可用直接以伯努利实验的结果计算:
> $p_i = \frac{P(y_i,z_i=1)}{P(y_i,z_i=0)+P(y_i,z_i=1)}=\frac{rp}{rp+(1-r)q}(y_i=1) \ or \ \frac{r(1-p)}{r(1-p)+(1-r)(1-q)}(y_i=0)$**【对于每一步i】**
> - **然后求其关于Z的期望,即:**
> $$Q(\theta) = \sum_{i=1}^{n}p_i\log[P(y_i=1,Z|\theta)] + (1-p_i)\log[P(y_i=0,Z|\theta)]
- 注意:pi与每一步要更新的θt有关,因此其表示为的r,p,q**也需要每一步更新。**而log[P(Y,Z∣θ)]则直接表示为上述的似然函数,注意它与要逼近的θt无关,可以直接表示为r,p,q的式子,故:
Q(θ,θt)=i=1∑npi(t−1)log[rpyi(1−p)1−yi]+(1−pi(t−1))log[(1−r)qyi(1−q)1−yi]
- 对该函数的r,p,q分别求偏导,即可得到:
r(t+1)=n∑i=1npi(t)
p(t+1)=∑i=1npi(t)∑i=1npi(t)yi
q(t+1)=∑i=1n(1−pi(t))∑i=1n(1−pi(t))yi
问题: 为什么EM算法能近似实现对观测数据 的极大似然估计? 答:可以通过数学证明:可以通过L(θ)函数构造Q函数,当作为中间函数时,可以证明在迭代过程中极大对数似然函数L(θ)的下界单调增加,即:L(θt+1)≥L(θt)
证明就省略啦~
概率潜在语义分析(PLSA)
是一种利用概率生成模型 对 文本集合进行话题分析的 无监督学习方法 假设:
- 每个文本由一个话题的分布决定
- 每个话题由一个单词的分布决定
- 因此,从给定文本的表示到生成单词,就是一个概率模型,其中话题是隐变量
举个例子:假设一个离散空间中,【话题】和其对应的单词的概率分布如下:
【教育】 = {大学:0.5,老师:0.3,课程:0.2 }
【经济】 = {市场:0.4,企业:0.2,金融:0.4}
【交通】 = {高铁:0.5,汽车:0.2,飞机:0.3}
而对于一个挖了空位的文本,其每个位置对应话题的概率分布如下:
D(xx场景下如何看待xx和xx的关系) = {教育:0.5,经济:0.3,交通:0.2}
那么,生成 “大学场景下如何看待大学与企业的关系”的概率 是:
[P(t=教育)P(w=大学∣t=教育)]2×P(t=经济)P(w=企业∣t=经济)=0.00375
假设文本的集合是D={d1,d2,...,dN}单词的集合是:W={w1,w2,...,wM}话题的集合是:Z={z1,z2,...,zK}我们可以看到,在求文本的生成分布时,涉及到以下的条件概率:P(z∣d): 已知文本d,生成话题z的概率,是一个多项分布P(w∣z): 已知话题z,生成单词w的概率,也是一个多项分布而P(d)表示从所有文本集合中,随机选取一个文本的d的概率
现在我们希望知道,给定(单词,文本)对,它在这个空间中的生成的概率,即:
P(X)=(w,d) ∈ W×D∏P(w,d)cnt(w,d)
,其中所有的(w,d)对应该有N×L(文本数×每个文本中要填空的单词数)个根据上面例子的思想,对于每个(w,d)对,其生成概率又可以用隐变量写为:
P(w,d)=P(d)P(w∣d)=P(d)z ∈ Z∑P(w,z∣d)=P(d)z ∈ Z∑P(z∣d)P(w∣z)
于是我们可以建立模型,对P(z∣d)和P(w∣z)分别进行估计,得到了这样的单层隐变量网络,即PLSA:
其中左侧的参数量是 NK,右侧为MK
现实中K远小于M,所以PLSA通过话题 对数据进行了更简洁地表示,减少了学习过程中过拟合的可能性
继续使用极大似然估计的方法,试图求出让P(X)最大时的参数,取对数似然(下面的公式推导中,我们省略了长度是O(NK+MK)的参数向量θ,不然就太长了太难读了QAQ):
LW,Z,D=log(w,d) ∈ W×D∏P(w,d)cnt(w,d)=logi=1∏Mj=1∏NP(wi,dj)cnt(wi,dj)=i=1∑Mj=1∑Ncnt(wi,dj)logP(wi,dj)=i=1∑Mj=1∑Ncnt(wi,dj)[logP(dj)+logk=1∑KP(wi∣zk)P(zk∣dj)]
仍然是非常难计算,因此要使用上一节介绍的EM估计算法,为此我们计算Q函数。上面的似然函数LW,Z,D已经是一个【完全数据】,隐藏变量Z被视为与W,D并列的随机变量。因此Q函数是每个(w,d)对为条件下,LW,Z,D的期望,即:
Q=P(zk∣wi,dj)[k=1∑Ki=1∑Mj=1∑Ncnt(wi,dj)logP(wi,dj,zk)]
其中,$$P(w_i,d_j,z_k) = P(d_j)P(w_i|z_k)P(z_k|d_j)$$
就是按照“链式法则”生成一堆单词文本的联合概率,而P(zk∣wi,dj)则是隐藏变量Z不被视为条件的分布概率【不完全数据】,即:
P(zk∣wi,dj)=∑k=1KP(wi∣zk)P(zk∣dj)P(wi∣zk)P(zk∣dj)
这样,我们可以发现,要每一步更新的参数其实是P(wi∣zk)和P(zk∣dj)
因为我们已经有一个数据集,P(dj)的值(即先验)可以直接由统计方法估计出来,cnt函数(即哪些对实际在数据集中同时出现了也是可以统计的已知量)。因此,EM近似的步骤为:
- 对于每个下标对(i,k)和(k,j),分别求P(wi∣zk)和P(zk∣dj)的偏导数(第一步时为每个概率取初始值(如均匀分布),只要满足概率和为1即可)
- 然后将导数为0的值求出来,更新(i,k)和(k,j)对应参数向量的元素
- 取 k=k+1,求下一步的不完全数据,直到收敛
在用统计估计P(dj)后,局部最优解的结果经过推导是:
PLSA的方法仍然胜在离散空间,计算复杂度低,可以快速迭代,但存在一个很重要的缺点:因为所学习的参数不仅依赖于单词库W,还依赖于文档数据集D,所有其可以生成其所在数据集的文档的模型,但却不能生成新文档的模型
潜在狄利克雷分布(LDA)
在对PLSA建模时,我们发现一个规律: 文本由话题的一个多项分布表示 , 话题也由单词的一个多项分布表示
以防你忘了我们在C1中介绍的多项分布,补充一下完整定义:
这不巧了嘛,我们在C2中提到,多项分布的贝叶斯生成模型,可以用 狄利克雷分布 作为先验。因此,可以假设 话题分布 和 单词分布 的先验都是 狄利克雷分布:
- 对于每个文本dm,假设d中包含的单词组成了向量dm=wm (m=1,2,...,M),认为生成该文本话题的概率P(z∣wm)=θm∼Dir(α)
- θm参数向量有K个值,每个值表示文本dm能生成对应话题z1,z2,...,zk的概率
- 因此,超参数α也是一个K维向量
- 注意,在这里我们为了对每个单词写出一个话题分布,将文本的定义改成了单词组成的向量。因此代表文本集中的文本数量的常量不再是N,而是M。用Ni(i=1,2,...,M)来表示一个文本中的单词总数。而下面的部分中,我们假设整个单词库中的单词总数是V
- 对于每个话题zk (k=1,2,...,K),认为生成相应单词的概率P(w∣zk)=ϕk∼Dir(β)
- 而对于每个单词wm[n]∈wm (n=1,2,...,Nm),其对应的话题和单词都链式地服从多项分布:
- zm[n]∼Mult(θm):先随机根据概率生成一个话题序列
- wm[n]∼Mult(ϕzm[n]),再对每个话题,随机生成一个单词序列,共生成m个
在这个定义下,我们可以直接得到所有先验的表示,因此,可以使用最大后验概率估计MAP来求解参数,记住在这里w是观测量,z是隐变量,因此后验是已知观测量算隐变量的概率:文本w的后验=P(θ,z∣w,α,β)=P(w∣α,β)P(w,z,θ,ϕ∣α,β)然后,就像PLSA方法一样,根据向量的嵌套定义把概率计算拆成每个元素概率的乘积,式子很长,直接贴一下结果吧:
自然,想对这种玩意求解析最大值,和自杀没什么区别。不过,既然这次我们估计的是后验概率分布,概率论中可以以 变分推断 的方法来处理
变分推断
所谓变分推断,是取一个用隐变量z的分布q(z)来近似后验概率的条件分布p(z∣x)的方法。为了比较二者的分布相似度,使用KL散度来计量:
- 如果能找到与p(z∣x)在KL散度意义下最近的分布 q^(z),则可以用这个分布近似后验概率分布
带入KL散度的公式:
则,如果想要KL散度更小,必有
log p(x)≥Eq[log p(x,z)]−Eq[log q(z)]
因为先验x的分布log p(x)可以被视为常量,因此右侧关于q分布的期望式越大,KL散度就越小。数学上把右侧称为证据下界。因此,下面问题就变为求证据下界的最大化。还有一个假设,是对于隐变量z(向量),假设分布q(z)对 z 的所有分量都是独立的,即:
q(z)=q(z1)q(z2),...,q(zm)
称其为平均场。
现在让我们回到LDA模型的最大后验概率估计,现在我们有了变分推断算法,可以定义“文本w的后验” 的证据下界:
L(r,t,α,ϕ)=Eq[log p(z,w)]−Eq[log q(z)]=Eq[log p(θ,z,w∣α,ϕ)]−Eq[log q(θ,z∣r,t)]
其中,向量r和t是变分参数,r来估计隐变量z在单词向量中的分布参数θ,t来估计话题向量中的分布参数(z1,z2,...,zn)有了平均场假设,就可以对每个文本分来计算,得到所有文本的证据下界:
L′(r,t,α,ϕ)=m=1∑MEq[log p(θm,zm,wm∣αm,ϕm)]−Eq[log q(θm,zm∣rm,tm)]
此时我们发现它也是一个 离散的期望最大化估计 问题了,可以使用第二节提到的 EM算法来迭代更新参数,此时有四个参数向量,两个是为了变分推断引入的,另外两个则为模型建立的狄利克雷分布参数。
注意,实际上狄利克雷分布的参数是α、β,不过因为话题的分布参数ϕ可以直接由参数β根据话题数 k 得到,因此这里简化一下模型,直接估计参数向量ϕ
这种方法被综合称为 **变分EM算法**
LDA和PLSA的比较
- 相同点:都将 话题建模为单词的多项分布,文本建模为话题的多项分布
- 不同点:
- PLSA没有使用先验分布( 或者说假设先验分布是均匀分布 ),使用MLE估计。
- 而LDA假设了狄利克雷分布作为先验分布,且使用MAP估计。
- 有先验分布的好处和C2中提到的一样,可以防止过拟合问题