我正在努力理解概率编程的概念,但读得越多,感觉越困惑。
我目前的理解是,概率编程类似于贝叶斯网络,只是将其翻译成编程语言,用于创建自动推理模型?
我有一些机器学习的背景,我记得一些机器学习模型也会输出概率,然后我又遇到了概率机器学习这个术语…
这两者之间有区别吗?还是它们是相似的?
非常感谢任何能帮助澄清的人。
回答:
我目前的理解是,概率编程类似于贝叶斯网络,只是将其翻译成编程语言,用于创建自动推理模型?
简而言之:这是正确的。概率程序可以被视为与贝叶斯网络等价,但使用的是一种更丰富的语言。作为一个领域,概率编程提出了这样的表示方法,以及利用这些表示的算法,因为有时更丰富的表示会使问题变得更简单。
简而言之(续):还要注意的是,“概率机器学习”是一个比贝叶斯网络(图形模型)更广泛的概念。它指的是任何使用概率的机器学习方法。一些不是贝叶斯网络(图形模型)的概率机器学习的例子包括:概率分类器,如概率决策树或带有softmax最后一层的神经网络(输出类别概率),高斯过程(可以用图形模型来理解,但通常以专门的方式进行),贝叶斯神经网络(学习神经网络权重的分布而不是点值)。
无论如何,为了更多地了解概率编程与贝叶斯网络之间的关系,请继续阅读。
例如,考虑一个概率程序,它模型了一种更可能影响男性的疾病:
N = 1000000;for i = 1:N { male[i] ~ Bernoulli(0.5); disease[i] ~ if male[i] then Bernoulli(0.8) else Bernoulli(0.3)}
这个概率程序相当于以下贝叶斯网络及其相应的条件概率表:
对于像这样高度重复的网络,作者通常使用板表示法来使其描述更加简洁:
然而,板表示法是一种供人类阅读的出版物设备,而不是像编程语言那样的正式语言。正式语言的优势在于它可以被算法自动处理,而不是仅被人类理解并手动操作,就像板表示法那样。此外,对于更复杂的模型,板表示法可能会变得难以理解和维护。最后,编程语言还带来了其他好处,例如原始操作,使得简洁地指定条件概率变得更加容易。
那么,这仅仅是拥有方便的表示方式的问题吗?不,因为更抽象的表示包含了可以用来提高推理性能的高层次信息。
假设我们想计算在N
个人中患病人数的概率分布。一个直接且通用的贝叶斯网络算法将不得不考虑2^N
种disease
变量分配的组合,以计算出答案。
然而,概率程序表示明确指出disease[i]
和male[i]
的条件概率对于所有i
都是相同的。推理算法可以利用这一点来计算disease[i]
的边缘概率,这对于所有i
都是相同的,使用disease[i]
的数量将因此是一个二项分布B(N, P(disease[i]))
,并以此作为所需的答案,其时间复杂度在N
上是常数的。它还能够提供一个对用户来说更易理解和有洞察力的解释。
有人可能会争辩说,这种比较是不公平的,因为一个有知识的用户不会像定义的显式O(N)大小的贝叶斯网络那样提出查询,而是通过利用其简单的结构提前简化问题。然而,用户可能没有足够的知识进行这样的简化,特别是在更复杂的情况下,或者可能没有时间去做,或者可能会犯错误,或者可能事先不知道模型会是什么样,所以她无法像那样手动简化。概率编程提供了这种简化可以自动进行的可能性。
公平地说,目前大多数概率编程工具(如JAGS和Stan)不执行这种更复杂的数学推理(通常称为提升概率推理),而是简单地对等同于概率程序的贝叶斯网络执行马尔可夫链蒙特卡洛(MCMC)采样(但通常不需要提前构建整个网络,这也是另一种可能的收益)。无论如何,这种便利已经足以证明它们的使用是合理的。