概率图模型与半监督学习
本页覆盖传统机器学习分类树中剩余的两块:按方法论横切划分的概率图模型(PGM),以及按监督信号划分的半监督学习,并讨论传统 ML 的几个典型分类边界与争议。
概率图模型(PGM)
Section titled “概率图模型(PGM)”概率图模型用图结构(节点 = 变量,边 = 依赖关系)来表示变量之间的概率依赖。核心思想:复杂的联合概率可以被分解为局部条件的乘积。
- 贝叶斯网络 = 画一张因果箭头图:节点是变量,有向边表示”谁影响谁”。比如”多云→下雨→草地湿”,知道结构后只需存局部条件概率,不用存整个联合概率表。
- HMM = 有记忆的隐状态链:有一串看不见的”隐状态”(比如天气晴/雨)在时间上依次转移,每个隐状态会”发射”出可见的观测值(比如穿短袖/带伞)。用于语音识别、词性标注。
- CRF = 序列版的逻辑回归:HMM 建模的是”序列怎么生成”(生成式),CRF 直接建模”给定观测,标签是什么”(判别式),通常效果更好。
贝叶斯网络与 D-分离
Section titled “贝叶斯网络与 D-分离”贝叶斯网络(Bayesian Network)用有向无环图(DAG)表示变量间的条件依赖。一条有向边 表示” 直接影响 “。联合概率按链式法则分解:
其中 是 的父节点集合。这个分解是贝叶斯网络的核心价值:把 的联合概率表分解为若干 的局部条件概率表(CPT),存储和推断都大幅简化。
**D-分离(D-separation)**是贝叶斯网络中判断条件独立性的核心工具。给定图中三个不相交的节点集 ,如果从 中任一节点到 中任一节点的所有路径都被 “阻断”,则称 和 在给定 时 D-分离,即 。
一条路径被阻断的规则取决于路径上的”三元组”结构:
| 结构 | 图示 | 阻断条件 | 独立性 |
|---|---|---|---|
| 因果链 | 给定 时阻断 | ||
| 共同原因 | 给定 时阻断 | ||
| 共同效果(V结构) | 不给定 时阻断 | ,但 |
关键反直觉点:共同效果结构(collider)不给定时反而独立,给定后反而不独立。这就是”观察到草地湿(collider)后,下雨和洒水器变得相关”的原因——称为**“explaining away”效应**。
HMM 的三大问题与算法
Section titled “HMM 的三大问题与算法”HMM(Hidden Markov Model,隐马尔可夫模型)由以下要素定义:
- 状态转移矩阵 :,隐状态间的转移概率。
- 发射矩阵 :,隐状态发射观测值的概率。
- 初始分布 :。
HMM 有三个经典问题,每个对应一个精确算法:
| 问题 | 定义 | 算法 | 复杂度 |
|---|---|---|---|
| ① 评估 | 给定模型 和观测序列 ,求 | 前向算法 | |
| ② 解码 | 给定 和 ,求最可能的隐状态序列 | Viterbi 算法 | |
| ③ 学习 | 给定 ,学参数 | Baum-Welch(EM) | 每轮迭代 |
其中 是隐状态数, 是序列长度。
前向算法(Forward Algorithm)——评估问题。定义前向变量 ,即”截至时刻 观测到 ,且处于状态 “的联合概率。递推:
最终 。这是动态规划——避免了暴力枚举所有 条路径。
Viterbi 算法——解码问题。定义 ,即”经过状态 的最优路径概率”。递推:
同时记录回溯指针 ,最终从 回溯得到最优状态序列。
Viterbi 和前向算法结构几乎一样,区别在于前向算法用求和(sum),Viterbi 用取最大(max)。这个细微差别是概率论中”边际化”和”最优化”的分野。
Baum-Welch 算法——学习问题。本质是 EM 算法(Expectation-Maximization)在 HMM 上的特化。E 步用前向-后向算法计算各时刻处于各状态的期望概率(“soft count”),M 步用这些期望重新估计转移矩阵和发射矩阵。迭代直到收敛。
CRF(条件随机场)原理
Section titled “CRF(条件随机场)原理”CRF(Conditional Random Field,条件随机场)是判别式的概率图模型,直接建模 (给定观测序列 ,标签序列 的条件概率),而不像 HMM 那样建模 。
最常用的是线性链 CRF(Linear-chain CRF),用于序列标注:
其中:
- 是特征函数,可以自由定义(如”当前位置是’北京’且标签是 B-LOC 得 1,否则 0”)。
- 是特征权重(通过最大似然学习)。
- 是配分函数(partition function),对所有可能的标签序列求和,确保概率归一化。
CRF vs HMM 的本质区别:
| 特性 | HMM(生成式) | CRF(判别式) |
|---|---|---|
| 建模目标 | ||
| 独立性假设 | 观测值之间条件独立(给定状态) | 无此假设,可定义任意特征 |
| 特征 | 受限(只能用发射概率) | 灵活(可用丰富的 overlapping 特征) |
| 标签依赖 | 全局约束(标签序列级) | 全局约束(标签序列级) |
| 效果 | 作为基线尚可 | 序列标注任务通常更优 |
CRF 的推理(求最可能标签序列 )同样用动态规划——与 Viterbi 类似但作用在条件概率上。配分函数 的计算用前向算法。CRF 的训练用最大似然 + 梯度上升(或 L-BFGS),需要前向-后向算法计算特征期望。
CRF 在深度学习时代:BiLSTM-CRF 是 NLP 序列标注的经典架构——BiLSTM 提取上下文特征,CRF 层在顶层做标签序列的全局约束(如”I-ORG 不能出现在序列开头”)。即使 BERT 时代,许多 NER 系统仍在 BERT 后接 CRF 层。
贝叶斯网络的 DAG
Section titled “贝叶斯网络的 DAG”以经典”洒水器”网络为例——有向边表示因果关系:
上图中”下雨”和”洒水器”是”草地湿”的共同效果结构(collider)。不给定”草地湿”时,下雨和洒水器在给定”多云”后条件独立;但一旦观察到”草地湿”,两者就会产生”explaining away”效应——确认下雨了会降低洒水器开着的概率。
HMM 状态转移
Section titled “HMM 状态转移”隐状态之间按转移概率切换,同时各自发射观测值:
HMM 的三大经典问题:(1) 评估——给定模型,观测序列出现的概率(前向算法);(2) 解码——给定观测,最可能的隐状态序列(Viterbi 算法);(3) 学习——从数据中学模型参数(Baum-Welch / EM 算法)。
CRF 与 HMM 对比
Section titled “CRF 与 HMM 对比”动手实践:贝叶斯网络推断(纯 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.0for 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.0for 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_rainp_rain_given_wet /= p_wetprint(f"P(下雨 | 草地湿) = {p_rain_given_wet:.4f}")贝叶斯网络的核心优势:把指数级大小的联合概率表分解为多个局部 CPT 的乘积,存储和推断都大幅简化。
HMM 实践:Viterbi 解码
Section titled “HMM 实践:Viterbi 解码”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}")# 输出示例: 最可能状态序列: ['晴天', '雨天', '雨天', '晴天']PGM 家族速览
Section titled “PGM 家族速览”| 类型 | 图结构 | 代表 | 适用场景 |
|---|---|---|---|
| 贝叶斯网络 | 有向无环图(DAG) | 朴素贝叶斯(特例) | 因果推断、诊断 |
| 马尔可夫随机场 | 无向图 | MRF | 图像分割、空间建模 |
| HMM | 动态 DAG(链式) | Baum & Petrie 1966 | 语音识别、序列标注 |
| CRF | 判别式无向图 | Lafferty et al. 2001 | NLP 序列标注(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,对比学习等)兴起,用数据自身构造监督信号,进一步模糊了半监督的边界。
原理:三大假设
Section titled “原理:三大假设”半监督学习能工作的前提是满足以下至少一个假设:
- 平滑假设(Smoothness Assumption):如果两个样本在特征空间中相近,它们的标签也大概率相同——这是图半监督和一致性正则化的理论基础。
- 聚类假设(Cluster Assumption):相同聚类的样本大概率属于同一类别——这是自训练的理论基础。
- 流形假设(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 是判别式(直接建模 ),HMM 是生成式(建模 );序列标注任务通常 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 的分词标配。
典型类库与工具
Section titled “典型类库与工具”| 类库 | 语言 | 说明 |
|---|---|---|
| pgmpy | Python | 纯 Python 概率图模型库,支持贝叶斯网络与马尔可夫随机场的建模与推断 |
| pomegranate | Python | 高性能概率建模库,支持贝叶斯网络、HMM、GMM 等模型 |
| hmmlearn | Python | scikit-learn 生态的 HMM 库,提供离散/高斯/连续隐马尔可夫模型 |
| CRF++ | C++/Python | 经典 CRF 工具,曾广泛用于中文分词、NER 等序列标注任务 |
| pystruct / pytorch-crf | Python | 结构化预测库,pytorch-crf 是深度学习框架中的 CRF 层实现 |
| ssl-wrapper | Python | 半监督学习工具包,含 Label Propagation / Spreading 等 |
| 术语 | 英文 | 解释 |
|---|---|---|
| 有向无环图 | DAG (Directed Acyclic Graph) | 贝叶斯网络的结构,用有向无环边表示变量间的条件依赖 |
| 条件概率表 | CPT (Conditional Probability Table) | 贝叶斯网络中每个节点存储的条件概率分布 |
| D-分离 | D-separation | 贝叶斯网络中判断两组节点在给定第三组时是否条件独立的图准则 |
| Explaining Away | Explaining Away | collider 结构中,给定共同效果后两个原因变得相关的现象 |
| 马尔可夫假设 | Markov Assumption | 给定当前状态,未来只取决于现在而与过去无关的假设 |
| 隐状态 | Hidden State | HMM 中不可直接观测的内部状态,只能通过观测值间接推断 |
| EM 算法 | Expectation-Maximization | 含隐变量时交替执行 E 步(估计隐变量)和 M 步(更新参数)的迭代算法 |
| 前向算法 | Forward Algorithm | HMM 中高效计算观测序列概率的动态规划算法 |
| 后向算法 | Backward Algorithm | 与前向算法对称,从后往前递推,配合前向算法计算边缘概率 |
| Viterbi 算法 | Viterbi Algorithm | 给定观测序列求解最可能隐状态路径的动态规划算法 |
| Baum-Welch | Baum-Welch Algorithm | HMM 参数学习的 EM 算法特化,交替用前向-后向和参数更新 |
| 配分函数 | Partition Function | CRF 中对所有可能标签序列求和的归一化常数 |
| 伪标签 | 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)。