2.8 随机过程与概率图模型
前面几节处理的对象是有限个随机变量。2.7 节讨论的极限定理研究一列独立同分布随机变量的累积行为:大数定律说明样本均值依概率收敛到期望,中心极限定理说明标准化和依分布收敛到标准正态分布。这些结论都以指标之间相互独立为前提,样本之间不存在时序或结构上的依赖。实际数据很少满足这一点:今天的股价与昨天的收盘价相关,句子中的每个词依赖它前面的词,社交网络中一个用户的活跃度受其好友的影响。这些对象由一列或一组相互依赖的随机变量描述,需要一套新的语言。
随机过程把随机变量按某个指标集排列,用联合分布刻画指标之间的依赖结构。指标集可以表示时间,也可以表示空间位置或图上的节点。依赖结构一旦固定下来,原本需要逐一写出全部联合分布的问题,就转化为少数几个参数或图结构的问题。本节先给出随机过程的定义与基本分类,再依次讨论状态离散的马尔可夫链、隐马尔可夫模型与泊松过程,取值连续的布朗运动与高斯过程,最后把变量之间的依赖关系用图表示,引入概率图模型与因果图。
这一章的内容是统计推断与序列建模的共同基础。马尔可夫链是 MCMC 采样的引擎,隐马尔可夫模型是序列标注与语音识别的经典工具,高斯过程给出贝叶斯非参数的回归框架,概率图模型统一了贝叶斯网络与马尔可夫随机场的因子分解。读懂这些模型,才能在后续章节中处理带结构的高维数据。
2.8.1 随机过程的定义与分类
随机变量族与指标集
随机过程(stochastic process)是定义在概率空间
指标集
| 指标集 | 状态空间 | 典型过程 |
|---|---|---|
| 离散 | 可数 | 随机游走、马尔可夫链 |
| 离散 | 连续 | 时间序列、语音信号 |
| 连续 | 可数 | 泊松过程、计数过程 |
| 连续 | 连续 | 布朗运动、高斯过程 |
有限维分布族
随机过程在数学上由它的全部有限维分布决定。对任意
称为过程的一个
反过来,给定一族满足相容性条件的有限维分布,可以构造出概率空间与随机过程以其为有限维分布。这一结论称为柯尔莫哥洛夫扩张定理(Kolmogorov extension theorem)。相容性要求低维分布是高维分布取边缘的结果,同时分布对时刻的排序保持不变。扩张定理把描述一个过程的问题转化为描述一族相容的联合分布,也为连续时间过程的存在性提供了保证。
矩函数
完整描述有限维分布族往往不现实,实践中常用前两阶矩来概括过程的结构。均值函数定义为
它刻画不同时刻取值之间的线性相关程度。当
典型例子
随机游走(random walk)是最简单的依赖序列。设
计数过程(counting process)记录到时刻
信号序列是取值连续的时间序列,如语音波形、气温序列、股票价格序列。这类过程的状态空间为
有限维分布族的作用
定义随机过程时容易只关注单个时刻的分布,忽略不同时刻之间的联合结构。判断两个过程是否相同、过程是否平稳、增量是否独立,都要用到有限维分布。扩张定理说明有限维分布族与过程本身等价,这为后续所有基于联合分布的定义提供了依据。实际建模时很少有人写出全部有限维分布,通常只指定均值、协方差或转移概率,由它们隐含地确定分布族。
import numpy as np
rng = np.random.default_rng(0)
# 简单对称随机游走的一条样本轨道
n_steps = 500
steps = rng.choice([-1, 1], size=n_steps)
path = np.concatenate([[0], np.cumsum(steps)])
print(f"轨道长度 = {path.shape[0]}") # 501
# 用大量轨道验证 Var(S_n) = n
n_paths = 20000
final = rng.choice([-1, 1], size=(n_paths, n_steps)).sum(axis=1)
print(f"模拟方差 = {final.var():.2f},理论值 n = {n_steps}")
print(f"模拟标准差 = {final.std():.2f},理论值 sqrt(n) = {np.sqrt(n_steps):.2f}")
# 模拟方差 = 498.93,理论值 n = 500
# 模拟标准差 = 22.34,理论值 sqrt(n) = 22.362.8.2 马尔可夫链
马尔可夫性质
马尔可夫链(Markov chain)是状态空间可数、指标集离散的随机过程,它的依赖结构由一条简洁的假设规定。设
则称该过程具有马尔可夫性质(Markov property),也称无后效性。条件的含义是:给定当前状态后,未来的分布与更早的历史无关,全部历史信息都被压缩进了当前状态。在马尔可夫性质下,条件概率
转移矩阵与初始分布
把全部转移概率排成矩阵
步转移与查普曼-科尔莫戈罗夫方程
多步转移概率满足查普曼-科尔莫戈罗夫方程(Chapman-Kolmogorov equation):对任意
方程的含义是把
状态分类
链的长期行为取决于各个状态的返回性质。对状态
状态的周期(period)定义为使
平稳分布与细致平衡
分布
则称
一个更强的条件是细致平衡(detailed balance):对任意
满足细致平衡的链称为可逆链。把细致平衡两边对
遍历性与极限分布
当链不可约、非周期且正常返时,存在唯一的平稳分布
这一性质称为遍历性(ergodicity),此时的平稳分布也称为极限分布。遍历性的含义是长期分布与初始条件无关,链会忘记起点。当链是周期链时,
这一定理是 MCMC 方法的理论依据,它允许用一条长轨道的时间平均来近似目标分布的期望。
平稳分布与极限分布的区别
平稳分布只要求初始分布与转移后分布相同,周期链也可以有平稳分布。极限分布要求
应用接口:PageRank 与 MCMC
PageRank 把网页排序问题转化为马尔可夫链的平稳分布问题。把网页看作状态,超链接看作转移,转移概率按出链数均分。若某网页没有出链,规定它等概率跳到任意网页;为避免链被少数网页的链接结构困住,再以概率
修正后的链不可约、非周期,平稳分布存在且唯一,第
马尔可夫链蒙特卡洛(Markov chain Monte Carlo,MCMC)用马尔可夫链生成目标分布的样本。目标是构造一条以目标分布
决定是否接受,其中
import numpy as np
# 转移矩阵:三状态天气模型(0 晴,1 阴,2 雨)
P = np.array([[0.7, 0.2, 0.1],
[0.3, 0.4, 0.3],
[0.2, 0.3, 0.5]])
# 幂迭代求解平稳分布:pi_{k+1} = pi_k P
pi = np.array([1 / 3, 1 / 3, 1 / 3])
for _ in range(200):
pi = pi @ P
print(f"平稳分布(幂迭代)= {np.round(pi, 6)}")
# [0.432432 0.270270 0.297297]
# 交叉验证:P^T 对应特征值 1 的左特征向量
vals, vecs = np.linalg.eig(P.T)
idx = np.argmin(np.abs(vals - 1.0))
pi_eig = np.real(vecs[:, idx])
pi_eig = pi_eig / pi_eig.sum()
print(f"平稳分布(特征向量)= {np.round(pi_eig, 6)}")
# 模拟验证:从状态 0 出发跑长轨道,统计各状态频率
rng = np.random.default_rng(7)
state = 0
counts = np.zeros(3)
n_steps = 200_000
for _ in range(n_steps):
state = rng.choice(3, p=P[state])
counts[state] += 1
print(f"模拟频率 = {np.round(counts / n_steps, 4)}")
# [0.4325 0.2709 0.2966],与平稳分布一致2.8.3 隐马尔可夫模型
状态与观测的双层结构
隐马尔可夫模型(hidden Markov model,HMM)把观测序列背后的状态序列建模为马尔可夫链,观测由状态按发射分布生成。模型包含两部分:状态序列
双层结构对应许多实际场景。在语音识别中,隐状态表示音素,观测是声学特征;在序列标注中,隐状态表示词性,观测是词;在手势识别中,隐状态表示动作类型,观测是传感器读数。要使用模型,需要解决三个问题:给定参数与观测序列,计算该序列出现的概率(评估问题);给定参数与观测序列,推断最可能的状态序列(解码问题);给定观测序列,估计参数(学习问题)。前向算法、维特比算法与鲍姆-韦尔奇算法分别解决这三个问题。
前向算法
前向算法(forward algorithm)计算观测序列的概率
它表示到时刻
递推把时刻
直接枚举状态序列需要
后向算法
后向变量定义为
它表示在时刻
后向算法从时刻
类似的乘积
维特比算法
维特比算法(Viterbi algorithm)求最可能的状态序列。定义
它表示以状态
同时记录使最大值达到的
鲍姆-韦尔奇算法
参数未知时用鲍姆-韦尔奇算法(Baum-Welch algorithm)估计
更新公式的含义是把当前后验看成隐状态的软计数,用这些计数估计转移频率与发射频率。可以证明每次迭代后观测序列的似然不减,算法收敛到似然的局部极大值。初始参数的选取影响收敛结果,实践中常多次随机初始化后取似然最大的一组。
在序列标注与语音识别中的位置
HMM 在 20 世纪后半叶成为语音识别与序列标注的标准模型。声学模型把音素作为隐状态,把每帧声学特征作为观测,用前向算法评分,用维特比算法解码出音素序列,再接语言模型得到词序列。在自然语言处理中,HMM 用于词性标注与命名实体识别,隐状态对应词性标签,观测对应词本身。
HMM 的局限来自两个假设:观测在给定状态下相互独立,且状态之间只存在一阶依赖。观测之间的长距离相关与重叠特征难以用发射分布刻画。条件随机场放宽了观测的独立性假设,改用全局归一化直接建模
import numpy as np
# 两状态 HMM:状态 0 健康、状态 1 患病;观测取 3 个符号
A = np.array([[0.7, 0.3],
[0.4, 0.6]]) # 转移矩阵
B = np.array([[0.9, 0.05, 0.05], # 发射矩阵 B[i, k] = P(观测 k | 状态 i)
[0.2, 0.30, 0.50]])
pi = np.array([0.6, 0.4]) # 初始分布
obs = [0, 1, 2, 0] # 观测序列
def forward(A, B, pi, obs):
T = len(obs)
n = len(pi)
alpha = np.zeros((T, n))
alpha[0] = pi * B[:, obs[0]]
for t in range(1, T):
alpha[t] = (alpha[t - 1] @ A) * B[:, obs[t]]
return alpha
alpha = forward(A, B, pi, obs)
print(np.round(alpha, 6))
print(f"观测序列的概率 P(O) = {alpha[-1].sum():.6f}")
# P(O) = 0.0119122.8.4 泊松过程
齐次泊松过程的定义
泊松过程(Poisson process)是计数过程中最基本的一族。强度为
三条性质合起来刻画了事件在时间上完全随机地发生这一情形:任意小区的发生概率与区间长度成正比,两个事件在同一瞬间发生的概率为零。
到达间隔与指数分布
令
因此到达间隔
反过来,若一列独立同分布的指数间隔,其到达时刻构成齐次泊松过程。同一过程的两种描述在建模时各有方便之处:关心事件计数时用泊松分布,关心等待时间时用指数分布。
非齐次泊松过程
实际中事件强度常随时间变化,例如打车订单在夜间下降、白天上升。非齐次泊松过程(non-homogeneous Poisson process)用强度函数
事件在
复合泊松过程与更新过程
复合泊松过程(compound Poisson process)在每次事件发生时附加一个随机标记。若事件到达构成强度为
构成复合泊松过程。保险理赔总额、网络流量的累积字节数、某店铺单日订单总额都可以这样建模。由条件期望可以算出
更新过程(renewal process)把到达间隔放宽为独立同分布的任意非负随机变量,不要求指数分布。更新函数
其中
泊松过程与二项计数不能混用
在固定长度区间上统计事件数时,泊松模型与二项模型容易混淆。泊松模型描述的事件发生在连续时间上,事件数无上界,均值为
import numpy as np
rng = np.random.default_rng(1)
# 齐次泊松过程:强度 lambda = 2,观察区间 [0, 10]
lam, T = 2.0, 10.0
# 方法一:按指数间隔累加到达时刻
arrivals = []
t = 0.0
while True:
t += rng.exponential(1 / lam)
if t >= T:
break
arrivals.append(t)
arrivals = np.array(arrivals)
print(f"区间内到达次数 N(10) = {len(arrivals)}") # 理论期望 20
# 方法二:先抽总数 N(T) ~ Poisson(lambda * T),再取均匀到达时刻
n = rng.poisson(lam * T)
times = np.sort(rng.uniform(0, T, size=n))
print(f"方法二的到达次数 = {n}")
# 验证到达间隔均值为 1/lambda
n_rep = 5000
mean_gaps = [rng.exponential(1 / lam, size=50).mean() for _ in range(n_rep)]
print(f"平均间隔的模拟均值 = {np.mean(mean_gaps):.4f},理论值 = {1 / lam:.4f}")
# 0.5001 附近
# 验证 N(t) ~ Poisson(lambda t):t = 3 时均值与方差均应为 6
counts = rng.poisson(lam * 3, size=100000)
print(f"N(3) 的模拟均值 = {counts.mean():.4f},模拟方差 = {counts.var():.4f},理论值均为 6")2.8.5 布朗运动与相关过程
布朗运动的定义与性质
布朗运动(Brownian motion)
布朗运动是随机游走在连续极限下的结果。把简单对称随机游走的时间与空间同时缩放,步长取
布朗运动的轨道具有若干反直觉的性质。轨道处处连续,却在每一点都不可微,因此不能用普通微积分处理;轨道的二次变差在极限下等于时间长度,
几何布朗运动
几何布朗运动(geometric Brownian motion)由随机微分方程
定义,其中
因此
分数布朗运动与长记忆性
分数布朗运动(fractional Brownian motion)
2.8.6 高斯过程
定义
高斯过程(Gaussian process)是一族随机变量
任意有限维边缘为正态这一要求把无穷维对象压缩为两个普通函数,这是高斯过程便于处理的根源。协方差函数
核函数与协方差函数
协方差函数也称核函数(kernel function),它编码函数的先验性质,如光滑程度与周期结构。常用的核包括:
平方指数核(squared exponential kernel)
马特恩核(Matérn kernel)通过参数
周期核(periodic kernel)刻画重复结构,适合建模昼夜节律或季节效应。把多个核相加或相乘还可以组合出趋势与噪声叠加的复合结构。
高斯过程回归
给定训练数据
其中
均值是训练值的线性组合,方差随测试点远离训练点而增大,在无数据处回到先验方差。这一公式把回归问题写成了闭式解,代价是求
高斯过程分类
分类任务中观测是离散标签,高斯过程不能直接给出标签分布。做法是对每个类别引入一个潜在函数
与贝叶斯非参数的联系
高斯过程是贝叶斯非参数(Bayesian nonparametrics)的典型例子。参数模型的参数个数固定,高斯过程把先验放在函数空间上,模型的有效复杂度随数据量自动增长。它与再生核希尔伯特空间(reproducing kernel Hilbert space)有紧密联系:给定核
import numpy as np
rng = np.random.default_rng(3)
def rbf(a, b, length=1.0, sigma=1.0):
"""平方指数核"""
d = a[:, None] - b[None, :]
return sigma**2 * np.exp(-0.5 * (d / length) ** 2)
# 训练数据
X = np.array([-3.0, -1.5, 0.0, 1.5, 3.0])
y = np.sin(X) + 0.1 * rng.standard_normal(len(X))
noise = 0.01
K = rbf(X, X) + noise * np.eye(len(X))
Ks = np.linalg.solve(K, y)
# 测试点上的后验均值与方差
Xstar = np.linspace(-4, 4, 9)
Kss = rbf(Xstar, X)
mu = Kss @ Ks
cov = rbf(Xstar, Xstar) - Kss @ np.linalg.solve(K, Kss.T)
print(f"后验均值 = {np.round(mu, 3)}")
print(f"后验标准差 = {np.round(np.sqrt(np.diag(cov)), 3)}")
# 靠近训练点处标准差小,远离处趋向先验标准差 1.02.8.7 鞅与可选停止定理
鞅的定义与例子
鞅(martingale)是一类增量均值为零的过程。设
则称
简单对称随机游走是鞅:
可选停止定理
可选停止定理(optional stopping theorem)把鞅的等期望性质从固定时刻推广到随机时刻。设
定理的条件不能省略。赌徒停止策略的例子说明违背条件时结论失效:在简单对称随机游走中,采用首次达到
2.8.8 平稳过程与谱分析
严平稳与宽平稳
严平稳(strictly stationary)要求过程的有限维分布在时间平移下不变:对任意
宽平稳(weakly stationary)只要求前两阶矩满足条件:均值函数为常数
各态历经性
各态历经性(ergodicity)指时间平均等于空间平均。对宽平稳过程,若均值各态历经成立,则单条长轨道的时间平均依概率收敛到总体均值:
各态历经性使我们可以从一次观测推知总体矩,这是时间序列分析的立足点。均值各态历经的一个充分条件是自协方差函数可积,
自相关与偏自相关函数
宽平稳过程的自协方差函数
它给出相隔
偏自相关函数(partial autocorrelation function,PACF)度量在去掉中间变量影响后
功率谱密度
功率谱密度(power spectral density)把过程按频率分解。由维纳-辛钦定理(Wiener-Khinchin theorem),宽平稳过程的自协方差与谱密度构成傅里叶变换对:
谱密度
白噪声与有色噪声
白噪声(white noise)是均值为零、方差恒定且不同时刻不相关的序列,
2.8.9 概率图模型
贝叶斯网络
概率图模型(probabilistic graphical model)用图结构编码随机变量之间的条件独立关系。贝叶斯网络(Bayesian network)是有向无环图(directed acyclic graph,DAG),节点对应随机变量,有向边表示直接依赖。给定父节点后,每个节点与其非后代节点条件独立,这一性质使联合分布分解为
其中
马尔可夫随机场与条件随机场
马尔可夫随机场(Markov random field,MRF)用无向图表示依赖关系,适合描述对称的相互作用,例如图像中相邻像素的相似性。无向图不能像有向图那样为每个节点指定父节点,因子分解改用团(clique,两两相连的节点集合)上的势函数(potential function)
归一化常数
条件随机场(conditional random field,CRF)是判别式模型,直接建模条件分布
势函数依赖观测
因子图与信念传播
因子图(factor graph)是二分图,同时包含变量节点与因子节点,因子节点连到它涉及的变量。因子图统一了有向图与无向图的表示,任何概率图模型都可以转化为因子图。在因子图上,信念传播(belief propagation)算法通过节点之间传递消息来近似计算边缘分布。
消息从变量节点传向因子节点或反向,每条消息是一个关于某个变量的函数。变量节点对所有入消息取乘积并归一化,因子节点对涉及的其他变量求和(或积分)后传给目标变量。对于树结构的因子图,信念传播给出精确的边缘分布;对于含环的图,迭代传播给出近似结果,称为循环信念传播。和-积算法计算边缘分布,最大-积算法计算最大后验配置,维特比算法是最大-积算法在链结构上的特例。
变分消息传递
图结构复杂时,精确推断的计算量无法承受。变分消息传递(variational message passing)用变分推断近似后验。基本思路是在一个受限制的分布族(例如各变量相互独立的平均场族)中寻找与真实后验最接近的分布,以最小化库尔贝克-莱布勒散度为准则。更新规则表现为节点之间传递消息,形式与信念传播相似,含义是把信念传播中的求和替换为对近似后验的期望。变分方法把推断问题转化为优化问题,通常比精确推断快,代价是引入近似误差。变分推断在 2.12 节与变分自编码器中都会用到。
图模型是共同语言
概率图模型的价值在于把不同模型的共同结构抽象出来。HMM 是链结构的贝叶斯网络,卡尔曼滤波是线性高斯状态空间模型,条件随机场是判别式的无向链,主题模型是含隐变量的有向图。一旦用图的语言表达,推断算法、参数估计算法与近似方法就可以在这些模型之间迁移。掌握因子图与消息传递,等于掌握了一类推断问题的通用解法。
2.8.10 因果图与结构因果模型简介
有向无环图与因果结构
结构因果模型(structural causal model,SCM)用一组结构方程描述变量之间的因果关系。每个变量由它的直接原因与一个独立的外生噪声决定:
其中
干预与 do 算子的直观含义
观测与干预是两类不同的操作。观测
do 算子把干预形式化。在因果图中,
公式称为调整公式,它是观察数据推断因果效应的桥梁。随机对照试验通过随机化切断混杂变量的影响,相当于直接执行
因果推断的完整内容,包括后门准则、前门准则、工具变量与反事实推理,将在 2.14 节展开。本节的作用是说明因果图与概率图模型共享同一套图语言:节点、边、条件独立、因子分解与消息传递都可以迁移到因果结构的分析中。贝叶斯网络刻画变量之间的依赖与独立关系,因果图在此基础上增加方向与干预的语义,两者共同构成后续因果推断与贝叶斯建模的语言基础。
2.8.11 本节小结
从概率分布到结构化的随机过程
本节把随机变量的视角从有限维扩展到指标集上的族。随机过程由有限维分布族确定,均值与自协方差刻画其二阶结构。马尔可夫链用无后效性把依赖压缩为转移矩阵,
下一节转向统计推断。前面的内容都在给定分布或过程的条件下讨论性质,而实际建模时分布本身往往未知,需要从观测数据推断。2.9 节给出统计推断的基本设定,讨论抽样分布、估计量的评价标准、充分性、Fisher 信息与 Cramér-Rao 下界,以及刀切法与自助法这类重抽样工具,为点估计与区间估计建立框架。
练习题
第 1 题 概念推导
设
参考答案
用全概率公式按时刻
右边正是矩阵乘积
第 2 题 计算推理
某马尔可夫链有两个状态
求平稳分布
参考答案
平稳分布满足
整理得
验证细致平衡:
第 3 题 代码验证
用蒙特卡洛方法验证布朗运动的二次变差性质。取长度为
参考答案
import numpy as np
rng = np.random.default_rng(42)
T = 1.0
n_rep = 2000
for n in [100, 1000, 10000]:
quad = []
for _ in range(n_rep):
# 布朗运动在等分点上的取值:增量独立,方差为 dt
dt = T / n
inc = rng.normal(0, np.sqrt(dt), size=n)
quad.append(np.sum(inc ** 2))
print(f"n = {n:6d},增量平方和均值 = {np.mean(quad):.4f},标准差 = {np.std(quad):.4f}")
# n = 100,增量平方和均值 = 1.0003,标准差 = 0.1414
# n = 1000,增量平方和均值 = 1.0005,标准差 = 0.0448
# n = 10000,增量平方和均值 = 1.0002,标准差 = 0.0141三种划分下增量平方和的均值都接近
第 4 题 综合应用
某网约车平台把订单到达建模为泊松过程,平均每小时到达
参考答案
(一) 下午时段长度为
(二) 到达间隔服从参数为
(三) 夜间时段长度为
检验泊松假设:泊松分布的一个重要特征是均值与方差相等。若某天下午到达
常见错误
错误 1 · 把平稳分布当作任意链都存在且唯一
原因:只有不可约、正常返的链才存在唯一的平稳分布。可约链的每个闭合互通类上各有一个平稳分布,存在无穷多个平稳分布的凸组合;零常返链没有平稳概率分布。把方程
解决:先判断链的互通类结构与常返性质,再讨论平稳分布。有限状态的链只需要检查不可约性即可保证存在唯一平稳分布,因为有限不可约链必为正常返。解平稳分布时若方程有多组线性无关解,说明链可约,需要补充实际关心的初始条件下链落入哪个类。
错误 2 · 混淆观测条件分布与干预分布
原因:
解决:先画出因果图,找出从
错误 3 · 在非平稳序列上直接套用平稳过程工具
原因:自相关函数、功率谱密度与遍历定理都以宽平稳为前提。存在趋势或单位根的序列不是平稳序列,直接计算 ACF 会得到缓慢衰减的假象,谱分析会给出低频处的虚假功率,时间平均也不再收敛到总体均值。
解决:分析前先检查平稳性,画出序列图观察趋势与方差变化,用单位根检验判断差分次数。对确定性趋势可以做去趋势处理,对随机趋势做差分,直到序列平稳后再计算 ACF、PACF 与谱密度。建模时优先使用能容纳非平稳性的模型。
错误 4 · 忽略 HMM 的观测条件独立假设
原因:HMM 假设给定隐状态后各时刻观测相互独立,发射概率只依赖当前状态。当观测存在重叠特征或长距离相关时,这一假设明显违背,前向算法给出的似然与维特比解码结果会产生偏差,模型输出的概率往往过于自信。
解决:需要保留马尔可夫结构又想放宽观测假设时,改用条件随机场直接建模