书名:LDA算法漫游指南 v2.0
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
LDA模型是著名的主题模型,自从发明以来,一直得到学术界和工业界的广泛重视。因此LDA以其经典性,其实用性是学习机器学习时不得不学的技术,但是LDA本身也涉及了概率论和数理统计的背景,使得这个技术本身不是那么浅显易懂,非得拿出搞研究学习的劲头,下一番功夫,才能尝到甜头。这本书完整而细致地解剖了LDA主题模型主流的Gibbs Sampling方法和变分推断法。
这个技术由于使用了概率论和数理统计的知识,考虑到了有些读者数学基础不是很扎实,因此会先将前置知识和背景知识介绍给读者,以打好读者的基础,在推导过程中,作者会写出很多技术细节部分,以不放弃任何一名潜在的读者的态度帮助理解。本书面向的读者应该是有一定数学基础的大学生,应该接触过简单的一元微积分知识,阅读本书,体验算法之美,是需要一定的毅力的,我不会将本书推荐给一位没有毅力的读者。
书中的独特之处与创新之处在于解决了以下几个问题:
1.在国内的LDA资料都缺乏工业界实际应用时,这本书以实用为导向,精选了LDA的几个应用给大家介绍,使数学算法理论不再阳春白雪,而真正落地。
2.着重帮助初学者, 为了争取到每一位读者,作者写作时特意考虑了只有大学微积分水平的读者如何读懂,因此每一条公式都不厌其烦地细致解释,力求贴近读者。
3.介绍了代码实现的方法以及并行化。这是其他LDA资料里总是缺少的内容,理论只有实现为真真实实运行的代码才可以真正落地,这也是搞理论研究和搞应用之间难以跨越的鸿沟。
关于本书有任何疑问,请在异步社区上答疑帖子提问:http://www.epubit.com.cn/article/502
马晨,清华大学在读博士。
硕士毕业于北京邮电大学,曾就职于新浪、暴风影音等知名互联网公司,主要任互联网数据挖掘算法研究工程师,主攻机器学习领域算法,对算法的原理推导和互联网环境下机器学习的算法落地应用非常感兴趣。在暴风影音工作期间,开发设计了开源作品cronhub调度系统,至今仍在GitHub上供使用者下载。还发表了相当多的技术文章,目前主要活跃在异步社区上。本书QQ读书交流群:152583630。
“小马哥机器学习”的微信公众号(xiaomage-ml),定期发布独家研究干货,公众号的二维码如下,扫码关注:
LDA算法是主题模型领域非常著名的算法,也有很深刻的数学背景和技术启发价值,值得深入研究应用。曾经有哲人说:万物皆数。我是一个十分喜欢数学、喜欢算法、热爱技术的人,非常想从算法中寻找人工智能的永恒之道。
我现在仍记得19世纪的数学家赫尔曼 · 汉克尔说过的:“就大多数学科而言,一代人摧毁的正是另一代人所建造的,而他们所建立的也必将被另一代人所破坏。只有数学不同,每一代人都是在旧的建筑物上加进新的一层。”
所以说,数学的价值还具有一种永世不灭的恒久性,其他学科的时尚潮流往往随着时代的变迁被人遗忘,那些旨在改变世界的理想,最终往往变成了思想垃圾。而只有数学和算法与此不同。
我们探究前人伟大的成果时,就能体会到奥利弗 · 亥维赛的精辟论说:“逻辑能够很有耐性,因为它是永恒的。”
当我选择分析Latent Dirichlet Allocation(LDA)这个算法课题时,我考虑了很多因素。首先,该算法是已经被学术界和工业界广泛接受的;其次,该算法能带来更多的新技术启示;最后,该算法能为我们的工作,我们的研究带来实用性的技术启发。
LDA算法恰好满足了这个条件。
虽然网上已经有许多分析LDA算法的博客文章,但是网上的博文相对零散不成体系,读者阅读起来有较大困难。只要读者有恒心和毅力,就一定可以从本书中受益。
为什么需要这本书?
1. 理论与实践并重:网络上同类文章非常零散,理论推导部分也缺乏关键细节。本书中每一条公式都由作者手把手为您推理(每一条公式都有详细的解释和备注),并且按照初学者的思路娓娓道来,从逻辑链条上打通算法的整个环节,让用户有清晰的认识。在实践部分,作者以多年的工作实践经验为基础,精选了6个实现简单但又有较强的应用价值的LDA应用方法。这些精选的应用方法将成为读者未来工作实践中不可多得的资料。
2. 见解独到:本书最大的特色是从理论分析开始就含有作者独到的理解和分析,从不同角度完美地解释算法的整个流程。
3. 章节内容安排精巧,可根据需求选择:有的工程师对于算法推导不是很感兴趣,这种情况下可以跳过前3章,直接从第4章开始阅读LDA算法的具体实现。如果将来有兴趣研究LDA的来龙去脉时,可以再来看前3章的理论推导部分。如果读者对大数据环境下的LDA感兴趣,包括如何在Hadoop、Spark上实现LDA算法可以直接阅读第5章。
4. 首次将LDA引入大数据时代:大数据时代最大的特色就是信息爆炸,各种文本数据,用户生成(UGC)数据也变得非常庞大,网络上查阅到的LDA算法资料大部分不能应对大数据环境。第5章深入浅出地讲解了大数据环境下如何实现并行化的LDA算法。
5. 关于LDA的变分推断技术讲解细致。
第1章为相关背景的介绍,介绍了算法知识的来源,即从18世纪的欧拉讲到剑桥大学的David Blei。
第2章和第3章为算法的理论分析阶段。
第2章为LDA算法的前置知识,为学习LDA打下了坚实的理论知识。第2章力求做到关键证明不遗漏,这样就可以与第3章的LDA的算法推导构成一个完整的推理链条!第2章中的有些证明需要读者具备一些简单的微积分知识,如果读者忘了基础的微积分知识,那么看不懂某条证明,可以暂且相信我的推理是对的,跳过去往后看,日后再复习。
第3章为LDA算法推导部分,用严谨的数学推导和清晰的讲解(每个公式都做了清晰的标注)让读者认识该推理方法。
第4章为实现和应用部分,用伪代码方式庖丁解牛,讲解代码实现的精髓,然后结合我多年的工作实践,写了该算法的几个最具实用价值的应用。这些应用方法中有相当一部分是本人工作经验的总结,在任何其他书籍上找不到。
第5章为并行化,在大数据如火如荼的今天,要想大规模运行LDA算法,就要靠并行化技术了,这一章从两个算法的改进形式讲解了该技术的并行化,并且可以放在目前最流行的spark大数据引擎上运行。
第6~8章为LDA的变分EM技术的详细推导和C语言代码实现的一个详尽剖析,这个方法的来龙去脉都在这3章有所体现。
本书是一个指南、指引性质的作品,尚不完善、完美,有些地方可能仍有疏漏,且本人水平有限,如果读者发现纰漏,请及时联系人民邮电出版社修正。希望这部作品日臻完美。
马晨 2016.4.19
飞机和飞鸟形态、结构和原理都不相同,但都能飞翔,人工智能未来也许如此。
LDA算法使用的全部知识的渊源可以追溯到18世纪的欧拉。欧拉(Leonhard Euler ,1707年4月15日—1783年9月18日),瑞士数学家,如图1-1所示。欧拉一生贡献颇丰,1734年,欧拉因解决巴塞尔问题而出名,巴塞尔问题见式(1.1)的值是多少。
图1-1 Euler
(1.1)
这个问题困扰了数学家长达几个世纪的,当时的数学家只知道该级数的值小于2,但不知道精确值,欧拉准确的推导出该式的值等于π^2/6。欧拉的方法聪明而新颖,他创造性地将有限多项式的观察推广到无穷级数,并假设相同的性质对于无穷级数也是成立的:
(1.2)
欧拉最后的发现是令人惊奇的,π这个数字在与圆周率无关的场合中出现了,这足以说明数学与自然存在着某些神秘的联系。虽然以现代数学的眼光来看,欧拉的证明还不严密。但作为第一个(富有创造性的)证明,欧拉的这个证明永远有着其宝贵的价值。欧拉的另一个贡献就是发现了gamma函数。该函数后被广泛应用于概率论,这个函数也是本文的主角之一。
作为算法标题之一的Dirichlet, wiki一下,一个19世纪的人映入了我们的眼帘。Dirichlet(1805—1859),德国数学家,生于现德国 Duren(当时属法国),卒于哥廷根,如图1-2所示。他是解析数论的奠基者,也是现代函数观念的定义者。在本文中该数学家的主要贡献是Dirichlet分布。
图1-2 Peter Gustav Lejeune Dirichlet
但是这还不是故事的全部,说到底19世纪的时候还没有发明计算机,LDA应该不是这哥们发明的,于是继续查找,最后查明英国剑桥大学的David M.Blei(见图1-3)是最初LDA论文的作者。Blei同学借用了Dirichlet Distribution,而创造了Latent Dirichlet Allocation。
Blei以PLSA(LDA之前的另一个概率模型)为基础,加上了贝叶斯先验,从而发明了LDA算法。LDA算法最初的论文使用的是变分EM方法训练(Variational Inference)。该方法较为复杂,而且最后训练出的主题非全局最优分布,而是局部最优分布。后期发明了Collapsed Gibbs Sampling方法,推导和使用都较为简洁。Blei及其LDA算法具体介绍如下:
图1-3 David Blei
Latent Dirichlet Allocation是Blei等人于2003年提出的基于概率模型的主题模型算法。LDA是一种无监督机器学习技术,可以用来识别大规模文档集或语料库中的潜在隐藏的主题信息。该方法假设每个词是由背后的一个潜在隐藏的主题中抽取出来。
对于语料库中的每篇文档,LDA定义了如下生成过程(generative process):
(1)对每一篇文档,从主题分布中抽取一个主题。
(2)从上述被抽到的主题所对应的单词分布中抽取一个单词。
(3)重复上述过程直至遍历文档中的每一个单词。
LDA认为每篇文章是由多个主题混合而成的,而每个主题可以由多个词的概率表征。所以整个程序的输入和输出如表 1-1所示。
表 1-1 LDA算法的输入与输出
算法输入:分词后的文章集(通常为一篇文章一行) 主题数K,超参数α和β |
算法输出:1.每篇文章的各个词被指定(assign)的主题编号:tassign-model.txt 2.每篇文章的主题概率分布θ:theta-model.txt 3.每个主题下的词概率分布φ:phi-model.txt 4.程序中词语word的id映射表:wordmap.txt 5.每个主题下φ概率排序从高到低top n特征词:twords.txt |
如果你想使用LDA算法,建议从Gibbs LDA++代码(http://gibbslda.sourceforge.net/)开始使用。在使用过程中,你就会发现该算法的使用方式还算简单,并且生成的结果文件也很规则,根据手册一看便懂。输入分词后的文件,一个文章一行,输出其中看到每个主题规则文件.twords如下格式所示。
Topic 0th: |
Topic 1th: |
---|---|
食品 0.022937 |
农业 0.022957 |