zoukankan      html  css  js  c++  java
  • 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


    参考文献

  • 相关阅读:
    matplotlib数据可视化之柱形图
    xpath排坑记
    Leetcode 100. 相同的树
    Leetcode 173. 二叉搜索树迭代器
    Leetcode 199. 二叉树的右视图
    Leetcode 102. 二叉树的层次遍历
    Leetcode 96. 不同的二叉搜索树
    Leetcode 700. 二叉搜索树中的搜索
    Leetcode 2. Add Two Numbers
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/downtjs/p/4293183.html
Copyright © 2011-2022 走看看