查看全课大纲(第 28 / 69 节)
- 1.NLP 的研究领域、应用与学习路径
- 2.自然语言的基本术语
- 3.信息论基础:信息熵与交叉熵
- 4.语言的进化与语义变迁
- 5.主观概率、客观概率与条件概率
- 6.贝叶斯原理与推理
- 7.随机变量:二项式、期望方差与联合概率
- 8.常见概率分布
- 9.辛普森悖论与贝叶斯解题实例
- 10.语言模型:语言概率与词袋模型
- 11.n-gram 语言模型(二元 / 三元 / N-Gram)
- 12.语言模型评价:交叉熵、困惑度与插值
- 13.朴素贝叶斯文本分类:垃圾邮件
- 14.拼写检查
- 15.中文分词:构词法、最大匹配、最优路径与 Jieba
- 16.词表示问题与语义相似度
- 17.TF-IDF 权重处理
- 18.One-Hot 表达与词表示的局限
- 19.Word2Vec 核心思想
- 20.Word2Vec 训练过程
- 21.Skip-gram 模型详解
- 22.词性标注任务与标注方法(规则 + N-Gram)
- 23.EM 算法与混合模型
- 24.高斯混合模型 GMM
- 25.从混合模型到隐马尔可夫模型
- 26.隐马尔可夫模型(HMM)推导与维特比解码
- 27.线性链条件随机场 CRF
- 28.贝叶斯网络与图模型
- 29.隐马尔可夫链与 HMM 推导
- 30.PLSA 主题模型
- 31.LSI 与 SVD 向量表达
- 32.LDA 与狄利克雷分布
- 33.主题模型实验复现(困惑度 / 分类 / 相似度 / 延展)
- 34.上下文无关文法(CFG)与句法分析
- 35.概率上下文无关文法 PCFG
- 36.统计机器翻译:词对齐与翻译模型
- 37.统计机器翻译中的对齐模型与参数估计
- 38.从统计机器翻译到神经机器翻译
- 39.神经元与反向传播速览(指向深度学习课)
- 40.CNN 原理及其在 NLP 中的应用
- 41.循环神经网络的基本原理与 Elman / Jordan 网络
- 42.LSTM:长短期记忆网络的核心思想与分步实现
- 43.Encoder-Decoder 框架
- 44.Seq2Seq 与早期注意力机制
- 45.注意力机制的背景与动机
- 46.注意力模型实现原理与匹配函数
- 47.记忆网络:组成与计算
- 48.注意力机制的应用与历史延展
- 49.Transformer 结构:Encoder-Decoder 栈与 Self-Attention
- 50.Multi-Head Attention、FFNN 与位置编码
- 51.层归一化、损失函数与 Universal Transformer 延展
- 52.预训练范式:从 ELMo 到 BERT
- 53.BERT 与掩码语言模型
- 54.BERT 下游任务微调与 GLUE 口径
- 55.GPT 与自回归语言建模
- 56.GPT-1 到 GPT-4 的演进
- 57.指令微调与 RLHF
- 58.分词器:BPE、WordPiece 与中文词表
- 59.上下文窗口与长文本处理
- 60.能力边界、成本与适用场景
- 61.文本分类实战:从朴素贝叶斯到逻辑回归
- 62.命名实体识别实战
- 63.文本生成与摘要实战
- 64.语义检索与向量库实战
- 65.RAG 知识库问答
- 66.NLP 评估指标:BLEU / ROUGE / BERTScore 与人工评估
- 67.幻觉与事实性问题
- 68.文本与知识结合(知识图谱压缩)
- 69.跨媒体信息检索与未来展望
贝叶斯网络与图模型
小象实战讲义 · 自然语言处理
在自然语言处理中,我们常常需要处理多个随机变量之间复杂的依赖关系。例如,一个词的出现可能依赖于它的词性,而词性又依赖于句子的结构。如何清晰、高效地表示和计算这些变量之间的联合概率分布,是构建复杂模型的关键。本节我们将引入概率图模型的核心思想,并重点学习其最早、最基础的形式——贝叶斯网络。通过有向无环图来直观表示变量间的概率依赖与条件独立性,我们将掌握从图结构到概率分解,再到推理计算的基本方法,为后续学习隐马尔可夫模型、主题模型等更复杂的图模型打下坚实基础。
💡 核心导读
- 图模型是什么:将复杂的联合概率分布分解为图结构,用节点表示随机变量,边表示依赖关系,从而简化建模与计算。
- 贝叶斯网络:一种基于有向无环图的概率图模型,表达了变量间的概率依赖结构和条件独立性。
- 从朴素贝叶斯到分层模型:理解如何从最简单的图模型(如朴素贝叶斯)出发,通过引入隐含变量和超参数,构建复杂的层次化概率模型。
- 图模型的威力:掌握如何利用图模型进行概率推理,例如在给定部分观测证据时,推断其他未知变量的状态。
概率图模型:用图来简化世界
在机器学习和统计学中,当我们面对大量相互关联的随机变量时,直接定义它们的联合概率分布 会非常困难,因为参数数量会随着变量数指数级增长。概率图模型 提供了一种强大的框架,它用图结构来直观地表示这些变量之间的依赖关系和条件独立性。
图由节点(代表随机变量)和边(代表变量间的依赖关系)构成。根据边的方向性,概率图模型主要分为两类:
- 贝叶斯网络:使用有向无环图,边有方向,表示直接概率依赖;只有在额外引入因果假设后,才能把边解释为因果关系。
- 马尔可夫网络:使用无向图,边无方向,通常表示变量间的关联或约束。
本节我们聚焦于贝叶斯网络,它是许多经典NLP模型(如朴素贝叶斯分类器、隐马尔可夫模型)的图模型基础。
贝叶斯网络:有向图上的概率分解
贝叶斯网络的核心是一个有向无环图。图中每个节点对应一个随机变量。如果存在一条从节点 指向节点 的有向边 ,则称 是 的父节点, 是 的子节点。这条有向边在概率上表示 对 有直接的概率依赖;是否进一步解释为因果影响,需要额外的因果假设,单靠图结构并不能确定因果方向。
贝叶斯网络的关键在于其局部条件独立性假设:给定其父节点,一个节点与其所有非后代节点条件独立。基于此,一个贝叶斯网络定义的联合概率分布可以分解为一系列条件概率的乘积:
其中, 表示节点 的所有父节点。这个分解极大地简化了联合分布的表示和计算。
一个实例:肺癌诊断网络
让我们通过一个经典的肺癌诊断例子来具体理解贝叶斯网络。假设我们关心以下几个变量:
- Pollution ():环境污染程度,取值为
Low或High。 - Smoker ():是否吸烟,取值为
True或False。 - Cancer ():是否患肺癌,取值为
True或False。 - X-ray ():X光检查结果,取值为
Positive或Negative。 - Dyspnoea ():呼吸困难这一症状,取值为
True或False。
根据医学知识,我们可以构建如下贝叶斯网络:
- 肺癌 () 的发生受环境污染 () 和吸烟 () 的影响。
- 如果患肺癌 (),则会影响X光检查结果 () 和呼吸困难指标 ()。
- 和 在给定 的条件下是独立的。
这可以用以下有向图表示:
P (Pollution) S (Smoker)
\ /
\ /
v v
C (Cancer)
/ \
/ \
v v
X (X-ray) D (Dyspnoea)现在,我们需要为每个节点定义其条件概率表。这些概率通常来自领域知识或历史数据。
先验概率:
- ,
- ,
条件概率 :
P S P(C=True | P, S) P(C=False | P, S) High True 0.05 0.95 High False 0.02 0.98 Low True 0.03 0.97 Low False 0.001 0.999 条件概率 :
C P(X=Positive | C) P(X=Negative | C) True 0.9 0.1 False 0.2 0.8 条件概率 :
C P(D=True | C) P(D=False | C) True 0.6 0.4 False 0.3 0.7
有了网络结构和条件概率表,整个系统的联合概率分布就可以分解计算:
概率推理:回答“如果…那么…”的问题
贝叶斯网络最重要的应用之一是进行概率推理。即,在观察到部分变量(证据)后,计算其他变量(查询)的后验概率。
例如,问题:如果一位患者的X光检查结果为阳性(),那么他吸烟的概率是多少?即求 。
推理过程(概念性):
- 根据贝叶斯公式:。
- 但 不能直接从条件概率表获得,因为 和 不直接相连。我们需要考虑所有可能的 和 的状态,对它们进行求和(这称为边缘化或消元):
- 将 和 代入,计算 。
- 同样计算 。
- 最后结合先验 ,利用贝叶斯公式归一化得到后验概率 。
在实际中,对于复杂的网络,我们会使用精确算法(如变量消元法、联结树算法)或近似算法(如采样)来进行推理。下面的简单代码演示了在这个小型网络上如何进行一次精确的手动推理计算。
import itertools
# 定义所有变量的取值空间
P_values = ['Low', 'High']
S_values = [False, True] # False: 不吸烟, True: 吸烟
C_values = [False, True] # False: 无癌, True: 有癌
X_values = ['Negative', 'Positive']
# 定义先验和条件概率表 (CPT)
# 为了计算方便,我们用字典存储,键为条件组合的元组
prob_P = {'Low': 0.9, 'High': 0.1}
prob_S = {False: 0.7, True: 0.3}
# P(C=True | P, S)
prob_C_given_PS = {
('High', True): 0.05,
('High', False): 0.02,
('Low', True): 0.03,
('Low', False): 0.001,
}
# P(C=False | P, S) = 1 - P(C=True | P, S)
# P(X=Positive | C)
prob_X_given_C = {
(True, 'Positive'): 0.9,
(True, 'Negative'): 0.1,
(False, 'Positive'): 0.2,
(False, 'Negative'): 0.8,
}
# 计算 P(X=Positive)
prob_X_Positive = 0.0
for p in P_values:
for s in S_values:
for c in C_values:
# P(P=p)
prior_P = prob_P[p]
# P(S=s)
prior_S = prob_S[s]
# P(C=c | P=p, S=s)
if c == True:
prob_C = prob_C_given_PS[(p, s)]
else:
prob_C = 1 - prob_C_given_PS[(p, s)]
# P(X=Positive | C=c)
prob_X = prob_X_given_C[(c, 'Positive')]
# 联合概率贡献
joint = prior_P * prior_S * prob_C * prob_X
prob_X_Positive += joint
print(f"P(X=Positive) = {prob_X_Positive:.4f}")
# 计算 P(S=True, X=Positive)
prob_STrue_XPositive = 0.0
s_query = True
x_evidence = 'Positive'
for p in P_values:
for c in C_values:
prior_P = prob_P[p]
prior_S = prob_S[s_query] # S=True的先验
if c == True:
prob_C = prob_C_given_PS[(p, s_query)]
else:
prob_C = 1 - prob_C_given_PS[(p, s_query)]
prob_X = prob_X_given_C[(c, x_evidence)]
joint = prior_P * prior_S * prob_C * prob_X
prob_STrue_XPositive += joint
print(f"P(S=True, X=Positive) = {prob_STrue_XPositive:.4f}")
# 计算后验概率 P(S=True | X=Positive)
posterior_S_given_X = prob_STrue_XPositive / prob_X_Positive
print(f"P(S=True | X=Positive) = {posterior_S_given_X:.4f}")P(X=Positive) = 0.2081
P(S=True, X=Positive) = 0.0667
P(S=True | X=Positive) = 0.3206计算结果显示,在观察到X光检查为阳性后,患者吸烟的后验概率从先验的30%上升到了约32.06%。这表明X光阳性结果提供了支持“患者吸烟”这一假设的证据。
从简单到复杂:图模型的层次化扩展
贝叶斯网络的图结构可以清晰地展示模型是如何从简单形式演变为复杂形式的。
朴素贝叶斯分类器
朴素贝叶斯分类器可以看作一个最简单的贝叶斯网络。假设我们有一个类别变量 和 个特征变量 。朴素贝叶斯的“朴素”之处在于它假设在给定类别 的条件下,所有特征 都是相互独立的。其图模型如下:
C (Class)
/ | | | \
/ | | | \
v v v v v
X1 X2 X3 ... Xn对应的概率分解为: 这正是我们熟悉的朴素贝叶斯公式。
板表示法
当模型中有重复结构时(例如,有 个独立同分布的数据点),我们使用板表示法来简化图形。用一个矩形框(板)将重复的节点括起来,并在角落标注重复次数 。
例如,对于 个独立同分布的数据点 都依赖于同一个参数 ,其板表示如下:
θ
|
-------
| |
| x | N
| |
-------这等价于 个独立的节点 都从 指向它们。概率分解为 。
分层贝叶斯模型:引入超参数
更复杂的模型会引入隐含变量和超参数,形成层次化结构。这是贝叶斯统计和许多高级主题模型(如LDA)的核心思想。
核心理念:模型的参数本身也可以被视为随机变量,并由更高层的参数(超参数)控制。
举例:假设我们观测到数据 ,我们认为它来自一个正态分布 。在频率学派中, 和 是固定的未知参数。在贝叶斯学派中,我们将 和 也视为随机变量。
- 我们可能认为均值 本身服从另一个分布,例如均匀分布 。
- 标准差 可能服从另一个分布,例如均匀分布 。注意:对 取均匀先验,与对方差 (或精度)取均匀先验并不是同一种先验,二者不可混写。
- 就是超参数,它们控制了参数 和 的分布。
这个生成过程的图模型如下(简化示意):
α1, α2 α3, α4
\ /
\ /
v v
μ ~ Uniform σ ~ Uniform
\ /
\ /
v v
x ~ N(μ, σ^2)这个过程可以描述为:
- 根据超参数 ,从均匀分布中采样得到一个具体的均值 。
- 根据超参数 ,从均匀分布中采样得到一个具体的标准差 。
- 使用采样得到的 和 定义出一个具体的正态分布 。
- 从这个正态分布中采样,得到我们最终观察到的数据点 。
这种层次化建模的优点在于:
- 共享统计强度:多个数据组可以共享超参数,允许信息在不同组间传递。
- 避免过拟合:参数不再是一个固定值,而是一个分布,对数据量少的情况更稳健。
- 表达不确定性:能够量化我们对模型参数本身的不确定性。
在自然语言处理中,主题模型(如LDA) 就是这种分层贝叶斯模型的典型代表。文档-主题分布和主题-词分布都被赋予了先验分布(狄利克雷分布),从而构建了一个强大的文本生成概率模型。
📝 动手练一练
- 条件独立性辨析:在肺癌诊断的贝叶斯网络中,如果我们已经知道了患者是否患癌()的信息,那么X光结果()和呼吸困难指标()之间是否独立?为什么?如果不知道 的信息呢?
👉 点击查看参考答案
- 已知 时: 和 是条件独立的。因为在贝叶斯网络中, 和 是 的两个子节点,且它们之间没有直接连接。在给定父节点 的条件下, 和 的生成过程只依赖于 ,彼此无关。用概率表示即 。
- 未知 时: 和 不是独立的,它们通过共同的父节点 产生关联。例如,一个阳性的X光结果()会让我们更相信患者患癌(),从而也提高了我们相信呼吸困难()出现的概率。这种通过未观测的共同原因导致的相关性,有时被称为“混杂”效应。
- 后验概率计算:基于上面提供的肺癌网络概率表,请计算:在已知患者不吸烟()且X光检查为阴性()的条件下,该患者实际患癌()的后验概率 。(提示:需要边缘化环境污染 和呼吸困难 ,但 与问题无关可先边缘化。计算时注意 的概率。)
👉 点击查看参考答案
我们计算 。根据贝叶斯公式: 其中 需要对 边缘化:。 是先验,但在计算后验比例时会消去,所以我们只需计算分子部分 对于 和 的值,然后归一化。
# —— 重新构建上文用到的微型数据(本节各代码块相互独立,可单独运行)
import itertools
P_values = ['Low', 'High']
S_values = [False, True] # False: 不吸烟, True: 吸烟
C_values = [False, True] # False: 无癌, True: 有癌
X_values = ['Negative', 'Positive']
prob_P = {'Low': 0.9, 'High': 0.1}
prob_S = {False: 0.7, True: 0.3}
prob_C_given_PS = {
('High', True): 0.05,
('High', False): 0.02,
('Low', True): 0.03,
('Low', False): 0.001,
}
prob_X_given_C = {
(True, 'Positive'): 0.9,
(True, 'Negative'): 0.1,
(False, 'Positive'): 0.2,
(False, 'Negative'): 0.8,
}
prob_X_Positive = 0.0
for p in P_values:
for s in S_values:
for c in C_values:
# P(P=p)
prior_P = prob_P[p]
# P(S=s)
prior_S = prob_S[s]
# P(C=c | P=p, S=s)
if c == True:
prob_C = prob_C_given_PS[(p, s)]
else:
prob_C = 1 - prob_C_given_PS[(p, s)]
# P(X=Positive | C=c)
prob_X = prob_X_given_C[(c, 'Positive')]
# 联合概率贡献
joint = prior_P * prior_S * prob_C * prob_X
prob_X_Positive += joint
# 计算 P(C=True, S=False, X=Negative) 和 P(C=False, S=False, X=Negative)
prob_joint_CTrue = 0.0
prob_joint_CFalse = 0.0
s_evidence = False
x_evidence = 'Negative'
for p in P_values: # 边缘化 P
# P(P=p)
prior_P = prob_P[p]
# P(S=False)
prior_S = prob_S[s_evidence]
# 计算 C=True 的情况
c_val = True
prob_C_given_PS_val = prob_C_given_PS[(p, s_evidence)] # P(C=True|P,S)
prob_X_given_C_val = prob_X_given_C[(c_val, x_evidence)] # P(X=Neg|C=True)
joint_CTrue = prior_P * prior_S * prob_C_given_PS_val * prob_X_given_C_val
prob_joint_CTrue += joint_CTrue
# 计算 C=False 的情况
c_val = False
prob_C_given_PS_val = 1 - prob_C_given_PS[(p, s_evidence)] # P(C=False|P,S)
prob_X_given_C_val = prob_X_given_C[(c_val, x_evidence)] # P(X=Neg|C=False)
joint_CFalse = prior_P * prior_S * prob_C_given_PS_val * prob_X_given_C_val
prob_joint_CFalse += joint_CFalse
print(f"非归一化分子: P(C=True, S=False, X=Neg) = {prob_joint_CTrue:.6f}")
print(f"非归一化分子: P(C=False, S=False, X=Neg) = {prob_joint_CFalse:.6f}")
# 计算后验概率
posterior_CTrue = prob_joint_CTrue / (prob_joint_CTrue + prob_joint_CFalse)
print(f"后验概率 P(C=True | S=False, X=Negative) = {posterior_CTrue:.6f}")非归一化分子: P(C=True, S=False, X=Neg) = 0.000203
非归一化分子: P(C=False, S=False, X=Neg) = 0.558376
后验概率 P(C=True | S=False, X=Negative) = 0.000363计算结果表明,在不吸烟且X光阴性的条件下,患癌的后验概率极低,约为0.0363%,远低于任何先验或单独证据下的概率。这体现了结合多种证据进行推理的价值。
📝 动手练一练
- 概念辨析:在给定的肺癌诊断贝叶斯网络中,变量“X光检查结果()”和“呼吸困难()”在没有任何观测信息时是独立的吗?在给定“是否患肺癌()”的条件下,它们是否独立?请结合贝叶斯网络的局部条件独立性假设进行解释。
👉 点击查看参考答案
在没有任何观测信息时, 和 不是独立的。因为根据网络结构,它们有一个共同的原因(父节点)。即使的状态未知,和的状态也通过这个潜在变量产生了关联(例如,为真会同时提高和为真的概率)。
在给定“是否患肺癌()”的条件下, 和 是条件独立的。根据贝叶斯网络的局部条件独立性假设,一个节点(如)在给定其父节点(此处为)的条件下,与其所有非后代节点条件独立。不是的后代(它们是的并列子节点),因此在给定它们的共同父节点后,连接 与 的通路 (含共同父节点的 fork 结构)被“阻断”了,和变得条件独立。这符合网络中描述的知识:一旦我们知道患者是否患癌,那么X光结果和呼吸困难指标之间就没有直接的依赖关系了。
- 手算推理:基于讲义中给出的部分概率表(如下),请计算在已知“环境污染程度为高()”且“吸烟()”的条件下,患者“患肺癌()”的概率 。
- 先验概率:
- 条件概率表(部分):
- 提示:利用贝叶斯公式和给定的条件概率直接计算。
👉 点击查看参考答案
根据贝叶斯网络的分解公式,在给定父节点 和 时, 的概率直接由其条件概率表(CPT)给出,无需进行复杂的边缘化或贝叶斯公式计算。
题目已经直接给出了我们所需要查询的条件概率:
因此,答案为 0.05。这体现了贝叶斯网络推理的直观性:当查询变量()的所有父节点(, )都被给定时,其概率就是CPT中的对应项。
本章小结
本节我们深入探讨了概率图模型的基石——贝叶斯网络。我们了解到,图模型通过将复杂的联合概率分布分解为图结构上的局部条件概率乘积,为建模多变量系统提供了清晰、模块化且计算上可处理的框架。
- 贝叶斯网络用有向无环图表示变量间的概率依赖结构,其联合分布分解为 。
- 图结构蕴含条件独立性,这是简化推理的关键。例如,给定父节点,节点与其非后代节点独立。
- 概率推理是贝叶斯网络的核心应用,即在给定部分观测证据后,计算其他变量的后验分布。我们通过肺癌诊断的例子演示了推理的概念和计算过程。
- 从简单到复杂:我们看到了朴素贝叶斯分类器作为简单贝叶斯网络的特例,并学习了如何使用板表示法刻画重复结构,以及如何通过引入隐含变量和超参数构建分层贝叶斯模型,这是理解后续主题模型等高级内容的基础。
概率图模型是连接传统统计机器学习与自然语言处理问题的一座桥梁。虽然当前深度学习盛行,但在数据稀缺、需要强先验知识、或模型可解释性至关重要的场景中,图模型依然具有不可替代的价值。
📋 行动清单
- 画出朴素贝叶斯分类器的贝叶斯网络图,并写出其对应的概率分解公式。
- 在肺癌网络例子中,尝试手动计算(或编写代码验证)另一个查询,例如 。
- 思考一个你熟悉的NLP任务(如词性标注),尝试构思一个简单的贝叶斯网络来描述其中关键变量间的关系。
—— 小象教研组