Skip to content

概率图模型与半监督学习

本页覆盖传统机器学习分类树中剩余的两块:按方法论横切划分的概率图模型(PGM),以及按监督信号划分的半监督学习,并讨论传统 ML 的几个典型分类边界与争议。

概率图模型用图结构(节点 = 变量,边 = 依赖关系)来表示变量之间的概率依赖。核心思想:复杂的联合概率可以被分解为局部条件的乘积。

  • 贝叶斯网络 = 画一张因果箭头图:节点是变量,有向边表示”谁影响谁”。比如”多云→下雨→草地湿”,知道结构后只需存局部条件概率,不用存整个联合概率表。
  • HMM = 有记忆的隐状态链:有一串看不见的”隐状态”(比如天气晴/雨)在时间上依次转移,每个隐状态会”发射”出可见的观测值(比如穿短袖/带伞)。用于语音识别、词性标注。
  • CRF = 序列版的逻辑回归:HMM 建模的是”序列怎么生成”(生成式),CRF 直接建模”给定观测,标签是什么”(判别式),通常效果更好。

贝叶斯网络(Bayesian Network)用有向无环图(DAG)表示变量间的条件依赖。一条有向边 A→BA \to B 表示”AA 直接影响 BB“。联合概率按链式法则分解:

P(X1,X2,…,Xn)=∏i=1nP(Xi∣Pa(Xi))P(X_1, X_2, \ldots, X_n) = \prod_{i=1}^{n} P(X_i \mid \text{Pa}(X_i))

其中 Pa(Xi)\text{Pa}(X_i) 是 XiX_i 的父节点集合。这个分解是贝叶斯网络的核心价值:把 O(2n)O(2^n) 的联合概率表分解为若干 O(2k)O(2^k) 的局部条件概率表(CPT),存储和推断都大幅简化。

**D-分离(D-separation)**是贝叶斯网络中判断条件独立性的核心工具。给定图中三个不相交的节点集 A,B,C\mathcal{A}, \mathcal{B}, \mathcal{C},如果从 A\mathcal{A} 中任一节点到 B\mathcal{B} 中任一节点的所有路径都被 C\mathcal{C} “阻断”,则称 A\mathcal{A} 和 B\mathcal{B} 在给定 C\mathcal{C} 时 D-分离,即 A⊥ ⁣ ⁣ ⁣⊥B∣C\mathcal{A} \perp\!\!\!\perp \mathcal{B} \mid \mathcal{C}。

一条路径被阻断的规则取决于路径上的”三元组”结构:

结构图示阻断条件独立性
因果链A→C→BA \to C \to B给定 CC 时阻断A⊥B∣CA \perp B \mid C
共同原因A←C→BA \leftarrow C \to B给定 CC 时阻断A⊥B∣CA \perp B \mid C
共同效果(V结构)A→C←BA \to C \leftarrow B不给定 CC 时阻断A⊥BA \perp B,但 A⊥̸B∣CA \not\perp B \mid C

关键反直觉点:共同效果结构(collider)不给定时反而独立,给定后反而不独立。这就是”观察到草地湿(collider)后,下雨和洒水器变得相关”的原因——称为**“explaining away”效应**。

HMM(Hidden Markov Model,隐马尔可夫模型)由以下要素定义:

  • 状态转移矩阵 AA:Aij=P(qt+1=j∣qt=i)A_{ij} = P(q_{t+1}=j \mid q_t=i),隐状态间的转移概率。
  • 发射矩阵 BB:Bj(o)=P(ot=o∣qt=j)B_j(o) = P(o_t = o \mid q_t = j),隐状态发射观测值的概率。
  • 初始分布 π\pi:πi=P(q1=i)\pi_i = P(q_1 = i)。

HMM 有三个经典问题,每个对应一个精确算法:

问题定义算法复杂度
① 评估给定模型 λ=(A,B,π)\lambda=(A,B,\pi) 和观测序列 OO,求 P(O∣λ)P(O \mid \lambda)前向算法O(N2T)O(N^2 T)
② 解码给定 OO 和 λ\lambda,求最可能的隐状态序列 Q∗Q^*Viterbi 算法O(N2T)O(N^2 T)
③ 学习给定 OO,学参数 λ=(A,B,π)\lambda=(A,B,\pi)Baum-Welch(EM)O(N2T)O(N^2 T) 每轮迭代

其中 NN 是隐状态数,TT 是序列长度。

前向算法(Forward Algorithm)——评估问题。定义前向变量 αt(i)=P(o1,o2,…,ot,qt=i∣λ)\alpha_t(i) = P(o_1, o_2, \ldots, o_t, q_t = i \mid \lambda),即”截至时刻 tt 观测到 o1…oto_1 \ldots o_t,且处于状态 ii“的联合概率。递推:

α1(i)=πi⋅Bi(o1),αt+1(j)=[∑i=1Nαt(i)⋅Aij]⋅Bj(ot+1)\alpha_1(i) = \pi_i \cdot B_i(o_1), \quad \alpha_{t+1}(j) = \left[\sum_{i=1}^{N} \alpha_t(i) \cdot A_{ij}\right] \cdot B_j(o_{t+1})

最终 P(O∣λ)=∑i=1NαT(i)P(O \mid \lambda) = \sum_{i=1}^{N} \alpha_T(i)。这是动态规划——避免了暴力枚举所有 NTN^T 条路径。

Viterbi 算法——解码问题。定义 δt(i)=max⁡QP(q1…qt−1,qt=i,o1…ot∣λ)\delta_t(i) = \max_Q P(q_1 \ldots q_{t-1}, q_t = i, o_1 \ldots o_t \mid \lambda),即”经过状态 ii 的最优路径概率”。递推:

δ1(i)=πi⋅Bi(o1),δt+1(j)=max⁡i[δt(i)⋅Aij]⋅Bj(ot+1)\delta_1(i) = \pi_i \cdot B_i(o_1), \quad \delta_{t+1}(j) = \max_i [\delta_t(i) \cdot A_{ij}] \cdot B_j(o_{t+1})

同时记录回溯指针 ψt(j)=arg⁡max⁡i[δt−1(i)⋅Aij]\psi_t(j) = \arg\max_i [\delta_{t-1}(i) \cdot A_{ij}],最终从 max⁡iδT(i)\max_i \delta_T(i) 回溯得到最优状态序列。

Viterbi 和前向算法结构几乎一样,区别在于前向算法用求和(sum),Viterbi 用取最大(max)。这个细微差别是概率论中”边际化”和”最优化”的分野。

Baum-Welch 算法——学习问题。本质是 EM 算法(Expectation-Maximization)在 HMM 上的特化。E 步用前向-后向算法计算各时刻处于各状态的期望概率(“soft count”),M 步用这些期望重新估计转移矩阵和发射矩阵。迭代直到收敛。

CRF(Conditional Random Field,条件随机场)是判别式的概率图模型,直接建模 P(y∣x)P(\mathbf{y} \mid \mathbf{x})(给定观测序列 x\mathbf{x},标签序列 y\mathbf{y} 的条件概率),而不像 HMM 那样建模 P(x,y)P(\mathbf{x}, \mathbf{y})。

最常用的是线性链 CRF(Linear-chain CRF),用于序列标注:

P(y∣x)=1Z(x)exp⁡(∑t=1T∑kλkfk(yt,yt−1,x,t))P(\mathbf{y} \mid \mathbf{x}) = \frac{1}{Z(\mathbf{x})} \exp\left(\sum_{t=1}^{T} \sum_{k} \lambda_k f_k(y_t, y_{t-1}, \mathbf{x}, t)\right)

其中:

  • fk(yt,yt−1,x,t)f_k(y_t, y_{t-1}, \mathbf{x}, t) 是特征函数,可以自由定义(如”当前位置是’北京’且标签是 B-LOC 得 1,否则 0”)。
  • λk\lambda_k 是特征权重(通过最大似然学习)。
  • Z(x)=∑y′exp⁡(⋯ )Z(\mathbf{x}) = \sum_{\mathbf{y}'} \exp(\cdots) 是配分函数(partition function),对所有可能的标签序列求和,确保概率归一化。

CRF vs HMM 的本质区别:

特性HMM(生成式)CRF(判别式)
建模目标P(x,y)P(\mathbf{x}, \mathbf{y})P(y∣x)P(\mathbf{y} \mid \mathbf{x})
独立性假设观测值之间条件独立(给定状态)无此假设,可定义任意特征
特征受限(只能用发射概率)灵活(可用丰富的 overlapping 特征)
标签依赖全局约束(标签序列级)全局约束(标签序列级)
效果作为基线尚可序列标注任务通常更优

CRF 的推理(求最可能标签序列 y∗\mathbf{y}^*)同样用动态规划——与 Viterbi 类似但作用在条件概率上。配分函数 Z(x)Z(\mathbf{x}) 的计算用前向算法。CRF 的训练用最大似然 + 梯度上升(或 L-BFGS),需要前向-后向算法计算特征期望。

CRF 在深度学习时代:BiLSTM-CRF 是 NLP 序列标注的经典架构——BiLSTM 提取上下文特征,CRF 层在顶层做标签序列的全局约束(如”I-ORG 不能出现在序列开头”)。即使 BERT 时代,许多 NER 系统仍在 BERT 后接 CRF 层。

以经典”洒水器”网络为例——有向边表示因果关系:

上图中”下雨”和”洒水器”是”草地湿”的共同效果结构(collider)。不给定”草地湿”时,下雨和洒水器在给定”多云”后条件独立;但一旦观察到”草地湿”,两者就会产生”explaining away”效应——确认下雨了会降低洒水器开着的概率。

隐状态之间按转移概率切换,同时各自发射观测值:

HMM 的三大经典问题:(1) 评估——给定模型,观测序列出现的概率(前向算法);(2) 解码——给定观测,最可能的隐状态序列(Viterbi 算法);(3) 学习——从数据中学模型参数(Baum-Welch / EM 算法)。

动手实践:贝叶斯网络推断(纯 NumPy)

Section titled “动手实践:贝叶斯网络推断(纯 NumPy)”
import numpy as np
# 经典"洒水器"贝叶斯网络的结构与条件概率表(CPT)
# 结构: 多云 → {下雨, 洒水器} → 草地湿
# 变量取值: 0=否, 1=是
P_cloudy = np.array([0.5, 0.5]) # P(多云)
P_sprinkler = np.array([ # P(洒水器 | 多云)
[0.8, 0.2], # 多云=否 → 不洒/洒
[0.1, 0.9], # 多云=是
])
P_rain = np.array([ # P(下雨 | 多云)
[0.8, 0.2], # 多云=否
[0.2, 0.8], # 多云=是
])
P_wet = np.array([ # P(草地湿 | 洒水器, 下雨)
[[1.0, 0.0], [0.1, 0.9]], # 洒水器=否
[[0.1, 0.9], [0.01, 0.99]], # 洒水器=是
])
# 推断 P(草地湿):利用链式法则分解联合概率
p_wet = 0.0
for c in range(2): # 多云
for s in range(2): # 洒水器
for r in range(2): # 下雨
joint = (P_cloudy[c] * P_sprinkler[c, s] *
P_rain[c, r] * P_wet[s, r, 1])
p_wet += joint
print(f"P(草地湿) = {p_wet:.4f}")
# 输出: P(草地湿) = 0.6372
# 反向推断:P(下雨 | 草地湿) ——贝叶斯定理
p_rain_given_wet = 0.0
for c in range(2):
for s in range(2):
joint_wet_and_rain = (P_cloudy[c] * P_sprinkler[c, s] *
P_rain[c, 1] * P_wet[s, 1, 1])
p_rain_given_wet += joint_wet_and_rain
p_rain_given_wet /= p_wet
print(f"P(下雨 | 草地湿) = {p_rain_given_wet:.4f}")

贝叶斯网络的核心优势:把指数级大小的联合概率表分解为多个局部 CPT 的乘积,存储和推断都大幅简化。

import numpy as np
# 定义一个简单 HMM:天气预测
# 隐状态: 0=晴天, 1=雨天
# 观测: 0=短袖, 1=外套
A = np.array([[0.8, 0.2], # 转移矩阵 [晴天→晴/雨, 雨天→晴/雨]
[0.4, 0.6]])
B = np.array([[0.9, 0.1], # 发射矩阵 [晴天→短袖/外套, 雨天→短袖/外套]
[0.3, 0.7]])
pi = np.array([0.6, 0.4]) # 初始分布
observations = [0, 1, 1, 0] # 观测序列: 短袖, 外套, 外套, 短袖
states = ['晴天', '雨天']
def viterbi(A, B, pi, obs):
"""Viterbi 算法:求最可能的隐状态序列。"""
T = len(obs)
N = A.shape[0]
delta = np.zeros((T, N)) # 最优路径概率
psi = np.zeros((T, N), dtype=int) # 回溯指针
# 初始化
delta[0] = pi * B[:, obs[0]]
# 递推
for t in range(1, T):
for j in range(N):
probs = delta[t-1] * A[:, j] # 从各状态转移到 j 的概率
psi[t, j] = np.argmax(probs)
delta[t, j] = probs[psi[t, j]] * B[j, obs[t]]
# 回溯
path = [np.argmax(delta[-1])]
for t in range(T-2, -1, -1):
path.append(psi[t+1, path[-1]])
path.reverse()
return [states[s] for s in path], np.max(delta[-1])
path, prob = viterbi(A, B, pi, observations)
print(f"最可能状态序列: {path}")
print(f"该路径概率: {prob:.6f}")
# 输出示例: 最可能状态序列: ['晴天', '雨天', '雨天', '晴天']
类型图结构代表适用场景
贝叶斯网络有向无环图(DAG)朴素贝叶斯(特例)因果推断、诊断
马尔可夫随机场无向图MRF图像分割、空间建模
HMM动态 DAG(链式)Baum & Petrie 1966语音识别、序列标注
CRF判别式无向图Lafferty et al. 2001NLP 序列标注(NER 等)
变分自编码器深度生成式Kingma 2013深度学习时代的生成式 PGM

标注数据很贵,无标注数据很便宜。半监督学习的思路:用少量标注数据定方向,用大量无标注数据提精度。

  • 自训练(Self-training):先用标注数据训练一个模型,给无标注数据打”伪标签”(pseudo-label),把高置信度的伪标签数据加入训练集,重新训练,循环迭代。
  • 协同训练(Co-training):用两个视角(view)各训练一个模型,互相给对方提供伪标签(Blum & Mitchell 1998)。
  • 图半监督(Label Propagation):把所有样本建成图,标注样本的标签沿图”传播”到无标注样本(Zhu & Ghahramani 2002)。
  • 一致性正则化(Consistency Regularization):对同一个输入施加不同的数据增强(如添加噪声),模型应对两者给出相近的预测。代表方法:FixMatch、MixMatch。

2018 年后自监督学习(Self-supervised Learning,对比学习等)兴起,用数据自身构造监督信号,进一步模糊了半监督的边界。

半监督学习能工作的前提是满足以下至少一个假设:

  1. 平滑假设(Smoothness Assumption):如果两个样本在特征空间中相近,它们的标签也大概率相同——这是图半监督和一致性正则化的理论基础。
  2. 聚类假设(Cluster Assumption):相同聚类的样本大概率属于同一类别——这是自训练的理论基础。
  3. 流形假设(Manifold Assumption):高维数据实际分布在低维流形上——无标注数据帮助描绘流形结构,从而找到更好的决策边界。

2025 年趋势:半监督与自监督的融合

Section titled “2025 年趋势:半监督与自监督的融合”

截至 2025 年,半监督学习的边界与自监督学习、LLM 驱动学习深度交融:

趋势说明代表方法
自监督预训练 + 少量标注微调已成为 CV/NLP 标准范式。先用无标注数据做自监督预训练(MAE、SimCLR、对比学习),再用少量标注微调MAE (2022), DINOv2 (2023)
LLM 零样本 / 少样本学习大模型直接零样本推理或用极少示例(few-shot prompt),无需传统半监督迭代GPT-4o, Claude 3.5, Gemini 1.5
伪标签 + LLM 数据增强用 LLM 生成高质量合成数据或标注,替代传统自训练中的噪声伪标签LLM-as-judge, LLM 数据合成
FixMatch 系列在表格/视觉任务强数据增强 + 伪标签 + 一致性正则的简洁框架,在视觉半监督上效果极强FixMatch (2020), FlexMatch (2021)
主动学习与半监督结合在半监督循环中用主动学习策略选择”最需要标注”的样本交给人类,降低标注成本BADGE, Cal

关键洞察:LLM 时代,传统半监督学习(自训练、协同训练)正在被 “LLM 伪标签 + 自监督预训练” 取代。但对于隐私敏感领域(医疗、金融)或需要特定领域模型的场景,传统半监督方法仍然有价值。

  • 贝叶斯网络的核心是条件概率表(CPT):构造网络的难点不在画图,而在确定每个节点的 CPT——通常需要领域专家或从数据中估计。
  • 朴素贝叶斯是贝叶斯网络的最简单特例:所有特征条件独立于类别,只有一个根节点。
  • D-分离是推断的基础:在贝叶斯网络上做精确推断(变量消元、信念传播)时,D-分离帮助识别条件独立性,简化计算。
  • CRF vs HMM:CRF 是判别式(直接建模 P(y∣x)P(\mathbf{y}|\mathbf{x})),HMM 是生成式(建模 P(x,y)P(\mathbf{x},\mathbf{y}));序列标注任务通常 CRF 效果更好,但 HMM 可以利用无标注数据做无监督训练(Baum-Welch)。
  • BiLSTM-CRF / BERT-CRF 仍是 NER 标配:即使大模型时代,特定领域的 NER 用微调 BERT + CRF 仍是精度最高的方案之一。
  • 半监督的前提:无标注数据与标注数据应来自同一分布,否则伪标签会引入噪声。
  • FixMatch 很好用:视觉半监督场景下,FixMatch(弱增强伪标签 + 强增强一致性损失)是最简洁有效的框架。
  • HMM → 语音识别:HMM 将语音帧序列建模为音素隐状态的转移,曾是语音识别的主流方法——科大讯飞、Nuance 等早期语音引擎的核心技术。现代语音识别已转向 CTC + Transformer / Conformer 架构,但 HMM 的前向-后向思想仍影响深远。
  • HMM → 基因序列分析:生物信息学中用 HMM 对 DNA 序列做基因结构预测和功能区域标注,如 CpG 岛检测、蛋白质家族识别。
  • HMM → 手写识别:将笔画轨迹建模为状态序列,HMM 曾是手写输入法(如早期手机手写、平板手写)的标准方案。
  • 贝叶斯网络 → 医疗诊断:经典的 PATHFINDER 系统用贝叶斯网络根据症状推断疾病概率,辅助医生做诊断决策;现代医疗辅助诊断系统仍在使用类似的概率图模型。
  • 贝叶斯网络 → 故障诊断:工业系统中用贝叶斯网络建模设备部件间的因果依赖,从传感器报警快速定位根因故障——微软 Azure 的故障分析工具即基于此思路。
  • CRF → 命名实体识别(NER):CRF 对序列标签的全局约束(如”B-组织”后必须是”I-组织”或结束)使其在 NER 任务上长期优于逐词分类,曾是信息抽取系统的核心组件。BiLSTM-CRF 是 2015–2019 的标准方案。
  • CRF → 中文分词:中文没有天然词边界,CRF 根据上下文字符特征给每个字标注”词首/词中/词尾”,精度高且可控,曾是中文 NLP 的分词标配。
类库语言说明
pgmpyPython纯 Python 概率图模型库,支持贝叶斯网络与马尔可夫随机场的建模与推断
pomegranatePython高性能概率建模库,支持贝叶斯网络、HMM、GMM 等模型
hmmlearnPythonscikit-learn 生态的 HMM 库,提供离散/高斯/连续隐马尔可夫模型
CRF++C++/Python经典 CRF 工具,曾广泛用于中文分词、NER 等序列标注任务
pystruct / pytorch-crfPython结构化预测库,pytorch-crf 是深度学习框架中的 CRF 层实现
ssl-wrapperPython半监督学习工具包,含 Label Propagation / Spreading 等
术语英文解释
有向无环图DAG (Directed Acyclic Graph)贝叶斯网络的结构,用有向无环边表示变量间的条件依赖
条件概率表CPT (Conditional Probability Table)贝叶斯网络中每个节点存储的条件概率分布
D-分离D-separation贝叶斯网络中判断两组节点在给定第三组时是否条件独立的图准则
Explaining AwayExplaining Awaycollider 结构中,给定共同效果后两个原因变得相关的现象
马尔可夫假设Markov Assumption给定当前状态,未来只取决于现在而与过去无关的假设
隐状态Hidden StateHMM 中不可直接观测的内部状态,只能通过观测值间接推断
EM 算法Expectation-Maximization含隐变量时交替执行 E 步(估计隐变量)和 M 步(更新参数)的迭代算法
前向算法Forward AlgorithmHMM 中高效计算观测序列概率的动态规划算法
后向算法Backward Algorithm与前向算法对称,从后往前递推,配合前向算法计算边缘概率
Viterbi 算法Viterbi Algorithm给定观测序列求解最可能隐状态路径的动态规划算法
Baum-WelchBaum-Welch AlgorithmHMM 参数学习的 EM 算法特化,交替用前向-后向和参数更新
配分函数Partition FunctionCRF 中对所有可能标签序列求和的归一化常数
伪标签Pseudo-Label用模型对无标注数据预测的高置信度标签,用于自训练
一致性正则化Consistency Regularization同一输入的不同增强应得到一致预测的半监督范式
自监督学习Self-supervised Learning用数据自身构造监督信号(如对比学习、掩码恢复)的预训练方法
  • HMM 归监督还是无监督:取决于训练方式——中文教材(李航《统计学习方法》)列在无监督部分,英文 NLP 教材常作监督序列标注讲。
  • GBDT 是”决策树算法”吗:GBDT 是与基学习器无关的框架,XGBoost/LightGBM 是以树为基学习器的实现;归类依据应是 boosting 分支(见集成学习与随机森林)而非”树模型”。
  • 半监督是否独立范式:AIMA 只列监督/无监督/强化三大类;2018 年后自监督学习兴起,进一步模糊了边界。2025 年,LLM 零样本/少样本学习让”半监督”的概念更加模糊——少量 prompt 示例算不算”标注数据”?
  • 贝叶斯网络(Pearl 1988,Pearl 获 2011 图灵奖);其特例朴素贝叶斯见监督学习。
  • 马尔可夫随机场(Geman & Geman 1984);HMM(Baum & Petrie 1966,语音识别标准工具);CRF(Lafferty et al. 2001,序列标注)。
  • D-分离:Pearl, Causality (2009) Part I 对 D-分离和因果推断有完整论述。
  • Viterbi 算法:Viterbi, “Error bounds for convolutional codes and an asymptotically optimum decoding algorithm” (IEEE TOIT, 1967)。原本是信道编码算法,后被广泛用于序列解码。
  • 半监督代表方法:自训练(Scudder 1965)、协同训练(Blum & Mitchell 1998)、图半监督(Zhu & Ghahramani 2002)、FixMatch(Sohn et al. 2020)。
  • PGM 标准教科书:Koller & Friedman 2009, Probabilistic Graphical Models。
  • BiLSTM-CRF 架构:Huang et al., “Bidirectional LSTM-CRF Models for Sequence Tagging” (2015)。