模型原理

  LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。

  LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。它采用了词袋(bag of words)的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。

1、LDA生成过程

  对于语料库中的每篇文档,LDA定义了如下生成过程(generativeprocess): 1.对每一篇文档,从主题分布中抽取一个主题; 2.从上述被抽到的主题所对应的单词分布中抽取一个单词; 3.重复上述过程直至遍历文档中的每一个单词。

  语料库中的每一篇文档与T(通过反复试验等方法事先给定)个主题的一个多项分布 (multinomialdistribution)相对应,将该多项分布记为θ。每个主题又与词汇表(vocabulary)中的V个单词的一个多项分布相对应,将这个多项分布记为φ。

2、LDA整体流程

  先定义一些字母的含义:文档集合D,主题(topic)集合T。D中每个文档d看作一个单词序列,wi表示第i个单词,设d有n个单词。(LDA里面称之为wordbag,实际上每个单词的出现位置对LDA算法无影响) 。D中涉及的所有不同单词组成一个大集合VOCABULARY(简称VOC),LDA以文档集合D作为输入,希望训练出的两个结果向量(设聚成k个topic,VOC中共包含m个词):

1、对每个D中的文档d,对应到不同Topic的概率θd,其中,pti表示d对应T中第i个topic的概率。计算方法是直观的,pti=nti/n,其中nti表示d中对应第i个topic的词的数目,n是d中所有词的总数。

2、对每个T中的topict,生成不同单词的概率φt,其中,pwi表示t生成VOC中第i个单词的概率。计算方法同样很直观,pwi=Nwi/N,其中Nwi表示对应到topict的VOC中第i个单词的数目,N表示所有对应到topict的单词总数。LDA的核心公式如下:

p(w|d)=p(w|t)*p(t|d)

直观的看这个公式,就是以Topic作为中间层,可以通过当前的θd和φt给出了文档d中出现单词w的概率。其中p(t|d)利用θd计算得到,p(w|t)利用φt计算得到。

3、实际上,利用当前的θd和φt,我们可以为一个文档中的一个单词计算它对应任意一个Topic时的p(w|d),然后根据这些结果来更新这个词应该对应的topic。然后,如果这个更新改变了这个单词所对应的Topic,就会反过来影响θd和φt。

3、LDA学习过程(方法之一)

  LDA算法开始时,先随机地给θd和φt赋值(对所有的d和t)。然后上述过程不断重复,最终收敛到的结果就是LDA的输出。再详细说一下这个迭代的学习过程:

1.针对一个特定的文档ds中的第i单词wi,如果令该单词对应的topic为tj,可以把上述公式改写为:

pj(wi|ds)=p(wi|tj)*p(tj|ds)

2.现在我们可以枚举T中的topic,得到所有的pj(wi|ds),其中j取值1~k。然后可以根据这些概率值结果为ds中的第i个单词wi选择一个topic。最简单的想法是取令pj(wi|ds)最大的tj(注意,这个式子里只有j是变量),即argmax[j]pj(wi|ds)

3.然后,如果ds中的第i个单词wi在这里选择了一个与原先不同的topic,就会对θd和φt有影响了(根据前面提到过的这两个向量的计算公式可以很容易知道)。它们的影响又会反过来影响对上面提到的p(w|d)的计算。对D中所有的d中的所有w进行一次p(w|d)的计算并重新选择topic看作一次迭代。这样进行n次循环迭代之后,就会收敛到LDA所需要的结果了

工程实践

1、技术构架

技术平台和模型

  数据超市LDA组件依托Spark2.1技术平台,采用online优化模型。Spark采用的两种优化算法:

(1)EMLDAOptimizer 通过在likelihood函数上计算最大期望EM,提供较全面的结果。 该方法比较占用内存,经过我们测算,容易造成内存溢出报错。

(2)OnlineLDAOptimizer 通过在小批量数据上迭代采样实现online变分推断,比较节省内存。在线变分预测是一种训练LDA模型的技术,它以小批次增量式地处理数据。由于每次处理一小批数据,我们可以轻易地将其扩展应用到大数据集上。MLlib按照 Hoffman论文里最初提出的算法实现了一种在线变分学习算法。

  数据超市只默认提供online模型。

SPARK中部分可选参数如下,数据超市组件采用简要配置,无提供配置的参数都使用默认值。

(1)K:主题数量(或者说聚簇中心数量)

(2)maxIterations:EM算法的最大迭代次数,设置足够大的迭代次数非常重要,前期的迭代返回一些无用的(极其相似的)话题,但是继续迭代多次后结果明显改善。我们注意到这对EM算法尤其有效。,至少需要设置20次的迭代,50-100次是更合理的设置,取决于你的数据集。

(3)docConcentration(Dirichlet分布的参数α):文档在主题上分布的先验参数(超参数αα)。当前必须大于1,值越大,推断出的分布越平滑。默认为-1,自动设置。

(4)topicConcentration(Dirichlet分布的参数β):主题在单词上的先验分布参数。当前必须大于1,值越大,推断出的分布越平滑。默认为-1,自动设置。

(5)checkpointInterval:检查点间隔。maxIterations很大的时候,检查点可以帮助减少shuffle文件大小并且可以帮助故障恢复。

2、模型训练

3、模型评估

  模型的评价指标:logLikelihood 对数似然率和logPerplexity对数复杂度。数据超市在"寻求最优参数模式"中,会根据不同迭代次数和不同主题数量,计算两个指标进行展示,方便用户评估,然后确定迭代次数和主题个数再进行"确定参数的模式"训练。

(1)根据训练集的模型分布计算的log likelihood,越大越好。

(2)Perplexity评估,越小越好

4、LDA还可以有更多的用途:

(1)特征生成:LDA可以生成特征(即topics向量)供其他机器学习算法使用。如前所述,LDA为每一篇文章推断一个主题分布;K个主题即是K个数值特征。这些特征可以被用在像逻辑回归或者决策树这样的算法中用于预测任务。

(2)降维:每篇文章在主题上的分布提供了一个文章的简洁总结。在这个降维了的特征空间中进行文章比较,比在原始的词汇的特征空间中更有意义。 所以呢,我们需要记得LDA的多用途:(1)聚类,(2)降纬,(3)特征生成,一举多得,典型的多面手。

5、数据超市实例

6、运行LDA的小技巧

(1)确保迭代次数足够多。这个前面已经讲过了。前期的迭代返回一些无用的(极其相似的)话题,但是继续迭代多次后结果明显改善。

(2)对于数据中特殊停用词的处理方法,通常的做法是运行一遍LDA,观察各个话题,挑出各个话题中的停用词,把他们滤除,再运行一遍LDA。

(3)确定话题的个数是一门艺术。有些算法可以自动选择话题个数,但是领域知识对得到好的结果至关重要。

(4)采用特征变换类组件对文本做有些处理,例如词语过滤(停用词过滤)等

参考资料

[1]Latent Dirichlet allocation隐狄利克雷分配模型原始论文

[2]维基百科隐狄利克雷分配模型介绍

[3]《LDA数学八卦》

[4]博客《简述LDA模型》

[5]Spark2.0机器学习系列之9: 聚类算法(LDA)

results matching ""

    No results matching ""