最近针对项目中涉及到的APP描述信息分类问题,有针对性地学习了LDA主题模型,发现涉及内容较多,有必要记录一下。接下来从简单到复杂:
什么是主题模型?
所谓主题模型,就是给定一篇文档,我去判断这篇文章是属于什么类别的文档,例如文章中出现吴恩达,可能就是一篇机器学习相关文档。现在我们给出一篇文档,我们的目的就是判断这篇文档是什么类型的。
直观版
假设某企业想要招聘一个工程师,他们收到了很多简历,他们想通过简历来判断谁是大牛,谁是小白。简历中一般包含了很多个人特征,例如:1.北京邮电大学毕业2.百度实习3.经常穿条纹衬衫4.参加过数据竞赛,等等。由以下这三个要素,构成了这家企业的人力总监判断基础:
这位人力总监要做的事情是: (假设这位HR是小白)
1.拿出一份份简历,记录下来每份简历包含的特征,但他可能不知道这一切代表着什么
2.他根据这些特征开始猜测,看到了简历A,里面提到学生毕业于北邮,他猜这个学生八成是个优秀码农,但一看他没有竞赛经历,有点担忧,可能觉得这个学生只是个理论帝。
3.接着又开始看B看C等等
经过大量查阅简历和与应聘者的实际接触,他慢慢总结经验,调整自己的预期。
但如果这个HR是一个老司机,他可以通过经验统计来调整自己的猜想:
1.比如他曾面试了一个竞赛金牌的应聘者,发现这个应聘者能力很强。这证明竞赛可能真的很有用。
2.但如果他面试了一个没有项目经历的人,发现这个人技术不行,那可能这个项目经历很重要。
他根据自己经历过的东西,大概进行一个组合,去猜测是大牛还是小白。
HR根据自己已有的概念,认为某些特征对自己招人特别有帮助,他可能就会更加关注这些内容,找出更加适合的人。
以上,就是我们用现实的例子模拟的LDA模型来区分简历好坏
在文本的主题分类中,我们的例子和实际之间的联系如下:
其实这样的一个区分应聘者好坏的程度,就类似于根据文档区分主题的过程。特征和单词可以组成简历和文档,我们通过简历和文档中的特征和单词来区分好坏应聘者或者主题。
什么是LDA?
Latent Dirichlet Allocation:
* 是一种无监督的贝叶斯模型(这个 贝叶斯模型 将会在公式版里面阐述)
* 是一种主题模型,它可以将文档集中每篇文档的主题按照概率分布的形式给出。同时它是一种无监督学习算法,在训练时不需要手工标注的训练集,需要的仅仅是文档集以及指定主题的数量k即可。此外LDA的另一个优点是,对于每一个主题均可找出一些词语来描述它。(有监督学习可以使用词频或者词向量来对文本进行具体的分类。我们可以通过描述每个主题的TOP词汇来猜测这个主题大概是什么意思)
* 是一种典型的词袋模型,即它认为一篇文档是由一组词构成的一个集合,词与词之间没有顺序以及先后的关系。一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。
什么是贝叶斯模型?
第一行其实就是一个条件概率,就是两者同时发生的概率,等于在θ发生的情况下,y发生的概率乘以θ发生的概率。
第二行就是把条件概率公式带入到另一个条件概率公式中,这个公式就是贝叶斯公式。这个公式其实就是通过贝叶斯公式将前后两者进行了一个交换律。
当已知y去推断出现θ的概率不好得出时,我们可以进行这样一个变换。
先验,后验与似然
在整个贝叶斯学派中,世界上的概率分为先验、后验与似然。先验指在事情没发生的时候,我对这个事情的判断。似然是指现在发生了这件事情,这件事情对我产生了影响,最终得到了后验知识。大概直观版就是这样,接下来加入一些公式。
标准版
我们用LDA找寻的就是之前例子里HR统计出来的经验:
一份简历的每个特征都是因为本人有一定的概率是好/坏程序员,并从好/坏这个分类中以一定概率选择某些特征而组成的。
一篇文章的每个词都是以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语而组成的。
所以根据贝叶斯公式,我们现在可以把这三者列成一个链式关系(其中有一些变量的约减)。
也就是说,从后往前看,当我们确定一篇文档以后,我们可以判断它属于每个主题的概率是多少,当选取了某个固定主题后,我们可以判断在这个主题下,得出某个具体单词的概率是多少。把两项相乘后,我们可以得到当给出一篇文档后,我们生成这些单词的概率是多少。
重点在于,第一项我们可以通过已有文档统计得出,后两者可以通过频度计算得出。文档属于哪个分布,我们计算下来。主题出现了哪个单词,同样记录下来。这些都是通过每一次经验慢慢得到的。我们可以通过第一项来判断现在的乘积是否符合要求。
P(单词|文档)是某个单词出现在某篇文档中的个数除以这篇文档词语总数
所以在做LDA的时候,我们需要计算得到两个概率分布。这两个分布的乘积,可以让我们来印证在某篇文档条件下,出现某个词的概率是多少。我们可以调整这两个分布,直到等号前后可以拟合。
一开始我们从文档主题分布抽取一个主题(例如体育),再从这个主题词汇分布中抽取一个词。来判断这个乘积和文档词汇的概率拟合与否,如果拟合说明主题选对了;如果不拟合,我们再继续选择下一个主题,选择对应主题下的一个单词。来不断更新概率分布。值得注意的是,这里的词是所有文档中的所有词,所以对应于不同的主题,它都画在这个主题词汇分布图中,只不过大小高低可能不一样。
这个分布改变的依据是根据,这个文档本身有这个词的事实来改变。
LDA生成过程
对于语料库中的每篇文档,LDA定义了如下生成过程:
1.对每一篇文档,从主题分布中抽取一个主题
2.从上述被抽到的主题所对应的单词分布中抽取一个单词
3.重复上述过程直至遍历文档中的每一个单词
针对1过程,一开始并不知道我抽到的主题对不对,我们一开始就随机设它是一个怎样的分布,例如正态分布。
这两个结果向量其实就是前面描述到的,文档主题分布、主题词汇分布。
第一个向量的表述形式是这样的,它对整个文档集合中具体的一篇文档d,得出它对应不同topic的概率,(topic一个有k个),其中pti对应这篇文档每一个具体topic的概率,可以通过 属于某个topic的单词数 除以 这篇文档的词总数 得到。(这里,不同topic可能包含相同的词)
同理,对应某一个具体的topic,我们从整个词汇表中的m个词中,我们去看针对一个具体的主题,它的词汇分布在整个词汇表中大概是个什么样子的。
这两个概率都可以通过遍历文档得出,而这两个概率结果的乘积就等于 基于这个文档生成这个词的概率(这个概率乘积是用对应的值来乘,而不是这两个分布);如果等式两边不成立,证明这两个分布不太对,我们需要不断更新。
所以,LDA的核心公式如下:
直观的看这个公式,就是以topic作为中间层,可以通过当前的θd和φt给出了文档d中出现单词w的概率。其中p(t|d)利用θd计算得到,p(w|t)利用φt计算得到。
实际上,利用当前的θd和φt,我们可以为一个文档中的一个单词计算它对应任意一个topic时的p(w|d),然后根据这些结果来更新这个词对应的topic。然后,如果这个更新改变了这个单词所对应的topic,就会反过来影响θd和φt。
等式后面可以通过概率统计形式来得出,相乘结果去拟合等式前面的部分。神奇的地方就在于,我们通过改变topic的具体形式,来达到等式成立这个目的。其中topic是一个隐含层,举一个例子,一开始topic可能包含的词汇有(刘翔,周杰伦),直到最后收敛为(周杰伦,费玉清)。也就是通过中间层去慢慢修改theta和fai这两个分布,最终拟合成我们这个符合客观事实的,即 文档主题 和 主题词汇分布。
不过需要关注的是,我们其实需要求的是P(t|d),这个等式是为了学习出这样一个符合条件的分布。即我们可以通过给出一个文档,直接确定出这个文档主题的分布。
一开始可以随机对这两个分布给一个正态分布,相当于给这两个分布一个先验值,(因为这个东西可以通过等式拟合来修正),通过似然数据来对先验进行调整,最后得到后验概率。
其实这里就大概说明了LDA所做的事情。