LDA工程实践之算法篇之(一)算法实现正确性验证(转)
研究生二年级实习(2010年5月)开始,一直跟着王益(yiwang)和靳志辉(rickjin)学习LDA,包括对算法的理解、并行化和应用等等。毕业后进入了腾讯公司,也一直在从事相关工作,后边还在yiwang带领下,与孙振龙、严浩等一起实现了一套大规模并行的LDA训练系统——Peacock。受rick影响,决定把自己对LDA工程实践方面的一些理解整理出来,分享给大家,其中可能有一些疏漏和错误,还请批评指正。
Rickjin在《LDA数学八卦》[1]一文中已经对LDA的数学模型以及基本算法介绍得比较充分了,但是在工程实践上,我们还是有一些需要注意的问题,比如:
- 怎样验证算法实现的正确性?
- 怎样加速Gibbs sampling?
- 在线推断(inference)时,需要注意些什么问题?
- 超参数对模型的影响以及怎样做超参数优化?
本文将涉及以上内容,不包括: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

参考文献
- [1] 靳志辉. LDA数学八卦. http://cos.name/2013/03/lda-math-lda-text-modeling.
- [2] Gregor Heinrich. Parameter estimation for text analysis. Technical Report, 2009.
- [3] Generative model. http://en.wikipedia.org/wiki/Generative_model.
- [4] Thomas L. Griffiths, and Mark Steyvers. Finding scientific topics. In PNAS ’2004.
- [5] http://www.gnu.org/software/gsl/ … -Distribution.html.
- [6] http://docs.scipy.org/doc/numpy/ … dom.dirichlet.html.
- [7] Perplexity. http://en.wikipedia.org/wiki/Perplexity.
- [8] David M. Blei, Andrew Y. Ng, and Michael I. Jordan. Latent Dirichlet Allocation. In JMLR ’2003.
LDA工程实践之算法篇之(一)算法实现正确性验证(转)的更多相关文章
- 【算法篇】Bitmap 算法
首先,什么是Bitmap算法(位图算法)呢? 一:定义: Bit map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素.使用Bit为用来存储数据的单位, 可以大大节省存储空间. ...
- panguan(判官):一个自研的任务执行引擎的工程实践
来某厂接近半年了,几乎没写过C++代码,说实话还真的有点手生.最近刚好有一个需求,然而我感觉我也没有办法用C++以外的语言去实现它.于是还是花了几天时间用C++完成编码,这是一个简单的任务执行引擎,它 ...
- webpack 从入门到工程实践
from:https://www.jianshu.com/p/9349c30a6b3e?utm_campaign=maleskine&utm_content=note&utm_medi ...
- 深度学习word2vec笔记之算法篇
深度学习word2vec笔记之算法篇 声明: 本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...
- 我的TDD实践---SVN架设篇
我的TDD实践---SVN架设篇 “我的TDD实践”系列之SVN架设 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭 ...
- 实现求解线性方程(矩阵、高斯消去法)------c++程序设计原理与实践(进阶篇)
步骤: 其中A是一个n*n的系数方阵 向量x和b分别是未知数和常量向量: 这个系统可能有0个.1个或者无穷多个解,这取决于系数矩阵A和向量b.求解线性系统的方法有很多,这里使用一种经典的方法——高斯消 ...
- 编码原则实例------c++程序设计原理与实践(进阶篇)
编码原则: 一般原则 预处理原则 命名和布局原则 类原则 函数和表达式原则 硬实时原则 关键系统原则 (硬实时原则.关键系统原则仅用于硬实时和关键系统程序设计) (严格原则都用一个大写字母R及其编号标 ...
- Spring实践系列-入门篇(一)
本文主要介绍了在本地搭建并运行一个Spring应用,演示了Spring依赖注入的特性 1 环境搭建 1.1 Maven依赖 目前只用到依赖注入的功能,故以下三个包已满足使用. <properti ...
- Appium+python自动化(四十二)-Appium自动化测试框架综合实践- 寿终正寝完结篇(超详解)
1.简介 按照上一篇的计划,今天给小伙伴们分享执行测试用例,生成测试报告,以及自动化平台.今天这篇分享讲解完.Appium自动化测试框架就要告一段落了. 2.执行测试用例&报告生成 测试报告, ...
随机推荐
- 为table元素添加操作日志
1.为所有的元素添加函数onchange() <input id="status" value="${status}" onchange="ch ...
- hover用法实例
//hover,鼠标移入移出的另一种用法 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &qu ...
- vue.js路由参数简单实例讲解------简单易懂
vue中,我们构建单页面应用时候,一定必不可少用到vue-router vue-router 就是我们的路由,这个由vue官方提供的插件 首先在我们项目中安装vue-router路由依赖 第一种,我们 ...
- app端性能测试笔记
IOS不清楚,我就说说android平台吧 1.按不同维度 APP级性能.代码级性能 app这一级 GT啊 emmage都可以检测 2.代码级性能的话 有可以分几块 函数性能UI ...
- 前端面试angular 常问问题总结
1. angular的数据绑定采用什么机制?详述原理 angularjs的双向数据绑定,采用脏检查(dirty-checking)机制.ng只有在指定事件触发后,才进入 $digest cycle : ...
- iOS 环信集成单聊界面,出现消息重复问题
解决办法很简单,数据重复就是EaseMessageViewController和ChatViewController重复调用了这个吧?//通过会话管理者获取收发消息 [self tableViewDi ...
- ehcache memcache redis 三大缓存对比
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt268 最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今 ...
- Oracle数据库只读事务和无事务的区别
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt382 Oracle默认情况下(没有事务) 保证了SQL语句级别的读一致性,即 ...
- Java缓存类的实际应用场景
不要着迷于技术,应把注意力放到问题上. 一个普通的后台管理系统,一定会有参数配置.参数配置数据表和其他的数据表是不同的,它的操作基本都是查的操作.参数配置的这些数据信息是贯穿在整个项目中,那么把他们放 ...
- 微信小程序开发心得--动画机制
微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受.首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司认 ...