NLP学习系列02丨LDA模型

一、什么是LDA

LDA(Latent Dirichlet Allocation)是文本挖掘(Text Mining)中的重要工具。在文本挖掘中,有一项重要的工作就是分析和挖掘出文本中隐含的结构信息,而不依赖任何提前标注(Labeled)的信息。也就是说,我们希望能够利用文本挖掘技术来对无标签的数据进行挖掘,这是典型的无监督学习。

LDA 就是一个出色的无监督学习的文本挖掘模型。这个模型在过去的十年里开启了主题模型(Topic Model)这个领域。不少学者都利用 LDA 来分析各式各样的文档数据,从新闻数据到医药文档,从考古文献到政府公文。在一段时间内,LDA 成为了分析文本信息的标准工具。而从最原始的 LDA 发展出来的各类模型变种,则被应用到了多种数据类型上,包括图像、音频、混合信息、推荐系统、文档检索等等,可以说各类主题模型变种层出不穷。

二、判别式模型和产生式模型

我们假设需要建模的数据有特征信息,也就是通常说的 X,以及标签信息,也就是通常所说的 Y。判别式模型常常直接对 Y 的产生过程(Generative Process) 进行描述,而对特征信息本身不予建模。这使得判别式模型天生就成为构建分类器或者回归分析的有利工具

LDA 模型所属的产生式模型(Generative Model),要同时对 X 和 Y 建模,这使得产生式模型更适合做无标签的数据分析,比如聚类。当然,因为产生式模型要对比较多的信息进行建模,所以一般认为对于同一个数据而言,产生式模型要比判别式模型更难以学习。

一般来说,产生式模型希望通过一个产生过程来帮助读者理解一个模型。注意,这个产生过程本质是描述一个联合概率分布(Joint Distribution)的分解过程。也就是说,这个过程是一个虚拟过程,真实的数据往往并不是这样产生的。这样的产生过程是模型的一个假设,一种描述。任何一个产生过程都可以在数学上完全等价一个联合概率分布。从文档聚类的角度来看,LDA 是没有一个文档统一的聚类标签,而是每个字有一个聚类标签,在这里就是主题。这也是 LDA 是MixedMembership 模型的原因——每个字有可能属于不同的类别、每个文档也有可能属于不同的类别。

三、LDA模型的训练和结果

LDA 模型中最重要的未知变量就是每个单词对应的主题下标(Index)或者说是主题“赋 值”(Assignment)。这个主题下标是从每个文档对应的主题分布中“采样”得来的。每 个文档的主题分布本身也是一个未知的多项式分布,用来表达当前这个文档的所属主题,比如有多少百分比属于运动、有多少百分比属于金融等等。这个分布是从一个全局的狄利克雷 (Diriclet)分布中产生的。狄利克雷分布在这里起到了超参数的作用,其参数的取值往往也是未知的。但是我们可以根据一些经验值对其进行设置。除了每个文档的主题分布和主题赋值以外,我们还需要对全局的主题语言模型进行估计。这些语言模型直接决定了,各类词语出现的概率是多少。

流行的 LDA 训练方法有两个,一个是基于吉布斯采样(Gibbs Sampling)的随机方法,一个是基于变分推断(Variational Inference)的确定性方法(Deterministic)。这两种 方法的初始形态都无法应对大型数据。这里我们来简要介绍一下这两种方法。

吉布斯采样主要是针对主题赋值进行采样,最开始是完全随机的结果,但是慢慢会收敛到参数的后验概率的真值。这里面比较慢的一个原因,是这个收敛过程可能需要几百到几千个不 等的迭代。同时,吉布斯采样只能一个文档一个文档进行,所有的数据结构都需要在采样的 过程中进行更改。这个过程比较慢的另外一个原因,是吉布斯采样的核心是如何对一个离散 分布进行采样。而离散分布采样本身,如果在分布的参数变化的情况下,最好能够达到 O(KlogK),这里 K 是主题的数目。因此,从原理上来说,这也是阻碍吉布斯采样能够扩 展到大型数据的一个原因。

变分推断的思路则和吉布斯采样很不一样。它是把对隐含参数的估计问题变成一个确定性的优化问题,这样我们就可以利用种种优化算法来解决贝叶斯推断的问题。不过和吉布斯采样 相比,变分推断存在一个问题,因为这种方法并不是解决原来的优化问题,因此新的优化问题可能并不能带来原来问题的解。同时,变分推断也需要一个文档一个文档单独处理,因此推广到大规模数据上有其局限性。

四、LDA的扩展模型

LDA扩展有很多,这里说几个经典的扩展思路,分别是基于上游、下游和时间序列的LDA扩展模型。

当 LDA 被提出以后,不少学者看到了这个模型的潜力,于是开始思考怎么把更多的信息融入到 LDA 里面去。LDA 只是对文档的文字信息本身进行建模。但是绝大多数的文档数据集还有很多额外的信息,如何利用这些额外信息,就成为了日后对 LDA 扩展的最重要的工作。第一个很容易想到的需要扩展的信息就是作者信息。特别是 LDA 最早期的应用,很多时候我们希望借用作者在写文档时的遣词造句风格来分析作者的一些写作信息。那么,如何让 LDA 能够分析作者的信息呢?

作者 LDA 和普通的 LDA 相比,最大的不同就是主题分布不是每个文档有一个,而是每个作者有一个。这个主题分布决定着当前的单词是从哪一个语言模型中采样的单 词。作者 LDA 也采用吉布斯采样的方法学习,并且通过模型的学习之后,能够看得出不同 作者对于文档的影响。

从作者 LDA 之后,大家看出了一种扩展 LDA 的思路,那就是依靠额外的信息去影响主题分布,进而影响文档字句的选择。这种扩展的方法叫作“上游扩展法”(Upstream)。什么意思呢?就是说把希望对模型有影响的信息,放到主题分布的上游,去主动影响主题分布的变化。这其实是概率图模型的一种基本的思路,那就是把变量放到这个产生式模型的上游,使得下游的变量受到影响。

那你可能要问,有没有把需要依赖的变量放到下游的情况呢?答案是肯定的。这里面的基本思路就是认为所有的这些数据都是通过主题分布产生的。也就是说,一个数据点,我们一旦知道了这个数据点内涵的主题(比如到底是关于体育的,还是关于金融的),那么我们就可以产生出和这个数据点相关的所有信息,包括文字、图像、影音等。这组数据的图像标签以及图像所属的类别都是主题产生 的。我们可以看到,和之前的作者 LDA 的区别,那就是其他信息都是放在主题变量的下游的,希望通过主题变量来施加影响。

这两种模型代表了一系列丰富的关于 LDA 的扩展思路,那就是如何把扩展的变量设置在上游或者是下游,从而能够对主题信息产生影响或者是受到主题信息的影响

除此以外,LDA 的另外一大扩展就是把文档放到时间的尺度上,希望去分析和了解文档在 时间轴上的变化。在之前的模型中,我们知道每个文档的主题分布其实来自一个全局的狄利克雷 (Diriclet )先验分布。那么,我们可以认为不同时间的先验分布是不一样的,而这些先验分布会随着时间变化而变化。怎么能够表达这个思想呢?作者们用到了一个叫“状态空间”(State-Space)的模型。简而言之,状态空间模型就是把不同时间点的狄利克雷分布 的参数给串起来,使得这些分布的参数会随着时间的变化而变化。把一堆静态的参数用状态 空间模型串接起来

五、优化LDA算法

吉布斯采样慢的一个核心就是我们刚才说的,需要从一个离散 分布中采样出一个样本,在我们这个例子中也就是每个单词的主题赋值。那么,有没有什么方法让这个步骤加速呢?答案是,有的。

在 KDD 2009 上发表了一篇论文《应用于流文档集合的主题模型推断的高效方法》。原来的吉布斯采样公式可以被分解为几个部分:和全局的语言模型有关、和文档有关以及和当前需要采样的单词有关。之后很多加速吉布斯采样的工作基本上都采用了类似的思路,也就是试图把原始的吉布斯采样公式拆分成好几个组成部分,并且每一个部分所代表数据的变化率是不一样的。 以这篇文章提出的方法来说,全局语言模型在每个文档的采样过程中是不变的,于是这部分 的计算不需要每个单词都重算。同理,只与文档相关的部分,也可以每个单词的采样过程中,只算一次,而不需要每个主题算一次。在这样一个简化了的流程里,采样速度得到了极大的提升。

在这篇文章之后,通过吉布斯采样这个方法,LDA 的采样速度还是没有得到明确的提升,直到《降低主题模型的采样复杂度》论文的出现,文章的思想还是针对吉布斯采样的公式,不过这一次,拆分的方法略不一样。作者们把采样的公式拆分成了与当前文档有关系的一部分,以及和当前文档没关系的全局语言模型的部分。同时,作者们提出了一个“Alias 方法”(Alias Method),简称A算法,来加速采样。 这个 A 算法其实并不是作者们为了 LDA 发明的,而是一个普遍的可以对离散分布采样的一 个算法。A 算法的核心思想是,如果我们要针对一个分布进行反复采样,那么就可以建立一 种数据结构,使得这种采样只有在第一遍的时候有一定的计算成本,而后都会以 O(1) 的成本进行采样。这个方法极大地加速了 LDA 通过吉布斯采样的效率。

那么在*变分推断的道路上,有没有什么方法能够加速呢?答案依然是肯定的。

这方面的代表作无疑就是论文《LDA 的在线学习》,我们回到变分推断的场景中,把一个贝叶斯推断的问题变成了优化的问题。那么,在优化的场景里,是怎么针对大规模数据的呢? 在优化的场景里,特别是基于梯度(Gradient)的优化方法中,大数据的应用往往需要 SGD(Stochastic Gradient Descent,随机梯度下降)的方法。通俗地讲,就是在计算梯 度的时候,我们不需要处理完所有的数据之后才计算一次梯度,而是针对每一个文档,都可以计算一次梯度的估计值。作者们其实就是把这个思想给搬到了变分推断里。总的来说,新发明出来的变分推断其实就是希望能够推演出一种类似 SGD 的变分方法,这种方法在后来的很多论文中都有所应用。