系统学习NLP(二十二)--主题模型LDA

转自:https://blog.csdn.net/kisslotus/article/details/78427585 原文更详细,这里删减了不少

1. 简介
在机器学习领域,LDA是两个常用模型的简称:Linear Discriminant Analysis 和 Latent Dirichlet Allocation。本文的LDA仅指代Latent Dirichlet Allocation. LDA 在主题模型中占有非常重要的地位,常用来文本分类。

LDA由Blei, David M.、Ng, Andrew Y.、Jordan于2003年提出,用来推测文档的主题分布。它可以将文档集中每篇文档的主题以概率分布的形式给出,从而通过分析一些文档抽取出它们的主题分布后,便可以根据主题分布进行主题聚类或文本分类。

2. 先验知识
LDA 模型涉及很多数学知识,这也许是LDA晦涩难懂的主要原因。本小节主要介绍LDA中涉及的数学知识。数学功底比较好的读者可以直接跳过本小节。

LDA涉及到的知识有:二项分布、Gamma函数、Beta分布、多项分布、Dirichlet分布、马尔科夫链、MCMC、Gibbs Sampling、EM算法等。

2.1 词袋模型
LDA 采用词袋模型。所谓词袋模型,是将一篇文档,我们仅考虑一个词汇是否出现,而不考虑其出现的顺序。在词袋模型中,“我喜欢你”和“你喜欢我”是等价的。与词袋模型相反的一个模型是n-gram,n-gram考虑了词汇出现的先后顺序。

二项分布是N重伯努利分布,即为X ~ B(n, p). 概率密度公式为:

P(K = k) = \begin{pmatrix} n\\ k\\ \end{pmatrix}p^k{(1-p)}^{n-k}

2.3 多项分布

多项分布,是二项分布扩展到多维的情况. 多项分布是指单次试验中的随机变量的取值不再是0-1的,而是有多种离散值可能(1,2,3…,k).概率密度函数为:

P(x_1, x_2, ..., x_k; n, p_1, p_2, ..., p_k) = \frac{n!}{x_1!...x_k!}{p_1}^{x_1}...{p_k}^{x_k}

2.4 Gamma函数

Gamma函数的定义:

\Gamma(x) = \int_0^\infty t^{x-1}e^{-t}dt

分部积分后,可以发现Gamma函数如有这样的性质:\Gamma(x+1) = x\Gamma(x)

Gamma函数可以看成是阶乘在实数集上的延拓,具有如下性质:\Gamma(n) = (n-1)!

2.5 Beta分布

Beta分布的定义:对于参数α>0,β>0, 取值范围为[0, 1]的随机变量x的概率密度函数为:

f(x; \alpha, \beta) = \frac{1}{B(\alpha, \beta)} x^{\alpha - 1} {(1-x)}^{\beta-1}

其中,\frac{1}{B(\alpha, \beta)} = \frac{\Gamma(\alpha + \beta)}{\Gamma(\alpha)\Gamma(\beta)}

2.6 共轭先验分布

在贝叶斯概率理论中,如果后验概率P(θ∣x)先验概率 p(θ)满足同样的分布律,那么,先验分布和后验分布被叫做共轭分布,同时,先验分布叫做似然函数的共轭先验分布。这里区别一下,似然函数是模型参数的分布函数,先验分布是某个变量x的分布,这句话的意思是说,某个变量x的分布即先验分布,叫做该变量x与结果Y之间模型参数的共轭先验分布,假设先验分布是狄利克雷(Dirichlet)分布,似然函数是多项式分布,则狄利克雷(Dirichlet)分布是多项式分布的共轭先验分布,则后验分布也是狄利克雷(Dirichlet)分布。也就是说,数据符合多项式分布,参数的先验分布和后验分布都能保持Dirichlet分布的形式,

Beta分布是二项式分布的共轭先验分布,而狄利克雷(Dirichlet)分布是多项式分布的共轭分布。

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

2.7 Dirichlet分布

Dirichlet的概率密度函数为:f(x_1, x_2, ..., x_k; \alpha_1, \alpha_2, ..., \alpha_k) = \frac{1}{B(\alpha)}\prod_{i=1}^{k}{x_i}^{\alpha^i-1}

其中,B(\alpha) = \frac{\prod_{i=1}^{k}\Gamma(\alpha^i)}{\Gamma(\sum_{i=1}^{k}\alpha^i)}, \sum_{i=1}^{k}x^i = 1

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

对于Beta分布的随机变量,其均值可以用α/(α+β)来估计。Dirichlet分布也有类似的结论,E(p) =\biggl ( \frac{\alpha ^ 1}{\sum_{i = 1}^K \alpha_i}, \frac{\alpha ^ 1}{\sum_{i = 2}^K \alpha_i}, \cdots, \frac{\alpha ^ K}{\sum_{i = 1}^K \alpha_i} \biggr)

这两个结论非常重要,后面的LDA数学推导过程会使用这个结论。

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

3. 文本建模
一篇文档,可以看成是一组有序的词的序列d=(ω1,ω2,⋯,ωn) 从统计学角度来看,文档的生成可以看成是上帝抛掷骰子生成的结果,每一次抛掷骰子都生成一个词汇,抛掷N词生成一篇文档。在统计文本建模中,我们希望猜测出上帝是如何玩这个游戏的,这会涉及到两个最核心的问题:

上帝都有什么样的骰子;
上帝是如何抛掷这些骰子的;
第一个问题就是表示模型中都有哪些参数,骰子的每一个面的概率都对应于模型中的参数;第二个问题就表示游戏规则是什么,上帝可能有各种不同类型的骰子,上帝可以按照一定的规则抛掷这些骰子从而产生词序列。

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

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

3.1.1 频率派视角

对于一个骰子,记各个面的概率为p,每生成一个词汇都可以看做一次多项式分布,一篇文档d=ω=(ω1,ω2,⋯,ωn),文档之间,我们认为是独立的,对于一个语料库,其概率为:W=(ω→1,ω→2,⋯,ω→m)。

假设语料中总的词频是N,记每个词ωi的频率为ni, 那么n→=(n1,n2,⋯,nV), n→服从多项式分布,整个语料库的概率为P(w)

此时,我们需要估计模型中的参数p→,也就是词汇骰子中每个面的概率是多大,按照频率派的观点,使用极大似然估计最大化p(W), 于是参数pi的估计值为p̂ i=ni/N

3.1.2 贝叶斯派视角
对于以上模型,贝叶斯统计学派的统计学家会有不同意见,他们会很挑剔的批评只假设上帝拥有唯一一个固定的骰子是不合理的。在贝叶斯学派看来,一切参数都是随机变量,以上模型中的骰子\vec{p}不是唯一固定的,它也是一个随机变量。所以按照贝叶斯学派的观点,上帝是按照以下的过程在玩游戏的:

1. 现有一个装有无穷多个骰子的坛子,里面装有各式各样的骰子,每个骰子有V个面;
2. 现从坛子中抽取一个骰子出来,然后使用这个骰子不断抛掷,直到产生语料库中的所有词汇

LDA是基于贝叶斯模型的,涉及到贝叶斯模型离不开“先验分布”,“数据(似然)”和"后验分布"三块。在贝叶斯学派这里:

先验分布 + 数据(似然)= 后验分布

这点其实很好理解,因为这符合我们人的思维方式,比如你对好人和坏人的认知,先验分布为:100个好人和100个的坏人,即你认为好人坏人各占一半,现在你被2个好人(数据)帮助了和1个坏人骗了,于是你得到了新的后验分布为:102个好人和101个的坏人。现在你的后验分布里面认为好人比坏人多了。这个后验分布接着又变成你的新的先验分布,当你被1个好人(数据)帮助了和3个坏人(数据)骗了后,你又更新了你的后验分布为:103个好人和104个的坏人。依次继续更新下去。

其实,这里已经把关键问题解释掉了,也就是说,我们用多项式分布表示数据(似然,也就是模型参数分布),用Dirichlet分布表示先验分布(也就是变量x的分布),之后,利用贝叶斯公式,先近似先验分布(如MCMC采样,近似变量X的分布),再计算后验分布(先验和后验共轭)。不断迭代更新模型分布。

PLSA模型
Unigram Model模型中,没有考虑主题词这个概念。我们人写文章时,写的文章都是关于某一个主题的,不是满天胡乱的写,比如一个财经记者写一篇报道,那么这篇文章大部分都是关于财经主题的,当然,也有很少一部分词汇会涉及到其他主题。所以,PLSA认为生成一篇文档的生成过程如下:

1. 现有两种类型的骰子,一种是doc-topic骰子,每个doc-topic骰子有K个面,每个面一个topic的编号;一种是topic-word骰子,每个topic-word骰子有V个面,每个面对应一个词;
2. 现有K个topic-word骰子,每个骰子有一个编号,编号从1到K;
3. 生成每篇文档之前,先为这篇文章制造一个特定的doc-topic骰子,重复如下过程生成文档中的词:
3.1 投掷这个doc-topic骰子,得到一个topic编号z;
3.2 选择K个topic-word骰子中编号为z的那个,投掷这个骰子,得到一个词;
PLSA中,也是采用词袋模型,文档和文档之间是独立可交换的,同一个文档内的词也是独立可交换的,由于文档之间相互独立,很容易写出整个语料的生成概率。求解PLSA 可以使用著名的 EM 算法进行求得局部最优解

LDA主题模型

前面做了这么多的铺垫,我们终于可以开始LDA主题模型了。

我们的问题是这样的,我们有M篇文档,对应第d个文档中有有Nd个词。即输入为如下图:

我们的目标是找到每一篇文档的主题分布和每一个主题中词的分布。在LDA模型中,我们需要先假定一个主题数目K,这样所有的分布就都基于K个主题展开。那么具体LDA模型是怎么样的呢?具体如下图:

 

LDA假设文档主题的先验分布是Dirichlet分布,即对于任一文档d, 其主题分布θd为:θd=Dirichlet(α→),其中,α为分布的超参数,是一个K维向量。

LDA假设主题中词的先验分布是Dirichlet分布,即对于任一主题k, 其词分布βk为:βk=Dirichlet(η→)其中,η为分布的超参数,是一个V维向量。V代表词汇表里所有词的个数。

对于数据中任一一篇文档d中的第n个词,我们可以从主题分布θd中得到它的主题编号Zdn的分布为:zdn=multi(θd)

而对于该主题编号,得到我们看到的词Wdn的概率分布为:wdn=multi(βzdn)

理解LDA主题模型的主要任务就是理解上面的这个模型。这个模型里,我们有M个文档主题的Dirichlet分布,而对应的数据有M个主题编号的多项分布,这样(α→θd→z→d)就组成了Dirichlet-multi共轭,可以使用前面提到的贝叶斯推断的方法得到基于Dirichlet分布的文档主题后验分布。

如果在第d个文档中,第k个主题的词的个数为:n(k)d, 则对应的多项分布的计数可以表示为n→d=(nd(1),nd(2),...nd(K))

利用Dirichlet-multi共轭,得到θd的后验分布为:Dirichlet(θd|α→+n→d)

同样的道理,对于主题与词的分布,我们有K个主题与词的Dirichlet分布,而对应的数据有K个主题编号的多项分布,这样η→βk→w→(k))就组成了Dirichlet-multi共轭,可以使用前面提到的贝叶斯推断的方法得到基于Dirichlet分布的主题词的后验分布。

如果在第k个主题中,第v个词的个数为:n(v)k, 则对应的多项分布的计数可以表示为n→k=(nk(1),nk(2),...nk(V))

利用Dirichlet-multi共轭,得到βk的后验分布为:Dirichlet(βk|η→+n→k)

由于主题产生词不依赖具体某一个文档,因此文档主题分布和主题词分布是独立的。理解了上面这M+K组Dirichlet-multi共轭,就理解了LDA的基本原理了。

现在的问题是,基于这个LDA模型如何求解我们想要的每一篇文档的主题分布和每一个主题中词的分布呢?

一般有两种方法,第一种是基于Gibbs采样算法求解,第二种是基于变分推断EM算法求解。

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

3.3.5 LDA Training
根据上一小节中的公式,我们的目标有两个:

1. 估计模型中的参数beta1,⋯,betaM 和 θ1,⋯,θM;
2. 对于新来的一篇文档,我们能够计算这篇文档的 topic 分布θd。
训练的过程:

1. 对语料库中的每篇文档中的每个词汇ω,随机的赋予一个topic编号z
2. 重新扫描语料库,对每个词ω,使用Gibbs Sampling公式对其采样,求出它的topic,在语料中更新
3. 重复步骤2,直到Gibbs Sampling收敛
4. 统计语料库的topic-word共现频率矩阵,该矩阵就是LDA的模型;
根据这个topic-word频率矩阵,我们可以计算每一个p(word∣topic)概率,从而算出模型参数φ→1,⋯,φ→K, 这就是那 K 个 topic-word 骰子。而语料库中的文档对应的骰子参数 θ1,⋯,θM 在以上训练过程中也是可以计算出来的,只要在 Gibbs Sampling 收敛之后,统计每篇文档中的 topic 的频率分布,我们就可以计算每一个 p(topic∣doc)概率,于是就可以计算出每一个θm。由于参数θm是和训练语料中的每篇文档相关的,对于我们理解新的文档并无用处,所以工程上最终存储 LDA 模型时候一般没有必要保留。通常,在 LDA 模型训练的过程中,我们是取 Gibbs Sampling 收敛之后的 n 个迭代的结果进行平均来做参数估计,这样模型质量更高。

3.3.6 LDA Inference
有了 LDA 的模型,对于新来的文档 doc, 我们只要认为 Gibbs Sampling 公式中的φ→kt 部分是稳定不变的,是由训练语料得到的模型提供的,所以采样过程中我们只要估计该文档的 topic 分布θ就好了. 具体算法如下:

1. 对当前文档中的每个单词ω, 随机初始化一个topic编号z;
2. 使用Gibbs Sampling公式,对每个词ω, 重新采样其topic;
3. 重复以上过程,知道Gibbs Sampling收敛;
4. 统计文档中的topic分布,该分布就是θ→
4 Tips
懂 LDA 的面试官通常会询问求职者,LDA 中主题数目如何确定?

在 LDA 中,主题的数目没有一个固定的最优解。模型训练时,需要事先设置主题数,训练人员需要根据训练出来的结果,手动调参,优化主题数目,进而优化文本分类结果。

LDA 在提出后,之后产生了很多基于 LDA 的改进模型,基本都是概率图模型加 LDA 的组合方式。但 LDA 也有缺点,LDA对短文本的效果不好,而且计算量比较大,训练时间比较长。
百度开源了其 LDA 模型,有兴趣的读者可以阅读:https://github.com/baidu/Familia/wiki

发布了292 篇原创文章 · 获赞 1251 · 访问量 566万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览