作者:黄明明
MCMC(Markov Chain Monte Carlo)算法全称是 马尔科夫 蒙特卡洛 ,是一组用马氏链从 随机分布 取样的 算法 。Gibbs抽样是现实中最简单应用最广泛的MCMC方法,具体算法为:
应用广泛的MCMC算法的具体应用是LDA(Latent Dirichlet Allocation)主题模型算法,使用在文本分类中。
MCMC算法测试困难的原因包括:
(1)它是一种随机算法,没有确定的输出;
(2)算法表现的差可能受到各种各样bug之外的原因的影响,比如,差的模型假设或者是不同模型之间的混合较差;
(3)评判算法的一个重要指标是在数据集上的准确率,当准确率很高的时候,也不能证明算法没有bug;
我们这里讨论的背景是,对于算法的研究者来说,不仅仅写出的算法要有很好的预测能力,而且能够掌握算法内部的整个工作的过程,不容忍任何bug。
这里提到单元测试,就是指从函数级别测试功能,与非算法类的模块的单元测试的要求相同。算法的实现必须要模块话,具有可测性。通常在第一个版本的时候,设计和实现满足可测性是最重要的,代价也是最小的。
MCMC算法虽然具有随机性,但是我们可以抓住算法的中不变的因素,在MCMC中,
是满足 = 这个等式的(这是大学中学习的概率中的内容)。因为既然随机而无法求的绝对结果,但是我们可以抓住随机抽取的数据之前的比例关系。那么我们就解决随机抽取无法测试的难题。
这里采用了Geweke test这种测试思想,概括来说就是通过趋势比较,思路为:
在随机采样中,从联合概率中采样有过程有两种,虽然方法不同,但是这两种采样产出的样本序列满足相同的分布。那么我们就抓住分布趋势上相同来测试。
例如下图:第一幅图中,两种采样的趋势一致,那么可以认为实现过程没有bug;第二幅图,两种采样的趋势明显不同,实现过程必然有bug;对于第三幅图,就是不太确定的情况,这时候我们就不能通过这个case判定实现是否有bug。
这篇paper给我们的启示就是,抓住测试中的恒等不变因素来判断,在单元测试中,就是抓住MCMC算法原理,得到的一个通过相对比值来代替绝对值;在模块测试中,通过趋势来验证实现,这种思想和之前提到的蜕变测试思路相似,我们在测试中可以拓展蜕变测试的方法。