LDA主题模型

在机器学习领域,关于LDA有两种含义,一是「线性判别分析(Linear Discriminant Analysis)」,是一种经典的降维学习方法;一是本文要讲的「隐含狄利克雷分布(Latent Dirichlet Allocation)」,是一种概率主题模型,主要用来文本分类,在NLP领域有重要应用。LDA由Blei, David M.、Ng, Andrew Y.、Jordan于2003年提出,用来推测文档的主题分布。它可以将文档集中每篇文档的主题以概率分布的形式给出,从而通过分析一些文档抽取出它们的主题分布后,便可以根据主题分布进行主题聚类或文本分类。

2、数学知识

第一次接触LDA的同学肯定是一头雾水的,因为相比于其他的机器学习算法,LDA模型涉及到很多数学知识与公式,这也许是LDA晦涩难懂的原因。在本小节中会介绍LDA中所需要的数学应用,对后面进一步理解LDA模型打好基础。

要理解LDA, 涉及的先验知识有以下几种:

  • 一个函数:Gamma函数
  • 四个分布:二项分布、多项分布、beta分布、Dirichlet分布
  • 一个概念和一个理念:共轭先验和贝叶斯框架
  • 两个模型:pLSA和LDA
  • 一个采样:Gibbs sampling
2.1 Gamma函数

Gamma函数的定义为: Γ ( x ) = ∫ 0 ∞ t x − 1 e − t d t \Gamma(x)=\int_0^\infty t^{x-1}e^{-t}dt Γ(x)=0tx1etdt

对上式进行分部积分之后可以发现Gamma函数具有如下的性质: Γ ( x + 1 ) = x Γ ( x ) \Gamma(x+1)=x\Gamma(x) Γ(x+1)=xΓ(x)

可知Gamma函数可以看成是阶乘函数在实数上的推广: Γ ( n ) = ( n − 1 ) ! \Gamma(n)=(n-1)! Γ(n)=(n1)!

2.2二项分布

要解释二项分布,首先要搞清楚「伯努利分布」(又称为两点分布或者0-1分布),它是一个离散型的随机分布,其中的随机变量只有两种取值,{0,1}。而二项分布就是对伯努利分布重复n次。举个栗子,把投掷一次硬币这个试验认为是伯努利分布,则投掷n次硬币的试验就可以被认为是二项分布。二项分布的概率密度公式为:

P ( K = k ) = ( n k ) p k ( 1 − p ) n − k P(K=k)=\binom nkp^k(1-p)^{n-k} P(K=k)=(kn)pk(1p)nk

2.3 多项分布

从二项分布到多项分布,只是从随机变量的取值由两种扩展为多维。多项分布是指单次实验中的随机变量的取值不再是0-1的,而是有多重离散值(1,2,3…当然也不一定是整数)。举个栗子,投掷有六个面的骰子试验。多项分布的概率密度公式为: P ( x 1 , x 2 , … , x k ; n , p 1 , p 2 , … , p k ) = n ! x 1 ! … x k ! p 1 x 1 … p k x k P(x_1,x_2,\ldots,x_k;n,p_1,p_2,\ldots,p_k)=\frac{n!}{x_1!\ldots x_k!}{p_1}^{x_1}\ldots{p_k}^{x_k} P(x1,x2,,xk;n,p1,p2,,pk)=x1!xk!n!p1x1pkxk

其中x1,x2…是指随机变量的取值,而p1,p2…是指取到相对应随机变量的概率。

2.4 共轭先验分布

在贝叶斯概率理论中,如果「后验概率P(θ|x)和先验概率p(θ)满足同样的分布律」,那么,先验分布和后验分布被叫做共轭分布,同时,先验分布叫做似然函数的共轭先验分布。

P ( θ ∣ x ) = P ( θ , x ) P ( x ) P(\theta|x)=\frac{P(\theta,x)}{P(x)} P(θx)=P(x)P(θ,x)

共轭的意思是,以Beta分布和二项式分布为例,数据符合二项分布的时候,参数的先验分布和后验分布都能保持Beta分布的形式,这种形式不变的好处是,我们能够在先验分布中赋予参数很明确的物理意义,这个物理意义可以延续到后续分布中进行解释,同时从先验变换到后验过程中从数据中补充的知识也容易有物理解释。

2.5 Beta分布

对于参数a>0,b>0,取值范围为[0,1]的随机变量x的概率密度函数为: f ( x ; α , β ) = 1 B ( α , β ) x α − 1 ( 1 − x ) β − 1 ( 2 ) f(x;\alpha,\beta)=\frac1{B(\alpha,\beta)}x^{\alpha-1}(1-x)^{\beta-1}\boldsymbol{\left(2\right)} f(x;α,β)=B(α,β)1xα1(1x)β1(2)

其中, 1 B ( α , β ) = Γ ( α + β ) Γ ( α ) Γ ( β )   ( 3 ) \frac1{B(\alpha,\beta)}=\frac{\Gamma(\alpha+\beta)}{\Gamma(\alpha)\Gamma(\beta)}\mathrm{~(3)} B(α,β)1=Γ(α)Γ(β)Γ(α+β) (3)

对比二项分布公式可以发现:Beta分布是二项分布的共轭先验分布。

2.6 Dirichlet分布

Dirichlet分布是Beta分布在高维上的推广,其公式为: 1 B ( α , β ) = Γ ( α + β ) Γ ( α ) Γ ( β )   ( 4 ) \frac1{B(\alpha,\beta)}=\frac{\Gamma(\alpha+\beta)}{\Gamma(\alpha)\Gamma(\beta)}\mathrm{~(4)} B(α,β)1=Γ(α)Γ(β)Γ(α+β) (4)

其中: B ( α ) = ∏ i = 1 k Γ ( α i ) Γ ( ∑ i = 1 k α i ) , ∑ i = 1 k x i = 1   (5) B(\alpha)=\frac{\prod_{i=1}^k\Gamma(\alpha^i)}{\Gamma(\sum_{i=1}^k\alpha^i)},\sum_{i=1}^kx^i=1\textbf{ (5)} B(α)=Γ(i=1kαi)i=1kΓ(αi),i=1kxi=1 (5)

根据Beta分布、二项分布、Dirichlet分布、多项式分布的公式,我们可以得出结论:Beta分布是二项式分布的共轭先验分布,而狄利克雷(Dirichlet)分布是多项式分布的共轭分布。

2.7 MCMC和Gibbs sampling

在现实应用中,我们很多时候很难精确求出精确的概率分布,常常采用近似推断方法。近似推断方法大致可分为两大类:第一类是采样(Sampling), 通过使用随机化方法完成近似;第二类是使用确定性近似完成近似推断,典型代表为变分推断(variational inference).

3、文本建模

ok,介绍完数学知识,下面来到了本文的重点,LDA模型。在这之前,会循序渐进地介绍几个基础模型:「Unigram model」、「mixture of unigrams model」,以及跟LDA最为接近的「pLSA」模型。

image-20230904095611524

3.1 Unigram Model

在Unigram Model中,我们采用「词袋模型」,假设了文档之间相互独立,文档中的词汇之间相互独立。假设我们的词典中一共有 V个词 ,那么最简单的 Unigram Model 就是认为上帝是按照如下的游戏规则产生文本的:

  1. 上帝只有一个骰子,这个骰子有V面,每个面对应一个词,各个面的概率不一;
  2. 每抛掷一次骰子,抛出的面就对应的产生一个词;如果一篇文档中N个词,就独立的抛掷n次骰子产生n个词;

用公式来表示的话也就是

p ( w ) = ∏ n = 1 N p ( w n ) p(\mathbf{w})=\prod_{n=1}^Np(w_n) p(w)=n=1Np(wn)

3.2 Mixture of Unigram Model

相比于unigram model,mixture of unigram model引入了一个**“主题”**参数作为中间量来链接文档和词语。

该模型的生成过程是:给某个文档先选择一个主题,再根据该主题生成文档,该文档中的所有词都来自一个主题。假设主题有z1,…zk,生成文档的概率为: p ( w ) = p ( z 1 ) ∏ n = 1 N p ( w n ∣ z 1 ) + ⋯ + p ( z k ) ∏ n = 1 N p ( w n ∣ z k ) = ∑ z p ( z ) ∏ n = 1 N p ( w n ∣ z ) p(\mathbf{w})=p(z_1)\prod_{n=1}^Np(w_n|z_1)+\cdots+p(z_k)\prod_{n=1}^Np(w_n|z_k)=\sum_zp(z)\prod_{n=1}^Np(w_n|z) p(w)=p(z1)n=1Np(wnz1)++p(zk)n=1Np(wnzk)=zp(z)n=1Np(wnz)

3.3 pLSA

在上面的Mixture of unigrams model中,我们假定一篇文档只有一个主题生成,可实际中,一篇文章往往有「多个主题」,只是这多个主题各自在文档中出现的概率大小不一样。比如介绍一个国家的文档中,往往会分别从教育、经济、交通等多个主题进行介绍。那么在pLSA中,文档是怎样被生成的呢?

image-20230904095931035

我们可以用以上的骰子模型来模拟PLSA生成一片文档的过程:

  1. 现有两种类型的骰子,一种是doc-topic骰子,每个doc-topic骰子有K个面,每个面一个topic的编号;一种是topic-word骰子,每个topic-word骰子有V个面,每个面对应一个词;

  2. 现有K个topic-word骰子(对应doc-topic骰子的K个面),每个骰子有一个编号,编号从1到K;

  3. 生成每篇文档之前,先为这篇文章制造一个特定的doc-topic骰子,重复如下过程生成文档中的词:

    • 投掷这个doc-topic骰子,得到一个topic编号z;
    • 选择K个topic-word骰子中编号为z的那个,投掷这个骰子,得到一个词;

重复至完成一篇文档所需的词语数。在这个过程中,我们并未关注词和词之间的出现顺序,所以pLSA是一种词袋方法。

在这里,我们定义:

image-20230904100019804

利用上述定义好的概率,我们可以按照如下的步骤得到‘文档-词语’的生成模型:

  1. 按照概率选择一篇文档
  2. 选定文档后,从主题分布中按照概率选择一个隐含的主题类别
  3. 选定后,从词分布中按照概率选择一个词

简而言之,pLSA的生成文档过程可以理解为「先选定文档生成主题,再确定主题生成词语」。

但是如果我们现在的情况是,已知一篇文档,想要确定这个已存在的文档其主题分布是什么样的。这便是主题建模(文档生成模型的逆过程)的目的:自动地返现文档几种的主题分布。即文档d和单词w是可被观测到的,但是主题确实隐藏的。

由上分析,对于任意一篇给定文档,其 p ( w j ∣ d i ) p(w_j|d_i) p(wjdi)是可以计算的。从而可以根据大量已知文档的文档-词语信息 p ( w j ∣ d i ) p(w_j|d_i) p(wjdi),训练出文档-主题 p ( z k ∣ d i ) p(z_k|d_i) p(zkdi)和主题-词语 p ( w j ∣ z k ) p(w_j|z_k) p(wjzk),如下公式所示:

P ( w j ∣ d i ) = ∑ k = 1 K P ( w j ∣ z k ) P ( z k ∣ d i ) P(w_j|d_i)=\sum_{k=1}^KP(w_j|z_k)P(z_k|d_i) P(wjdi)=k=1KP(wjzk)P(zkdi)

故可以得到每个词语的生成概率为:

P ( d i , w j ) = P ( d i ) P ( w j ∣ d i ) = P ( d i ) ∑ k = 1 K P ( w j ∣ z k ) P ( z k ∣ d i ) \begin{aligned} P(d_{i},w_{j})& =P(d_i)P(w_j|d_i) \\ &=P(d_i)\sum_{k=1}^KP(w_j|z_k)P(z_k|d_i) \end{aligned} P(di,wj)=P(di)P(wjdi)=P(di)k=1KP(wjzk)P(zkdi)

由于P(d;)可事先计算求出,而P(u;|zk)和 P ( z k ∣ d i ) P(z_{k}|d_{i}) P(zkdi) 未知, 所以 θ = ( P ( w j ∣ z k ) , P ( z k ∣ d i ) ) 就是 \text{所以}\theta=(P(w_j|z_k),P(z_k|d_i))\text{就是} 所以θ=(P(wjzk),P(zkdi))就是我们要估计的参数(值),通俗点说,就是要最大化这个 θ \theta θ

用什么方法进行估计呢,常用的参数估计方法有极大似然估计MLE、最大后验证估计MAP、贝叶斯估计等等。因为该待估计的参数中含有隐变量z,所以我们可以考虑EM算法。

关于EM算法,主要是可以分为E-step和M-step,这里就不再详细论述。可以参考PRML或者李航老师的小蓝书。

3.4、 LDA模型

从pLSA模型的分析中可以看出,pLSA模型的样本随机,参数虽未知但固定,属于「频率派思想」。

而在LDA模型中,样本固定,参数未知但不固定,是个随机变量,服从一定的分布,所以LDA模型属于「贝叶斯派」。

以上就是pLSA和LDA主要的区别,所以可以认为LDA就是在PLSA的基础上套上了贝叶斯框架(具体来说就是多加了两个先验参数)

废话不多说,直接上LDA模型生成文档的套路:

image-20230904100759089

可以看出,LDA 在 PLSA 的基础上,为主题分布和词分布分别加了两个 Dirichlet先验。

我们仍然以上面骰子模型举例说明,在PLSA中,我们会以固定的概率来抽取一个主题词,比如0.5的概率抽取教育这个主题词,然后根据抽取出来的主题词,找其对应的词分布,再根据词分布,抽取一个词汇。由此,可以看出PLSA中,主题分布和词分布都是唯一确定的。但是,在LDA中,主题分布和词分布是不确定的,LDA的作者们采用的是贝叶斯派的思想,认为它们应该服从一个分布,主题分布和词分布都是多项式分布,因为多项式分布和狄利克雷分布是共轭结构,在LDA中主题分布和词分布使用了Dirichlet分布作为它们的共轭先验分布。所以,也就有了一句广为流传的话 – LDA 就是 PLSA 的贝叶斯化版本。下面两张图片很好的体现了两者的区别:

image-20230904100832651

image-20230904100847292

在PLSA和LDA的两篇论文中,使用了下面的图片来解释模型,它们也很好的对比了PLSA和LDA的不同之处。

image-20230904100906583

上图是PLSA,下图是LDA,其中,阴影圆圈表示可观测变量,非阴影圆圈表示隐变量,箭头表示两变量间的条件依赖性,方框表示重复抽样,方框右下角表示重复抽样次数,Φ表示词分布,Θ表示主题分布, 是主题分布Θ的先验分布(即Dirichlet 分布)的参数,是词分布Φ的先验分布(即Dirichlet 分布)的参数,N表示文档的单词总数,M表示文档的总数。

所以,对于一篇文档d中的每一个单词,LDA根据先验知识确定某篇文档的主题分布θ,然后从该文档所对应的多项分布(主题分布)θ中抽取一个主题z,接着根据先验知识确定当前主题的词语分布ϕ,然后从主题z所对应的多项分布(词分布)ϕ中抽取一个单词w。然后将这个过程重复N次,就产生了文档d。

LDA参数估计:Gibbs采样

类似于pLSA,LDA的原始论文中是用的变分-EM算法估计未知参数,后来发现另一种估计LDA未知参数的方法更好,这种方法就是:Gibbs Sampling,有时叫Gibbs采样或Gibbs抽样,都一个意思。Gibbs抽样是马尔可夫链蒙特卡尔理论(MCMC)中用来获取一系列近似等于指定多维概率分布(比如2个或者多个随机变量的联合概率分布)观察样本的算法。

LDA训练
  1. 对语料库中的每篇文档中的每个词汇,随机的赋予一个topic编号
  2. 重新扫描语料库,对每个词,使用Gibbs Sampling公式对其采样,求出它的topic,在语料中更新
  3. 重复步骤2,直到Gibbs Sampling收敛
  4. 统计语料库的topic-word共现频率矩阵,该矩阵就是LDA的模型;

LDA训练

  1. 对语料库中的每篇文档中的每个词汇,随机的赋予一个topic编号
  2. 重新扫描语料库,对每个词,使用Gibbs Sampling公式对其采样,求出它的topic,在语料中更新
  3. 重复步骤2,直到Gibbs Sampling收敛
  4. 统计语料库的topic-word共现频率矩阵,该矩阵就是LDA的模型;

根据这个topic-word频率矩阵,我们可以计算每一个概率,从而算出模型参数 , 这就是那 K 个 topic-word 骰子。而语料库中的文档对应的骰子参数在以上训练过程中也是可以计算出来的,只要在 Gibbs Sampling 收敛之后,统计每篇文档中的 topic 的频率分布,我们就可以计算每一个 p(topic|doc) 概率,于是就可以计算出每一个 θ m \theta_m θm。由于参数 θ m \theta_m θm是和训练语料中的每篇文档相关的,对于我们理解新的文档并无用处,所以工程上最终存储 LDA 模型时候一般没有必要保留。通常,在 LDA 模型训练的过程中,我们是取 Gibbs Sampling 收敛之后的 n 个迭代的结果进行平均来做参数估计,这样模型质量更高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LDA(Latent Dirichlet Allocation)是一种常用的主题模型,用于从文本数据中发现隐藏的主题结构。它是一种无监督学习方法,可以自动地将文本数据集中的文档划分为若干个主题,并确定每个主题在每篇文档中的权重。 在Jupyter Notebook中使用LDA模型,你需要先安装相应的Python库,如`gensim`和`nltk`。然后按照以下步骤进行操作: 1. 导入所需的库: ```python import gensim from gensim import corpora from nltk.corpus import stopwords from nltk.tokenize import word_tokenize ``` 2. 准备文本数据: ```python # 读取文本文件 with open('text_data.txt', 'r') as file: text_data = file.readlines() # 分词和去除停用词 stop_words = set(stopwords.words('english')) tokenized_data = [word_tokenize(doc.lower()) for doc in text_data] filtered_data = [[word for word in doc if word not in stop_words] for doc in tokenized_data] ``` 3. 构建词袋模型: ```python # 创建词典 dictionary = corpora.Dictionary(filtered_data) # 将文本转换为词袋表示 corpus = [dictionary.doc2bow(doc) for doc in filtered_data] ``` 4. 训练LDA模型: ```python # 设置LDA模型参数 num_topics = 10 # 主题数量 passes = 10 # 迭代次数 # 训练LDA模型 lda_model = gensim.models.LdaModel(corpus, num_topics=num_topics, id2word=dictionary, passes=passes) ``` 5. 查看LDA模型结果: ```python # 打印每个主题的关键词 topics = lda_model.print_topics(num_topics=num_topics, num_words=5) for topic in topics: print(topic) ``` 以上是使用LDA模型进行主题建模的基本步骤。你可以根据自己的需求进行参数调整和结果解读。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值