标签:
研究生二年级实习(2010年5月)开始,一直跟着王益(yiwang)和靳志辉(rickjin)学习LDA,包括对算法的理解、并行化和应用等等。毕业后进入了腾讯公司,也一直在从事相关工作,后边还在yiwang带领下,与孙振龙、严浩等一起实现了一套大规模并行的LDA训练系统——Peacock。受rick影响,决定把自己对LDA工程实践方面的一些理解整理出来,分享给大家,其中可能有一些疏漏和错误,还请批评指正。
Rickjin在《LDA数学八卦》[1]一文中已经对LDA的数学模型以及基本算法介绍得比较充分了,但是在工程实践上,我们还是有一些需要注意的问题,比如:
本文将涉及以上内容,不包括:LDA并行化和应用,后续会在文章《LDA工程实践之架构篇》和《LDA工程实践之应用篇》中进行介绍。
为了方便大家理解,本文所有数学符号和 [2] 保持一致,具体见表 1。
Table 1: Symbols
1 算法实现正确性验证
在实现机器学习算法的时候,由于数值算法特有的收敛性问题,让这项本来相对简单的工作增加了难度。这其中的典型是多层次神经网络的优化算法——反向传播(Back Propagation,BP)算法,由于神经网络的强大表述能力,即使实现有误,在简单数据实验上,我们可能也发现不了问题。LDA算法的实现较BP简单,工作中我们常采用如下几个方法进行算法正确性的先期验证。
1.1 Toy data实验
Figure 1: KMeans toy data
在实现算法之前,toy data的准备必不可少。Toy data需要尽量简单——纬度低、数据量少,能表述清楚问题即可,这样方便我们实现算法时进行单元测试和调试。比如做KMeans聚类,可以采用2D高斯混合模型生成toy data(见图1,类别数为3)。LDA实现过程中,我们构造的toy data类似表 2(假设模型主题数 K=2),此时模型训练过程中的每一个迭代以及最终模型输出都是可预测的(表 2 数据收敛后,Doc1-3的词赋予的主题应该都是1,Doc4-6的词赋予的主题应该都是2,或者二者主题互换)。
Table 1: LDA toy data
随机算法在开发调试过程中,稳定不变的随机数序列是非常重要的,这样有利于定位问题。获取稳定不变的随机数非常简单,只需要我们额外提供一个伪随机数种子的命令行参数。
1.2 合成实验
算法包最终实现,toy data实验符合预期,此时如果我们想进一步验证LDA算法的效果呢?考虑到LDA是一种生成模型[3],Griffiths等人[4]在论文中采用合成实验来演示模型的效果,当然,这也可以作为算法正确性的验证。
Figure 2: Griffiths Ground truth
Figure 3: Griffiths Synthesis Experiment [4]
Figure 4: Ground truth
Figure 5: Estimated
合成实验过程中需要用到Dirichlet采样,一般的标准库中没有提供:对c/c++来说,gsl [5] 是不错的选择;对python来说,numpy [6] 有提供实现。
具体到LDA模型,Perplexity计算公式如Eq. 6。训练过程中,计算Perplexity严谨的做法应该使用当前迭代获得的模型在线Inference测试集文档,得到文档的的主题分布后代入Eq. 6,在第三章我们将看到,在线Inference新文档的主题分布也满足
Eq. 3。当然,工程上为了节省计算资源,我们通常就在训练集上计算当前迭代的Perplexity。
LDA模型训练过程中,随着迭代的进行,模型的Perplexity曲线会逐渐收敛。因此,我们通常会根据训练过程中模型的Perplexity曲线是否收敛来判定模型是否收敛。Perplexity曲线收敛性也从侧面可以证明算法实现的正确性。图 6 给出了一次模型训练过程的LogLikelihood和Perplexity曲线(主题数 K=10,000,迭代130左右的曲线突变将在第四章给出解释)。
Figure 6: LogLikelihood and perplexity curve
参考文献
标签:
原文地址:http://www.cnblogs.com/downtjs/p/4293183.html