1. 概率编程与贝叶斯推断导论

大家好,欢迎来到这门课。今天咱们聊聊概率编程和贝叶斯推断的入门知识。说实话,我第一次接触这个概念时,也觉得有点抽象。但后来在实际项目中用起来,才发现这东西真能解决不少棘手问题。

什么是概率编程?

概率编程,说白了就是把概率模型和编程语言结合起来。你不需要手动推导复杂的数学公式,而是用代码来描述数据生成的过程。然后让计算机帮你做推断。

我习惯这么理解:传统编程是「给定输入,计算输出」。概率编程则是「给定数据和模型,推断未知参数」。举个例子,你想预测明天会不会下雨。传统方法可能写个 if-else 判断。概率编程呢?你会建立一个模型,把历史气温、湿度、气压都放进去,然后得到「明天下雨概率 70%」这样的结果。

核心思想:概率编程 = 概率模型 + 推断算法 + 编程语言封装

TensorFlow Probability(TFP)就是 Google 推出的概率编程工具。它基于 TensorFlow,能利用 GPU 加速,还能和深度学习模型无缝衔接。我个人觉得,这是目前最实用的概率编程框架之一。

贝叶斯定理回顾

贝叶斯定理是整个概率编程的基石。公式很简单:

P(θ|D) = P(D|θ) × P(θ) / P(D)

其中:

  • P(θ|D) — 后验概率。看到数据后,对参数的信念
  • P(D|θ) — 似然。给定参数,数据出现的可能性
  • P(θ) — 先验概率。看到数据前,对参数的初始信念
  • P(D) — 证据。数据的边缘概率,通常是个归一化常数

嗯,这里要注意。很多初学者会纠结于 P(D) 的计算。其实在实际应用中,我们往往不需要精确计算它。MCMC 和变分推断这些方法,就是用来绕过这个难题的。

我在项目中遇到过这样一个场景:用户点击率预估。我们用贝叶斯方法,把历史点击率作为先验,然后根据新数据不断更新。效果比传统方法稳定不少。

频率学派 vs 贝叶斯学派

这两个学派争论了上百年。我简单说说它们的区别:

对比维度 频率学派 贝叶斯学派
参数性质 固定但未知的常数 随机变量,有分布
概率含义 长期频率 信念程度
推断方式 点估计 + 置信区间 后验分布
先验信息 不使用 必须指定先验
小样本表现 不稳定 相对稳健

你想想看,频率学派说「置信区间有 95% 的概率包含真实值」。这句话其实很绕。贝叶斯学派直接说「参数有 95% 的概率落在某个区间」。哪个更直观?我个人觉得后者更容易理解。

我的建议:别纠结谁对谁错。实际工作中,两种方法各有适用场景。数据量大、计算资源有限时,频率方法更快。数据少、需要融入先验知识时,贝叶斯方法更合适。

TensorFlow Probability 生态介绍

TFP 的生态结构,我习惯把它分成三层:

  1. 底层:概率分布库(Normal、Bernoulli、Mixture 等)
  2. 中层:推断算法(MCMC、VI、HMC)
  3. 上层:概率层(与 Keras 结合,构建贝叶斯神经网络)

来看个最简单的例子。用 TFP 定义一个正态分布:

import tensorflow as tf
import tensorflow_probability as tfp

# 定义一个均值为0,标准差为1的正态分布
normal_dist = tfp.distributions.Normal(loc=0., scale=1.)

# 采样
samples = normal_dist.sample(5)
print(samples)

# 计算对数概率
log_prob = normal_dist.log_prob(0.5)
print(log_prob)

运行这段代码,你会得到 5 个随机样本,以及 0.5 这个点的对数概率密度。看起来很简单对吧?但这就是概率编程的起点。

避坑指南:我曾经在项目里直接用 tfp.distributions.Normal 做采样,结果发现速度很慢。后来才意识到,应该用 tfp.distributions.Sample 来批量采样。嗯,这个细节后面会详细讲。

TFP 还有一个很实用的功能:概率层。你可以把贝叶斯层直接嵌入到 Keras 模型中。比如:

import tensorflow as tf
import tensorflow_probability as tfp

model = tf.keras.Sequential([
    tfp.layers.DenseFlipout(64, activation='relu'),
    tfp.layers.DenseFlipout(10, activation='softmax')
])

这样构建的神经网络,每个权重都是一个分布,而不是固定值。预测时能给出不确定性估计。这在医疗诊断、金融风控等领域特别有用。

最后说说 TFP 的安装。建议用 pip:

pip install tensorflow-probability

注意版本匹配。TFP 0.12 对应 TF 2.4,TFP 0.13 对应 TF 2.5。我建议直接用最新稳定版,省得踩坑。

总结一下:概率编程让你用代码描述不确定性。贝叶斯定理是核心工具。TFP 提供了从分布到推断的完整生态。下一章,我们会深入概率分布的具体用法。