斯坦福-CS228-概率图模型笔记-全-
斯坦福 CS228 概率图模型笔记(全)
001:课程介绍与预备知识




大家好,欢迎来到概率图模型课程。我是Daphne Koller,斯坦福大学的教授。我们斯坦福大学非常高兴能够向全世界任何地方的人免费提供这门研究生级别的课程。


在本节课中,我们将介绍课程的基本信息、学习所需背景以及一些重要的课程规定。概率图模型是一个融合了概率论与图论的强大框架,用于表示和推理复杂系统中的不确定性。我们将在后续视频和整个课程中详细探讨其内涵。
📚 预备知识要求
为了顺利完成本课程,你需要具备一些基础知识。以下是具体要求:
以下是核心知识要求:
- 概率论基础:课程学习离不开对基础概率论的理解。这不需要非常高级的知识,但你需要了解诸如独立性、贝叶斯规则以及离散分布的基本概念。课程也提供了一些入门模块来帮助你复习这些概念。
- 编程经验:编程作业要求你具备一定的编程经验。这不是一门编程课,我们不会教授如何编程。
- 算法与数据结构:由于本课程融合了概率论和计算机科学的思想,具备一些算法和数据结构的背景知识非常重要。
以下是推荐但非必需的知识:
我们不强求以下背景,并且会在课程进行中提供必要的介绍。
- 机器学习经验:可能有一些机器学习经验会有所帮助。
- 简单优化知识:例如梯度下降,不需要非常复杂的知识。
- MATLAB/Octave编程:有一些MATLAB或Octave的编程经验会很有帮助。如果你以前没有接触过,我们也提供了一些入门模块来帮助你学习这门编程语言。
⚖️ 课程规定与建议
了解并遵守课程规定是保证学习体验的重要一环。
以下是学术诚信规定:
本课程设有荣誉准则,这也是斯坦福本地学生上课的规范。荣誉准则规定,你可以与同学讨论课程材料,事实上我们鼓励这样做。你甚至可以就编程作业的问题进行澄清性提问。但你提交的作业必须是自己的独立成果。此外,我们要求你不要将编程作业或其解决方案发布到网络上的任何地方,以便未来的学生也能独立完成这些习题集。
以下是时间管理建议:
这是一门斯坦福研究生级别的课程,即使在斯坦福也被认为是一门有难度的课程。一名典型的斯坦福学生每周很容易在这门课上花费10到15个小时。因此,我们建议你为自己的学习至少预算出相同的时间,以免在提交截止日期临*时时间不够用。我们在提交截止日期中设置了一定的缓冲期,如果你未能在原始截止日期前提交,你有一周的宽限期,但这显然会开始影响下一周的作业。因此,我们建议你不要在整个课程期间积压作业,否则最终会带来麻烦。
以下是互动学习建议:
本课程体验的一部分是与同学互动。为此,我们设有讨论论坛,这在其他课程中已被证明是与同学互动、提问和更深入理解材料的宝贵资源。我们也鼓励你们组建学习小组,可以是与同一地理区域的人组成的线下小组,也可以是在线学习小组,彼此讨论材料。我们相信这样做会让你更好地理解材料,也会让课程变得更有趣。


🎯 课程目标总结
总而言之,通过所有这些不同的内容和练习环节,我们认为你将学习到概率图模型领域的基本方法。你还将看到并尝试一系列已应用这些方法的现实世界应用案例。希望你在完成本课程后,能够理解如何将这些思想应用到你关心的问题和你自己的工作中。我们期待在课程中见到你。


002:概述与动机

在本节课中,我们将要学习概率图模型的基本概念、其核心组成部分以及它们被设计用来解决何种问题。我们将通过具体的应用实例来理解这个框架的动机和强大之处。

什么是概率图模型?🤔
概率图模型这个名称有些拗口。在定义它之前,让我们先了解一下它可能用于解决什么问题。
概率图模型首次进入计算机科学和人工智能领域的一个典型应用是医疗诊断。设想一位医生面对一位病人。医生在观察病人时掌握着大量信息:易感因素、症状、各种检查结果。她需要根据这些信息推断病人可能患有哪些疾病,以及对不同治疗方案的可能反应。
另一个截然不同但同样应用了概率图模型的领域是图像分割。我们可能有一张包含成千上万甚至数十万个像素的图像,我们的目标是判断每个像素对应什么物体。例如,将图像分割成较大的区域(超像素)后,我们需要判断哪些区域对应草地、天空、牛或马。
这两个问题有一些共同点。首先,它们都涉及大量需要推理的变量。在医疗诊断中,变量是所有易感因素、检查结果、可能的疾病等。在图像分割中,变量是每个像素或超像素的标签。其次,这些应用本质上都存在显著的不确定性。无论我们设计的算法多么巧妙,都无法完全确定正确答案。
概率图模型正是为处理这类应用而设计的框架。
理解框架的组成部分 🔍
上一节我们看到了概率图模型的应用场景,本节中我们来仔细看看这个框架名称中每个词的含义。
模型
首先,什么是“模型”?模型是我们对世界理解的声明式表示。它是计算机内部的一种表示,捕捉了我们对这些变量是什么以及它们如何相互作用的认知。声明式意味着这种表示是独立存在的,我们可以独立于任何算法去审视和理解它。
这很重要,因为同一个模型可以被用于不同的算法,以回答不同类型的问题,或者以更高效的方式回答相同的问题,或在精度和计算成本之间做出不同的权衡。拥有独立的模型还允许我们将模型的构建与用于推理的算法分离开来。我们可以开发方法从人类专家那里获取模型,或者使用统计机器学习技术从历史数据中学习模型,或者结合两者。模型、算法和学习之间的分离使我们能够分别处理每个问题。
概率
“概率”一词的存在,是因为这些模型旨在帮助我们处理大量的不确定性。
不确定性有多种形式和来源:
- 部分知识:我们对世界状态的了解不完整。例如,医生无法测量每一个症状或检查结果,她当然不确定病人患有何种疾病。
- 噪声观测:即使我们能观察到某些事物(如血压),这些观察也常常受到显著噪声的影响。
- 建模局限:我们的模型无法涵盖所有现象。例如,可能存在各种罕见的疾病导致相同的症状集。我们不可能写出一个详尽到包含所有可能意外情况和因素的模型。
- 内在随机性:有些人认为世界本质上是随机的。至少在量子层面这是真的,即使在更高层面,复杂系统的建模局限也使得人们不妨将世界视为本质随机的。
概率论为我们提供了一种原则性的框架来处理不确定性,并带来了重要且有价值的工具。概率模型提供了声明式表示,具有清晰的语义,能表示我们对世界可能处于不同状态的不确定性。它还提供了一个工具箱,包含强大的推理模式,例如基于新证据进行条件推断或在不确定性下进行决策。此外,由于概率论与统计学的紧密联系,我们可以运用一系列强大的统计学习方法,有效地从历史数据中学习这些模型,避免了需要人工指定模型每个方面的麻烦。
图
“图”这个词来自计算机科学的视角。概率图模型是概率论、统计学与计算机科学思想的综合。其核心思想是利用计算机科学的技术,特别是图论,来表示涉及大量变量的复杂系统。我们已经在医疗诊断和图像分割的例子中看到了这些大量的变量。
为了捕捉涉及如此多因素的庞大空间上的概率分布,我们需要处理所谓的随机变量。本课程的重点是将世界表示为一组随机变量 X1, X2, ..., XN,每个变量代表世界的某个方面(例如,一个症状是否存在,一个具有连续可能值的检查结果,或一个具有多个可能标签的像素)。我们的目标是通过一个概率分布(或称联合分布)来捕捉我们对世界可能状态的不确定性,该分布描述了这组随机变量所有可能取值的概率。
需要认识到的重要一点是,即使在最简单的情况下(例如每个变量都是二值的),这也是一个在 2^N 个可能世界状态上的分布(每个状态对应一种可能的赋值组合)。因此,我们必须处理本质上呈指数级庞大的对象。我们唯一的办法是利用数据结构,在这种情况下,利用计算机科学的思想来利用分布中的结构,并以有效的方式表示和操作它。

图模型示例 📊
那么,什么是图模型?让我们看几个简单的例子。
这是一个玩具贝叶斯网络,它将伴随我们学习本课程的第一大部分。贝叶斯网络是概率图模型的两大主要类别之一,它使用有向图作为其内在表示。

在这里,随机变量 X1, ..., XN 由图中的节点表示。以这个简单的例子(我们稍后会再次讨论)为例:一名学生选修一门课程并获得成绩(这是一个随机变量)。还有其他相关的随机变量,例如学生的智力、课程的难度,以及其他可能感兴趣的变量,例如学生在这门课程中获得的推荐信质量(这可能取决于学生的成绩和SAT分数)。这是一个在这五个随机变量上的概率分布表示,图中的边以一种非常形式化的方式(我们稍后会定义)代表了这些随机变量之间的概率联系。
概率图模型的另一主要类别是马尔可夫网络,它使用无向图。在这种情况下,我们有一个在四个随机变量 A, B, C, D 上的无向图,我们稍后可能会给出这类网络的例子。
以上是玩具示例。以下是一些真实框架的例子:
- 真实贝叶斯网络:例如名为“CPCS”的网络,这是斯坦福大学设计用于内科疾病诊断的真实医疗诊断网络,包含约480个节点和900多条边。
- 真实马尔可夫网络:例如用于之前讨论的图像分割任务的网络。这里的随机变量代表像素或超像素的标签(每个超像素一个),边则代表相邻像素标签之间的概率关系(因为它们很可能相互关联)。

总而言之,图表示为我们提供了一种直观且紧凑的数据结构,用于捕捉这些高维概率分布。同时,正如我们将在课程后面看到的,它为我们提供了一套利用图结构进行高效推理的通用方法。由于图结构编码了概率分布的参数化方式,我们可以用非常少的参数有效地表示这些高维概率分布,这使得无论是从专家那里手动获取,还是从数据中自动学习,都变得可行。在这两种情况下,参数数量的减少都非常有价值。



广泛的应用领域 🌍
这个框架非常通用,已应用于非常广泛的领域。以下简要列举几个:
- 图像分割:通过构建捕捉场景全局结构及超像素间概率关系的概率图模型,可以获得比单独分类每个超像素更连贯、更准确的分割结果。
- 医疗诊断:例如,微软网络曾部署一个系统,帮助父母判断生病的孩子可能患有何种疾病。父母输入主要症状后,系统通过一系列问题,提供一个最可能诊断的概率分布。
- 文本信息抽取:从非结构化的文本(如新闻文章)中提取结构化信息(如人名、地点、组织及关系)。当前最先进的方法是将此任务构建为概率图模型,为每个单词设置一个变量来编码其标签,并捕捉相邻及非相邻单词之间的相关性。
- 多传感器数据融合:例如,整合来自道路传感器、天气信息、事故报告等多种来源的交通数据,使用从数据中学习的模型来预测当前和未来的道路速度,甚至包括那些没有安装传感器的道路。
- 生物网络重建:生物学家在不同条件和扰动下测量多种蛋白质的水*,从中学习蛋白质之间的关系,发现蛋白质之间的相互作用(包括以前未知的),从而获得新的知识。


课程内容概览 📚
让我们以对本课程学习内容的概述来结束本次介绍。

我们将涵盖与概率图模型相关的三个主要部分:
- 表示:包括有向和无向表示。我们还将讨论更高级的结构,以编码更复杂的场景,包括涉及时间结构的场景,以及涉及重复或关系结构的场景(特别是称为“盘模型”的类别)。
- 推理:使用这些模型进行推理。涵盖输出精确概率的精确推理方法,以及在精度和计算之间提供不同权衡的*似方法。我们还将讨论如何利用这类模型在不确定性下进行决策。
- 学习:如何从历史统计数据中学习这些模型。我们将讨论如何自动学习模型的参数和结构,并处理两种场景:相对简单的完全数据场景(所有变量总是被观测到),以及更困难的不完全数据场景(有些变量可能并非总是被观测到,或完全未被观测到),后者引入了一系列有趣的复杂性,但也带来了大量非常激动人心的应用。

本节课中,我们一起学习了概率图模型的基本动机、核心概念(模型、概率、图)以及其广泛的应用领域。我们了解到,概率图模型是一个强大的框架,它结合了概率论与图论,能够紧凑地表示高维不确定性,并支持高效的推理与学习。在接下来的课程中,我们将深入探讨其具体的表示方法。
003:分布

概述
在本节课中,我们将要学习概率分布的基础概念。理解概率分布是学习概率图模型的前提。我们将通过一个简单的“学生”例子,介绍联合分布、条件化、归一化和边缘化等核心操作。
联合分布与参数
在深入概率图模型的细节之前,我们需要先讨论一下什么是概率分布,以确保我们使用共同的术语。

让我们从一个非常简单的联合分布例子开始。这个例子将在课程后续部分被扩展。我们从一个仅涉及三个随机变量的例子开始,我称之为“学生”例子。
一个学生可以用一个代表其智力的变量来描述,其值可以是高或低。学生正在上一门课,这门课可能难也可能不难,这是随机变量D。智力变量I有两个值,难度变量D也有两个值。然后还有学生在这门课中获得的成绩,这是随机变量G,在这个例子中,我们假设它有A、B、C三个值。

现在,这是一个定义在这三个随机变量集合上的联合分布示例。这是 P(I, D, G) 的一个例子,它是一个联合分布。让我们思考一下这样一个联合分布中有多少个条目。因为我们有三个变量,我们需要表示这三个变量每个值组合的概率。所以我们有 2 × 2 × 3 种可能的组合,总共需要为 12 个可能的值分配概率。
因此,这个概率中有12个总参数。我将引入独立参数的概念,我们稍后会详细讨论。独立参数是其值不完全由其他参数的值决定的参数。在这个例子中,因为这是一个概率分布,我们知道右边所有这些数字的总和必须为1。因此,如果你告诉我12个中的11个,我就知道第12个是什么。所以独立参数的数量是 11。我们稍后会看到,当我们开始评估不同概率分布的相对表达能力时,这是一个有用的概念。
条件化与归一化
我们可以用概率分布做什么呢?一件重要的事情是,我们可以根据特定的观察结果对概率分布进行条件化。
例如,假设我们观察到学生得了A。因此,我们现在有了变量G的一个赋值,即 G=G1。这立即消除了所有与我的观察不一致的可能赋值。所以,除了 G=G1 的情况,其他所有情况都被排除了。

这给了我一个缩减的概率分布。这个操作被称为缩减。我取概率分布,缩减掉了与我所观察到的不一致的部分。但这本身并没有给我一个概率分布,因为请注意,这些数字的总和不再为1。在我丢弃一堆东西之前,它们的总和是1。
为了得到一个概率分布,我需要做的是归一化这个度量。“度量”这个词表明它是一种分布形式,但“未归一化”意味着它的总和不为1。这是一个未归一化的度量。如果我们想把它变成一个概率分布,显然要做的事情就是归一化它。
所以我们要做的是,取所有这些条目,把它们加起来,这将给我们一个数字,在这个例子中是 0.447。然后我们可以将每个条目除以0.447,这将给我们一个归一化的分布,在这个例子中对应于 P(I, D | G=G1)。这是一种将未归一化的度量转化为归一化概率分布的方法。我们将看到,这个操作是我们在整个课程中使用的最重要的操作之一。
边缘化
关于概率分布,我要讨论的最后一个操作是边缘化操作。这是一个对更大变量子集的概率分布进行操作,并产生一个关于这些变量子集的概率分布的过程。
在这个例子中,我们有一个关于I和D的概率分布。假设我们想要边缘化I,这意味着我们基本上要对I求和,我们将丢弃I,并将注意力限制在D上。

例如,如果我想计算 P(D=0),我将把与 D=0 相关的两个条目加起来,即对应于 I=0 的条目和对应于 I=1 的条目。这就是这个概率分布的边缘化。

总结
本节课中,我们一起学习了概率分布的基础知识。我们通过“学生”的例子,理解了联合分布及其参数数量(特别是独立参数)的概念。我们探讨了条件化操作,即根据观察结果缩减分布,并通过归一化得到条件概率分布。最后,我们介绍了边缘化操作,它用于从联合分布中获取关于部分变量的分布。这些操作是构建和理解更复杂概率图模型的基础。
004:因子

在本节课中,我们将要学习概率图模型中的一个核心概念——因子。因子是定义概率分布以及进行推理操作的基础构件。我们将了解因子的定义、常见类型以及三种基本操作:乘积、边缘化和约简。
什么是因子?🔍
因子本质上是一个函数或一个表格。它接收一组随机变量作为参数,例如 X1, X2, ..., Xk。对于这些变量的每一种可能赋值组合,因子都会给出一个实数值。这组变量被称为该因子的作用域。
用公式表示,一个因子可以写作:
φ(scope) = φ(X1, X2, ..., Xk) → ℝ
因子的类型 📊
以下是几种常见的因子类型:
- 联合概率分布:我们已经见过的一种因子。它为所有变量的每一种组合(例如
I, D, G)分配一个数值(概率)。这些数值之和为1。 - 未归一化度量:这也是一种因子。例如,概率
P(I, D, G=‘A’)。它的作用域是I和D,因为变量G被固定为常数 ‘A’。 - 条件概率分布:这是一种我们将频繁使用的因子,通常缩写为 CPD。它给出了在给定某些变量条件下,另一个变量的概率分布。例如,
P(G | I, D)。在CPD表中,每一行(对应一个特定的条件上下文)的概率值之和为1。

因子的基本操作 ⚙️
上一节我们介绍了因子的定义和类型,本节中我们来看看对因子可以进行的三种基本操作。这些操作是构建和操作高维概率分布的基础。
以下是三种核心操作:
- 因子乘积
该操作将两个因子相乘,生成一个作用域为原因子作用域并集的新因子。新因子中每个条目的值,是原两个因子中对应条目值的乘积。
公式:若φ1(A, B)和φ2(B, C),则φ3(A, B, C) = φ1(A, B) * φ2(B, C)。

-
因子边缘化
该操作通过对某个变量求和,将其从因子的作用域中“消除”,从而得到一个作用域更小的新因子。这与概率分布中的边缘化概念完全相同。
公式:若φ(A, B, C),则φ'(A, C) = Σ_{b ∈ Val(B)} φ(A, b, C)。 -
因子约简
该操作通过将某个变量固定为一个特定值,来“缩减”因子的作用域。新因子只包含原因子中满足该变量取特定值的那些行。
公式:若φ(A, B, C),则φ''(A, B) = φ(A, B, C=c1),其中c1是C的一个特定取值。
为什么因子如此重要?💡
因子之所以是概率图模型的基石,主要有两个原因:
- 构建高维分布:我们通过将许多小的因子(局部函数)相乘,来定义指数级庞大的高维联合概率分布。这避免了直接列举所有可能组合。
- 执行推理算法:我们在高维空间中对概率分布进行操纵(如计算边缘概率、条件概率)时,所依赖的基本运算正是上述的因子乘积、边缘化和约简操作。

总结 📝

本节课中我们一起学习了因子这一核心概念。我们明确了因子是一个为变量赋值返回实数值的函数,其作用域是它所依赖的变量集合。我们认识了联合分布、条件概率分布等不同类型的因子。最重要的是,我们掌握了因子的三种基本操作:乘积、边缘化和约简。理解并熟练运用这些操作,是后续学习如何用概率图模型表示复杂分布以及进行有效推理的关键。
006:推理模式

在本节课中,我们将学习贝叶斯网络支持的几种核心推理模式。我们将通过学生网络的例子,探讨因果推理、证据推理和因果间推理等概念,并理解信息如何在网络节点间流动。
定义了贝叶斯网络后,我们来看看它允许我们执行的一些推理模式。
让我们回到我们熟悉的学生网络,它包含以下条件概率分布(CPDs),这些我们已经见过了,因此不再赘述。我们来看看,如果你使用贝叶斯网络的链式法则生成联合分布,然后计算不同的边缘概率,会得到哪些概率值。
例如,我们现在要问:获得一封强推荐信的概率是多少?我们不会进行详细计算,因为将所有数字相加会很繁琐。我可以直接告诉你,P(L=1) 的概率是 0.5。
但我们可以进行更有趣的查询。我们可以对某个变量进行条件化,还记得我们讨论过条件概率分布,并询问这会如何改变概率。
例如,如果我们以“低智力”为条件,我们将用红色表示假值,结果概率不出所料地下降了,降至 0.39。因为如果智力下降,获得好成绩的概率就会下降,获得强推荐信的概率也会随之下降。
这是一个因果推理的例子,因为直观上,推理是沿着因果方向进行的,即从上到下。
我们还可以让事情变得更有趣。我们可以问,如果我们让课程难度变低(D=0)会发生什么。在这种情况下,我们有概率 P(L=1 | I=0, D=0)。你期望概率会如何变化?如果课程简单,人们会期望成绩上升。果然,概率回升了,我们大致回到了五五开。
这是因果推理的另一个例子,在这种情况下,我们有了更多证据。
你也可以进行证据推理,证据推理是从下到上的。在这种情况下,我们可以以成绩为条件,并询问其父节点或祖先节点的概率会发生什么变化。
假设这个可怜的学生参加了课程,并且他得到了一个 C。最初,课程难度高的概率是 0.4,学生智力高的概率是 0.3。但现在有了这个额外的证据,同样不足为奇,学生智力高的概率下降了相当多。但另一个假设,即课程难度高,其概率也上升了。
然而,还有一种不那么标准但很有趣的推理类型,称为因果间推理,因为它本质上是单一结果的两个原因之间的信息流动。
记住,我们将继续之前的场景,我们可怜的学生得了 C。但现在我要告诉你,等等,这门课真的很难,所以我要以 D=1 为条件。注意,学生智力高的概率上升了,从 0.08 上升到 0.11。这不是一个巨大的增长,正如你在使用贝叶斯网络时会发现的那样,概率的变化通常有些微妙。
原因是,即使在一门困难的课程中,如果你回头看看 CPD,根据这个模型,得 C 其实有点难。学生更可能得 B。所以现在我们看到,高智力的概率仍然下降了,从 0.3 下降到 0.175。但如果我告诉你这门课很难,概率就会上升,实际上,它甚至升得比这更高。这说明因果间推理实际上可以对概率产生相当显著的影响。
因果间推理有点难以理解,它似乎有点神秘。毕竟,看看难度和智力,它们之间没有边,一个原因怎么会影响另一个呢?让我们深入一个具体场景来真正理解其机制,这是最纯粹的因果间推理形式。
这里我们有两个随机变量 X1 和 X2,我们假设它们均匀分布,所以每个变量取值为 1 的概率是 50%,取值为 0 的概率是 50%。我们有一个共同的结果 Y,它简单地是其两个父节点的确定性“或”运算。通常,当我们有一个确定性变量时,我们用双线表示。
在这种情况下,只有四种赋值具有非零概率,因为 Y 的值完全由 X1 和 X2 的值决定。所以我们这里有这四种分布。现在我要以证据 Y=1 为条件。
让我们看看在我以这个证据为条件之前发生了什么。X1 和 X2 是相互独立的。当我以 Y=1 为条件时会发生什么?我们讨论过条件化,这一行消失了。我们得到 1/3, 1/3, 1/3。
在这个概率分布中,X1 和 X2 不再相互独立。为什么?因为如果我现在以 X1=0 为条件,那么……实际上,在我们这样做之前,在这个概率分布中,P(X1=1) 等于 2/3,P(X2=1) 也等于 2/3。
现在如果我以 X1=1 为条件,这意味着我们将移除这一行。突然间,P(X2=1 | X1=1) 又回到了 50%。它之前是 50%,然后上升到 2/3,然后如果我们以 X1=1 为条件,它又回到了 50%。
原因如下:直观地想一想,如果我知道 Y=1,有两种可能的情况导致 Y=1:要么 X1=1,要么 X2=1。如果我告诉你 X1=1,我就完全解释了 Y=1 这个证据,我给了你一个关于发生了什么事的完整解释。所以现在 X1 又回到了之前的状态,因为不再有任何东西表明它应该不是 50/50。
这种特定类型的因果间推理非常常见,被称为“解释消除”。它发生在一个原因解释了让我怀疑另一个原因的理由时。如果你仔细想想,这是人们在推理时经常做的事情,例如在医疗环境中:你病得很重,非常担心,不知道自己是否得了猪流感。你去看医生,医生说,哦,别担心,只是普通感冒。你并不知道自己没有得猪流感,但因为你的症状得到了解释,你就不再那么担心了。
最后,让我们回到我们的例子,看看一个涉及图中更长路径的有趣推理模式。

假设学生得了 C,但现在我们有了额外的信息:学生实际上 SAT 考了高分。让我们看看那里发生了什么。记住,当我们只有关于成绩的证据时,学生智力高的概率只有 0.08。但现在我们有了这个额外的、看似矛盾的证据,突然间概率急剧上升到 0.58。
你认为课程难度会如何变化?现在,解释消除正在以不同的方向起作用。因为如果学生得 C 不是因为他不聪明,那么原因可能是课程非常难,所以那个概率上升了。我们有效地看到了信息像那样流动。

在本节课中,我们一起学习了贝叶斯网络中的几种核心推理模式:因果推理、证据推理和因果间推理(特别是解释消除现象)。我们通过学生网络的实例,看到了信息如何沿着网络结构流动,以及条件证据如何改变我们对其他变量的信念。理解这些模式是进行有效概率推理的基础。
007:概率影响的流动

在本节课中,我们将学习贝叶斯网络中概率影响是如何流动的。我们将通过定义“活跃路径”这一核心概念,来精确地描述一个变量X何时能影响另一个变量Y。理解这一点对于后续的推理算法至关重要。
上一节我们讨论了贝叶斯网络的基本推理模式,本节中我们来看看如何更严谨地定义概率影响的流动。
无证据时的概率影响
首先,我们考虑在没有任何观测证据的情况下,变量X能否影响变量Y。以下是几种基本结构:
以下是直接连接的情况:
- 直接因果:如果X是Y的父节点,那么X可以影响Y。公式表示为:P(Y|X) ≠ P(Y)。
- 直接证据:如果Y是X的父节点(即X是Y的子节点),那么X同样可以影响Y。这体现了概率影响的对称性。
以下是间接连接的情况:
- 因果链:结构为 X → W → Y。例如,课程难度(D)影响成绩(G),成绩(G)又影响推荐信(L)。在这种情况下,X可以通过W影响Y。
- 共同原因:结构为 X ← W → Y。例如,学生智力(I)同时影响SAT分数(S)和课程成绩(G)。观测W(智力)会影响对X和Y的信念。
- 共同结果(V型结构):结构为 X → W ← Y。例如,课程难度(D)和学生智力(I)共同影响成绩(G)。这是唯一一个例外:在无证据时,X和Y相互独立,X不能影响Y。
基于以上分析,我们可以定义无证据时的“活跃路径”:一条路径是活跃的,当且仅当其中没有未被激活的V型结构。V型结构会阻断影响的流动。
有证据时的概率影响
现在,我们引入一组观测证据变量Z。问题是:在给定Z的条件下,X能否影响Y?
直接连接的情况不变。观测证据不会改变直接相连变量间的相互影响。
对于间接连接,情况变得复杂,关键在于中间变量W是否被观测。以下是当W不在证据集Z中时的情形:
- 因果链 (X → W → Y):若W未被观测,影响可以流动。
- 证据链 (X ← W ← Y):若W未被观测,影响可以流动(对称性)。
- 共同原因 (X ← W → Y):若W未被观测,影响可以流动。
以下是当W在证据集Z中(即被观测)时的情形:
- 因果链 (X → W → Y):若W被观测,影响无法流动。例如,已知成绩(G),则课程难度(D)不会改变对推荐信(L)的信念。
- 证据链 (X ← W ← Y):若W被观测,影响无法流动。
- 共同原因 (X ← W → Y):若W被观测,影响无法流动。例如,已知学生智力(I),则SAT分数(S)不会改变对成绩(G)的信念。
最后,我们来看最有趣的V型结构 (X → W ← Y):
- 若W被观测,则影响可以流动。这就是“解释消除”或“因果间推理”。例如,已知成绩差(G),那么得知课程难(D)会降低你认为学生笨(I)的概率,X和Y之间产生了关联。
- 若W未被观测,但W的某个后代节点被观测,同样会激活V型结构,使影响可以流动。例如,虽未知成绩(G),但观测到推荐信(L)很差,这间接提供了关于G的信息,从而在D和I之间建立了联系。
活跃路径的正式定义
综合以上所有情况,我们可以给出活跃路径的正式定义。
一条从X1到Xk的路径,在给定证据集Z的条件下是活跃的,当且仅当满足以下两个条件:
- 对于路径中的每一个V型结构 Xi-1 → Xi ← Xi+1,其汇聚节点Xi或Xi的至少一个后代节点包含在证据集Z中(即被“激活”)。
- 路径中所有不属于V型结构汇聚节点的其他节点,都不在证据集Z中。
简而言之,影响只能通过活跃路径在网络中流动。这一定义系统地刻画了贝叶斯网络中信息传递的所有规则。

总结

本节课中我们一起学习了贝叶斯网络中概率影响流动的规则。我们定义了“活跃路径”这一核心概念,它精确描述了在给定某些证据的条件下,一个变量的信息何时能够影响另一个变量的信念。关键要点是:V型结构在未被激活时会阻断影响,而一旦其汇聚节点或其后代被观测,它反而会成为传递影响的通道。掌握这些规则是理解后续概率推理算法的基础。
009:贝叶斯网络中的独立性

在本节课中,我们将要学习概率图模型中最优雅的特性之一:分布的因子分解与其必须满足的独立性属性之间的深刻联系。我们将重点探讨这种联系在有向图模型(即贝叶斯网络)中的具体表现。
因子分解与独立性的关联

首先,我们需要回顾为什么独立性与因子分解是相互关联的。
例如,独立性定义 P(x, y) = P(x) * P(y) 表明联合分布是两个因子的乘积,这本身也是一种因子分解。同样,我们给出的条件独立性定义之一——联合分布 P(x, y, z) 可以分解为 f(x, z) * f(y, z) 的形式——也直接对应着一种因子分解。
因此,我们看到分布的因子分解对应于该分布中成立的依赖关系。现在的问题是,如果我们知道一个分布 P 在某个图 G 上可以因子分解,那么我们能否仅通过观察图 G 的结构,就知道分布 P 必须满足哪些独立性?

影响流与 d-分离
在概率图模型中,我们讨论过“影响流”的概念,例如,一条“活跃迹”可能穿过多个节点。这为我们提供了关于概率影响如何流动的直观理解。
现在,我们可以将这个观念反过来,并提出一个问题:当图中没有活跃迹(即影响无法流动)时会发生什么?我们将使用 d-分离 这个概念来使其形式化。
我们说,在图 G 中,给定一组观测变量 Z,如果 X 和 Y 之间没有活跃迹,则 X 和 Y 是 d-分离 的。我们想要论证的是,这种“影响无法流动”的直观概念,更正式地对应于图中条件独立性的严格定义。
d-分离蕴含独立性:一个定理
以下是我们要证明的核心定理:
如果分布 P 在图 G 上可因子分解(即 P 可表示为 G 上的贝叶斯网络),并且图中存在 d-分离性质(即 X 和 Y 在给定 Z 时是 d-分离的),那么 P 满足条件独立性陈述:X ⊥ Y | Z。
换句话说,d-分离蕴含独立性。

我们不进行完整的证明,而是通过一个例子来说明推导的主要思想。
假设我们有如下贝叶斯网络 G 及其对应的因子分解(根据贝叶斯网络的链式法则):
P(D, I, G, S, L) = P(D) * P(I) * P(G | D, I) * P(S | I) * P(L | G)
我们想证明的 d-分离陈述是:D 与 S 在给定空集(即无观测)时是独立的(D ⊥ S)。首先,确认 D 和 S 之间只有一条迹 D -> G <- I -> S。由于 G 和 I 都未被观测,这条迹不是活跃的,因此 D 和 S 是 d-分离的。
现在,我们通过边缘化其他变量来推导 P(D, S):
P(D, S) = Σ_{G, L, I} P(D, I, G, S, L)
= Σ_{G, L, I} [P(D) * P(I) * P(G | D, I) * P(S | I) * P(L | G)]
通过将求和符号推入乘积中(只要不穿过涉及该变量的项),我们可以逐步简化。最终,表达式会化简为 φ1(D) * φ2(S) 的形式,这正好符合边际独立的定义,从而证明了 P 满足 D ⊥ S。
一个重要的通用独立性
基于 d-分离的概念,我们可以证明一个非常重要的通用性质:
在图中的任何节点,在给定其父节点的条件下,都独立于其所有非后代节点。
让我们以变量 L(Letter)为例。它的后代是 J 和 H。它的非后代(且非父节点)包括 D, I, S。现在,我们检查在给定其父节点 G 的条件下,L 是否与任意一个非后代(例如 S)d-分离。
- 从
S到L的迹可能向上经过I,再向下经过G。但由于G是观测条件(父节点),这条迹被阻塞。 - 另一条迹可能从
S向下经过J,再向上到L。这是一个 V 型结构S -> J <- L。要使它活跃,需要J或其后代被观测。但J是L的后代,在给定G的条件下并未被观测,因此这条迹也不活跃。
因此,L 与 S 是 d-分离的。这个论证可以推广到所有非后代节点。根据之前的定理,这意味着如果 P 在 G 上可因子分解,那么任何变量在给定其父节点时,都独立于其非后代。这为贝叶斯网络的结构选择提供了形式化的语义:一个变量只直接依赖于其父节点。
I-Map:独立性的映射
既然我们已经定义了对于任何在图上可因子分解的分布都成立的一组独立性,我们现在可以定义一个通用概念来概括这一点。

我们定义图 G 的 独立性集合 I(G),为所有对应于图中 d-分离陈述的条件独立性陈述 (X ⊥ Y | Z) 的集合。这些是图 G 所隐含的独立性。
现在,我们给出一个名称:如果分布 P 满足 I(G) 中的所有独立性,那么我们称 G 是 P 的一个 I-Map。I-Map 代表“独立性映射”,因为通过观察 G,我们可以映射出 P 中确定成立的独立性。
以下是 I-Map 的一个例子:
考虑两个分布 P1 和 P2,以及两个图:
-
G1:D和I之间没有边。 -
G2:D和I之间有边。 -
I(G1)包含{D ⊥ I}。 -
I(G2)是空集{}(不隐含任何独立性)。
检查:
- 如果
P1满足D ⊥ I,则G1是P1的 I-Map。G2也是P1的 I-Map,因为空集独立性总是成立。 - 如果
P2不满足D ⊥ I,则G1不是P2的 I-Map。但G2仍然是P2的 I-Map。
这个例子说明,一个图是某个分布的 I-Map,只要求该分布满足图所隐含的所有独立性,并不要求分布只满足这些独立性。
因子分解与 I-Map 的等价性
现在,我们可以用 I-Map 的语言重新表述并扩展之前的定理:
定理(双向):
- 因子分解 ⇒ I-Map:如果
P在G上可因子分解(即可表示为G上的贝叶斯网络),那么G是P的一个 I-Map。这意味着我们可以仅从图G的结构中,读出P必定成立的独立性,而无需了解具体参数。 - I-Map ⇒ 因子分解:如果
G是P的一个 I-Map(即P满足I(G)中的所有独立性),那么P可以在G上因子分解(即可表示为G上的贝叶斯网络)。
第二个方向的证明同样可以通过例子来理解。我们从一个通用的概率链式法则开始,然后利用图 G 所隐含的独立性(例如,变量在给定父节点时独立于非后代),来简化链式法则中的每一项,最终将其转化为贝叶斯网络特有的因子分解形式。这证明了从独立性假设可以推导出因子分解的形式。
总结
本节课中,我们一起学习了关于图结构的两种等价观点:

-
因子分解观点:将图视为一种数据结构,它告诉我们联合分布
P如何被分解为更小的、定义在局部(节点及其父节点)上的因子(条件概率分布 CPDs)。公式表示为:P(X1, ..., Xn) = Π_i P(Xi | Parents_G(Xi)) -
I-Map 观点:将图视为一个独立性映射。图
G的结构编码了一系列必须在于任何与之兼容的分布P中的条件独立性陈述。如果P满足所有这些独立性,则G是P的 I-Map。

我们已经证明,这两种观点是等价的:一个分布能在某个图上因子分解,当且仅当该图是该分布的 I-Map。这种等价性非常强大,它意味着如果我们知道一个分布被表示为某个贝叶斯网络,我们就可以仅通过观察图的结构(无需查看参数),就知道该分布必须满足哪些独立性。独立性信息极具价值,它能告诉我们变量间的影响路径、在观察到某些信息后其他变量可能如何变化,极大地帮助我们理解分布的结构以及不同观测所带来的后果。
010:朴素贝叶斯模型


在本节课中,我们将要学习贝叶斯网络的一个子类——朴素贝叶斯模型。我们将了解其基本结构、核心假设、两种常见变体及其应用场景。
概述
朴素贝叶斯模型是贝叶斯网络的一个子类,因其做出了非常“朴素”且过于简化的条件独立性假设而得名。尽管假设很强,但它在模型复杂度的权衡曲线上占据了一个有趣的位置,并且在某些情况下表现出惊人的实用性。
模型结构与假设

上一节我们介绍了贝叶斯网络的一般形式,本节中我们来看看朴素贝叶斯模型的具体结构。
朴素贝叶斯模型通常用于分类任务。在一个实例中,我们观察到一组特征(通常是全部特征),目标是推断该实例属于有限类别集合中的哪一个类别。在模型中,特征变量是观测到的,而类别变量通常是隐藏的。
该模型的核心假设是:在给定类别变量 C 的条件下,任意两个特征变量 Xi 和 Xj 是条件独立的。这意味着,一旦知道了实例的类别,任何一个特征都不会提供关于其他特征的信息。
这个假设将整个模型的参数化简化为只需要编码类别变量与每个单一特征之间的成对交互。
根据贝叶斯网络的链式法则,该模型的联合分布 P(C, X1, ..., Xn) 可以写成如下乘积形式:
P(C, X1, ..., Xn) = P(C) * ∏ P(Xi | C)
其中,P(C) 是类别变量的先验概率,P(Xi | C) 是给定类别下每个特征的条件概率。
为了更好地理解模型,我们可以考察在给定一组特定观测特征值 (X1, ..., Xn) 时,两个不同类别 c1 和 c2 的概率比值:
P(C=c1 | X) P(C=c1) ∏ P(Xi | C=c1)
------------ = -------- * -----------------
P(C=c2 | X) P(C=c2) ∏ P(Xi | C=c2)
这个比值可以分解为两项的乘积:第一项(绿色部分)是两个类别的先验概率之比;第二项(蓝色部分)是一系列“优势比”的乘积,它表示在某个类别下观察到特定特征值相对于另一个类别的可能性。
文本分类中的应用
朴素贝叶斯模型的一个常见应用领域是文本分类。我们的目标是判断一个文档属于哪个预定义的类别(例如,宠物、金融、度假)。
以下是两种常用于文本分类的朴素贝叶斯模型变体:
伯努利朴素贝叶斯模型
这种模型为词典中的每一个单词定义一个二元随机变量。例如,如果词典包含约10,000个单词,我们就对应有10,000个特征变量。每个变量取值为1(表示该单词在文档中出现)或0(表示未出现)。
每个特征变量的条件概率分布(CPD)表示在给定文档类别下,该单词出现的概率。例如,在“宠物”类文档中,“猫”这个词出现的概率可能很高;而在“金融”类文档中,“买入”和“卖出”出现的概率则更高。
它被称为“伯努利”模型,因为每个特征变量都服从伯努利分布。其“朴素”性体现在它假设:在已知文档类别的前提下,任意两个单词是否出现是相互独立的。这个假设显然过于简化,但在实际性能上往往是一个不错的*似。
多项式朴素贝叶斯模型
这种模型的特征变量不是词典中的单词,而是文档中的单词位置。如果文档有N个单词,就有N个随机变量。每个变量的取值是该位置实际出现的单词(来自一个大小为|V|的词典)。
这看起来是一个更复杂的模型,因为我们需要为文档中的每一个位置指定一个在词典上的概率分布。为了简化,我们假设所有位置的条件概率分布是相同的。也就是说,第一个位置出现某个单词的概率与第二个、第三个位置相同。
它被称为“多项式”模型,因为每个特征变量(单词位置)服从一个多项式分布(所有单词的概率之和为1)。其“朴素”性体现在它假设:在已知文档类别的前提下,文档中任意两个位置的单词是相互独立的。这个假设同样很强,忽略了常见的词组搭配,但在许多实际应用(包括文档分类)中仍然是有效的*似方法。
总结

本节课中我们一起学习了朴素贝叶斯模型。
朴素贝叶斯为分类问题提供了一个非常简单的解决方案。它计算效率高,模型易于通过手工或机器学习技术构建。在处理具有大量弱相关特征的领域(如文本)时,它常常表现出令人惊讶的效果。

另一方面,我们所讨论的强独立性假设——即给定类别下各特征条件独立——也限制了模型的性能,尤其是在存在多个高度相关特征的情况下。
011:应用-医学诊断
在本节课中,我们将学习贝叶斯网络在诊断领域,特别是医学诊断和故障诊断中的经典应用。我们将回顾一个名为Pathfinder的里程碑式系统的发展历程,并探讨贝叶斯网络相较于其他方法(如基于规则的系统)的优势。
贝叶斯网络在诊断中的应用概述

贝叶斯网络最早且至今仍被广泛应用的领域之一是诊断,这包括医学诊断和故障诊断。这一应用可追溯到20世纪90年代初,以Heckerman等人的博士论文和Pathfinder系统为代表。
Pathfinder系统的演进
Pathfinder系统旨在整合多种证据,帮助医生诊断一系列疾病,最初专注于淋巴结病理学。它涉及60种不同的疾病和多种症状,并尝试了多种方法来解决诊断问题。

基于规则系统的尝试

在贝叶斯网络普及之前,研究团队首先尝试了基于规则的系统。这种方法效果并不理想。
朴素贝叶斯模型的引入
Pathfinder的第二版采用了朴素贝叶斯模型。该模型假设在给定疾病的情况下,所有症状都是相互独立的。即便如此简单的模型,其性能也优于最初尝试的基于规则的系统。

知识工程的改进
Pathfinder 3仍然使用朴素贝叶斯模型,但通过改进知识工程提升了性能。研究团队深入理解了影响此类系统性能的关键因素并进行了修正。

以下是知识工程中的关键改进点:
- 避免零概率:对于任何概率模型系统,性能的一个根本性要求是不要输入零概率(定义性情况除外)。因为一旦概率为零,无论出现多少相反证据,该概率值都无法被更新(任何数乘以0仍是0)。在Pathfinder 2中,他们为一些可能性极低但并非不可能的事件设置了不正确的零概率,这导致了系统约10%的错误诊断。
- 改进条件概率校准:条件概率的校准对于贝叶斯网络的知识工程至关重要。例如,让医生比较同一证据在不同疾病下的概率,比比较同一疾病下不同证据的概率要容易得多。当医生以这种方式进行校准时,他们能得到更准确的概率估计。需要指出的是,当时还没有自动学习技术,所有概率都是手工构建的。
完整贝叶斯网络的应用
Pathfinder 4采用了完整的贝叶斯网络,不再对给定疾病下不同症状间的独立性做出错误假设。这使模型更加正确,并带来了一个意想不到的副作用:允许一个症状变量拥有多个父节点(而不仅仅是单个疾病变量),实际上使得概率估计更加准确,因为医生可以考虑不同的具体情况,而不必在脑海中将所有情况*均化。

完整贝叶斯网络的表现非常出色。在一个由医生组成的专家小组评估的53个疑难病例中,贝叶斯网络模型与专家意见在50个病例上达成一致。相比之下,朴素贝叶斯模型在47个病例上与专家一致,而基于规则的系统则少得多。
一个有趣且重要的方面是,贝叶斯网络的表现甚至超过了构建该模型的医生本人。虽然它没有超越整个专家小组,但优于构建它的医生,因为它能更好地整合所有数据,而医生无法同时将所有不同的发现纳入大脑进行综合处理。
大规模网络的参数挑战
我们以CPCS网络为例,这是一个包含约500个变量的大型网络,每个变量*均有4个取值。

如果为这个网络指定一个完整的联合分布,参数数量将是 4^500(约等于 2^1000),这是一个天文数字,显然无法实现。
即使为每个变量构建条件概率分布(CPD),参数数量也高达约1.33亿,虽然比 2^1000 好得多,但仍然过于庞大。
因此,研究团队采用了额外的简化假设(我们将在后续课程中讨论),使他们能够避免使用完整的CPD表格表示,转而采用更紧凑的表示方式,最终将参数数量减少到约8000个。这个数量虽然仍然很大,但已经是可处理的了。
诊断系统的现状与优势

医学诊断系统已经从研究走向应用,微软等公司都构建过此类系统。然而,它们在医疗领域的普及相对缓慢,因为不太符合医生传统的工作流程。随着电子健康记录的普及,未来这些系统可能会更常见。

相比之下,故障诊断是这些系统更直接的应用领域。例如,在Windows操作系统中,有成千上万个内置的“故障排除器”,用于诊断打印机、Excel、电子邮件等问题,每个排除器内部都有一个小型贝叶斯网络,根据用户观察到的现象计算各种问题的概率。
此外,也存在大型网站利用贝叶斯网络进行汽车维修诊断。用户输入汽车的品牌、型号、年份以及主要问题,系统会推断出最可能的原因并告知用户需要检查什么。
人们选择使用贝叶斯网络进行故障诊断,不仅仅是因为它“酷”,更是因为它提供了非常灵活的用户界面和易于维护的设计。
- 对用户灵活:用户可以在贝叶斯网络中随时输入证据(观察结果)并获取概率。如果暂时不想回答某个问题,可以稍后再答,系统会将其视为尚未获得观察值的变量。
- 对设计者易维护:如果系统结构发生微小变化(例如打印机结构更新),在基于规则或硬编码的菜单系统中,可能需要重建整个决策树。而在贝叶斯网络中,可能只需要修改一个概率或增加一条边,所有推断结果都会自动、直接地随之更新,这使得系统更加模块化,更易于维护。这也是使用者选择贝叶斯网络而非硬编码方法的主要原因。
总结

本节课我们一起学习了贝叶斯网络在诊断领域的经典应用。我们回顾了Pathfinder系统从基于规则方法、朴素贝叶斯模型到完整贝叶斯网络的演进过程,看到了完整模型在准确性上的显著优势。我们还探讨了处理大规模网络时的参数挑战,以及贝叶斯网络在故障诊断等实际应用中因其灵活性和易维护性而备受青睐的原因。
012:知识工程示例-SAMIAM

在本节课中,我们将通过一个具体的网络示例,学习如何构建和理解贝叶斯网络。我们将使用SAMIAM工具,以一个简化的保险风险评估模型为例,探讨条件概率分布(CPD)的设定、网络的扩展以及如何进行因果推理。
网络结构与核心变量
首先,我们来看一个基础网络。核心变量是Cost,它代表保险公司每年需要为投保人支付的费用。为了简化,我们将其定义为只有两个取值的离散变量:low(低)和high(高)。
公式表示:
Cost ∈ {low, high}
扩展对话:添加父节点
根据“扩展对话”的技术,我们需要找出影响Cost的主要因素。一个关键因素是Accident(事故),它有三个取值:none(无)、mild(轻微)和severe(严重)。
以下是Accident变量的概率分布:
none: 0.85mild: 0.10severe: 0.05
现在,我们来看Cost在给定Accident情况下的条件概率表(CPD)。请注意,在SAMIAM中,条件变量(Accident)通常显示为列。
代码/表格表示:
| Cost \ Accident | none | mild | severe |
|---|---|---|---|
| low | 0.99 | 0.70 | 0.10 |
| high | 0.01 | 0.30 | 0.90 |
从表中可以看出,若无事故,成本极有可能是低的;若发生严重事故,成本有90%的概率是高的。
进一步扩展网络
上一节我们介绍了事故对成本的影响,本节中我们来看看事故本身又受哪些因素影响。我们为Accident添加了三个父节点:
- DriverQuality(驾驶员质量):
good(好)或bad(差)。 - VehicleSize(车辆尺寸):
SUV(运动型多用途车)或compact(紧凑型车)。 - VehicleYear(车辆年份):
after 2000(2000年后)或before 2000(2000年前)。
现在,Accident的CPD变得更为复杂,因为它有3个父节点,每个有2个取值,共形成2x2x2=8种条件组合。
以下是其中一个条件组合的概率示例:
- 当
VehicleYear = after 2000,VehicleSize = SUV,DriverQuality = good时:P(Accident = none) = 0.85P(Accident = mild) = 0.12P(Accident = severe) = 0.03
如果我们将VehicleSize改为compact,而其他条件不变,概率分布会发生变化,这反映了不同车型可能带来的不同驾驶模式和风险。
进行因果推理
有了这个网络,我们可以进行一些简单的因果推理。例如,我们可以固定DriverQuality的值,观察其对Cost和Accident概率的影响。
推理示例:
- 当
DriverQuality = bad时:P(Cost = low) = 81%P(Accident = none) = 下降,P(Accident = mild/severe) = 上升
- 当
DriverQuality = good时:P(Cost = low) = 87%P(Accident = none) = 87.5%
需要注意的是,这些概率变化可能看起来不大,但对于拥有数十万客户的保险公司来说,几个百分点的差异会对利润产生重大影响。
处理不可观测变量:添加子节点


DriverQuality是一个难以直接观测的变量。为了获得关于它的证据,我们可以添加一个可观测的子节点,例如DrivingHistory(驾驶历史),其取值为previous accident(有事故史)或no previous accidents(无事故史)。
在因果结构中,DriverQuality是DrivingHistory的原因(即驾驶质量影响历史记录),因此将DrivingHistory作为DriverQuality的子节点更为合理。这种结构也便于未来添加其他指示变量(如交通违规记录)。
探索更复杂的网络
现在,让我们观察一个更完整的网络。除了上述变量,我们还添加了:
- 车辆属性:如是否配备防抱死刹车系统(Anti-Lock Brakes)和安全气囊(Airbag),这些会影响事故概率。
- 驾驶员属性:
ExtraTraining(额外培训):可提升DriverQuality。Age(年龄):假设年轻人更易冒险。Focused(专注度):影响DriverQuality。
- 可观测的指示变量:
GoodStudent(是否是好学生),作为Age和Focused的子节点,用于间接推断人格类型。
以下是GoodStudent的一个CPD示例片段:
- 当
Age = young,Focused = focused时,P(GoodStudent = yes)很高。 - 当
Age = old时,P(GoodStudent = yes)很低,因为年长者很可能不是学生。
分析复杂的推理模式
利用完整网络进行查询,有时会得到反直觉的结果,这揭示了贝叶斯网络中推理路径的复杂性。
示例分析:
- 首先,我们查询
Accident的先验概率:P(none) ≈ 79.5%,P(severe) ≈ 3%。 - 然后,我们观测到
GoodStudent = yes。结果发现,P(Accident = none)反而下降到了78%,P(severe)上升到了3.67%。 - 原因:存在两条活跃的推理路径:
- 路径A(降低事故率):
GoodStudent -> Focused -> DriverQuality -> Accident。观察到是好学生,可能暗示其更专注,从而提高驾驶质量,降低事故率。 - 路径B(提高事故率):
GoodStudent <- Age -> DriverQuality -> Accident。观察到是好学生,同时提高了该人是young(年轻人)的概率,而年轻人本身事故风险较高。这条路径的影响压过了路径A。
- 路径A(降低事故率):
- 验证:如果我们同时观测
Age = young和GoodStudent = yes,就阻断了路径B(因为Age已被固定)。此时,再观测GoodStudent = yes,就会通过路径A使P(Accident = none)从77%上升到78%,这与我们的直觉一致。

本节课中我们一起学习了如何从简单变量开始,逐步构建一个贝叶斯网络。我们理解了如何通过添加父节点和子节点来扩展模型,以纳入更多领域知识。更重要的是,我们通过实例看到了贝叶斯网络中的推理如何通过多条路径进行,这些路径可能相互抵消或增强,导致复杂的概率变化。在设计网络时,测试各种查询以验证其行为是否符合预期至关重要。
015:数据运算

在本节课中,我们将学习如何在Octave中对数据进行计算操作。这些操作是后续实现机器学习算法的基础。
上一节我们介绍了如何加载、保存数据以及将数据放入矩阵。本节中我们来看看如何对这些矩阵进行各种数学运算。
矩阵运算
首先,我们初始化一些矩阵变量用于示例。
A = [1 2; 3 4; 5 6]; % 3x2 矩阵
B = [11 12; 13 14; 15 16]; % 3x2 矩阵
C = [1 1; 2 2]; % 2x2 矩阵
矩阵乘法
要计算两个矩阵的乘积,例如 A * C,可以直接使用乘号。
A * C
这是一个3x2矩阵乘以2x2矩阵,结果得到一个3x2矩阵。
元素级运算
在Octave中,点号 . 通常用于表示元素级操作。例如,A .* B 会对 A 和 B 的每个对应元素进行相乘。
A .* B
第一个元素计算为 1*11=11,第二个为 2*12=24,依此类推。
元素级运算也适用于其他操作。例如,对矩阵 A 进行元素级*方:
A .^ 2
结果中,1 的*方是 1,2 的*方是 4,等等。
向量运算
我们定义一个列向量 V。
V = [1; 2; 3];
以下是针对向量的元素级运算示例:
- 倒数:
1 ./ V计算每个元素的倒数。 - 对数:
log(V)计算每个元素的自然对数。 - 指数:
exp(V)计算每个元素的指数值(e的幂)。 - 绝对值:
abs([-1; 2; -3])返回每个元素的绝对值。 - 取负:
-V相当于-1 * V。
一个实用技巧是给向量所有元素加1。一种方法是构造一个全1向量相加:
V + ones(length(V), 1)
更简单的方法是直接使用 V + 1,Octave会自动进行元素级加法。
更多矩阵操作
转置
使用单引号 ‘ 来计算矩阵的转置。
A‘
再次转置将返回原矩阵 A。
最大值和索引
对于向量,max(a) 返回最大值,[val, ind] = max(a) 同时返回最大值及其索引。
a = [1 15 2 0.5];
[max_val, max_index] = max(a); % max_val = 15, max_index = 2
对于矩阵,max(A) 默认返回每列的最大值。
比较与查找
a < 3 会进行元素级比较,返回一个由0(假)和1(真)组成的逻辑数组。
a < 3 % 返回 [1 0 1 1]
find(a < 3) 会返回满足条件(值小于3)的元素的索引。
find(a < 3) % 返回 [1 3 4]
对于矩阵,find(A >= 7) 返回满足条件的元素的行列索引。
A = magic(3); % 生成3x3幻方矩阵
[row, col] = find(A >= 7);
其他实用函数
以下是处理矩阵和向量的其他常用函数:
sum(a):对所有元素求和。prod(a):对所有元素求积。floor(a):向下取整。ceil(a):向上取整。rand(3):生成3x3的随机矩阵。
对于矩阵,max(A, [], 1) 指定计算每列的最大值(第一维度),max(A, [], 2) 计算每行的最大值。
max(A, [], 1); % 列最大值
max(A, [], 2); % 行最大值
要找出整个矩阵的最大值,可以使用 max(max(A)) 或将矩阵转换为向量 max(A(:))。
幻方矩阵示例
幻方矩阵的每行、每列及对角线之和相等。以9x9幻方为例:
A = magic(9);
sum(A, 1)计算每列之和,验证它们是否相等。sum(A, 2)计算每行之和。- 要计算主对角线之和,可以将其与单位矩阵进行元素相乘,然后求和:
sum(sum(A .* eye(9)))
- 计算反对角线之和可以使用
flipud函数翻转单位矩阵后类似操作:
sum(sum(A .* flipud(eye(9))))
矩阵求逆
使用 pinv(A) 函数来计算矩阵的逆(伪逆)。
A = magic(3);
temp = pinv(A);
temp * A % 结果应*似为单位矩阵
本节课中我们一起学习了Octave中各种核心的数据运算操作,包括矩阵乘法、元素级运算、转置、查找、求和以及求逆等。掌握这些计算是编写机器学习算法的重要步骤。

在下一节中,我们将学习如何用一两行代码快速可视化数据,这有助于更好地理解算法的运行结果。
016:数据绘图 📊
在本节课中,我们将学习如何在Octave中进行数据绘图。数据可视化是开发学习算法时的重要工具,它能帮助你直观地理解算法行为、检查运行状态,并启发改进思路。
上一节我们介绍了Octave的基本操作,本节中我们来看看如何使用其强大的绘图功能。
基础绘图

Octave的plot函数是绘图的基础工具。首先,我们生成一些数据并绘制简单的图形。
T = [0:0.01:0.98];
y1 = sin(2*pi*4*T);
plot(T, y1);


这段代码创建了一个从0到0.98的数组T,并计算了对应的正弦函数值y1。plot(T, y1)命令会生成一个以T为横轴、y1为纵轴的图形,显示正弦波形。

在同一图形上绘制多条曲线

有时我们需要比较多个数据集。以下是绘制并叠加多条曲线的方法。
y2 = cos(2*pi*4*T);
plot(T, y1);
hold on;
plot(T, y2, 'r');

首先计算余弦函数值y2。plot(T, y1)绘制正弦曲线。hold on命令允许后续绘图叠加在当前图形上,而不是替换它。plot(T, y2, 'r')则用红色(‘r’代表red)绘制余弦曲线。
图形标注与美化
为了使图形更清晰易懂,我们可以添加标签、图例和标题。
以下是添加图形标注的命令:
xlabel('time');
ylabel('value');
legend('sin', 'cos');
title('My Plot');
xlabel('time'):为横轴添加标签“time”。ylabel('value'):为纵轴添加标签“value”。legend('sin', 'cos'):在图形右上角添加图例,区分正弦和余弦曲线。title('My Plot'):为图形添加标题“My Plot”。

保存与关闭图形

完成绘图后,你可能需要保存图形文件或关闭图形窗口。


print -dpng 'myPlot.png';
close;


print -dpng 'myPlot.png':将当前图形保存为PNG格式的文件,名为“myPlot.png”。Octave也支持其他格式,可通过help plot查看。close:关闭当前的图形窗口。
管理多个图形窗口

当需要同时查看多个图形时,可以使用figure命令创建和管理不同的图形窗口。
figure(1); plot(T, y1);
figure(2); plot(T, y2);

figure(1)创建或切换到编号为1的图形窗口并绘图。figure(2)则创建或切换到编号为2的新窗口进行绘图。这样,桌面上就会同时显示两个独立的图形窗口。


子图绘制
subplot命令允许在一个图形窗口内创建多个子图,便于对比。
subplot(1,2,1);
plot(T, y1);
subplot(1,2,2);
plot(T, y2);
axis([0.5 1 -1 1]);
subplot(1,2,1):将图形区域划分为1行2列,并激活第一个子图区域。随后的plot命令将在该区域绘图。subplot(1,2,2):激活第二个子图区域。axis([0.5 1 -1 1]):设置当前活动子图(第二个)的坐标轴范围,横轴为[0.5, 1],纵轴为[-1, 1]。
可视化矩阵
除了曲线,Octave还能将矩阵可视化为颜色网格,这对于理解矩阵结构很有帮助。
A = magic(5);
imagesc(A);
colorbar;
colormap gray;
A = magic(5):生成一个5x5的幻方矩阵A。imagesc(A):将矩阵A显示为图像,不同数值对应不同颜色。colorbar:在图形旁添加颜色条,显示颜色与数值的对应关系。colormap gray:将颜色映射设置为灰度色图。
你可以尝试用magic(15)生成更大的矩阵进行可视化。
命令串联技巧
在Octave中,可以使用逗号或分号在一行内串联多个命令。
a = 1, b = 2, c = 3
a = 1; b = 2; c = 3;
- 使用逗号
,分隔命令时,每个命令的结果都会打印出来。 - 使用分号
;分隔命令时,会执行命令但不打印输出。这在需要执行多个命令(如imagesc(A), colorbar, colormap gray;)但又不想让中间结果刷屏时非常有用。
本节课中我们一起学习了Octave中数据绘图的核心方法,包括基础绘图、图形叠加、标注美化、保存管理、多窗口与子图操作、矩阵可视化以及命令串联技巧。掌握这些可视化工具,将极大地助力你理解和改进机器学习算法。

在接下来的课程中,我们将学习Octave中的控制语句(如if、while、for)以及如何定义和使用函数。
017:控制语句与函数定义 🧮

在本节课中,我们将学习如何在Octave中编写控制语句(如for、while、if)以及如何定义和使用函数。这些是构建复杂程序的基础。
1. for循环 🔄
for循环用于重复执行一段代码固定的次数。以下是其基本语法。
首先,我们创建一个10x1的零向量v:
v = zeros(10, 1);
现在,我们使用for循环为向量v的每个元素赋值:
for i = 1:10
v(i) = 2^i;
end
执行后,v将包含2的1到10次幂。代码中的缩进是为了提高可读性,Octave并不强制要求。
另一种写法是使用索引数组:
indices = 1:10;
for i = indices
disp(i);
end
这与直接使用1:10的效果相同。在循环内部,你也可以使用break和continue语句。
2. while循环与if语句 ⚙️
上一节我们介绍了for循环,本节中我们来看看while循环和if语句。
首先,重置向量v并初始化索引i:
v = [1; 2; 4; 8; 16; 32; 64; 128; 256; 512];
i = 1;
使用while循环修改前五个元素:
while i <= 5
v(i) = 100;
i = i + 1;
end
循环结束后,v的前五个元素将变为100。

接下来是一个结合while、if和break的例子:
i = 1;
while true
v(i) = 999;
i = i + 1;
if i == 6
break;
end
end
这个无限循环会在i等于6时通过break语句跳出,最终将v的前五个元素设置为999。注意,这里有两个end,分别结束if语句和while语句。
3. if-elseif-else语句 🧭
if语句可以根据条件执行不同的代码块。以下是其完整语法。
假设我们有一个变量v1:
v1 = 2;

使用if-elseif-else结构进行判断:
if v1 == 1
disp(‘The value is one.’);
elseif v1 == 2
disp(‘The value is two.’);
else
disp(‘The value is not one or two.’);
end
由于v1等于2,程序会输出“The value is two.”。
最后,你可以使用exit或quit命令退出Octave。
4. 函数的定义与调用 📁
控制语句是程序的骨架,而函数则是可复用的功能模块。本节我们学习如何定义和调用函数。
函数在Octave中定义在以.m为扩展名的文件中。建议使用专业的文本编辑器(如Notepad++)来编写,以避免格式问题。
以下是一个简单的函数示例,文件名为squareThisNumber.m:
function y = squareThisNumber(x)
y = x^2;
end
第一行定义了函数名、返回变量y和输入参数x。函数体计算x的*方并赋值给y。
要调用此函数,需要确保Octave的当前工作目录包含该文件:
cd ‘C:\Users\AG\Desktop’ % 切换到文件所在目录
squareThisNumber(5) % 调用函数,返回25
对于熟悉“搜索路径”概念的用户,可以使用addpath命令将目录添加到路径中,这样在任何目录下都能调用该函数。



5. 返回多个值的函数 📤

Octave的一个强大特性是允许函数返回多个值。
定义一个返回*方和立方的函数squareAndCubeThisNumber.m:
function [y1, y2] = squareAndCubeThisNumber(x)
y1 = x^2;
y2 = x^3;
end
函数定义中的[y1, y2]表明它将返回两个值。

调用方法如下:
[a, b] = squareAndCubeThisNumber(5);
执行后,a等于25,b等于125。
6. 实战:计算成本函数 🎯

最后,我们通过一个更复杂的例子来巩固所学知识:定义一个计算线性回归成本函数的函数。
首先,准备数据。假设我们有三个训练样本(1,1), (2,2), (3,3):
X = [1 1; 1 2; 1 3]; % 设计矩阵,第一列为截距项
y = [1; 2; 3]; % 目标值
theta = [0; 1]; % 参数向量
函数costFunctionJ.m定义如下:
function J = costFunctionJ(X, y, theta)
% X为设计矩阵,y为目标值向量,theta为参数向量
% 返回成本函数J的值
m = size(X, 1); % 训练样本数量
predictions = X * theta; % 计算预测值
sqrErrors = (predictions - y).^2; % 计算*方误差
J = 1/(2*m) * sum(sqrErrors); % 计算成本函数
end
函数计算了预测值与实际值之间的均方误差的一半。
现在调用它进行计算:
J = costFunctionJ(X, y, theta); % theta=[0;1]时,完美拟合,J=0
J = costFunctionJ(X, y, [0;0]); % theta=[0;0]时,J=2.333
当theta = [0;1]时,假设函数完美拟合数据,成本J为0。当theta = [0;0]时,计算得到的J约为2.333,这与手动计算(1^2+2^2+3^2)/(2*3)的结果一致,验证了函数的正确性。



总结 📝
本节课中我们一起学习了Octave编程的核心控制流和函数定义:
- 使用
for循环 进行固定次数的迭代。 - 使用
while循环 和if语句 实现条件判断和循环控制,并了解了break的用法。 - 掌握了
if-elseif-else多分支条件判断结构。 - 学会了如何通过创建
.m文件 来定义函数,以及如何调用它们。 - 探索了Octave函数可以返回多个值的特性。
- 通过一个计算线性回归成本函数的实战例子,综合应用了向量化运算和函数定义。

在接下来的课程中,我们将了解如何提交作业,并学习向量化这一关键技巧,它能让你的Octave程序运行得更快。
019:编程练习操作与提交指南 🖥️
在本节中,我们将学习如何完成课程中的编程作业,并使用提交系统来即时验证你的答案是否正确。我们将一步步演示从打开Octave环境到成功提交作业的完整流程。
概述

我们将首先定位到作业文件所在的目录,然后编辑指定的函数文件以完成练习。接着,我们会运行代码来测试其正确性。最后,我们将使用submit命令将作业提交到课程服务器,并立即获得反馈。
操作步骤详解
以下是完成并提交编程练习的具体步骤。
1. 定位作业目录
首先,我们需要在Octave窗口中导航到存放第一次练习文件的目录。例如,目录路径可能是~/Desktop/Mlclass-Ex1/。
cd ~/Desktop/Mlclass-Ex1/
2. 编辑作业文件
我们提供了多个文件,其中一些需要你进行编辑。首要步骤是阅读本次练习的详细PDF说明文件以了解具体要求。
第一个需要编辑的文件是warmUpExercise.m。这个热身练习的目的是确保你熟悉提交系统。你只需要让该函数返回一个5x5的单位矩阵。
解决方案是修改warmUpExercise.m文件中的代码,使其生成并返回一个5x5的单位矩阵。在Octave中,单位矩阵可以通过函数eye(5)创建。
% 在 warmUpExercise.m 文件中
function A = warmUpExercise()
A = eye(5); % 返回 5x5 单位矩阵
end
编辑完成后,请保存文件。
3. 测试代码
返回Octave命令行窗口,确保你已切换到正确的目录。然后,你可以运行刚修改的函数来测试它是否按预期工作。
% 调用函数
warmUpExercise()
如果代码正确,命令行将显示一个5x5的单位矩阵。


4. 提交作业
测试无误后,即可提交作业。在Octave命令行中,输入submit命令。
submit
系统会启动提交流程。首先,它会提示你选择要提交的部分(例如,第一部分)。
接下来,系统会要求你输入在课程网站上注册的电子邮箱地址和提交密码。

- 电子邮箱地址: 例如
AG@cs.stanford.edu。 - 提交密码: 这是一个专门用于提交作业的密码。你可以在课程网站的个人账户页面找到它(例如
9YC75USGF)。你也可以使用你的常规网站登录密码,但出于安全考虑(因为密码在Octave窗口中以明文显示),课程提供了这个专门的提交密码。
输入信息后,系统会连接到服务器并提交你的代码。
5. 查看提交结果
提交完成后,系统会立即给出反馈。
- 如果答案正确,你会看到类似“Congratulations! You have successfully completed part 1.”的祝贺信息。
- 如果答案不正确,系统会提示你尚未答对,你需要检查并修改代码后重新提交。

关于提交密码的补充说明:你可以在课程网站上生成新的提交密码。由于在Octave脚本中输入时,密码可能会根据操作系统的不同而显示或隐藏,使用这个专门的密码可以避免泄露你的主网站密码。
总结
本节课我们一起学习了完成和提交编程作业的标准流程。我们首先定位并编辑了作业文件,然后测试了代码功能,最后使用submit命令成功提交了作业并获得了即时反馈。掌握这个流程对于顺利完成后续所有编程练习至关重要。
在下一个也是最后一个Octave教程视频中,我们将介绍向量化,这是一种可以大幅提高你Octave代码运行效率的技术。
020:模板模型概述
在本节课中,我们将要学习概率图模型的一个重要扩展——模板模型。这种模型旨在处理一类广泛的情况,即我们不仅希望为特定应用构建一个图模型,更希望获得一种通用表示法,以便使用同一个模型解决多个问题。
为了更具体地理解其含义,让我们回顾之前讨论过的遗传继承例子。这可以说是贝叶斯网络推理的最早例子,甚至早于贝叶斯网络本身的发明。在这个例子中,我们有一个家谱作为输入。




家谱是一个家族树,我们关注于推理某个特定性状。对于每个家谱和每个性状,我们都可以构建一个贝叶斯网络,这个网络可能看起来像这样。
然而,如果你的家谱稍有不同,例如突然多了三个表亲和一个曾祖父,或者你面对的是一个完全不同的家族,你仍然希望使用与构建第一个网络时相同的思路和组件,因为它们在结构上显然有很多共同之处。这就是模型之间的共享。
此外,在这个例子中,模型内部也存在相当明显的共享。例如,描述赛拉基因型如何影响其血型的条件概率分布(CPD),很可能与描述玛吉、丽莎、巴特、霍默等所有人的基因型影响其血型的过程是相同的。
因此,我们在依赖模型和参数上都存在大量的共享。同样地,你可能会发现,决定巴特基因型的遗传继承模型,同样适用于丽莎、玛吉、玛吉和赛拉等人。
所以,我们再次看到,不仅在模型之间,在模型内部也存在大量参数的共享。因此,我们希望有一种方法来构建具有这种大量共享结构的模型,这既能让我们用稀疏的参数化来构建非常大的模型,也能让我们从一个简洁的表示中构建出整个模型家族。


这并非唯一的应用场景。实际上,最常用的图模型类型就是那些具有共享结构和共享参数的模型。以下是另一个我们之前见过的例子,它用于自然语言处理,具体是一个用于命名实体识别的序列模型。
这是一个图模型常用的非常普遍的任务。这里同样有一个序列模型,并且同样存在共享的组件。例如,关联潜在变量(在这个例子中,是变量类型,比如是人名还是地名等)的参数集合,它们在序列中的位置是独立的。
这并不是因为这是一个绝对正确的模型(显然可以想象序列中的位置可能造成差异的情况),而是因为它通常是一个非常实用的简化假设。具体来说,它允许我们:A) 重用参数;B) 将同一个模型应用于不同长度的序列,而无需担心“我的15词模型”和“我的8词模型”有何不同。
因此,这是另一个存在大量参数重用的案例。


我们已经看到,图像分割的例子同样如此。显然,我们不想为图像中的每个超像素都建立一个单独的模型,因为图像中有成百上千个超像素。因此,我们需要在超像素或像素之间进行共享。
例如,将一个超像素的类别标签与其图像特征关联起来的模型通常是共享的,涉及相邻超像素的边缘势函数参数也是共享的。
同样地,我们也有模型之间的共享,因为我们会为图像A建立一个这样的模型,显然我们不想为每一张图像都构建一个单独的模型。所以,我们再次看到了模型之间和模型内部的共享。


现在,让我们更具体地看一个例子,因为它将在后续的一些分析中使用。让我们回到大学课程的示例,其中有一个学生选了一门课并获得了一个成绩,该成绩取决于课程的难度和学生的智力。
如果我们只关心单个学生,这没有问题。但现在,假设我们想考虑整个大学的情况。现在我们有了多个难度变量,这些是不同课程的难度变量,例如C1到CN代表我们大学中存在的不同课程。
反过来,在另一侧,我们有多个学生。这是一组由不同学生索引的智力变量,我们有学生1的智力,一直到学生M的智力。
请注意,这些是不同的随机变量,它们通常彼此取值不同,但它们都共享一个概率模型。这正是我们心中所想的那种共享。我们看到,学生在某门课程中的成绩(即下面的这些变量)取决于相关课程的难度和相关学生的智力。
例如,学生1在课程1中的成绩取决于课程1的难度和学生1的智力。我们再次看到,这些不同的成绩变量之间共享了结构和参数,因此它们都具有相同类型的依赖结构和相同的条件概率分布(CPD)。


另一个例子是机器人定位。这是另一个时间序列的例子。机器人随时间从一个位置移动到另一个位置,尽管时间T的位置会随时间变化,但我们期望机器人的动力学模型是固定的。


我们稍后会详细讨论这一点。这为我们提供了一个图模型,再次看起来有点像这样。这是此类图模型的一个例子,我们看到机器人的位姿(这里的X变量)取决于,例如,前一个位姿以及机器人采取的任何控制动作。我们再次假设这些参数在变量的每个实例化中都是共享的。


由此产生了一类用模板变量表示的模型。模板变量是我们在单个模型内以及跨模型之间反复复制的变量。这种复制是通过变量可以被视为一个带参数的函数来实现的,这些参数例如可以是时间点(如本例所示)。
这里我们有一个由时间点索引的位置变量,或者一个由时间点索引的声纳读数变量。在这个例子中,我们有一个由特定人索引的基因型变量和表型变量,一个由像素索引的类别标签,以及类似地,由不同索引组合(课程、学生或课程-学生对)索引的难度、智力和成绩变量。


模板模型是一种语言,它告诉我们模板变量如何成为其他模板变量的依赖模型,以及这些变量的具体实例(称为基变量,即那些由特定时间点或人实际索引的变量)如何继承依赖模型。
针对不同的应用,已经开发了一系列专门的此类语言。例如,动态贝叶斯网络旨在处理时间过程,其中存在随时间进行的复制。我们还有一系列用于对象关系模型的语言,包括有向模型和无向模型,其中涉及多个对象(如人、学生、马、像素等),以及如何以连贯的方式表示这个整体上的依赖模型。


本节课中我们一起学习了模板模型的概念。模板模型通过引入模板变量和参数共享机制,使我们能够高效地构建大型模型家族,并处理具有重复结构的问题,例如时间序列、多对象系统和遗传图谱等。核心思想是将通用的依赖模式和参数封装在模板中,然后通过索引(如时间、个体、位置)将其实例化到具体的场景中,从而实现了模型构建的模块化和可扩展性。
021:时序模型-DBNs 🕰️


在本节课中,我们将学习如何表示随时间演变的系统。我们将介绍一种强大的模型类别——动态贝叶斯网络,它允许我们使用一个简洁的模板来表示包含多个相同变量副本的复杂模型。
概述:从连续时间到离散化
上一节我们介绍了表示复杂模型的模板概念。本节中,我们来看看如何将其应用于随时间演变的系统。
首先,为了处理连续时间,我们通常需要将其离散化。我们选择一个特定的时间粒度 Δ 来测量时间。在许多情况下,这个粒度由传感器的测量频率决定(例如视频帧率或机器人采样率)。在其他情况下,我们可以自行选择。
现在,我们有一组模板随机变量。X(t) 表示在时间点 tΔ 时,特定变量 X 的值。这样,我们就得到了每个时间点的一个变量副本。
以下是本节将用到的一些符号:
- X(t):表示时间 t 的变量 X。
- X(t:t‘):表示从时间 t 到 t‘(包含两端)的所有随机变量集合。
我们的目标是:构建一个简洁的表示法,能够描述系统在任意时长轨迹上的概率分布。这面临两个挑战:需要表示无限多个不同时长的分布,且每个分布都涉及数量不定的随机变量。
核心假设:马尔可夫性与时间不变性
为了简化模型,我们需要引入两个核心假设。
马尔可夫假设
第一个假设是马尔可夫假设。这是一种条件独立性假设,与我们之前在通用概率图模型中使用的简化原理相同。
首先,我们使用概率链式法则将轨迹概率展开,这本身不是假设:
P(X(0:T)) = P(X(0)) * ∏_{t=0}^{T-1} P(X(t+1) | X(0:t))
马尔可夫假设声明:下一时刻的状态 X(t+1) 在给定当前状态 X(t) 的条件下,与过去的所有状态 X(0:t-1) 独立。这是一个“遗忘”假设——一旦知道当前状态,就不再关心过去。
将此假设代入链式法则,可将其简化为:
P(X(0:T)) = P(X(0)) * ∏_{t=0}^{T-1} P(X(t+1) | X(t))
这个假设合理吗?以机器人的位置 L 为例,L(t+1) 是否在给定 L(t) 的条件下独立于 L(t-1)?通常不合理,因为它完全忽略了速度(方向和大小)的影响。
解决方法:通过丰富状态描述来使马尔可夫假设成为更好的*似。例如,将速度 V(t) 甚至更多信息加入状态变量 X(t)。另一种策略是放宽假设,允许依赖更早的历史状态(即半马尔可夫模型),但本节不讨论。
时间不变性假设
第二个假设用于处理模型数量无限的问题。即使应用了马尔可夫假设,我们仍需要为每个时间点 t 编码 P(X(t+1) | X(t))。
时间不变性假设规定:存在一个通用的条件概率模型 P(X‘ | X),它被复制用于每一个时间步的转移。也就是说,从时间 t 到 t+1 的动力学规律不依赖于具体的 t。
这同样是一个*似。例如,交通流动力学可能依赖于一天中的时间、是否周末等因素。我们可以通过引入额外的上下文变量(如“时间段”)到状态 X(t) 中来提高*似的准确性。
模型表示:2-时间片贝叶斯网络
现在,我们看看如何在概率图模型的框架内表示这个条件概率模型 P(X‘ | X)。
假设我们的状态由一组随机变量描述。以下是一个简单的交通系统示例,状态包含:天气 W、车辆位置 L、车辆速度 V、传感器故障状态 F。每个时间点我们还能得到一个传感器观测 O。
我们构建一个“网络片段”来表示 P(X‘ | X),即下一时刻状态变量 W‘, V‘, L‘, F‘, O‘ 在给定上一时刻状态 W, V, L, F 下的条件分布。注意,观测 O 不影响下一时刻状态,因此不作为右侧的父节点。
这个片段使用与标准贝叶斯网络相同的链式法则进行参数化:
P(W‘, V‘, L‘, F‘, O‘ | W, V, L, F) = P(W‘|W) * P(V‘|W,V) * P(L‘|L,V) * P(F‘|W,F) * P(O‘|L‘,F‘)
关于此图,有几个要点需要注意:
- 依赖类型:图中既有时间片间的依赖(如 W → W‘),也有时间片内的依赖(如 L‘ → O‘)。后者通常用于表示瞬时发生的依赖关系。
- 持续边:特别地,从一个变量到其下一时刻自身的边(如 L → L‘)称为“持续边”,表示变量保持其状态的倾向。
- 参数化:此图只定义了下一时间片变量(带‘的变量)的条件概率分布,而没有定义当前时间片变量(不带‘的变量)的分布。它仅表示转移动力学。
为了表示整个系统的概率分布,我们还需要一个描述初始状态 X(0) 的标准贝叶斯网络。
动态贝叶斯网络的定义与展开
结合以上两部分,我们给出正式定义。
一个2-时间片贝叶斯网络(2-TBN)定义在模板变量集 {X1, ..., Xn} 上。它包含:
- 下一时间片的节点 X1‘, ..., Xn‘。
- 当前时间片的部分节点 {X1, ..., Xn} 的一个子集,作为父节点。
- 仅为每个 Xi‘ 节点定义其父节点(可来自当前片或下一片)及其条件概率分布。
2-TBN 通过链式法则定义条件分布:P(X‘ | X) = ∏_{i=1}^{n} P(Xi‘ | Pa(Xi‘))。
一个动态贝叶斯网络(DBN)由一个2-TBN(定义转移模型)和一个用于初始时间片 X(0) 的贝叶斯网络(定义初始状态分布)共同定义。
通过“展开”或“接地”,DBN可以表示任意长度轨迹的概率分布:
- 复制初始贝叶斯网络作为时间片0。
- 对于每个后续时间步 t,复制2-TBN片段,将 X 实例化为 X(t),将 X‘ 实例化为 X(t+1)。
- 将所有片段的CPD按照链式法则相乘,得到联合分布:
P(X(0:T)) = P_{B0}(X(0)) * ∏_{t=0}^{T-1} P_{2TBN}(X(t+1) | X(t))。


实例分析:车辆跟踪DBN

在结束前,我们看一个更真实的DBN示例,用于交通场景中的车辆跟踪。
此模型包含更多变量:
- 状态变量:车辆绝对位置与速度(Xdot, Ydot)、语义位置(如是否在车道内)、上下文信息(左右是否空旷)、引擎状态、驾驶员操作(纵向和横向动作)。
- 依赖关系:包含大量的持续边,表示各种状态的持续性;也包含许多中间变量,帮助以更紧凑的方式表示概率分布。
- 观测变量:包含大量传感器观测,如转向灯状态、左右车道感知情况等。
这个模型比之前的简单示例更真实地刻画了交通流的演化过程。
总结 🎯

本节课中,我们一起学习了动态贝叶斯网络。DBN为我们提供了一种描述随时间演变的结构化分布的语言。通过做出马尔可夫演化和时间不变性这两大假设,我们可以使用一个紧凑的网络来编码任意长时间序列上的转移概率。

然而,这些假设并非天然成立。为了使其更好地逼*真实分布,我们可能需要重新设计模型,例如通过添加变量来丰富状态描述。DBN是处理时序数据的强大工具,其有效性取决于模型设计对这些核心假设的合理*似程度。
022:时序模型-HMMs 🕰️
在本节课中,我们将要学习一种简单但极其有用的概率时序模型——隐马尔可夫模型。我们将了解其基本结构、核心组成部分,并探讨它在机器人定位、语音识别等领域的实际应用。

概述 📋
隐马尔可夫模型是一类强大的概率时序模型。虽然它可以被视为动态贝叶斯网络的一个子类,但其独特的内部结构使其在众多应用场景中特别有用。
基本结构 🧱
隐马尔可夫模型最简单的形式可以看作是一个包含单个状态变量 S 和单个观测变量 O 的概率模型。
该模型主要由两个概率部分组成:
- 转移模型:描述了状态如何随时间从一个状态转移到下一个状态。
- 观测模型:描述了在给定状态下,观测到不同观测值的可能性。
这个简单的2-TBN(两时间片贝叶斯网络)可以展开,形成一个具有重复结构的展开网络。该网络从时间0的状态开始,转移到时间1的状态,依此类推,并且在每个状态都会产生相应的观测。
内部结构 🔍

隐马尔可夫模型的有趣之处在于,它们通常具有丰富的内部结构。这种结构主要体现在转移模型中,有时也体现在观测模型中。
以下是一个结构化转移模型的示例。整个模型实际上是在窥视条件概率分布 P(S_{t+1} | S_t),即给定当前状态下,下一个状态的概率。


这里的每个节点并非随机变量,而是状态变量 S 可能取的一个特定赋值。图中展示的是转移矩阵的结构。例如,从状态 S1 出发,模型有0.7的概率转移到 S2,有0.3的概率保持在 S1。这两个输出概率之和必须为1,因为它是在给定当前时间点处于 S1 的条件下,对下一个状态的概率分布。其他状态也有类似的结构。
因此,这里的结构实际上是转移模型中的稀疏性,而不是在2-TBN结构层面上的体现(2-TBN结构本身相当简单)。
应用领域 🌐
事实证明,这种模型结构在广泛的应用中都非常有用。
以下是隐马尔可夫模型取得巨大成功的几个领域:
- 机器人定位:确定机器人在环境中的位置和朝向。
- 语音识别:HMM是所有当前主流语音识别系统的核心方法。
- 生物序列分析:例如,标注DNA序列中功能重要的区域。
- 文本标注:例如,标注句子中单词的词性角色。
应用实例详解 🔬
上一节我们介绍了HMM的通用应用领域,本节中我们来看看它在具体问题中是如何建模的。

机器人定位 🤖
机器人定位的HMM模型可能初看起来不完全像标准的HMM,因为它包含一些额外的变量。

以下是各个变量的含义:

- 状态变量 S:表示机器人的位姿,即机器人在地图中每个时间点的位置和朝向。
- 外部控制信号 U:指示机器人移动的指令(如左转、右转)。由于这些变量是观测到且外部施加的,它们并非真正的随机变量,可以视为系统的输入。
- 观测变量 O:表示机器人在每个时间点观测到的信息,这取决于其位置和地图本身。
在许多应用中,地图是已知的(图中已置灰),因此我们可以将推理的基本结构视为仅由状态变量 S 和观测变量 O 组成的集合。这使得该模型成为标准HMM的一个轻微扩展。这里,转移模型同样具有稀疏性,因为机器人在单个时间步内只能从一个位置移动到有限的几个相邻位置。
语音识别 🗣️
语音识别是HMM最典型的成功案例。其核心问题是:给定一段代表语音的、嘈杂的声学信号,通过解码器评估不同可能句子,以合理的准确率预测出原始句子。


工作原理
一段声学信号在时域上表现为不同频率的强度。通过傅里叶变换可以将其转换为频谱。

我们的目标是将这个连续信号分割成对应于单词的片段,并识别每个片段对应的单词。这是一个双重问题,因为在连续语音中,我们需要同时识别单词边界和单词本身。

解决方法不是将单词作为基本单元,而是使用更小的单元——音素。音素是构成单词的基本发音单位。通过识别音素,再将它们组合起来以确定单词。
音素与HMM结构
音素表定义了单词如何分解为音素。同一个字母可能有不同发音(对应不同音素),反之,不同字母也可能发相同的音。


一旦有了音素表,我们就可以为单词构建HMM。例如,单词“nine”可以分解为音素序列。其HMM结构表示在时间进程中,你处于哪个音素中。自转移循环允许在一个音素内停留多个时间单位,然后最终转移到下一个音素。


音素内部的HMM
一个音素本身也持续一段时间。因此,在一个给定的音素(例如音素“ay”)内部,也存在一个转移模型。通常,一个音素HMM包含三个状态:开始(B)、中间(M)、结束(E)。每个状态通常对应于在该音素阶段观测到的声学信号的不同概率分布。

完整的语音识别HMM
将所有这些部分组合起来,就构成了一个完整的语音识别HMM(此处以孤立词识别为例)。

模型从一个起始状态开始。从起始状态的转移模型(即语言模型)告诉我们当前状态下进入某个单词的可能性。假设模型转移到了单词“one”,我们会看到模型随时间从音素“w”转移到“ah”,最后到“n”。单词结束后,过程循环回到起始状态,这使我们能够进行连续语音识别。
这是一个生成式模型,它描述了语音如何由单词、单词内的音素以及音素内的小片段构成。当你输入观测到的声学信号证据,并在此模型上运行概率推理时,你得到的就是最有可能产生该观测语音信号的单词序列。

总结 🎯
本节课中我们一起学习了隐马尔可夫模型。
总结来说,HMM在某种简化视角下可以被视为动态贝叶斯网络框架的一个子类。虽然在随机变量层面上观察时,它们似乎结构简单,但其丰富的结构体现在条件概率分布的稀疏性上,也体现在结构的重复使用上(如同一个音素模型可以在多个单词中复用)。
我们看到,HMM被广泛用于各种序列建模任务,它可能是目前最常用的概率图模型形式之一。


023:板模型 🧩

在本节课中,我们将要学习一种用于表示重复结构的强大工具——板模型。板模型允许我们以一种简洁的方式,为同一类型的多个对象定义共享的概率模型,从而构建出复杂但结构清晰的图模型。

重复结构的建模
上一节我们介绍了图模型的基本表示法,本节中我们来看看如何处理现实世界中常见的重复结构。当我们拥有多个相同类型的对象时,就会出现一种非常常见的重复结构。我们希望对所有这些不同的对象副本(更准确地说,是同一类型的所有对象)使用相似甚至完全相同的概率模型。
出于我们稍后会讨论的原因,这类模型中最常见的一种被称为板模型。

让我们从建模重复开始。在这个例子中,想象我们反复抛掷同一枚硬币。我们有一个结果变量,我们想要建模的是多次抛掷的重复。因此,我们将用一个小方框把这个结果变量框起来。这个被称为板的方框,是一种表示结果变量被索引的方式。

我们通常不显式地表示索引,但这里用不同的抛掷次数 t 来索引。之所以称之为“板”,是因为直觉上这就像一叠相同的盘子,这也是板模型名称的由来。
这个模型表示的是:如果我们有一组抛掷 T1 到 TK,那么我们就有一组随机变量:Outcome(T1) 到 Outcome(TK)。我们只是将结果变量复制了多份。
现在,这具体对应什么呢?我将做一件在本课程后面讨论学习时会经常做的事情:我将把条件概率分布的参数显式地放入模型中。这个随机变量 Theta 就是具体的CPD参数化,我把它显式地放进去是为了展示不同变量如何依赖于它。

如果我们把参数放在这里,可以看到 Theta 在板之外。这意味着它不像 t 那样被索引,也就是说它对所有 t 值都是相同的。这意味着我们有一个参数 Theta,所有这些结果都依赖于完全相同的参数化,Outcome(T1) 的CPD是从这个参数化 Theta 复制而来的。
更复杂的例子:学生与课程
让我们看一个稍微复杂一点的例子。回到我们有多名学生的大学,现在我们有一个双变量模型,包含智力 I 和成绩 G。我们用不同的学生 S 来索引,这再次表明我们复制了这个模板模型。在这个例子中,我只做了两个副本,一个给学生1,另一个给学生2。
同样,如果我们想编码对参数的依赖,我们可能有代表 I 的CPD的参数 theta_I,以及代表 G 的CPD的参数 theta_G。theta_I 会影响两个 I 变量,theta_G 会影响两个 G 变量,并且它们都在板之外。在许多模型中,我们有时会显式地将这些参数包含在模型内,但通常当一个参数在所有板之外时,我们不会显式地表示它,就像我在标注之前的原始图表中所做的那样,直接省略它。
仅仅重复完全相同的模型多次并不特别有趣,所以现在让我们讨论如何让不同的板重叠,或者换句话说,思考模型中不同类型的对象如何相互关联。
在这种情况下,我们的论域中有两种对象:课程和学生。课程我们用小写 c 表示,学生用小写 s 表示。现在让我们思考如何复制对应于课程属性的变量和对应于学生属性的变量。
难度变量 D 属于课程板,因为它是课程的属性,所以它是 Difficulty(c)。现在考虑如何放入学生。一种可能性是,我们将学生板嵌套在课程板内部。
这意味着这里的每个变量(I 和 G)都被 s 和 c 共同索引,因为当一个变量嵌套在一个板中时,意味着它具有它所在的所有板的索引。所以如果智力变量 I 既在学生板 S 中又在课程板 C 中,它将被两者索引。
让我们构建这个模型,看看当我们展开课程和学生时是什么样子。它会看起来像这样:假设我们有一个两门课程和两名学生的模型,我们有课程1的难度和课程2的难度。现在我们有一个嵌套板中的变量 I 和 G,我们可以看到它们都被学生和课程参数化了。
让我们思考这个模型的含义。含义是:智力现在是一个学生在课程中的属性,并且学生在特定课程中的智力会影响他在该课程中的成绩。你可以通过这里的依赖模型看到这一点。
但这意味着什么?这意味着对于每个学生在每门课程中,都有一个课程特定的智力。这可能不是我们想要的。如果你正在学习完全不同的课程,一门是艺术课,一门是数学课,你可能会说有一种艺术智力(代表艺术技能)和一种数学智力。那么你可能真的想要两种不同的智力,而不假设它们必然是同一个东西。

当然,这会使模型复杂化。如果你有一堆在某些方面相似、需要相似技能组合的课程,你可能不希望有一堆独立的随机变量。在这种情况下,你不希望智力变量成为课程板的一部分。

重叠板模型
这给了我们另一种表示方法,即所谓的重叠板模型。在这种情况下,我们有课程板(这里的这个板)和学生板(这里的这个板)。假设是:难度 D 只是课程的属性,智力 I 只是学生的属性,而只有成绩 G 是依赖于两者的属性。

当我们展开这个模型时,我们最终得到这样一个模型:在这个例子中,我们只有一个课程的难度和一个学生的智力。让我们用绿色表示交集部分:学生在课程中的成绩依赖于课程的难度和学生的智力。

因此,现在我们每个学生只有一个智力。这是一种替代的建模方式,并不是说一个对另一个错,它们只是不同。

再次,为了演示参数共享,我想再次强调,参数共享的概念也适用于这样的模型。这里我们有一个参数 theta_D,一个参数 theta_I,以及一个影响成绩CPD的参数 theta_G,这是一个共享模型,影响所有不同的成绩变量。

集体推理的力量

那么,为什么这类板模型有用呢?让我们看一个例子来说服自己,通过构建这些涉及多个实体的丰富结构模型,你实际上可以得到更有趣的结论。
看这里的这个例子:想象我们大学来了一个第一学期的新生,我们想弄清楚我们能了解他什么。假设在这所特定的大学里,先验地,我们相信大多数学生智力高,所以智力分布是80%高智力。
这个我们将称为乔治的学生,选了两门课:他选了地质学101并得了A。所以他智力高的概率上升了。他选了CS101但表现不佳,得了C。概率下降了,但没有降到非常低的数字,这是因为我们从之前见过的成绩CPD中知道,学生在一门课上表现不佳可能有多种原因,例如这门课非常难,所以可能每个人都考得不好,因此你不应该太当真。
如果乔治只选了这两门课,我们的推断就到此为止了。但现在让我们在一个更全面的背景或集体推理中思考这个问题,我们将考虑许多学生选修许多课程。想象一下,我们拥有所有这些学生的成绩。这里绿色代表A,黄色代表B,红色代表C。你在这里看到的是一堆已观测成绩变量的简写。

现在,让我们思考从这个网络中我们可以得出什么结论。即使粗略地看,我们也能看到一堆人选修了CS101,除了我们的朋友乔治,他们都得了A。此外,即使你看这里的这个学生,他在其他所有课上都得C,他仍然在CS101上得了A。

因此,如果我们对这个整体模型进行概率推断,我们将得到:我们相当确定CS101是一门简单的课。如果我们对此相当确定,那么在这种情况下,我们也相当确定乔治的智力较低。
因此,在这种设置下,我们可以得出比孤立地推理个体更明智的结论。这是一个简单的例子,但稍后我们会看到集体推理的例子,其中有多个相互关联的实体,可能是图像中相关的像素,也可能是网站中相互链接的网页。如果我们试图孤立地标记每个实体,我们得不到非常明智的结论,但通过思考它们如何相互关联,我们得到了更强大、更明智的结果。

板依赖模型的形式化总结
现在,让我们总结一下板依赖模型。板依赖模型具有以下特征:
它为一组对象类型(例如学生、课程等)索引的模板变量定义了一个依赖模型。对于每个模板变量,我们有一组模板父节点。
其内在要求是,每个父节点的索引集必须是子节点索引集的子集。这意味着什么?例如,对于模板变量 G(s, c),G 对应变量,s 和 c 对应这里的索引 U1 和 U2。我们有两个模板父节点:I(s) 和 D(c)。规定 UI(父节点索引集)是子节点索引集 {U1, ..., UK} 的子集,这告诉我们,例如,我们不能在父节点中出现子节点中没有的索引。

所以,举例来说,在这个模型中,我们不能有(由于我稍后会描述的原因)诸如“学生 s 的荣誉 H 依赖于该学生在多门课程中的成绩”这样的依赖。原因是,这不是一个标准的CPD。荣誉变量依赖于潜在无限多个父节点(即学生参与的所有课程的成绩)。这并不是说不能定义这样的依赖模型,事实上,有比板模型更丰富的语言,人们定义了聚合器CPD的概念。但这不属于传统上称为板模型的标准范式。
通过防止这种情况,我们现在有效地拥有了一个传统模型,其中随机变量具有有限且固定的父节点集。因此,我们可以定义一个模板CPD,然后对于该模板变量的任何副本(通过索引 U 的不同实例化获得),我们都可以在模型中重用这个模板CPD。
具体来说,如果我们有这个模型,有这个变量 A(U1, ..., UK),那么对于索引的任何具体实例化 u1, ..., uk,我们将拥有以下模型:变量 A(u1, ..., uk) 依赖于其父节点的具体实例化。这听起来可能有点令人困惑,但具体想想例子就明白了:这恰恰说明了一个特定学生在特定课程中的成绩依赖于该课程的难度和该学生的智力。它只是用一种通用的方式表达了这一点。



这只是我早先陈述的形式化版本,它要求父节点不能有未在子节点中显式实例化的变量,这样我们就不会有一个可以任意多种方式实例化的自由浮动变量。

课程总结 🎯
本节课中我们一起学习了板模型。总结如下:
- 板模型是一种语言,允许我们为无限集合的贝叶斯网络定义一个模板。之所以是无限的,是因为你可以有3个学生、1个学生、100个学生、一百万个学生,即任意数量的学生。我们可以用这种语言编码无限多的贝叶斯网络,每个网络都由我们论域中对象(例如学生和课程)的不同组合所诱导产生。
- 参数和结构在单个贝叶斯网络内部以及不同的贝叶斯网络之间都被重用。例如,在我们的大学例子中,我们重用相同的参数;如果我们有另一所拥有不同学生和课程组合的大学,我们仍然会使用相同的参数。
- 这些模型通过允许我们表示复杂的依赖网络,使我们能够以简洁的方式捕捉非常丰富的相关结构,从而实现集体推理,这可能是得出明智结论的一个非常强大的来源。
我介绍了板模型,它可能是最早也是最简单的这类语言之一,允许我们表示模板结构。这是一个简单的例子,例如,它对父节点有限制(不能有子节点中未实例化的变量)。因此,举例来说,你无法在这里表示时序模型,因为 X(t-1) 没有在变量 X(t) 中实例化,所以你不能让 X(t-1) 作为 X(t) 的父节点——至少在板模型中不行。显然,我们有能做到这一点的语言,但不是这个。同样,你也不能让父亲的基因型影响孩子的基因型,因为同样,孩子并没有实例化母亲和父亲,这些是单独的索引。
因此,板模型是一种有限的语言,但有许多其他语言以不同的方式扩展了它。它们在表达什么容易、什么不容易方面各有不同的权衡。关于这方面有大量的文献,我们不会深入探讨,但它提供了许多非常有用的语言来表示这类结构丰富的模型。


024:结构化条件概率分布概述 🧩
在本节课中,我们将要学习条件概率分布(CPD)的表示方法。之前我们主要关注了概率分布的全局结构,即如何将其分解为对应变量子集的因子乘积。然而,在实际应用中,我们还需要编码其他类型的结构,这对于现实世界的建模至关重要。
表格表示的局限性

上一节我们介绍了概率分布的因子分解,本节中我们来看看条件概率分布的具体表示方法。到目前为止,我们使用的例子都普遍采用了表格表示法。
表格表示法为父变量的每一种赋值组合都设置了一行,明确列出了对应子变量概率的所有条目。例如,对于一个变量 G 及其父变量 I 和 D,其 CPD 表格如下:

这种表示法清晰易懂。但当我们考虑更现实的例子时,问题就出现了。例如,在一个医疗应用中,一个表示“咳嗽”的变量可能有许多父变量,如肺炎、流感、肺结核、支气管炎或普通感冒等。当列举完所有可能导致咳嗽的因素后,这类变量通常可能有 10 到 20 个父变量。
如果我们有 K 个父变量,并且为简化起见假设它们都是二元的,那么 CPD 中的条目数量将随着 2^K 增长(具体取决于子变量取值的数量)。不幸的是,这种情况非常普遍,这意味着表格表示法对于许多实际应用来说并不适用。因此,我们必须思考超越表格的方法。
超越表格:CPD 的广义定义
幸运的是,贝叶斯网络的定义并未强制要求我们必须使用完全指定的表格作为条件概率分布的唯一表示。我们唯一需要的是,CPD P(X | Y1, ..., Yk) 必须能为 Y1, ..., Yk 的每一种赋值指定一个关于 X 的概率分布。
这个分布可以完全隐式地定义。例如,它可以是一段查看 Y1 到 Yk 的值并输出 X 分布的小代码。更正式地说,任何满足以下条件的函数(无论是参数化函数还是代码例程)都可以作为 CPD 的合法表示:
- 它是一个定义在作用域 {X, Y1, ..., Yk} 上的因子。
- 对于给定的 Y1, ..., Yk 的赋值,它对 X 的所有取值求和必须等于 1。
用公式表示,即对于所有 y1, ..., yk,需满足:
∑_x P(x | y1, ..., yk) = 1

结构化 CPD 的常见类型
幸运的是,我们通常不必诉诸于编写代码来指定 CPD。统计学框架已经为我们定义了多种在给定一组条件变量下表示条件概率分布的方法。

以下是几种常见的结构化 CPD 类型:
- 确定性 CPD:其中 X 是 Y1, ..., Yk 的确定性函数。我们之前已经见过几个例子。
- 树形结构 CPD:例如决策树或回归树框架,根据父变量的值通过一系列判断来决定子变量的分布。
- 逻辑函数/对数线性模型:例如使用逻辑斯蒂函数来建模概率。
- 噪声函数:例如“噪声或”、“噪声与”,它们是确定性函数的噪声版本。
- 连续变量的 CPD:对于连续变量及其连续或离散的父变量,我们有专门的框架(如线性高斯模型)来表示其概率分布,因为显然无法为连续变量的每一个可能值列一张表。

上下文特定独立性
与 CPD 内部结构紧密相关的一个有用概念是上下文特定独立性。这种独立性出现在我们将要讨论的一些 CPD 表示中。
上下文特定独立性指的是一种独立性,其中变量集 X 和 Y 在给定另一组变量 Z 和某个特定赋值 c(即上下文)的条件下是独立的。这与之前的标准条件独立性不同,标准独立性要求对条件变量 Z 的所有赋值都成立,而上下文特定独立性只对 Z 的特定取值 c 成立。

其定义形式与标准条件独立性类似,只是现在条件栏的右侧同时包含了变量集 Z 和具体的上下文赋值 c:
(X ⊥ Y | Z, c)
示例:确定性“或”门中的上下文特定独立性
让我们通过一个例子来看看,当 CPD 具有特定内部结构时,上下文特定独立性是如何产生的。
考虑一个案例,其中 X 是 Y1 和 Y2 的确定性“或”函数。即 X = Y1 OR Y2。
我们来分析以下几种陈述是否成立:
-
(Y1 ⊥ Y2 | X, Y2=False)
- 当 Y2=False 时,X 的值就等同于 Y1 的值。在这种情况下,Y1 显然依赖于 X(已知),因此它们不是独立的。此陈述不成立。
-
(Y1 ⊥ Y2 | X, Y2=True)
- 当 Y2=True 时,无论 Y1 取何值,X 都一定为 True。因此,在这个特定的上下文(Y2=True)下,已知 X 时,Y1 和 Y2 是独立的。这是一个上下文特定独立性。
-
(Y1 ⊥ Y2 | X, X=False)
- 当 X=False 时,根据“或”门的定义,Y1 和 Y2 必须同时为 False。如果你告诉我其中一个为 False,我已经能推断出另一个也为 False。因此,在这个上下文(X=False)下,它们是独立的。这是另一个上下文特定独立性。
-
(Y1 ⊥ Y2 | X, X=True)
- 当 X=True 时,我无法确定是 Y1 还是 Y2(或两者)使其为 True。因此,这个陈述不成立。

后两个例子说明,在确定性 CPD 的特定上下文(X=False)中成立的独立性,在另一个上下文(X=True)中可能就不成立。这些上下文特定独立性在通用的、非结构化的 CPD 中不一定成立。


总结

本节课中我们一起学习了条件概率分布的结构化表示。我们首先认识到,对于具有大量父变量的现实问题,传统的表格表示法会变得不可行。接着,我们探讨了贝叶斯网络中 CPD 的广义定义,它允许使用任何能为每种父变量赋值提供有效子变量分布的函数。然后,我们介绍了几种常见的结构化 CPD 类型,如确定性函数、树形模型和逻辑模型等。最后,我们引入了上下文特定独立性的概念,并通过确定性“或”门的例子展示了 CPD 的内部结构如何能够在特定条件下(上下文)产生额外的独立性关系,这些关系在通用的概率分布中是不存在的。理解这些结构化表示和上下文特定独立性,对于构建高效、紧凑且易于推断的概率图模型至关重要。
025:树结构条件概率分布


在本节中,我们将探讨一种重要的结构化条件概率分布——树结构条件概率分布。我们将了解它如何通过捕捉上下文特定的依赖关系,来避免表格CPD参数数量随父节点数指数级增长的问题。
概述
表格CPD因其参数数量随父节点数呈指数级增长而存在缺陷。树结构CPD是一种非常有用的结构化CPD类别,它编码了子节点对父节点的依赖关系,但这种依赖仅在特定上下文中发生。
树结构CPD示例:学生求职
为了理解树结构CPD,让我们看一个简单的例子。假设我们有一个学生正在申请工作,学生获得工作的前景取决于三个变量:他们从教员那里获得的推荐信质量、他们的SAT分数以及学生是否首先选择申请这份工作。
以下是一个可能的CPD模型。我们可以将其视为一个分支过程,其中“工作”的分布会查看某些变量,然后决定分布可能是什么样子。

首先,依赖关系取决于学生是否申请工作。如果学生不申请工作,情况如何?在硅谷鼎盛时期,例如互联网泡沫时期,学生即使不申请也可能获得工作机会。因此,在这种情况下,学生获得工作的概率可能非零。请注意,学生没有申请工作,也就没有提交推荐信或SAT成绩,这意味着在这种情况下,学生的工作前景不依赖于这两个变量。因此,在S和L变量的所有可能配置下,学生获得工作的概率都是0.2。
如果学生确实申请了工作呢?我们可以想象,招聘人员主要关注学生的SAT成绩,他们不太相信推荐信。因此,招聘人员首先查看学生的SAT分数。如果学生SAT成绩好,那么无论推荐信如何,招聘人员甚至不会去看,学生获得工作的概率为0.9。只有在学生SAT成绩不强的情况下,招聘人员才会回头查看推荐信,此时如果推荐信强,获得工作的概率为60%;如果推荐信弱,则为10%。
我们可以看到,这个CPD依赖于三个二元变量。原则上,我们需要表示J变量上的八种不同概率分布,但我们只表示了四种,因为在某些上下文中,某些变量无关紧要。
上下文特定独立性
变量无关紧要的概念与之前定义的上下文特定独立性概念相关。事实上,我们可以将其形式化为上下文特定独立性。
让我们看看这棵树,思考在这个树结构CPD中出现了哪些上下文特定独立性。
以下是几个需要判断的独立性陈述:
- J在上下文
A=1, S=1下是否独立于L?我们可以看到,在此上下文中,招聘人员从不看推荐信,因此J确实独立于L。答案为“是”。 - J在仅给定
A=1时是否独立于L?在这种情况下,我们有两种情景:S=S1和S=S0。在S=S0的情况下,招聘人员会看推荐信,因此这个陈述不成立。 - J在给定
A=0时是否独立于L和S?查看A=0的情况,确实不依赖于L或S。因此这个陈述成立。 - J在上下文
S=1下是否独立于L?这需要针对变量A的两个值进行案例分析。这归结为两个独立的陈述:J独立于L给定S=1, A=1(成立)和J独立于L给定S=1, A=0(是A=0情况的特例,也成立)。由于两种情况都成立,因此这个陈述也成立。
多路复用器CPD示例
让我们看另一个例子,它代表了此类上下文中的一大类例子。这里,学生在申请工作时需要提交推荐信,但可以在两封信中选择一封提交:来自课程一的信或来自课程二的信。学生的工作前景取决于实际提交的那封信的质量,因为招聘人员无法访问未提交的信。
在树结构CPD的背景下,它看起来是这样的:顶部的第一个变量对应学生的选择,有两个分支C1和C2。在C1情况下,仅依赖于信1的质量;在C2情况下,仅依赖于信2的质量。这是一个与多路复用器CPD相关的例子,因为选择变量有效地决定了对一组情况或另一组情况的依赖。

这个例子有一些有趣的影响,因为不仅树结构导致了上下文特定独立性,它还暗示了非上下文特定的独立性,这在课程后面会很有用。
具体来说,我们有:Letter1 独立于 Letter2 给定 J 和 C。如果仅从图的有向分离结构(影响流动)的角度思考,工作实际上激活了信1和信2之间的结构,因此你不会期望信1和信2是条件独立的,因为存在因解释消除而产生的信息流。
但让我们更详细地思考一下。像之前一样进行案例分析。我们问:在给定 J 和 C=C1 的情况下,Letter1 是否独立于 Letter2?在上下文 C=C1 中,工作和信2之间不再有依赖关系,因为招聘人员从未获得第二封信。因此,在上下文 C=C1 中,图实际上看起来像这样,其中没有从L2到J的边。相反,看另一种情况 C=C2,在这种情况下,另一条边会消失,再次没有V型结构,因此变量L1和L2之间没有有效路径。因此,在这两种情况下,有效路径都消失了,这暗示了独立性假设。
多路复用器CPD的一般形式
如前所述,这个例子与更一般的模型类别——多路复用器CPD——有关。
在这种情况下,多路复用器CPD具有以下结构:我们有一组随机变量 Z1 到 ZK,它们都在某个特定空间中取值。变量 Y 是其中一个 Z 的副本。变量 A 是多路复用器或选择器变量。选择器变量在空间 {1, ..., K} 中取值,它选择 Y 复制哪个 Zi。请注意,这里的 Y 是确定性的。
那么,给定选择器 A 和父节点 Z1 到 ZK,变量 Y 的CPD是什么?我们可以这样考虑:我们需要指定概率分布 P(Y | A, Z1, ..., ZK)。这个概率分布是:如果 Y 等于 Z_A,则概率为1;否则为0。这意味着,如果 A 等于某个值 a,那么确定性地,Y 以概率1等于 Z_a。这只是 A 告诉我们 Y 需要复制哪个变量 Z 的一种形式化说法。
应用场景
这个概念在各种应用中都非常有用。
- 感知不确定性:例如,当我们有噪声传感器时,我们观察到多架飞机中某一架的位置,但我们不确定观察到的是哪架飞机。因此,观测值的位置代表了我们正在观测的飞机的位置,但这里的变量
A告诉我们这是哪架飞机,我们对此也可能不确定。这产生了一系列被称为配准、对应或数据关联的问题,在许多应用中非常常见。 - 物理硬件配置:这是来自微软打印机故障诊断程序的一个实际例子。微软操作系统中的所有故障诊断程序都是基于贝叶斯网络技术构建的。这里的任务是找出打印机不打印的原因。我们有一个变量告诉我们打印机是否产生输出,这取决于多种因素,但它所依赖的因素之一是打印机输入的来源:是来自本地传输还是网络传输。

根据来源的不同,可能发生不同的故障集。这里充当选择器变量角色的变量是“打印数据输出”,它是此处使用的树的根。根据打印位置是本地还是网络,你依赖于本地传输的属性或网络传输的属性。事实证明,即使在这个非常简单的网络中,使用树结构CPD也将参数数量从145个减少到大约55个,并使知识获取过程容易得多。

总结
在本节中,我们一起学习了树结构条件概率分布。树结构CPD为我们提供了一种紧凑的表示形式,有效地捕捉了上下文特定方式的依赖关系。正如我们所提到的,它在广泛的应用中都具有相关性,我们只给出了一些例子:硬件配置、医疗环境(根据你所处的情况,你可能依赖于一组或另一组诱发因素)、对智能体行为的依赖(例如学生决定是否申请工作或提交哪封信),以及感知模糊性(特定感知观测值取决于该观测来自哪个真实世界对象)。


026:因果影响独立性
在本节中,我们将学习如何表示一个变量依赖于其多个父变量的复杂情况。我们将重点介绍两种重要的条件概率分布表示法:噪声或模型和Sigmoid模型。这些方法能够有效处理多个原因共同影响一个结果的情况,并大幅减少模型所需的参数数量。
从树状CPD到更复杂的依赖关系

上一节我们介绍了树状条件概率分布,它允许变量在不同的情境下依赖不同的父变量。然而,这种方法无法处理所有情况。
例如,考虑一个变量,如“咳嗽”,它可能同时依赖于多个不同的因素:肺炎、流感、肺结核、支气管炎等。这种情况不适合用树状CPD表示,因为“咳嗽”并非只在某些情境下依赖某个父变量,而在其他情境下不依赖。实际上,它同时依赖于所有这些因素,每个因素都以某种方式共同影响出现咳嗽的概率。
为了捕捉这种交互作用,我们需要引入新的模型。
噪声或模型
一种捕捉此类交互作用的模型称为“噪声或”条件概率分布。理解噪声或模型的最佳方式是将其视为一个更大的图模型。
在这个模型中,我们通过引入一系列中间变量来分解变量Y对其父变量X1到XK的依赖关系。以“咳嗽”变量和不同疾病为例,我们为每个疾病引入一个中间变量Zi,它捕获了“该疾病X_i(如果存在)本身会导致咳嗽”这一事件。
你可以将每个Zi视为一个“噪声发射器”:如果疾病X_i为真,那么Zi以一定的概率决定将Y变为真。最终,Y为真当且仅当至少有一个Zi为真。也就是说,Y是其父变量Z1到ZK的确定性“或”运算结果。
现在让我们更精确地定义它。给定父变量Xi,中间变量Zi为真的概率如下:
- 如果
Xi = 0,则P(Zi=1 | Xi=0) = 0。因为Xi没有尝试去激活Zi。 - 如果
Xi = 1,则P(Zi=1 | Xi=1) = λ_i。λ_i是一个在区间[0,1]内的参数,可以理解为Xi激活Y的“渗透力”或效率。
此外,模型中通常包含一个“泄漏”概率Z0,它表示Y在没有父变量激活的情况下自行变为真的概率,其参数为λ_0。
基于此,我们可以推导出Y的条件概率。Y为假的概率,即所有激活源都失败的概率,计算公式如下:
P(Y=0 | X1...Xk) = (1 - λ_0) * ∏_{i: Xi=1} (1 - λ_i)
相应地,Y为真的概率是其补集:
P(Y=1 | X1...Xk) = 1 - P(Y=0 | X1...Xk)
这就是噪声或CPD的公式。
因果影响独立性
噪声或模型可以推广到一个更广泛的概念:因果影响独立性。其核心假设是,一个变量有多个原因,每个原因都独立地影响该变量的真值,不同原因之间没有相互作用。它们各自拥有独立的机制,最终通过一个聚合函数(如“或”)汇总,决定Y的最终状态。
以下是符合此框架的其他模型示例:
- 噪声与:聚合函数是“与”运算。
- 噪声最大:适用于非二值情况,原因可能有不同的激活程度,Z取各个原因独立影响的最大值。
噪声或模型是其中最常用的,但其他模型也在特定场景下有所应用。
Sigmoid CPD
一个初看可能不在此框架内,但实际上也属于因果影响独立性的模型是Sigmoid条件概率分布。
在Sigmoid CPD中,每个父变量Xi(假设是离散的)通过一个权重参数Wi施加一个连续的影响。Wi的大小表示Xi对促使Y为真施加的“力”:Wi为零表示无影响,Wi为正表示增加Y为真的可能性,Wi为负则表示降低其可能性。
所有这些影响,加上一个额外的偏置项W0,被汇总到一个连续变量Z中:
Z = W0 + Σ_{i} (Wi * Xi)
接下来,我们需要将这个介于负无穷到正无穷的连续值Z,转化为我们关心的变量Y的概率。这是通过一个Sigmoid函数实现的:
σ(z) = e^z / (1 + e^z)
由于e^z是正数,这个函数的值域总是在(0,1)之间。Sigmoid函数的形状像一个被压缩的“S”形曲线:当Z趋*负无穷时,概率趋*于0;当Z趋*正无穷时,概率趋*于1;在中间区域,概率*滑过渡。
因此,Y为真的最终概率为:
P(Y=1 | X1...Xk) = σ(Z) = σ(W0 + Σ_{i} (Wi * Xi))
Sigmoid CPD的行为分析
让我们通过参数变化来理解Sigmoid CPD的行为。
假设所有父变量Xi共享相同的权重参数W。我们可以观察到:
- 激活父变量数量的影响:激活(为真)的父变量越多,Y为真的概率越高,因为更多的正向影响在推动Y。
- 权重W大小的影响:对于较小的权重W,需要非常多的父变量为真才能使Y很可能为真。随着W增大,仅需较少的正向影响就能使Y为真。
- 尺度缩放的影响:如果将所有权重W和偏置W0同时放大(例如乘以10),会导致Z值迅速达到极端值,从而使概率从0到1的转变区域变得非常陡峭。

实际应用案例
这种模型在实际中有重要应用。例如,斯坦福医学院开发的用于内科疾病诊断的CPCS网络。
该网络包含约500个变量,每个变量*均有4个取值。如果使用原始的联合分布表示,将需要约4^500个参数,这是一个天文数字。即使使用基本的贝叶斯网络因子化表示,参数也高达约1.34亿个,仍然难以处理。
通过在本网络中使用噪声最大这类因果影响独立性CPD,他们将总参数量减少到了约8000个。这使得模型变得可处理,并允许专家进行参数估计。
总结
在本节课中,我们一起学习了如何表示变量对多个父变量的复杂依赖。
- 我们首先指出了树状CPD的局限性,并引入了噪声或模型,它通过引入中间变量和“或”聚合来模拟多个独立原因的影响。
- 我们将此概念推广到因果影响独立性的框架,涵盖了噪声与、噪声最大等变体。
- 我们深入探讨了Sigmoid CPD,它使用加权和与Sigmoid函数将多个连续影响转化为概率,这实质上也属于因果影响独立性的思想。
- 最后,我们通过CPCS诊断网络的实际案例,看到了应用这类结构化CPD如何将参数数量从天文数字降至可管理的范围,从而使得复杂概率图模型的构建和应用成为可能。
027:连续变量与局部结构表示法 🎯

在本节中,我们将探讨概率图模型中涉及连续变量的情况,并学习如何利用参数化形式来表示这些变量。我们将看到,对于连续变量,传统的条件概率表(CPT)不再适用,必须采用更紧凑的参数化模型。
上一节我们介绍了离散变量的表示方法,本节中我们来看看当变量是连续时,如何表示其概率分布。
连续变量网络的必要性
利用参数化形式等额外局部结构的概率分布(PPDs)在图模型的大背景下极具价值,因为它们允许我们提供更稀疏的表示。当网络涉及连续变量时,参数化形式不仅是高效的,而且是绝对必要的,因为条件概率表(CPT)在这种情况下根本不是一个可行的选项。
连续变量网络示例
让我们看一些涉及连续变量的网络示例,并了解我们可能希望在其中加入何种表示。
示例一:温度传感器模型
假设我们有一个连续的温度变量,例如房间的温度。我们还有一个传感器(温度计)来测量这个温度。温度计并不完美,因此我们预期传感器的读数接*真实温度,但并非完全准确。一种捕捉这种关系的方式是说传感器读数 S 服从一个正态分布。
具体来说,S 是一个以真实温度 T 为均值、标准差为 σ_S 的正态分布。这为每一个 T 的值定义了一个关于 S 的分布,其形式非常紧凑,仅需参数 σ_S。我们可以说 S 是围绕变量 T 值的高斯变量。
公式表示:
S ~ N(T, σ_S²)
示例二:带有扩散过程的温度模型
现在让情况变得更有趣一些。我们有两个变量:当前温度 T 和未来温度 T‘。未来温度 T‘ 依赖于当前温度 T 以及室外温度 O,因为室内外温度会通过某种扩散过程达到*衡。
那么,我们如何为 T‘ 建立关于其两个父节点(当前温度和室外温度)的模型呢?一种模型可能是某种扩散模型,它表示 T‘ 的均值是其父节点的线性组合,并且由于过程中存在随机性和噪声,T‘ 并非精确等于这个均值,而是围绕该均值的高斯分布。
公式表示:
T‘ ~ N(α * T + β * O, σ_y²)
其中,σ_y 是过程噪声的标准差,以区别于传感器方差 σ_S。
示例三:引入离散变量——门的状态
让情况变得更加复杂。假设房间里有一扇门,门可以是开着的或关着的,这是一个取两个值的离散变量 D。显然,扩散的程度将取决于门是否打开,我们预期在离散变量 D 的不同取值下,系统会有不同的参数。
因此,当我们现在写出模型时,未来温度 T‘ 将是一个高斯分布,其参数 α 和 σ 依赖于门变量 D 的值。
公式表示:
如果 D = 0,则 T‘ ~ N(α_0 * T + β_0 * O, σ_0²)
如果 D = 1,则 T‘ ~ N(α_1 * T + β_1 * O, σ_1²)

模型定义与命名
以下是上述示例中引入的两种核心参数化模型。
线性高斯模型

我们之前看到的第一个模型(示例二)被称为线性高斯模型。它适用于一个连续子节点 Y 有多个连续父节点 X₁, …, X_k 的一般情况。
线性高斯模型具有以下形式:Y 是一个高斯分布(用 N 表示),其均值是父节点 X_i 的线性函数(因此得名“线性高斯”),并且其方差完全独立于父节点,是一个固定值。
公式表示:
Y ~ N( w₀ + Σᵢ wᵢ * Xᵢ, σ² )
其中,wᵢ 是权重参数,σ² 是固定方差。
条件线性高斯模型
第二个模型(示例三)被称为条件线性高斯模型。它在混合模型中引入了离散父节点的可能性。这本质上是一个线性高斯模型,但其参数可以依赖于一个或多个离散父节点 A 的值。
公式表示:
对于离散父节点 A 的每一个取值 a:
Y | A=a ~ N( w₀(a) + Σᵢ wᵢ(a) * Xᵢ, σ²(a) )
注意,方差 σ²(a) 可以依赖于离散父节点 A,但不能依赖于连续父节点 X_i。
这两种模型虽然有限制性,但在许多情况下是非常有用的第一*似,并被广泛应用于大量实际问题中。
实际应用:机器人定位
一个涉及连续变量的经典应用是机器人定位任务。在这个任务中,机器人的位置是一个连续量,其传感器(如声纳或激光雷达)提供的观测值也是连续的,这些观测值给出了机器人与各个方向障碍物距离的带噪声版本。
以下是该应用中连续分布的具体使用方式。
观测模型
假设一条线代表从机器人当前位置到某个方向障碍物的真实距离。传感器读数(如声纳或激光)被建模为围绕该真实距离的高斯分布。由于激光传感器通常更精确,其高斯分布的标准差会比声纳传感器更低。
然而,实际使用的传感器模型(图中红线)更为复杂,它聚合了三种信号:
- 障碍物周围的传感器模型:围绕真实距离的高斯峰。
- 最大量程读数:当该方向上一定距离内没有障碍物时,传感器会返回一个最大量程值,对应图中远处的峰值。
- 障碍物前的伪返回:在到达真实障碍物之前,可能有其他瞬态物体(如走过的人)导致光束提前返回,因此障碍物前的概率密度略高。
实际测量数据(图中蓝线)表明,这个复杂的模型在相当程度上反映了现实。
运动模型
机器人的运动模型也涉及连续分布。当机器人认为自己以方向 α 移动了距离 δ 时,由于其方向角 α 和移动距离 δ 本身存在不确定性,其下一个位置的实际分布并非简单的高斯形,而是一个奇特的“香蕉形”分布。
这个香蕉形分布以机器人认为自己将到达的位置为中心,其形状由角轨迹的不确定性导致。如果机器人持续移动而没有传感器证据(如激光读数)来修正位置,这个香蕉形分布会变得越来越扩散。

本节课中我们一起学习了概率图模型中处理连续变量的核心方法。我们了解到,对于连续变量,必须使用参数化的局部结构,如线性高斯模型和条件线性高斯模型,来代替传统的条件概率表。通过温度预测和机器人定位的实例,我们看到了这些模型如何以紧凑的形式捕捉变量间的复杂依赖关系,并将连续与离散变量自然地融合在同一个图模型中。这些模型为在现实世界(如机器人学)中应用概率推理提供了坚实的基础。
028:成对马尔可夫网络
在本节课中,我们将要学习概率图模型的另一个主要分支——基于无向图的模型,即马尔可夫网络。我们将从最简单的子类——成对马尔可夫网络开始,了解其基本概念、表示方法和参数化方式。

概述
概率图模型主要有两个家族:基于有向图的模型(如贝叶斯网络)和基于无向图的模型。无向图模型通常被称为马尔可夫网络或马尔可夫随机场。本节我们将重点介绍其中最简单的子类——成对马尔可夫网络,并探讨其核心思想。
从示例引入
上一节我们介绍了有向图模型,本节中我们来看看无向图模型。首先通过一个简单的例子来理解其应用场景。
假设有四名学生(Alice, Bob, Charles, Debbie)以结对的方式一起学习。他们之间的关系如图所示:Alice和Charles合不来,Bob和Debbie分手后也不再交谈。因此,只有图中用边连接的学生对才会一起学习。

我们关心学生是否对某个容易混淆的知识点存在误解。随机变量表示学生是否有该误解。直觉上,如果两个学生一起学习,他们会相互影响。例如,如果Alice和Bob一起学习,那么其中一人有误解,另一人也很可能有误解。
这种相互影响的关系不适合用有向图表示,因为影响是双向的,无法确定箭头的方向。因此,我们将使用无向图来建模这种情况。
参数化无向图
那么,如何参数化一个无向图呢?由于没有条件概率分布的概念(因为没有明确的“条件”变量),我们需要使用之前定义的更一般的概念——因子。
以下是用于描述学生关系的因子(也称为势函数)示例。请注意,这些数字甚至不一定在0到1的范围内。
φ₁(A, B):
A=0, B=0: 30
A=0, B=1: 5
A=1, B=0: 1
A=1, B=1: 10
这些因子有许多名称,如亲和函数、兼容性函数或软约束。它们的含义是变量A和B取特定联合赋值时的“局部满意度”。
例如,在上面的因子中:
- 最满意的赋值是
A=0, B=0(两个学生都没有误解)。 - 第二满意的是
A=1, B=1(两个学生都有误解,但他们意见一致)。 - 最不满意的是
A=0, B=1和A=1, B=0(两个学生意见相左)。
图中其他结对关系也有类似的“满意度”因子:
- Bob和Charles非常倾向于意见一致。
- Charles和Debbie则倾向于争论,即意见相左时更“满意”。
- Alice和Debbie也倾向于意见一致。
构建联合概率分布
我们通过许多这样的小片段来描述整体状态。那么,如何将这些片段组合起来定义一个联合概率分布呢?我们将使用因子乘积的概念。
具体做法是,将所有因子相乘。然而,这样得到的结果并不是一个概率分布,因为这些数字不在[0,1]区间内,且总和不为1。因此,我们在符号P上加一个波浪号(P̃),表示这是一个未归一化的度量。
未归一化的联合度量定义如下:
P̃(A, B, C, D) = φ₁(A, B) * φ₂(B, C) * φ₃(C, D) * φ₄(D, A)
如何将这个未归一化的度量转化为概率分布呢?答案是归一化。归一化常数在历史上被称为配分函数,用Z表示。
配分函数Z是未归一化度量中所有可能赋值的总和:
Z = Σ_{A,B,C,D} P̃(A, B, C, D)
然后,通过除以Z得到归一化的联合概率分布:
P(A, B, C, D) = (1/Z) * P̃(A, B, C, D)
这个概率分布就是由这个无向图所定义的分布。
理解因子的含义
现在,让我们思考因子 φ₁(A, B) 的含义。它是否等于联合分布中A和B的边际概率 P(A, B)?或者是条件概率 P(A|B)、P(B|A),或给定C和D时A和B的联合概率 P(A, B | C, D)?
答案是否定的。 因子 φ₁(A, B) 并不直接对应任何这些概率。
为了理解这一点,让我们比较一下由所有四个因子 φ 定义的联合分布计算出的实际边际概率 P_φ(A, B),和原始的因子 φ₁(A, B)。
我们会发现,在 φ₁ 中,A和B高度倾向于一致(30远大于其他值)。然而,在实际的边际分布 P_φ(A, B) 中,概率最高的赋值可能并不是两者一致的情况。
为什么会这样?因为概率分布是由所有四个因子相乘得到的。在这个网络中:
- B和C强烈倾向于一致。
- A和D也强烈倾向于一致。
- C和D则强烈倾向于不一致。
这些因子的强度(不同赋值间的差异)甚至比 φ₁(A, B) 还要大。这就形成了一个“循环”:无法同时满足D与A一致、A与B一致、B与C一致,而C与D不一致。这个循环必须在某个环节被打破,而最弱的环节就是 φ₁(A, B)。因此,A和B的边际概率实际上是网络中所有不同因子相互作用的一个复杂聚合结果。
这是一个重要的观点:在马尔可夫网络中,用于构建分布的因子与最终的概率分布之间没有直接的、自然的映射关系。你不能仅仅观察概率分布就说“啊,这一部分就是 φ₁ 应该有的样子”。这与贝叶斯网络形成直接对比,在贝叶斯网络中,因子就是条件概率,可以直接从分布中计算出来。这个区别也会影响我们如何从数据中学习这些因子,因为你无法直接从概率分布中提取它们。
成对马尔可夫网络的定义
基于上述直觉和定义,我们现在可以正式定义成对马尔可夫网络。由于这类网络应用广泛,值得为其单独定义。
一个成对马尔可夫网络包含以下部分:
- 一个无向图,其中节点是随机变量
X₁, ..., Xₙ。 - 图中的每条边
(Xᵢ, Xⱼ)都关联一个因子(或称势函数)φᵢⱼ(Xᵢ, Xⱼ)。
其对应的未归一化度量定义为所有边因子的乘积:
P̃(X₁, ..., Xₙ) = Π_{(i,j)∈E} φᵢⱼ(Xᵢ, Xⱼ)
归一化的联合概率分布则为:
P(X₁, ..., Xₙ) = (1/Z) * P̃(X₁, ..., Xₙ)
应用示例
以下是另一个稍大一点的马尔可夫网络示例,其结构呈网格状。这种网络常用于图像处理任务,因为变量可以对应于像素。

下图展示了一个对应于图像分割任务的马尔可夫网络,其中使用了超像素,因此结构不再是规则的网格。


总结

本节课中我们一起学习了概率图模型中无向图分支的基础——成对马尔可夫网络。我们了解到:
- 无向图适用于建模变量间双向的、对称的依赖关系。
- 使用因子(势函数)来参数化网络,因子表示变量组取值的局部“兼容性”或“满意度”。
- 通过将所有因子相乘得到未归一化的度量,再通过除以配分函数Z进行归一化,得到最终的联合概率分布。
- 强调了因子与概率分布间没有直接映射,这是与贝叶斯网络的关键区别之一。
- 正式定义了成对马尔可夫网络,并简要介绍了其在图像处理等领域的网格状应用。
029:一般吉布斯分布

在本节课中,我们将学习一种比成对马尔可夫网络更具表达力的模型——吉布斯分布。我们将了解其定义、参数化方式,以及它如何与图结构相关联。
概述
之前我们介绍了成对马尔可夫网络的概念。本节中,我们将定义一个更一般、表达能力更强的概念,即吉布斯分布。我们将探讨其数学定义,并理解它如何通过一组因子来参数化一个概率分布,以及这些因子如何诱导出一个图结构。


从成对网络到一般分布
上一节我们介绍了成对马尔可夫网络。本节中我们来看看,仅使用成对交互的网络是否足以表示所有概率分布。
考虑一个包含四个随机变量 A、B、C、D 的网络,并引入所有可能的成对边。问题是:这个网络是否具有完全的表达能力?换句话说,它能表示任意定义在这四个变量上的概率分布吗?
我们可以通过分析参数数量来思考这个问题。假设一个包含 n 个变量的全连接成对马尔可夫网络,每个变量有 d 个可能取值。该网络中的参数数量是 O(n²d²)。
然而,一个定义在 n 个变量(每个有 d 个取值)上的一般概率分布,其自由参数的数量是 dⁿ - 1。这比 O(n²d²) 大得多。因此,直观上,成对马尔可夫网络不足以捕捉所有可能的概率分布。
为了扩展无向表示的表达能力,我们需要超越成对边。
定义吉布斯分布
为了参数化一个一般的吉布斯分布,我们将使用一般的因子。每个因子可以包含两个以上的变量。以前我们只有定义在变量对上的因子,现在我们可以有定义在三个、四个甚至所有变量上的因子。
形式上,一个吉布斯分布由一组因子 Φ = {φ₁, …, φₖ} 参数化。我们通过两个步骤来定义这个分布:
-
构建未归一化度量:将所有因子相乘。这与我们之前见过的因子乘积操作相同。
P̃(x₁, …, xₙ) = ∏_{i=1}^{k} φ_i(D_i)这里,
D_i是因子φ_i的作用域。P̃上的波浪号表示这通常不是一个概率分布,而是一个未归一化的度量。 -
归一化为概率分布:为了将未归一化度量转化为有效的概率分布,我们定义一个配分函数 Z 作为归一化常数:
Z = ∑_{x₁, …, xₙ} P̃(x₁, …, xₙ)然后,用 Z 除以
P̃中的所有项,得到概率分布:P_Φ(x₁, …, xₙ) = (1/Z) * P̃(x₁, …, xₙ)
这样,我们就通过一组因子定义了一个概率分布。
诱导的马尔可夫网络
上述定义给出了分布的参数。那么,与这个吉布斯分布对应的马尔可夫网络在哪里呢?
为了直观理解,考虑一个包含两个因子的分布:φ₁(A, B, C) 和 φ₂(B, C, D)。我们希望网络能编码 A、B、C 之间以及 B、C、D 之间可以相互作用的事实。因此,网络应该包含边 (A, B), (A, C), (B, C)(来自第一个因子)以及边 (B, C), (B, D), (C, D)(来自第二个因子)。合并后,诱导出的图包含所有这五条边。
更一般地,给定一组因子 Φ,其诱导的马尔可夫网络 H_Φ 定义如下:
- 对于每一对变量 X_i 和 X_j,如果存在一个因子 φ ∈ Φ,使得 X_i 和 X_j 都出现在该因子的作用域中,那么在 H_Φ 中,X_i 和 X_j 之间就有一条边。
换句话说,只要两个变量出现在同一个因子中,它们在图里就是相连的。
因子分解与图结构
我们可以反过来定义概率分布 P 在某个图 H 上因子化的概念。这与贝叶斯网络中的定义类似。
我们说概率分布 P 在马尔可夫网络 H 上因子化,如果存在一组因子 Φ,使得:
- P 可以由 Φ 通过上述吉布斯分布过程表示(即
P = P_Φ)。 - 图 H 正是这组因子 Φ 诱导出的图(即
H = H_Φ)。

这回答了“何时可以用图 H 编码分布 P”的问题。
图不能唯一确定因子分解
现在让我们思考一个重要问题:给定一个图 H,我们能唯一确定分布 P 在它上面的因子分解形式吗?答案是否定的。
考虑同一个图结构(例如一个包含四个节点的全连接图或特定子图),不同的因子集合可以诱导出完全相同的图。例如:
- 因子集
{φ₁(A,B,D), φ₂(B,C,D)}诱导出包含边 (A,B), (A,D), (B,C), (B,D), (C,D) 的图。 - 因子集
{φ₃(A,B), φ₄(B,C), φ₅(C,D), φ₆(A,D)}也诱导出完全相同的图。 - 因子集
{φ₇(A,B,C,D)}(一个定义在所有四个变量上的单一因子)同样诱导出完全相同的全连接图。
这些因子化在表达能力上差异巨大(参数数量从 O(d²) 到 O(d⁴) 不等),但它们诱导出的图却是一样的。
关键结论是:我们无法从图结构中读出唯一的因子分解形式。 图结构是因子分解的一种更“粗糙”的表示。
图结构的意义:影响流
既然图不能唯一确定因子分解,那么图结构的意义是什么?它到底告诉我们什么信息?
图结构刻画了影响(或信息)在变量之间可能传播的路径。尽管不同的因子化(参数化)方式在细节上不同,但变量间相互影响的可能性——即图中哪些路径是“活跃”的——只取决于图结构本身。
在马尔可夫网络中,我们定义活跃迹的概念。一条从 X₁ 到 Xₙ 的迹,在给定观测变量集 Z 的条件下是活跃的,当且仅当:
- 迹上的所有中间变量
X_i都不在观测集 Z 中。
其原理是:影响只能通过未被观测的变量流动。一旦一个变量被观测到(即其值已知),它就“阻断”了通过它的影响流,因为它不再能被其父节点或邻居所影响。
例如,在之前的图中,迹 B -> A -> D 在 Z 为空集时是活跃的。但如果变量 A 被观测到(A ∈ Z),那么这条迹就不再活跃,因为 B 无法再通过已被固定的 A 来影响 D。
因此,图 H 编码了分布 P 中的条件独立性,它告诉我们,在给定某些变量被观测到时,其他变量之间何时可能(或不可能)相互影响。这正是图模型的核心价值所在。
总结

本节课中我们一起学习了吉布斯分布的核心内容:
- 吉布斯分布是一种通过一组因子(可作用于多个变量)参数化的概率分布,表示为这些因子乘积的归一化形式:
P = (1/Z) ∏ φ_i。 - 一组因子会诱导出一个马尔可夫网络,其中边的存在条件是变量共同出现在某个因子作用域内。
- 一个概率分布 P 在某个图 H 上因子化,意味着存在一组因子能表示 P 并诱导出图 H。
- 重要洞见:图结构不能唯一确定具体的因子分解形式。不同的参数化可以对应同一个图。
- 图结构的意义在于它刻画了变量间的影响流(活跃迹),从而编码了分布中的条件独立性关系。影响流是否通畅仅取决于图的结构,而非因子分解的具体细节。
030:条件随机场 (CRF) 🧩


在本节中,我们将学习一种非常重要的马尔可夫网络变体——条件随机场。它如今的应用非常广泛,其核心思想与标准马尔可夫网络相似,但设计目的有所不同。
概述:任务特定的预测问题
条件随机场这类模型旨在处理“任务特定的预测”问题。在这类问题中,我们总有一组输入(或观测)变量 X,以及一组我们试图预测的目标变量 Y。模型的设计前提是,我们总是面对相同类型的输入和输出变量,并试图解决本质上相同的问题。
为了更清晰地理解,让我们看两个例子。

以下是两个典型的应用场景:
- 图像分割:输入 X 是像素值及其处理后的特征(如颜色和纹理直方图)。目标变量 Y 是每个像素的类别标签(例如,草地、天空、牛、水等)。模型的目标是从 X 预测 Y。
- 自然语言处理 (NLP):输入 X 是一个句子中的单词序列。输出 Y 是我们试图推导的单词标签(例如,人名、地点、机构名等)。同样,输入始终是单词,输出始终是标签。
为何需要条件随机场?
既然要解决这类预测问题,为什么不直接使用我们之前学过的标准概率图模型呢?让我们思考一下这样做可能存在的问题。
想象一下,在图像分割任务中,我们试图预测一个超像素的类别标签 Y_i。我们会处理该超像素的特征,生成一系列代表其外观的颜色和纹理直方图。根据上一节的符号,Y_i 是我们的目标变量 Y,而下面的这些特征就是我们的输入 X。
问题在于,这些通常对像素类别信息量很大的特征之间,往往存在高度的相关性。例如,测量线条方向的纹理直方图,在测量的纹理结构类型上可能包含大量冗余信息。
如果我们用一个朴素的模型(例如朴素贝叶斯模型)来表示,假设特征在给定标签的条件下相互独立,那么我们实际上忽略了这种相关性结构。这会导致严重的问题:如果我有五个高度相关、测量同一事物的特征,模型会将其计数五次。这会使模型因为这一个事实而变得过度自信,从而产生严重偏斜的概率分布,不能真实反映我们的信念,因为它做出了错误的独立性假设。


那么,为什么不建立正确的独立性假设,添加一堆边来捕捉特征间的相关性呢?事实证明这非常困难。首先,理清这些*凡特征之间的相关性本身就很难。其次,尝试加入这些相关性会导致模型变得高度稠密连接。如果我们开始在所有特征之间添加边,模型会变得异常复杂。
条件随机场的核心思想
条件随机场提供了一个完全不同的解决方案。其核心思想是:我们并不关心输入特征 X 本身的概率分布。我们不想预测像素的概率分布(例如,一个绿色像素旁边是另一个绿色像素再旁边是一个棕色像素的概率)。我们面对的是一个已经给定的输入 X,我们真正关心的只是在给定 X 的条件下,目标变量 Y 的条件概率分布。

因此,我们重新定义了问题:不再对 X 和 Y 的联合分布进行建模,而是直接对给定 X 时 Y 的条件分布进行建模。既然我们不试图捕捉 X 的分布,那么我们也就无需关心 X 内部特征之间的相关性了。这一点在我们看具体例子时会更加清晰。
条件随机场的正式定义
在深入例子之前,让我们先给出条件随机场(CRF)的正式定义。CRF 乍看之下很像吉布斯分布。
与吉布斯分布类似,我们有一组定义在作用域上的因子。与吉布斯分布类似,我们将这些因子相乘,得到一个未归一化的度量。到目前为止完全一样,只是现在这个未归一化度量的参数是 X 和 Y,而不仅仅是一组随机变量。
关键区别在于归一化。为了对给定 X 时 Y 的条件分布进行建模,我们需要将 X 放在条件概率的右侧。这意味着我们将有一个依赖于 X 的、单独的归一化常数(或称配分函数)。
其数学形式如下:
P(Y | X) = (1 / Z(X)) * ∏ φⱼ(Dⱼ)
其中,Z(X) = ∑_Y ∏ φⱼ(Dⱼ) 是依赖于 X 的配分函数。
这意味着,对于任何一个给定的 X,我们对所有可能的 Y 取值进行求和。然后,通过除以这个与 X 相关的配分函数 Z(X),我们为这个特定的 X 构造了一个在 Y 上的条件概率分布。这样就定义了一个随 X 变化的条件分布族。
与逻辑回归的联系
有趣的是,条件随机场与我们在许多机器学习课程中见过的逻辑回归模型高度相关,后者在贝叶斯网络中也可以作为一种条件概率分布表示。为了理解这种联系,让我们看一个非常简单的例子。
假设 X 和 Y 都是二元随机变量(取值为 0 或 1)。在我们的对数线性模型中,使用一个简单的特征表示:一个指示函数。我们有一个特征,当 X=1 且 Y=1 时其值为 1,否则为 0,并带有一个参数 w。
将这个特征代入 CRF 表示并进行推导后,我们可以得到给定 X 时 Y=1 的概率为:
P(Y=1 | X) = sigmoid(w * X) = e^{wX} / (1 + e^{wX})
这正是我们熟悉的 Sigmoid 函数。由此我们得出结论:逻辑回归模型是一个极其简单的条件随机场。
从朴素贝叶斯到逻辑回归的视角
从这个数学推导出发进行更广泛的思考:如果我们不是进行这种条件归一化,而是使用相同的成对特征(连接 Y 和每个 X_i)来对 X 和 Y 的联合分布进行建模,那么我们会得到一个类似朴素贝叶斯的模型。因为特征 X 之间没有连接边,所以模型会假设给定 Y 时,所有 X 相互独立。

但是,当我们将其建模为条件分布 P(Y|X) 时,我们有效地从分析中移除了 X 之间相关性的任何概念,而只专注于 X 如何共同影响 Y 的概率。这就是朴素贝叶斯模型和逻辑回归模型之间的本质区别。
同样的直觉可以扩展到更丰富的模型类别,其中 Y 和 X 不再是简单的二元变量。这种忽略输入特征分布、只关注目标变量的能力,使我们能够利用丰富的特征,而无需担心它们是否彼此独立。
在复杂任务中的应用优势
让我们回到图像分割的例子。在 CRF 中,我们通常使用非常丰富的特征。例如,在定义与类别标签 Y_i 相关的单个节点势能时,我们无需担心特征之间的相关性。我们可以使用颜色直方图、纹理特征,甚至像“寻找牛的眼睛”这样的判别性特征。所有这些特征可能高度相关,但这没有关系,因为我们不关心它们的联合分布。
你甚至可以查看超像素之外的特征,例如:“如果下面完全不同的超像素是绿色的,那么它更可能是一头牛或一只羊,因为它们倾向于在草地上。”这些特征肯定是相关的,因为你同时在为当前超像素和另一个超像素计算类似的特征。但这没关系,因为我们不担心超像素之间的相关性。
同样的思想也适用于语言处理的 CRF。我们通常拥有高度相关的特征,例如:单词是否大写、是否出现在某个名称列表中、前一个单词是否是“Mr.”或“Mrs.”等。这些特征经常彼此相关,甚至同一个词可能作为多个单词的特征出现。这都没有问题,因为我们不试图对句子中单词的分布建模,而是对给定单词时的标签概率建模。

需要指出的一点是,在这个框架中,“特征”一词是重载的,可能会造成混淆。它既指上下文中的具体特征(如图像特征、单词特征),也指定义对数线性模型时使用的“特征函数” f。这确实容易混淆,但通常可以从上下文中分辨其含义。
总结

在本节中,我们一起学习了条件随机场。我们来总结一下要点:
- 定义:条件随机场形式上很像吉布斯分布,但有一个微妙而关键的区别——它的归一化方式不同。它通过一个依赖于输入 X 的配分函数进行归一化,从而直接构造了给定 X 时 Y 的条件概率分布。
- 与经典模型的关系:作为一个特例,它包含了标准的逻辑回归模型,但拥有更强大的表达能力。
- 核心优势:我们无需对那些我们不关心的变量(即输入 X)的分布进行建模,而只专注于我们真正想要预测的变量(即目标 Y)。
- 关键效用:这使得我们可以设计非常强大、表达能力丰富的预测器(例如,用于模型各部分),而无需担心不同变量之间不正确的依赖性。如果我们试图对这些丰富特征的联合分布进行建模,这种不正确的依赖将是不可避免的。

条件随机场通过直接对条件分布建模,巧妙地规避了复杂特征间相关性建模的难题,使其在图像分割、自然语言处理等需要丰富特征的任务中表现出色。
031:马尔可夫网络中的独立性
在本节课中,我们将要学习马尔可夫网络中独立性与概率分布因子分解之间的关系。我们将看到,这种关系与我们在贝叶斯网络中建立的非常相似,但存在一些重要的区别。

上一节我们介绍了贝叶斯网络中独立性与因子分解的对应关系,本节中我们来看看这种关系在马尔可夫网络中是如何体现的。
马尔可夫网络中的分离概念
首先,我们需要一个类似于贝叶斯网络“d-分离”的概念,用于从图结构本身解读独立性。在马尔可夫网络中,这个概念称为“分离”。
分离 的定义是:在无向图H中,给定节点集Z,节点集X与Y被分离,当且仅当在H中,连接X和Y的每条路径都被Z中的节点所“阻塞”。
这里的“路径”是指一系列相邻节点构成的序列。“阻塞”的概念很简单:如果路径上的某个节点在观测集Z中,那么这条路径就被阻塞了。换句话说,分离 意味着在给定Z的条件下,X和Y之间没有“活跃路径”。
分离性质示例
以下是几个分离性质的例子,可以帮助我们理解这个概念。

考虑上图,我们来看如何分离节点A和E。

- 给定节点集 {B, D},A和E被分离。因为B和D同时阻塞了A到E的两条可能路径。
- 给定节点集 {C},A和E也被分离。因为C阻塞了其中一条路径(A-B-C-E),而另一条路径(A-B-D-E)上的B未被观测,但D未被观测,然而,由于路径A-B-D-E上的B未被观测,这条路径本身不活跃?等一下,我们需要澄清:在无向图中,只要路径上任何一个节点在Z中,该路径就被阻塞。在A-B-D-E路径中,B和D都不在Z={C}中,所以这条路径没有被阻塞。因此,仅给定C,A和E并不分离。原视频描述可能有误或简略。更准确的例子可能是:
- 给定节点集 {B, C},A和E被分离。因为B阻塞了路径A-B-D-E,C阻塞了路径A-B-C-E。
从分离到独立性:IMap 定理
现在我们可以证明一个与贝叶斯网络几乎相同的定理。
定理(分解蕴含独立):如果概率分布P可以因子分解为马尔可夫网络H(即 P(X) ∝ ∏ φ_c(X_c),其中c是H中的团),并且在该图中,X和Y在给定Z的条件下被分离,那么P必定满足条件独立关系:(X ⊥ Y | Z)。
这个定理的意义在于,我们可以将从图H中读出的所有分离性质,定义为图H所蕴含的独立性集合,记作 I(H)。
类似于贝叶斯网络,我们引入 IMap(独立映射) 的概念:
如果概率分布P满足图H所蕴含的所有独立性(即
I(P) ⊇ I(H)),则称H是P的一个IMap。
我们刚刚证明的定理可以重述为:如果P因子分解于H,那么H是P的一个IMap。因为因子分解保证了P满足从H中读出的所有独立性。
从独立性到分解:逆定理

在贝叶斯网络中,我们有一个完美的逆定理:如果H是P的IMap(且P是“与图相容”的分布),那么P可以因子分解为H的结构。
在马尔可夫网络中,逆定理几乎成立,但需要一个关键的前提条件。
定理(独立蕴含分解,Hammersley-Clifford):如果概率分布P是正分布(即对于所有可能的变量赋值x,都有 P(x) > 0),并且无向图H是P的一个IMap,那么P可以因子分解为H的结构(即,P是定义在H的团上的因子的乘积)。
“正分布”的假设至关重要。如果分布P包含确定性的关系(即某些赋值的概率为0),那么这个逆定理可能不成立。
两种视角的等价性
因此,我们再次得到了描述图结构的两种几乎等价的视角:
- 因子分解视角:图H允许概率分布P以一种紧凑的方式(基于团的因子乘积)表示。
- 独立性(IMap)视角:从图H中,我们可以读出一组必须存在于P中的条件独立性关系。
这两种视角通过上述两个定理紧密相连。简单来说,如果P能按H因子分解,那么H中编码的独立性在P中都成立。反之,如果P是正分布且满足H中编码的所有独立性,那么P一定能按H因子分解。
总结
本节课中我们一起学习了马尔可夫网络中独立性与因子分解的核心关系。

- 我们引入了分离的概念,作为从无向图结构中解读独立性的标准。
- 我们证明了关键定理:因子分解性意味着图结构所蕴含的独立性(即因子分解 → IMap)。
- 我们探讨了逆定理(Hammersley-Clifford定理),它指出对于正分布,独立性同样意味着因子分解性(即IMap → 因子分解)。
- 这确立了马尔可夫网络中因子分解视角与独立性视角在正分布条件下的基本等价性,这与贝叶斯网络中的结论相似,但增加了对分布正定性的要求。
032:I-映射与完美映射
在本节课中,我们将探讨如何将一个满足特定独立性集合的概率分布,编码到图结构中。我们将学习I-映射、完美映射等核心概念,并理解图模型在捕捉分布独立性方面的能力与局限。

概述
之前我们已经证明,图结构编码了一组独立性,并且这组独立性必然适用于所有可以编码为该图结构上贝叶斯网络的分布。
现在我们要讨论的问题是:如何将一个满足特定独立性集合的分布,编码到一个图结构中。我们能在多大程度上,在图模型的框架下捕捉该分布的独立性?
分布中的独立性
首先,让我们理解一个分布的独立性是什么。

我们将为分布 P 定义 I(P) 这个概念。I(P) 是分布 P 中成立的所有独立性语句的集合。这些语句的形式是:在给定 Z 的条件下,X 独立于 Y。
我们可以写出一个可能指数级庞大的独立性语句集合,其中每个语句在给定分布 P 中要么为真,要么为假。我们将 I(P) 定义为在该分布中为真的那些语句。
这些就是在分布 P 中成立的独立性。
我们已经知道,如果 P 在特定图 G 上可因子分解,那么 G 是 P 的一个 I-映射。这意味着图 G 通过 d-分离 性质所蕴含的每一个独立性,在分布 P 中也成立。
但这并不意味着反过来也成立。也就是说,在 P 中成立的、属于 I(P) 的独立性,可能并未被图结构编码。
为什么捕捉独立性很重要?
如果一个图没有捕捉到 P 中的某些独立性,那么它就“不必要地复杂”。相反,图越稀疏,它编码的独立性就越多。
更稀疏的图意味着我们需要指定或学习的参数更少,推理效率也更高。同时,图本身也更能反映 P 的内在特性。因此,我们希望图能尽可能多地捕捉 P 的独立性特性。
最小 I-映射
在稀疏性方面,一个基本要求是所谓的 最小 I-映射。我们希望得到一个分布 P 的 I-映射,它至少没有冗余的边。
例如,如果我们有一个图 X → Y,但 Y 实际上并不依赖于 X(即条件概率分布 P(Y|X=0) = P(Y|X=1)),那么我们可以移除这条边,得到的图仍然是该分布的一个 I-映射。因此,这条边是冗余的。
根据定义,这意味着这个 I-映射不是最小的,因为你可以从中移除边而仍然保持 I-映射的性质。
这似乎是一个合理的策略,但事实证明,仅凭这一点不足以确保我们的图达到可能的最稀疏状态。
为了理解原因,让我们看一个分布的例子,它对应于我们之前见过的学生成绩场景。学生的成绩 G 依赖于两个变量:课程难度 D 和智力 I。
下图是一个最小 I-映射,其中 D 和 I 独立,而 G 依赖于两者。
D I
\ /
G
但事实证明,这不是该分布唯一的最小 I-映射。另一个不同的最小 I-映射如下所示:
D → I
↓ ↓
G ← ?
让我们验证这确实是一个最小 I-映射。尝试移除其中任何一条边,看看是否仍然得到原始分布的一个 I-映射。
- 如果尝试移除边 D → I,这将对应 D 独立于 I 的陈述,这显然在原始分布中不成立。
- 如果尝试移除边 G → I,这将对应在给定 D 的条件下 G 独立于 I 的陈述,这在原始分布中也不成立。
- 如果尝试移除最后一条边 D → G(这条边在原网络中不存在),这似乎最有希望。移除它对应在给定 G 的条件下 D 独立于 I 的假设。而这正是我们之前见过的“解释消除”推理所诱导出的依赖关系。因此,这条边也不能移除。
所以,这确实是一个最小 I-映射。虽然存在更好的最小 I-映射,但这个也是。因此,最小 I-映射不一定是捕捉分布结构的最佳工具。
完美映射
我们真正想要的是 完美映射。一个完美映射是指图 G 中编码的独立性与分布 P 中的独立性完全对应。图 G 完美地捕捉了 P 中的独立性。如果能实现这一点,那将是理想的。
不幸的是,完美映射通常很难获得。
以下是一个不存在完美映射的场景示例。分布 P 实际上由我们之前见过的这个成对马尔可夫网络表示:
A — B
| \ |
D — C
我们知道,由于马尔可夫网络的性质,这个分布满足某些独立性。具体来说,我们知道在给定 B 和 D 的条件下,A 独立于 C,因为 B 和 D 在图中间隔开了 A 和 C。同时,我们知道在给定 A 和 C 的条件下,B 独立于 D。
现在,假设我们有一个分布 P 满足这些独立性。让我们尝试使用贝叶斯网络作为完美映射来编码这些独立性。
尝试一:简单地给边定向,比如这样:
A → B → C
↑ ↓
D ←-----←
这是该分布的一个 I-映射吗?这个图蕴含的独立性之一是在给定 A 的条件下,B 独立于 D。这显然不被原始分布支持。因此,这不是一个 I-映射。
尝试二:以另一种方式组织边,例如:
A → B
↓ ↓
D → C
这个图正确地蕴含了在给定 A 和 C 的条件下 B 独立于 D,这是我们之前的一个独立性。但它也做出了其他在原始分布中不成立的独立性假设,例如 A 和 C 是边缘独立的。因此,这也不是一个 I-映射。
那么,作为有向图,什么是该分布的一个 I-映射呢?一个可能的 I-映射如下:
A → B → C
↑ ↑
D —-----→
你可以确认,这个图蕴含在给定 B 和 D 的条件下 A 独立于 C,并且仅此而已。因此,这确实是该分布的一个 I-映射,因为在这种情况下,I(G) 是 I(P) 的子集。但它没有捕捉到所有的独立性,只捕捉了两个中的一个。
所以,这是一个不存在贝叶斯网络完美映射的分布。
另一个不完美映射的例子
让我们提供另一个不完美映射的例子。实际上,这是一个既没有贝叶斯网络完美映射,也没有马尔可夫网络完美映射的分布。这就是著名的 “异或” 例子,它将是许多情况的反例。
这里有两个随机变量 X1 和 X2,我们假设它们是二值的,每个变量以 50/50 的概率取 0 或 1。另一方面,Y 是 X1 和 X2 的异或,这意味着当且仅当 X1 或 X2 中恰好有一个等于 1 时,Y 等于 1。
让我们看看这个概率分布 P 是什么样子。它有四种非零概率的配置,每种概率均为 0.25。X1 和 X2 可以各自以 50/50 的概率为 0 或 1,Y 的值如上定义。
现在,让我们思考在这个分布中成立的独立性语句。最明显的是,X1 与 X2 是边缘独立的。但仔细观察结构,你会发现 X1、X2 和 Y 在结构上是对称的。不难验证,我们还有 X1 独立于 Y,以及 X2 独立于 Y。所有这三个两两独立性都在这个分布中成立。
因此,左边的图(任何试图连接它们的图)并不是这个分布的完美映射,因为存在图中不可见的、但在分布中成立的独立性。事实上,无论你以何种方式组织图中的节点,都无法同时捕捉所有这三个独立性,因为要做到这一点,唯一的方法是让 X1、X2 和 Y 成为完全分离的变量,而这显然不会是原分布的一个 I-映射。
马尔可夫网络作为完美映射
我们讨论了贝叶斯网络作为完美映射。那么马尔可夫网络呢?这里的定义是相同的,只是将 G 替换为 H:如果一个马尔可夫网络 H 编码的独立性与 P 中的独立性完全对应,那么它就是完美映射。
我们能否用马尔可夫网络作为完美映射来捕捉所有可能的分布呢?我确信你们此刻都预期答案是否定的,事实也确实如此。以下是一个分布的例子,它存在完美映射(在这种情况下是贝叶斯网络),但不存在马尔可夫网络完美映射。
这就是著名的 V-结构 例子(难度 D,智力 I,成绩 G)。让我们思考一下,为了成为该分布的一个 I-映射,我们需要编码哪些边。
显然,我们需要在 D 和 G 之间,以及 I 和 G 之间引入边,因为我们肯定无法在给定 I 的条件下使 D 和 G 独立(反之亦然)。因此,这将是该分布一个明显的 I-映射候选。
但是,如果我们选择这个作为候选 I-映射,它将蕴含其他一些独立性,例如在给定 G 的条件下 D 独立于 I。而这当然是错误的,因为我们知道当我们以 G 为条件时,D 和 I 会变得依赖。
因此,该分布唯一的 I-映射是包含所有三条边的完全连接图,而这失去了我们原本拥有的边缘独立性(D 和 I 独立)。所以,这个分布同样没有马尔可夫网络完美映射。
I-等价与表示的唯一性
我们可能问自己的最后一个问题是:一个分布的表示在多大程度上是唯一的?假设我们可以用某个图(例如作为完美映射)来表示一个分布,这种表示是唯一的吗?
为了理解这一点,让我们先看一个最简单的例子,其中有两个变量 X 和 Y。这里有一个图 G1: X → Y,它没有编码任何独立性假设,所以 I(G1) 是空集。另一个图 G2: X ← Y 看起来相同,只是边的方向相反,它同样具有完全相同的(空)独立性集合。
因此,我们看到这里有两个不同的图,具有完全相同的独立性假设集合。正因为如此,它们可以表示完全相同的分布集合(在这种情况下,是所有关于变量 X 和 Y 的分布)。
有人可能认为这是一个退化例子,因为它是一个全连接图。但事实并非如此,在许多其他情况下,边方向不同的两个不同图可以表示完全相同的独立性假设集合。
例如,当我们观察三个随机变量的图时,以下四种场景中有三种代表了相同的独立性假设集合,只有一种是不同的。
以下是四个图的结构:
- 链: X → Y → Z
- 叉: X ← Y → Z
- 对撞: X → Y ← Z (V-结构)
- 反链: X ← Y ← Z
我相信大多数人都意识到,这里的答案是 V-结构(对撞结构)。这个图具有边缘独立性假设:X 独立于 Z。而其他三个图具有条件独立性假设:在给定 Y 的条件下,X 独立于 Z。
因此,这三个图再次代表了相同的独立性假设集合。因此,任何可以被其中一个图表示的概率分布,也可以被另一个图表示。
这个概念的形式化术语称为 I-等价。如果两个定义在相同变量集上的图 G1 和 G2 做出完全相同的独立性假设,则称它们是 I-等价的。

在前面的例子中,我们看到 X → Y → Z 与 Y 同时是 X 和 Z 的父节点(即 X ← Y → Z)是 I-等价的,而 V-结构则不等价。
为什么 I-等价是一个重要的概念?因为它告诉我们,图模型的某些方面是不可识别的。这意味着,如果我们出于某种原因认为某个图代表了我们的概率分布,那么它也很可能是另一个等价的图。因此,如果没有某种先验知识(例如,我们更倾向于 X 是 Y 的父节点),我们无法在这些不同的选择中进行选择。
事实证明,这不是例外,而是普遍规则。大多数图都有大量等价的变体,这成为一个复杂因素,尤其是当我们从数据中学习模型时。
总结
在本节课中,我们一起学习了以下内容:
- 目标:我们倾向于使用能尽可能多地捕捉 I(P) 中结构的图,因为它们更紧凑、更容易学习、更容易进行推理,并且能为我们提供关于分布的更多洞察。
- 最小 I-映射:我们讨论了最小 I-映射作为一种稀疏图的选择,并展示了它并不是一个特别好的选择,因为它可能无法捕捉分布中存在的、甚至可以用图模型表示的结构。
- 完美映射:一个更好的概念是完美映射,它非常理想,但在许多情况下可能不存在。
- 模型间的转换:我们已经看到,当我们尝试将一个自然表示为贝叶斯网络的分布表示为马尔可夫网络时,通常无法得到完美映射,我们会丢失独立性(反之亦然)。具体来说:
- 从贝叶斯网络到马尔可夫网络时,我们会丢失 V-结构 中的独立性。
- 从马尔可夫网络到贝叶斯网络时,我们需要在环内添加边(例如在 ABCD 环中,我们必须在中间添加一条边),这种边通常称为三角化边,因为它将环变成一对三角形。
- I-等价:我们还介绍了 I-等价的概念,它表明图表示可能不是唯一的,许多不同的图结构可以编码完全相同的独立性集合,这在模型学习中是需要注意的一个重要方面。

通过理解 I-映射、完美映射和 I-等价,我们能够更深入地评估和选择适合特定概率分布的图模型表示,并认识到其固有的能力和限制。
033:对数线性模型

在本节课中,我们将学习如何在无向模型中引入局部结构,其核心框架被称为对数线性模型。我们将了解其基本形式、如何表示因子,以及它在实际应用中的几个例子。
引入对数线性模型
在上一节中,我们讨论了有向和无向模型中局部结构的重要性。本节中,我们来看看如何在无向模型中具体地融入局部结构。
其核心框架被称为对数线性模型,原因稍后会变得清晰。
在原始的未归一化密度表示中,我们定义 P̃ 为一系列因子 φᵢ(Dᵢ) 的乘积,每个因子可能是一个完整的参数表。
现在,我们将把这种表示转换为一种使用线性形式的方法。其形式如下:
P̃(x) = exp( Σⱼ wⱼ fⱼ(Dⱼ) )
这被称为“对数线性”模型,因为取对数后,log P̃(x) = Σⱼ wⱼ fⱼ(Dⱼ),是一个关于特征的线性函数。
在这个形式中:
- wⱼ 被称为系数或权重。
- fⱼ(Dⱼ) 被称为特征。每个特征,类似于因子,都有一个作用域 Dⱼ,即它所依赖的变量集合。
- 不同的特征可以拥有相同的作用域,即可以对同一组变量定义多个特征。
将指数函数移入求和内部,我们得到:

P̃(x) = Πⱼ exp( wⱼ fⱼ(Dⱼ) )
我们可以将每个 exp( wⱼ fⱼ(Dⱼ) ) 视为一个小的因子,但这个因子只有一个参数 wⱼ。
用对数线性模型表示因子
这个概念有些抽象,让我们看一个具体的例子:如何将一个简单的表格因子表示为对数线性模型。
假设有一个因子 φ 作用于两个二元随机变量 X₁ 和 X₂。一个完整的表格因子会有四个参数:a₀₀, a₀₁, a₁₀, a₁₁。
我们可以使用一组指示函数特征来捕获这个因子。指示函数的形式为 1{条件},当条件满足时值为1,否则为0。
为了表示这个因子,我们可以定义四个特征,每个对应表格中的一个条目:
fₖₗ(x₁, x₂) = 1{x₁=k, x₂=l},其中 k, l ∈ {0, 1}
然后,将对数线性模型定义为:
P̃(x₁, x₂) = exp( Σₖ Σₗ wₖₗ * 1{x₁=k, x₂=l} )
如果我们定义权重 wₖₗ = -log(aₖₗ),那么通过计算可以验证,这个对数线性模型正好还原出原始的因子 φ。

这表明,对数线性模型是一种通用的表示方法。我们可以通过包含所有可能的细粒度特征来表示任何因子。但在实践中,我们通常希望使用更精简、更有意义的特征集。
实践中的特征示例
以下是实际应用中常用的几种特征类型。
语言模型中的特征
考虑一个命名实体识别任务中的语言模型。我们有两组变量:
- Y:序列中每个词的标签(如人名、地名、机构名的开始或延续部分)。
- X:句子中实际的词。
使用完整的表格来关联每个 Yᵢ 和所有可能的 Xᵢ 会非常低效。相反,我们可以定义更智能的特征:
- 特征1:f₁(yᵢ, xᵢ) = 1{yᵢ = “人名-B” 且 xᵢ 首字母大写}
- 这个特征不关心具体是哪个词,只关心该词是否大写,并用一个权重参数来量化“大写”对识别“人名”的重要性。
- 特征2:f₂(yᵢ, xᵢ) = 1{yᵢ = “地名-B” 且 xᵢ 出现在地图册中}
- 这个特征利用外部知识(地图册),赋予出现在其中的词更高的概率被标记为地名。
通过组合大量此类有意义的特征,我们可以构建一个强大而高效的模型。
伊辛模型(统计物理学)

伊辛模型是一个成对马尔可夫网络,变量是二元取值 {-1, +1},代表电子的自旋方向。它关注相邻变量对。

其核心特征是相邻变量值的乘积:
fᵢⱼ(xᵢ, xⱼ) = xᵢ * xⱼ
由于 1 * 1 = (-1) * (-1) = 1,而 1 * (-1) = -1,因此这个特征本质上衡量相邻原子是同向自旋(值高)还是反向自旋(值低)。权重 wᵢⱼ 的正负决定了模型是倾向于铁磁性(同向)还是反铁磁性(反向)。
模型中还引入了温度 T 的概念:
P̃(x) = exp( Σ_{(i,j)} (wᵢⱼ / T) * (xᵢ * xⱼ) )
- 高温时(T 很大),权重项趋*于0,相邻原子几乎独立。
- 低温时(T 很小),相互作用项的影响变得显著,系统倾向于形成一致的自旋区域。
度量马尔可夫随机场
这种模型常用于变量取值于同一个标签空间 V(例如,所有变量都是类别标签)的情况。我们希望相邻变量 Xᵢ 和 Xⱼ 的取值相似。
为此,我们引入一个距离函数 μ,它衡量两个标签 vₖ 和 vₗ 之间的差异。距离函数通常满足:
- 非负性:μ(vₖ, vₗ) ≥ 0
- 同一性:μ(vₖ, vₗ) = 0 当且仅当 vₖ = vₗ
- 对称性:μ(vₖ, vₗ) = μ(vₗ, vₖ)
- 三角不等式:μ(vₖ, vₗ) ≤ μ(vₖ, vₘ) + μ(vₘ, vₗ) (满足前三条称为半度量,满足全部四条称为度量)。
在MRF中,我们定义特征为:
fᵢⱼ(xᵢ, xⱼ) = μ(xᵢ, xⱼ)
并配合一个负的权重 wᵢⱼ < 0。这样,模型的对数概率为:
log P̃ ∝ Σ_{(i,j)} wᵢⱼ * μ(xᵢ, xⱼ)
由于 wᵢⱼ 为负,μ(xᵢ, xⱼ) 越小(即标签越相似),该项的贡献越大,整个配置的概率也就越高。反之,标签差异越大,概率越低。
以下是几种常见的度量函数:
- 简单度量:μ(vₖ, vₗ) = 0 如果 vₖ = vₗ,否则为 1。这鼓励相邻变量取相同标签,但不关心具体是哪个标签。
- 绝对差度量:μ(vₖ, vₗ) = |vₖ - vₗ|。适用于数值型标签,惩罚与差值成线性关系。
- 截断线性度量:μ(vₖ, vₗ) = min( c, |vₖ - vₗ| )。当差值超过阈值 c 后,惩罚不再增加。这允许在证据足够强时,相邻变量可以取截然不同的值。
度量MRF的一个典型应用是图像分割,我们希望相邻的超像素块倾向于被分配相同的类别标签。
应用案例:图像去噪与立体视觉

让我们看两个基于度量MRF思想的具体计算机视觉应用。
图像去噪
我们有一个含噪声的图像(观测变量 X)和希望恢复的干净图像(隐变量 Y)。我们建立模型关联 X 和 Y,并施加两种约束:
- 数据保真项:每个干净像素 Yᵢ 应接*其观测到的噪声像素 Xᵢ。
- 空间*滑项:相邻的干净像素 Yᵢ 和 Yⱼ 应具有相似的值(这是一个度量MRF)。
如果仅使用线性惩罚(如绝对差),模型会过于脆弱,可能将整个图像*滑成一片灰色。因此,截断线性度量在这里非常有效:它允许在颜色或纹理发生显著变化的边界处,相邻像素可以拥有不同的强度值,从而在去噪的同时保留边缘。
立体视觉重建
在立体视觉中,我们希望根据左右图像的匹配,推断出每个像素的视差(深度,变量 Y)。同样,我们利用空间连续性先验:相邻像素的深度应该相似。
这里也经常使用截断线性度量模型,因为场景中存在深度不连续的物体边界。模型还可以进行增强,例如,根据相邻像素的颜色和纹理相似性来动态调整*滑强度:颜色纹理越相似,*滑约束越强;差异越大,约束越弱,允许深度在此处发生跳变。
总结
在本节课中,我们一起学习了对数线性模型,这是在无向图中引入局部结构的重要框架。
- 我们首先看到了如何将传统的因子乘积形式,转化为基于特征加权求和的指数形式。
- 通过例子,我们理解了任何因子都可以用对数线性模型表示,但实践中我们使用更精简、更有意义的特征。
- 接着,我们探讨了语言模型中的二值特征、统计物理中的伊辛模型特征,以及广泛使用的度量特征。
- 最后,我们看到了度量MRF,特别是截断线性度量,在图像去噪和立体视觉等实际问题中的强大应用。

对数线性模型通过定义灵活的特征,使我们能够构建参数更少、表达力更强、更适合特定问题领域的概率图模型。
034:对数线性模型中的共享特征 🧩
在本节中,我们将学习无向图模型,特别是对数线性模型中,如何实现结构和参数的共享。共享机制在无向模型中尤为重要,因为与有向模型不同,无向模型的参数(通常表示为能量函数中的权重)不直接代表条件概率或概率,因此将它们设计为可复用的“模板”或“构建块”会更为简便。
上一节我们讨论了有向模型中的参数共享,本节中我们来看看无向模型中的情况。

共享参数的必要性
在无向模型中,指定参数通常更为困难。因此,将模型表示为由更小组件构成的模板是一种更自然的方法。对数线性模型为此提供了一种简洁的框架。
伊辛模型示例
让我们从一个简单的例子开始:伊辛模型。该模型最初用于统计物理学,描述网格中原子的自旋。
在伊辛模型中,每个随机变量 $ X_i $ 代表一个原子的自旋,取值为 +1 或 -1。模型的能量函数是所有边上能量项的总和。
最初,我们可能为每对相邻原子 \((i, j)\) 设置一个独立的权重参数 $ W_{ij} $ 和一个特征函数 $ f(X_i, X_j) \(。特征函数通常是两者取值的乘积:\) f(X_i, X_j) = X_i \times X_j $。当两个自旋方向相同时,乘积为 +1;相反时,乘积为 -1。
然而,我们通常不会为材料中的每一对原子都设置一个不同的模型。更常见的做法是,使用一个共享的权重参数 $ W $ 来表示所有相邻原子对之间的相互影响程度。这样,我们就有了一个在模型的不同随机变量对之间复用相同特征和相同权重的模型。
公式表示:
原始的每边独立参数模型:$ \text{Energy} = \sum_{(i,j) \in \text{Edges}} W_{ij} \cdot (X_i \times X_j) \(
共享参数后:\) \text{Energy} = W \cdot \sum_{(i,j) \in \text{Edges}} (X_i \times X_j) $

自然语言处理示例
在诸如命名实体识别的自然语言处理任务中,参数共享同样普遍。
以下是模型中常见的特征类型:
- 词本身特征:例如,如果单词 $ X_i $ 是大写的,那么其标签 $ Y_i $ 更可能是“人名”。这个特征(标签是“人名”且单词大写)会在序列的每一个位置 $ i $ 上出现,并且我们希望对所有位置使用相同的权重参数。
- 上下文特征:例如,如果前一个词是“Ms.”,那么当前词更可能是人名。这种描述相邻标签 $ Y_{i-1} $ 和 $ Y_i $ 关系的特征,也会在序列的每一对相邻位置上重复使用。
我们不会为序列中不同位置上的相同语言学现象设置不同的参数。因此,相同的特征及其关联的权重会在整个序列中重复应用。
图像分割示例
在图像分割任务中,我们需要为每个像素或超像素分配一个标签(如“前景”、“背景”)。
模型中包含两种主要的势函数(即特征):
- 节点势:连接图像特征(如颜色、纹理)和像素标签的特征。对于图像中的所有像素,我们会使用完全相同的节点势函数和权重。
- 边势:鼓励相邻像素具有相同标签的特征。对于图像中所有相邻的像素对,我们会复用相同的边势函数和权重。

实现方法:特征与作用域
那么,我们如何在对数线性模型中形式化地实现这种共享呢?方法其实非常简单。
我们需要为每一个希望复用的特征 $ f_k $ 指定一个作用域集合。这个集合定义了该特征将被应用到模型中的哪些变量子集上。
公式表示:
共享特征后的能量函数形式为:
其中:
- $ w_k $ 是第 $ k $ 个特征的共享权重(仅依赖于特征索引 $ k $)。
- $ \text{Scopes}(f_k) $ 是特征 $ f_k $ 应用的作用域集合。每个作用域 $ \mathbf{d} $ 是模型变量的一个子集(如一对相邻像素的索引)。
- $ f_k(\mathbf{x}_{\mathbf{d}}) $ 是特征函数在具体作用域变量取值上的计算结果。
例如,在图像分割中,一个边特征 $ f_{\text{edge}} $ 的作用域集合可以是所有相邻超像素对 \((Y_i, Y_j)\) 的集合。这样,该特征及其权重 $ w_{\text{edge}} $ 就被应用到了模型中所有满足“相邻”关系的变量对上。
这实质上就是将模型中所有具有相同权重 $ w_k $ 的项(因为它们对应同一个特征)聚合起来。

本节总结
在本节课中,我们一起学习了在对数线性模型中实现参数共享的核心机制。
- 共享相同的特征和权重在无向模型中非常常见,伊辛模型、自然语言处理和图像分割都是典型例子。
- 这种机制允许我们为多个马尔可夫网络(如不同的句子或不同的图像)提供一个统一的模板,从而在网络内部和不同网络之间复用结构和参数。
- 实现的关键在于为每个特征指定一个作用域集合,该集合定义了特征在模型变量上的所有应用实例。

通过这种方式,我们可以用有限的参数构建出表达能力强且可扩展的概率图模型。
035:最大期望效用
在本节课中,我们将学习如何利用概率图模型进行决策。我们将介绍最大期望效用原则,并学习如何使用影响图来形式化决策问题,以及如何通过变量消除算法找到最优决策策略。

概述:从推理到决策
上一节我们介绍了如何使用概率图模型进行各种推理任务,例如计算条件概率或寻找最大后验概率分配。然而,在实际应用中,我们通常需要基于概率分布做出决策。例如,医生诊断病人后,最终需要决定采取何种治疗方案。
那么,如何利用概率分布,特别是概率图模型,来做出好的决策呢?解决这类推理任务的理论基础早在概率图模型兴起之前就已建立,这个框架被称为最大期望效用框架。
决策问题的构成要素

一个简单的决策情境包含以下要素:
- 行动 A:决策者可以采取的一系列选择。例如,医生可以给病人使用的不同药物。
- 世界状态 X:一组变量
X1, ..., Xn,描述了世界的状态。行动可以影响其中某些状态的发生。这些状态可能包括决策者无法影响的因素(如病人的先天疾病或检测结果),也可能包括可以影响的因素(如给药后病人的结果)。 - 效用函数 U:用于定义决策者偏好的数值函数。它量化了在特定世界状态下采取特定行动能给决策者带来的“满意度”或“幸福感”。
以下是决策问题的构成要素示意图:


最大期望效用原则
现在,我们可以为决策问题 D 中的某个行动 A 定义期望效用。其计算方式是一个简单的期望值:
公式:EU(A) = Σ_x P(x | A) * U(x, A)
其中,我们对所有可能的世界状态 x 求和。P(x | A) 是在采取行动 A 的情况下达到状态 x 的概率,U(x, A) 是在该状态下采取该行动的效用。
显然,我们希望最大化整体的*均“幸福感”。因此,最大期望效用原则就是:选择能够最大化上述期望效用的行动 A。
公式:A = argmax_A EU(A)*

影响图:决策的图模型表示
我们可以利用图模型的思想,以一种易于解释的方式来表示决策情境。这种结构被称为影响图,它是贝叶斯网络的扩展,增加了两种节点:
- 随机变量:用椭圆形表示,代表世界状态
X的一部分。 - 行动变量:用矩形表示,代表由决策者(而非自然)选择其值的变量。
- 效用节点:用绿色菱形表示,代表效用函数。
让我们看一个简单的例子:一位刚毕业的企业家决定是否创办一家公司。

- 行动 F:
F0(不创办,找传统工作)或F1(创办公司)。 - 随机变量 M:小部件市场状况,可能为
Poor(差)、Moderate(中等)或Great(好),有其概率分布。 - 效用节点 V:依赖于行动
F和市场M。其父节点表示效用函数所依赖的变量。
效用值示例如下:
U(F0, M) = 0(无论市场如何,不创办则效用为0)U(F1, Poor) = -7U(F1, Moderate) = 5U(F1, Great) = 20
现在我们可以计算两个行动的期望效用:
EU(F0) = 0EU(F1) = P(Poor) * (-7) + P(Moderate) * 5 + P(Great) * 20 = 0.5*(-7) + 0.3*5 + 0.2*20 = 2
因此,最优行动是创办公司 (F1)。
更复杂的影响图与效用分解

让我们看一个更复杂的影响图,它基于学生网络,并引入了效用分解的概念。

此图包含:
- 随机变量:课程难度(
D)、学生智力(I)、成绩(G)、推荐信质量(L)、工作前景(J)。 - 行动变量:是否学习(
S)。 - 多个效用节点:
V_G:对成绩本身的满意度。V_J:对工作前景的满意度。V_Q:学习期间的生活质量(依赖于学习行动S和课程难度D)。
我们假设智能体的总效用是这些分量的和:U_total = V_G + V_J + V_Q。这被称为分解的效用函数。
为什么要分解效用函数?因为总效用依赖于许多因素。如果用一个单一的、庞大的效用函数来表示,它会有很多参数(例如,依赖于G, J, S, D),导致需要评估的组合数量呈指数级增长,难以确定。分解效用函数就像我们将联合概率分布分解为因子乘积一样,可以简化表示和计算。
决策时的可用信息

影响图还能表示决策者在做决定时可用的信息。让我们扩展企业家的例子。

现在,企业家在决定是否创办公司前,有机会进行一次市场调查(Survey)。调查结果不完全可靠,因此有一个条件概率分布(CPD) P(Survey | Market)。
关键点在于,进行调查后,代理人可以基于调查结果做出决定。图中从 Survey 节点指向行动节点 F 的边就表示了这一点。这意味着,代理人可以选择一个决策规则 δ。
决策规则 δ(A | Parents(A)) 本质上是一个条件概率分布(CPD),它告诉代理人,在观察到其父节点(即做决定前能看到的变量,此处是 Survey)的取值后,应以何种概率分布来选择行动 A 的值。

在单智能体决策中,最优决策规则通常是确定性的(即概率为0或1),但将其形式化为CPD在更一般的设定中是有用的。
形式化决策问题与优化
给定一个决策规则 δ_A,将其注入决策网络后,网络中所有变量(包括行动 A 和机会变量 X)都有了相关的CPD。这样,我们就定义了一个所有变量上的联合概率分布 P(X, A)。
此时,智能体在选定规则 δ_A 后的期望效用为:
公式:EU(δ_A) = Σ_{x, a} P(x, a) * U(x, a)
我们对所有可能的世界状态 x 和行动 a 进行求和,计算效用的期望值。
显然,智能体希望选择能使该期望效用最大化的决策规则 δ_A。这就是智能体需要解决的优化问题。
寻找最优决策规则:变量消除法
我们如何找到最大化期望效用的决策规则呢?让我们从一个简单例子开始,然后推广到一般情况。
再次以企业家调查为例。期望效用表达式为:
EU(δ_F) = Σ_{m, s, f} P(m) * P(s|m) * δ_F(f|s) * U(f, m)
这看起来非常熟悉:它是一系列因子的乘积。其中一些是概率因子(P(m), P(s|m)),另一个是效用因子(U(f, m)),而 δ_F(f|s) 是待优化的决策规则因子。
我们可以应用变量消除算法。目标是优化关于 δ_F(f|s) 的表达式。我们将不直接依赖于 f 和 s 的变量(即 m)求和消除掉:
- 求和消除 M:对
m求和,计算因子μ(f, s) = Σ_m P(m) * P(s|m) * U(f, m)。这个因子μ综合了市场概率、调查可靠性和最终效用。 - 简化表达式:期望效用简化为
EU(δ_F) = Σ_{s, f} δ_F(f|s) * μ(f, s)。 - 优化决策规则:为了最大化这个和,对于每个可能的调查结果
s,决策规则δ_F应该将所有概率质量(即概率1)分配给能使μ(f, s)最大的那个行动f。其他行动的概率为0。
数值示例:
假设给定概率和效用值,我们计算出因子 μ(f, s) 如下:
- 当调查结果
S=差时:μ(F0, 差)=0,μ(F1, 差)=-3.5=> 最优选择F0(不创办)。 - 当调查结果
S=中时:μ(F0, 中)=0,μ(F1, 中)=1.5=> 最优选择F1(创办)。 - 当调查结果
S=好时:μ(F0, 好)=0,μ(F1, 好)=4.0=> 最优选择F1(创办)。
因此,最优决策规则是确定性的:见差则止,见好则进。计算此策略下的总期望效用为 0 + 1.5 + 4.0 = 5.5。如果没有调查,之前算得的最佳期望效用是2.0。因此,进行调查带来了 5.5 - 2.0 = 3.5 的效用增益,体现了信息的价值。
一般算法总结
对于具有单个效用节点和单个行动节点的影响图,计算最大期望效用并找到最优决策规则的步骤如下:
- 形式化:将行动节点
A视为一个具有未知CPDδ(A | Z)的随机变量,其中Z是A的父节点(即决策时可观察到的信息)。 - 构建因子:除了网络中原有的概率因子
P(X_i | Parents(X_i)),引入效用因子U(Scope(U))。 - 变量消除:使用变量消除算法,消除所有除
A及其父节点Z以外的变量。这将产生一个综合因子μ(A, Z)。- 公式:μ(a, z) = Σ_{其他变量} [ Π_{概率因子} * U ]
- 确定最优规则:对于
Z的每一种可能取值z,选择使μ(a, z)最大化的行动a*。- 最优决策规则:
δ*(a | z) = 1如果a = argmax_a μ(a, z),否则为0。
- 最优决策规则:

总结

本节课中,我们一起学习了如何将概率图模型用于决策制定。
- 最大期望效用原则为我们提供了在不确定性下进行决策的严谨理论基础。
- 影响图框架扩展了贝叶斯网络,使我们能够紧凑地表示包含多个机会变量、多个行动以及依赖于多变量的效用的复杂高维决策场景。
- 我们可以基于概率图模型中的推理方法,特别是变量消除算法,来找到最优决策策略,并计算特定决策情境对智能体的总体价值。
- 这些方法还可以扩展到更丰富的场景,例如我们例子中提到的具有多个效用分量以及智能体序贯做出多个决策的情况。
通过结合概率推理与效用理论,概率图模型成为了一个强大的工具,不仅能告诉我们世界可能如何,还能指导我们如何采取行动以达到最佳预期结果。


036:效用函数


在本节课中,我们将要学习效用函数的概念。效用函数是影响图中用于表示智能体偏好的关键组成部分。它允许我们在涉及不确定性和风险的复杂决策场景中,对不同的结果进行比较和排序。
效用函数的作用与来源
上一节我们介绍了影响图的基本结构,其中包含了代表智能体效用函数的节点。这些效用函数表明了智能体对于世界状态或其不同方面的偏好。
那么,这些效用函数具体是什么?它们又是如何产生的呢?
效用函数对于我们比较涉及不确定性或风险的复杂场景是必要的。一个人很容易说出他更偏好获得400万美元的结果,而不是300万美元。但要编码一个更复杂的偏好,让我们能够比较这两种所谓的“彩票”的效用,就不那么简单了。
- 左边的彩票:智能体有0.2的概率获得400万美元。
- 右边的彩票:智能体有0.25的概率获得300万美元。
如果必须做出决定,我们更偏好哪一种彩票?

事实证明,在这种场景下形式化智能体决策过程的方法,是为这些不同的结果(获得400万、300万和0美元的结果)赋予一个数值化的效用。然后,我们可以使用最大期望效用原则在这两种不同的彩票之间做出决定。
具体来说,我们可以比较:
- 第一种彩票的期望效用:
0.2 * U($4M) + 0.8 * U($0) - 第二种彩票的期望效用:
0.25 * U($3M) + 0.75 * U($0)
通过比较这两个表达式,我们可以决定是更偏好左边、右边,还是认为它们同样好。
效用与回报的非线性关系
人们很自然地会假设效用应该与获得的回报金额呈线性关系,例如5美元的效用大约是10美元的一半。但事实证明,对大多数人来说情况并非如此。
以下是说明这一点的决策情境:
- 左边选项:以0.8的概率获得400万美元。
- 右边选项:确定性地获得300万美元。
大多数人倾向于选择右边的彩票。然而,如果我们计算这两种彩票的期望回报:
- 左边的期望回报:
$4M * 0.8 = $3.2M - 右边的期望回报:
$3M
左边的期望回报更高,但人们仍然偏好右边的彩票。
另一个著名的例子是“圣彼得堡悖论”。这是一个假想的游戏:反复抛掷一枚公*的硬币,直到第一次出现正面。如果第一次出现正面是在第n次抛掷,你将获得2^n美元。
这个游戏的期望回报是无限的。理论上,人们可能愿意支付任意金额来玩这个游戏,因为他们的期望回报大于任何支付金额。但事实上,对大多数人来说,玩这个游戏的价值大约只有2美元。这强烈表明,他们的偏好与所赚取的金钱数额并非线性关系。
效用曲线与风险态度
我们可以尝试使用“效用曲线”的概念来量化这种关系。效用曲线的x轴代表你获得的美元金额,y轴代表智能体赋予该金额的效用。
让我们比较几种不同的场景。首先,看看获得500美元的效用。从500美元向上对应到效用曲线,我们可以找到该结果的效用值。

现在,考虑一个涉及风险的决策情境:一组彩票,以概率1-P获得0美元,以概率P获得1000美元。由于期望效用的线性性质,所有这些彩票都将落在这条连接U($0)和U($1000)的直线上,具体位置取决于P值。
如果我们看概率P=0.5的情况,对应的点会落在这条线上。重要的是,在这个例子中,以50%概率获得1000美元和50%概率获得0美元的彩票,其效用值明显低于确定获得500美元的效用。因此,我更喜欢确定性地获得500美元,这也是大多数人的选择。
如果我们看这个风险彩票的“价值”,即它的确定性等价物,它可能对应着确定性地获得400美元。这个400美元被称为该彩票的确定性等价,即你愿意用这个彩票交换的确定性金额。
期望回报与该彩票效用值之间的差值,被称为保险溢价或风险溢价。保险公司正是利用这一点来盈利,因为人们愿意接受更少的确定性金额,而不是更具风险的选择。
我们可以看到,这种具有凹形形状的曲线代表了一种风险厌恶的风险态度。即人们愿意为降低风险而支付费用。
效用曲线的其他形状代表不同的行为:
- 如果效用与回报呈线性关系,则称为风险中性。
- 如果曲线是凸函数形状,则称为风险寻求。风险寻求行为发生在例如拉斯维加斯或其他赌博情境中,人们愿意在期望回报上承受损失,以换取获得极高回报的小概率机会。
多属性效用函数
关于效用函数最后一个重要的观察是,一个人的效用通常取决于许多事物,而不仅仅是货币收益。所有影响偏好的属性都必须整合到一个单一的效用函数中。
许多人觉得这很痛苦,因为它迫使我们做一些事情,比如将人的生命或生命的损失与货币收益放在同一个尺度上衡量。关键在于,即使我们不明确地这样做,即使我们拒绝将人的生命与货币收益等同,我们做出的决策本身就表明了我们在进行这种权衡。
例如,当航空公司选择不在每次飞机着陆后都进行维护时,这是一个财务决策,因为每次维护成本太高。但同时,这无疑也增加了因事故导致生命损失的风险。不仅大公司做这些决策,我们自己也在做。我们不会每个月或每周更换汽车轮胎,因为那样成本太高,但显然,更好的轮胎可能会增加我们在事故或打滑中幸存的机会。这些权衡我们无时无刻不在进行,无论我们是否意识到。
因此,在思考决策情境时,重要的是为我们自己列出所有可能影响决策的不同事物:金钱、时间、愉悦以及许多其他属性,并思考如何将它们整合到一个单一的效用函数中。
具体到人的生命语境,人们花了大量时间思考如何将人的生命纳入效用函数。事实证明,反映人们偏好的错误策略是为“某人死亡”这个单一事件设定一个效用值,这非常难以考量。
一个普遍更好的策略是使用“微死亡”的概念,即百万分之一的死亡概率。这样就将风险明确地放入了效用函数。那么,一个微死亡价值多少?早在1980年,人们做过研究,发现一个微死亡大约值20美元(1980年价值)。当然,你可以考虑通货膨胀,但这并不是一笔巨款。事实证明,与询问死亡的效用相比,这是对涉及生命风险的结果进行效用排序的更好方法。
在医疗决策情境中,人们用于考量生命的第二种方法是“质量调整生命年”的概念。每个质量调整生命年(根据生活质量调整的一年)都有与之相关的特定效用,这使其能够与影响我们效用的其他方面进行比较。
效用函数的分解:一个实例

一个来自现实世界的例子是产前诊断领域。研究人员进行了大量工作,来引出涉及产前检测的效用函数。
在这个场景中,相关变量包括:
- 婴儿是否最终会患有某种遗传疾病(他们重点关注的是唐氏综合征)。
- 检测唐氏综合征带来的痛苦。
- 了解未来情况的“知情安心”感。
- 产前检测导致胎儿流失的风险。
- 未来再次怀孕的可能性。
效用函数以复杂的方式依赖于这五个变量,这是一个相当高维的空间,难以直接引出效用值。
幸运的是,事实证明许多人的效用函数具有很多结构。具体来说,他们可以将效用函数分解为子效用的和,就像我们在影响图上下文中看到的那样。对许多人来说,这种分解看起来如下:
U(总) = U_测试 + U_知情安心 + U_配对1(唐氏综合征, 胎儿流失) + U_配对2(胎儿流失, 未来怀孕可能性)
人们的效用函数(对许多人而言)以这种方式分解,这实际上可以看作一个图形模型,包含单点项以及这些配对项。这使我们能够显著减少为获得可用效用函数而需要列出的项数。

总结
本节课中我们一起学习了效用函数的核心概念。
效用函数是我们用来确定涉及风险或不确定性的决策偏好的工具。为了定义或引出效用函数,我们通常需要考虑影响我们效用的多个因素。在大多数情况下,这些不同因素(例如金钱与效用,或微死亡与效用)之间的关系通常是非线性的,效用曲线的形状决定了一个人对风险的态度。


最后,实际的效用函数通常是一个整合了所有这些不同因素的多属性效用函数。将这种效用函数分解为可处理的片段(通常是这些片段的和)通常很有帮助,这可以使引出问题变得更容易管理。
037:完美信息价值
在本节课中,我们将学习如何利用影响图来评估获取信息的价值。具体来说,我们将探讨“完美信息价值”这一概念,它量化了在做出决策前,完美地观测某个变量所能带来的预期效用提升。我们将通过定义、性质分析和具体案例,来理解信息何时有价值以及其价值大小如何决定。
完美信息价值的定义
上一节我们介绍了影响图如何帮助智能体在给定观测下选择行动。本节中,我们来看看一个不同的问题:在做出决策前,究竟应该进行哪些观测?例如,医生需要决定为病人做哪些检查,而检查并非免费,它们可能带来痛苦、风险和经济成本。同样,在传感器网络中,我们需要决定激活哪个传感器,因为信息传输需要消耗能量。

事实证明,影响图框架同样可以为这类问题提供严谨的形式化基础。那么,我们如何为“获取信息的价值”或“进行观测的价值”这一概念提供形式化语义呢?
其形式化定义是完美信息价值。关于变量 X 的完美信息价值,是指在选择行动 A 之前观测 X 所能带来的价值,其中“完美”意味着观测 X 时没有任何噪声。
如何赋予这个价值一个形式化的数值呢?假设 D 是我们最初的影响图,那时我们还没有机会观测 X。我们可以将 D 的价值与另一个不同的影响图的价值进行比较。这个新的影响图在 D 的基础上增加了一条从 X 指向决策节点 A 的边,因为这代表了如果我们有能力进行该观测,所处情境的价值。
因此,我们可以将完美信息价值定义为:在拥有此观测的情况下,我能获得的最大期望效用,减去在没有此观测的原始情境下,智能体能获得的期望效用。用公式表示如下:
VPI(X) = MEU(D‘) - MEU(D)
其中,D‘ 是增加了边 X → A 的影响图。
在我们之前展示的例子中,我们比较了两种决策情境:一种是智能体在没有任何关于市场价值的额外信息的情况下决定是否创立公司;另一种是智能体在决定是否创立公司前,可以先观测调查变量 S。我们计算了增加边 S → F 后的决策情境价值(3.25)与原始决策情境 D 的价值(2)之差。因此,完美信息价值为 1.25。这意味着,为了进行这项调查,智能体愿意支付最多 1.25 个效用点,因为这样做会增加他的期望效用。
完美信息价值的性质
现在,让我们来看看完美信息价值的一些重要性质。
性质一:非负性
第一个重要性质是,假设信息本身没有成本(例如,不考虑进行调查可能花费的代价),那么完美信息价值总是大于或等于零。
让我们先来理解为什么这是正确的。观察上面的表达式,它比较了两个不同影响图的最大期望效用。请记住,每个值都是通过优化决策规则得到的。原始影响图 D 的 MEU 是优化决策规则 δ(A | Pa(A)) 得到的,其中 Pa(A) 是 A 当前的父节点集 Z。而新的影响图 D‘ 则是优化决策规则 δ(A | Pa(A), X) 得到的,其中 A 的父节点集是原来的 Z 加上额外父节点 X。
从这个角度看,一个显而易见的关键点是:后一类决策规则(δ(A | Z, X))是前一类决策规则(δ(A | Z))的一个严格更大的集合。也就是说,任何形式为 δ(A | Z) 的决策规则,也都可以表示为形式 δ(A | Z, X)。这意味着,任何我可以在原始影响图中实现的决策规则,同样可以在新的、更丰富的影响图中实现。如果该规则在原始图中有某个期望效用值,那么在新图中它仍然具有完全相同的期望效用值。
回到我们的例子,如果智能体有一个决策规则是“无论调查结果如何都创立公司”,那么即使在他能够观测调查结果之后,这仍然是一个合法的决策规则,并且会具有完全相同的期望效用。因此,在更丰富的影响图背景下,我可以考虑的决策集合只是变得更大了,所以通过在一个更大的空间上进行优化,我不可能遭受损失。
性质二:零价值的条件
现在让我们思考第二个性质:完美信息价值何时等于零。这源于与我们刚才讨论的非常相似的原因。如果对于我的原始影响图 D 的最优决策规则,在扩展后的影响图 D‘ 中仍然是最优的,那么我从信息中一无所获。因为任何我之前可以应用的决策规则,我现在仍然可以应用,因此这个额外的观测没有带来任何增益。
这为我们提供了一个非常清晰的概念,关于信息何时是有用的。信息有用,当且仅当它至少在一种情况下改变了我的决策。从另一个角度思考,如果一个观测没有能力改变我的决策,那么进行这个观测就真的没有意义。

案例分析:信息价值如何体现
让我们看看这个直觉如何在真实的决策场景中体现。假设我们的创业者决定不创立自己的公司,现在他试图在两家公司中选择一家加入。
对于每家公司,都有一个描述公司状态的变量。S1 表示公司管理不善,情况不佳;S2 表示中等;S3 表示公司运营良好。这个状态变量对两家公司都适用。
我们假设公司的创始人可以获取关于公司状态的某些信息(例如通过深入的尽职调查),因此公司获得融资的机会取决于其状态。你可以看到,如果公司状态是 S1(差),获得融资的概率是 0.1;而如果公司状态是 S3(好),概率则是 0.9。我们假设智能体的效用是:如果他加入的公司获得融资,则效用为 1,否则为 0。
以下是三种不同的公司状态概率分布和融资条件概率的设定,我们将逐一分析。
案例一:一家公司明显更优
首先,考虑智能体在没有任何额外信息时可以采取的两种策略。
- 如果智能体选择加入公司一,其期望效用是 0.72。
- 如果选择加入公司二,其期望效用仅为 0.33。
显然,在没有信息时,智能体会选择公司一。
现在,如果智能体可以进行一次观测呢?具体来说,我们允许智能体观测关于公司二状态 S2 的信息(例如在公司内部有一个线人)。那么会发生什么?
我们可以计算在不同观测结果下,选择公司二的期望效用:
- 如果观测到 S1(概率 0.4),选择公司二的期望效用为 0.1。
- 如果观测到 S2(概率 0.5),期望效用为 0.4。
- 如果观测到 S3(概率 0.1),期望效用为 0.9。
前两种情况(S1 和 S2)下的期望效用都低于智能体坚持选择公司一所能保证的 0.72。因此,在这两种情况下,智能体将坚持原来的选择,即公司一。只有在观测到 S3 这一种情况下,他才会改变主意选择公司二。但这种情况发生的概率很低(仅 0.1)。
因此,这里的信息价值会非常低。确实,计算增加观测边后的影响图的期望效用,它仅从 0.72 上升到 0.743。这意味着智能体不应该为了获取关于公司二的这个信息而付给他的线人太多钱。
案例二:两家公司势均力敌
现在考虑一个略有不同的情况:两家公司都不那么出色。公司一也是一家管理结构不佳、商业模式不明的初创公司。
同样,我们计算两个行动的期望效用:
- 选择公司一的期望效用是 0.35。
- 选择公司二的期望效用是 0.33。
现在,两个决策之间的*衡要精细得多。因此,你会认为获取信息的价值会高得多,因为智能体改变主意的可能性大大增加了。
让我们来分析一下。再次考虑增加从公司二状态 S2 到决策的边。现在,智能体在观测到 S2 或 S3 时都会想要改变主意,因为 0.4 和 0.9 都高于坚持选择公司一所能得到的期望效用(0.35)。
确实,在这个新影响图中,期望效用上升到了 0.43,相对于之前的 0.35 是一个显著得多的提升。因为现在信息更有价值:智能体在三种情况中的两种(总概率为 0.6)改变了决策。
案例三:融资概率普遍很高
最后,让我们看第三种情况:我们改变了公司获得融资的概率。假设回到了互联网泡沫时期,基本上每家公司都有很高的概率获得融资,即使其商业模式完全可疑。
计算期望效用:
- 选择公司一的期望效用是 0.788。
- 选择公司二的期望效用是 0.779。
这两个期望效用值再次非常接*。直观上,这意味着即使智能体改变了主意,对其期望效用的影响也微乎其微。
具体来看,当观测到 S2 时,选择公司二的期望效用是 0.8,高于 0.788,因此他会改变主意从公司一转向公司二。观测到 S3 时也是如此。但实际获得的效用增益在这种情况下相当小。计算得到,在智能体可以观测变量后再做决策的场景下,期望效用是 0.8142,这仅比他不做观测就能保证的 0.788 有很小的提升。因此,这又是一个信息价值不大的案例,公司二的那位可怜线人还是赚不到多少钱。
总结

本节课中,我们一起学习了如何利用影响图来形式化地评估信息的价值。
- 我们首先定义了完美信息价值,它是在决策前完美观测某个变量所带来的最大期望效用增量,计算公式为 VPI(X) = MEU(D‘) - MEU(D)。
- 接着,我们分析了其两个关键性质:非负性(信息无成本时,价值总不小于零)和零价值条件(当信息不改变最优决策时,其价值为零)。
- 最后,通过三个详细的决策案例,我们深入探讨了信息价值如何具体体现。我们发现,信息的价值取决于两个关键因素:
- 改变决策的可能性:在多少种可能的观测结果下,智能体会改变其原本的最优行动。
- 改变决策带来的效用提升幅度:在新的决策下,期望效用提高了多少。

总而言之,影响图为“进行观测”这一概念提供了一个非常清晰和优雅的解释,即两个影响图之间最大期望效用的差值。这使我们能够具体地理解信息何时有价值:当且仅当它至少在一种情境下能引致行动的改变。定量来看,信息的价值大小,既取决于基于该改变我的效用提升了多少,也取决于我改变决策的那些情境发生的可能性有多大。
001:条件概率查询概述
在本节课中,我们将要学习概率图模型推理的核心任务之一:条件概率查询。我们将了解其定义、应用场景、计算复杂性,并初步探讨其计算框架。

条件概率查询的定义
到目前为止,我们已经详细讨论了概率图模型的表示方法。我们定义了不同类型的概率图模型,如贝叶斯网络和马尔可夫网络,并讨论了它们的独立性假设。现在,我们将探讨如何利用这种声明式的表示来回答实际的查询。
在众多查询类型中,最常用的一种是条件概率查询。让我们来定义它。
在条件概率查询中,我们有一组关于变量集 E 的观测值 e,这些是我们恰好观察到的变量。我们还有一个特定的查询变量集 Y。我们的目标是计算在给定证据 E = e 的条件下,变量 Y 的条件概率分布。
公式:P(Y | E = e)
这种查询在许多应用中非常有用。例如,在我们讨论过的医疗或故障诊断领域,我们可能观察到某些症状或测试结果,并希望预测不同故障模式或疾病的概率。在家谱分析示例中,我们可能观察到家族中某些个体的表型甚至基因型,并希望推断其他个体的信息。
推理问题的计算复杂性
不幸的是,与许多有趣的问题一样,概率图模型中的推理问题是NP难的。在深入讨论之前,我们先简要回顾一下NP难的含义。在本课程中,我们不进行正式定义,但一个粗略的直觉是:如果一个问题被证明是NP难的,那么它极不可能存在高效的解决方案。更正式地说,人们为该问题以及一系列同等难度问题设计的所有算法,其时间复杂度至少是问题表示大小的指数级。这意味着,对于任何规模稍大(例如,在我们的语境中,变量数量稍多)的问题,它都难以求解。
那么,在PGM推理的背景下,哪些具体问题是NP难的呢?
首先,PGM中的精确推理基本问题就是NP难的。给定一个由因子集 Φ 定义的PGM P_Φ,一个目标变量 X 及其取值 x,计算事件 X = x 的概率是NP难的。事实上,即使是一个更简单的特例——我们只想判断这个概率是否为正——也是NP难的。
有人可能会说,精确推理难以处理,但如果我们在准确性上稍作妥协呢?如果我们只寻求一个*似答案呢?毕竟,我们不一定关心概率的每一位有效数字。这会让问题变得更容易吗?不幸的是,答案是否定的。对于*似推理,存在许多不同版本的NP难结果。这里仅举一例:同样给定一个PGM、事件 X = x 和一些观测值,寻找一个*似答案 P',并保证该*似答案与真实值的误差在 ε 以内,这个问题也是NP难的。这对于任何小于0.5的 ε 都成立。请注意,ε 等于0.5的*似可以通过随机猜测或直接猜测概率为0来获得。
因此,对于这类条件概率查询,任何非*凡的*似计算同样是难以处理的。
这是一个相当令人沮丧的观察结果,可能让我们想放弃使用PGM进行推理。但重要的是,这是一个最坏情况下的结果。这意味着我们可以构造一些离奇的PGM,使得指数时间是我们能做到的最好情况,但这并不意味着在一般情况下我们不能做得更好。本课程推理部分的其余内容将致力于展示一系列算法,无论是精确推理还是*似推理,其表现都可以比这个最坏情况结果所暗示的要好得多。

推理的计算框架:和积形式
首先,为了理解这些算法可能从何处获得其效力,让我们更深入地探讨一下推理问题。
这里有一个略微详细的学生网络版本,我们现在有了额外的变量。例如,课程的连贯性会影响其难度,以及其他一些我们暂不讨论的变量。
在这个模型以及一般情况下,概率图模型的推理使用了我们之前讨论过的因子概念。事实证明,使用因子非常方便,因为它意味着算法同样适用于贝叶斯网络和马尔可夫网络,这是一个非常有用的抽象。
让我们在因子集的背景下思考这个贝叶斯网络。例如,我们最初有变量 C 的先验概率 P(C),它转化为一个定义域为 {C} 的因子。我们还有 P(G | I, D),它转化为一个定义域为 {G, I, D} 的因子。通常,网络中的每个条件概率分布都转化为一个定义域为其家族(即变量及其父变量)的因子。
现在,假设我们的目标是计算变量 J 的概率 P(J)。我们在这里看到的是联合分布,这是我们使用贝叶斯网络的链式法则定义的。
为了计算 P(J),我们需要做的是消除或边缘化除 J 之外的所有变量。因此,我们最终得到一个如下形式的求和式。
公式:P(J) = Σ_{C,D,I,G,S,L,H} P(C, D, I, G, S, L, H, J)
这正是为什么这种条件概率推理问题通常被称为“和积”问题,因为我们是对因子乘积进行求和。
马尔可夫网络的推理问题具有完全相同的形式。这里我们再次得到因子的乘积,在这种情况下,因子是网络最初定义的形式。如果我们对计算概率 P(D) 感兴趣,那么我们同样需要计算这些因子的乘积,然后进行边缘化。
公式:P(D) = (1/Z) * Σ_{A,B,C} [φ1(A,B) * φ2(B,C) * φ3(C,D) * φ4(A,D)]
这里我写的内容并不完全正确,因为因子的乘积在马尔可夫网络中实际上是未归一化的度量 P̃(ABCD)。为了得到归一化的度量,我们需要除以配分函数 Z 进行归一化。
如果我们目标是计算 P(D),如何处理呢?关键在于,如果我们计算了忽略配分函数的 P̃(D),我们可以推断出 P(D) 实际上等于 (1/Z) * P̃(D)。因为归一化常数是一个常数,所以如果我们计算了 P̃(D),我们可以通过简单的重新归一化过程得到 P(D)。
那么证据呢?事实证明,证据可以通过一个简单的因子约简预处理步骤来处理。如果我们试图计算给定证据 E = e 时变量集 Y 的概率,根据定义,它等于 Y 和证据的联合概率除以证据的概率。
公式:P(Y | E=e) = P(Y, E=e) / P(E=e)
如果我们观察这个表达式的分子,并定义一个变量集 W,它包含所有既不是查询变量也不是证据变量的变量,那么我们可以再次将其视为一个和积表达式。概率 P(Y, E=e) 是通过边缘化 W 变量得到的这个概率的和。
现在,如果我们重写这个表达式,可以将其视为因子的乘积。无论是贝叶斯网络还是马尔可夫网络,都是如此。并且这个因子乘积只包含那些与我们的证据 E = e 一致的因子成分,这意味着我们需要根据证据来约简因子。
为了理解这意味着什么,让我们看一个例子。假设我们有一个观测,例如 A = a0,我们想要计算在这个观测条件下的分布概率。这意味着我们将从每一个涉及 A 的因子中,移除那些对应于 A = a1 的条目,因为它们与我们的观测 A = a0 不一致。
一旦我们将这些因子约简为与证据一致,我们仍然得到一个因子乘积,并且可以像之前一样进行处理。现在我们有了需要对需要被消除的变量 W 求和的、约简后因子的乘积。同样,我们可以通过计算这个未归一化的概率,然后在最后进行重新归一化来忽略配分函数。
这同样适用于贝叶斯网络的上下文。例如,我们可能有观测 I = i 和 H = h。现在,这不再是一个等式,因为我们还没有对证据进行条件化。所以,如果我们想使其相等,我们必须根据证据约简每一个涉及 I 和 H 的因子。例如,φ_I(I) 变成了 φ_I(i),这恰好是一个常数(其定义域中没有其他变量),对于 H 也是如此。现在它又变回了等式。如果我们想计算给定 I=i 和 H=h 时 J 的概率,我们进行这个求和,并像之前一样重新归一化。
算法总结与分类
总结一下,和积算法可以按如下步骤进行:将条件概率转化为一个比值。这个比值的分子是约简后因子的乘积,并对剩余变量求和。分母则只是这个分子对查询变量 Y 求和的结果。如果将这两者相除,我们会发现,我们可以通过简单地计算这个约简后因子的乘积并在最后进行归一化来得到答案。
有许多算法可用于计算条件概率查询。
- 变量消除算法:其中一种涉及将求和运算推入因子乘积中,这产生了称为变量消除的算法。它是一类称为动态规划算法的特例,是一种精确推理形式。
- 消息传递算法:这种算法的一个推广是在图上执行消息传递,它也能有效地处理求和、因子乘积和因子求和。这种算法有许多变体,其中一些是精确的,另一些是*似的。
- 基于随机采样的算法:还有一类非常不同的算法,使用随机采样作为关键技术。它以各种方式对完整的实例或赋值进行采样,并使用这些赋值来*似特定查询的概率。这是一种*似方法。
在本节剩余部分,我们当然会讨论其中的一些算法。
本节课总结

在本节课中,我们一起学习了概率图模型推理的核心——条件概率查询。我们明确了其数学定义 P(Y | E=e) 及其在诊断、预测等场景的应用价值。我们认识到,无论是精确计算还是*似求解该问题,在最坏情况下都是NP难的,这构成了推理任务的根本挑战。然而,这并未关闭所有大门,因为最坏情况复杂度不代表一般情况下的表现。接着,我们深入探讨了推理问题的计算本质,即将其转化为对因子乘积进行求和(边缘化)的“和积”形式。通过引入证据约简和归一化步骤,我们建立了一个统一的计算框架,该框架同时适用于贝叶斯网络和马尔可夫网络。最后,我们概要性地介绍了后续将深入学习的几类主要推理算法:精确的变量消除法、基于图的消息传递法(包括精确和*似变体)以及基于随机采样的*似方法,为后续课程内容奠定了基础。
002:最大后验概率推断概述
在本节课中,我们将要学习概率图模型中另一种重要的推断类型——最大后验概率推断。我们将了解它的定义、应用场景、与条件概率查询的区别,以及解决该问题的基本思路和算法类别。

什么是最大后验概率推断?
正如之前所说,我们可以使用图模型回答多种不同类型的查询。条件概率查询非常常用,但另一种常用的推断类型被称为最大后验概率推断。
那么,什么是最大后验概率推断?

MAP 是“最大后验概率”的缩写。其定义如下。
我们有一组关于变量 E 的证据或观测值 e。我们还有一个查询变量集 Y。出于我们暂不讨论的计算原因,Y 包含除 E 之外的所有其他变量,这一点很重要。
我们的任务是计算所谓的 MAP 赋值,即找到能使给定证据下变量 Y 的条件概率最大化的赋值 y。
arg max 表示能为此表达式提供最大值的 y。
需要注意的是,在某些情况下,这个最大值可能不是唯一的。也就是说,可能存在多个不同的赋值(例如 y1 和 y2)给出完全相同的概率。因此,MAP 赋值不一定是一个唯一的赋值。
最大后验概率推断的应用

最大后验概率推断有许多应用,其中一些我们之前讨论过。
以下是几个应用示例:
- 在消息解码的背景下,我们有一组通过噪声信道传输的噪声比特。我们通常希望得到最可能被传输的消息,即给定证据下,最可能的传输比特赋值。
- 在图像分割的背景下,我们希望根据像素点,找出像素点最可能属于的语义类别。
这两个问题都可以视为 MAP 赋值问题。

与条件概率查询的区别
理解 MAP 推断与条件概率查询是不同的问题非常重要。为了理解这一点,让我们看一个仅包含两个随机变量的简单例子。
这里我们有一个关于变量 A 和 B 的贝叶斯网络。将两个条件概率分布相乘,我们得到此处所示的联合分布。可以立即看出,MAP 赋值是 a0, b1,因为它具有最高的概率。
我们能否通过分别查看变量 A 和变量 B 来得到 MAP 赋值呢?
如果我们分别查看变量 A,我们会发现变量 A 最可能的赋值是 a1,而不是 MAP 赋值中的 a0。因此,我们不能分别查看 A 和 B 的边缘分布,并用它们来推断 MAP 赋值。原因在于,我们寻找的是在所有变量上具有最高概率的单一联合赋值。
问题的计算复杂性
不幸的是,就像条件概率推断一样,MAP 推断问题也是 NP 难的。
以下是 MAP 背景下 NP 难问题的例子:
- 找到具有最高概率的联合赋值是 NP 难的。
- 对于给定的概率图模型和某个阈值 p,判断是否存在一个赋值 x 其概率大于 p,这个问题也是 NP 难的。

那么,我们应该放弃吗?答案是否定的。就像在条件概率查询的背景下一样,存在可以非常高效地解决这个问题的算法。事实上,这些算法能处理的问题范围甚至比条件概率查询更广。
接下来,让我们更深入地研究这个问题,理解可能使其易于处理的基础。

最大后验概率推断的优化问题形式
再次回到贝叶斯网络的例子,我们将再次把条件概率分布视为因子。这里,P(C|A, B) 转换成一个关于 C, A, B 的因子。
与条件概率查询中我们希望对某些变量求和(边缘化)不同,现在我们要找到所有变量的赋值,使得这些因子的乘积最大化。因此,我们这里有一个最大化乘积的问题,这也常被称为 最大乘积问题。
让我们分解这个最大乘积问题。想象在更一般的情况下,我们有 P(Y | E = e)。提醒一下,Y 是除 E 中变量之外的所有变量的集合。根据条件概率的定义,我们有这个比率,我们试图找到最大化这个比率的 y。
请注意,分母相对于 y 是常数。这意味着,为了找到最大化的 y,我们实际上不关心分母,只关心分子,即 P(Y, E = e),这是一个未归一化的度量。
这个分子在一般情况下是多个因子的乘积,并由配分函数归一化。这里的因子是相对于证据简化后的因子。
我们再次注意到,配分函数相对于 y 是常数,这意味着我们可以忽略它。因此,我们再次得到这个表达式正比于相同简化因子的乘积。所以,我们试图做的就是在更一般的情况下最大化一组因子的乘积。
这为我们带来了以下优化问题:


解决最大后验概率推断的算法
有许多算法可以解决 MAP 问题。
第一类算法类似于求和乘积算法。这些算法将最大化操作推入因子乘积中,从而产生了 最大乘积变量消除算法。
我们也有消息传递算法,它同样是求和乘积算法的直接类比,产生了一类称为 最大乘积信念传播 的算法。
然而,由于 MAP 问题本质上是一个优化问题,我们也可以调用专门用于优化的技术。
这类方法包括基于整数规划的方法,这是一种在离散空间上进行优化的通用技术。事实证明,基于整数规划的这类方法是过去几年中最流行的方法之一,并催生了一系列全新的 MAP 算法,这些算法比之前开发的许多算法(尤其是在*似推断情况下)要好得多。
此外,对于某些特定类型的网络(其中一些我们会讨论),存在针对该类图模型非常高效的特殊算法。其中最常用(但不是唯一)的一类是基于 图割 算法的方法。
最后,因为它是一个优化问题,我们也可以使用在组合搜索空间上的标准搜索技术。对于某些问题,这也是一个非常有用和成功的解决方案。

总结

本节课中,我们一起学习了最大后验概率推断。
总结来说,MAP 问题的目标是找到具有最高概率的单一、一致的联合赋值。这意味着它不同于最大化单个边缘概率,正如我们在例子中看到的那样。
我们可以将这个问题重新表述为寻找因子乘积的最大值,这是一个组合优化问题,它允许使用一系列不同的解决方案,其中一些是精确的,另一些是*似的。


003:变量消元算法

在本节课中,我们将学习概率图模型推理中最基础、最核心的算法之一:变量消元算法。我们将通过简单的链式结构和更复杂的“学生网络”例子,一步步展示该算法如何高效地计算变量的边缘概率分布。
概述
我们已经知道,存在多种用于概率图模型推理的算法,但最简单、最基础的一种算法通常被称为变量消元法。该算法的核心思想是通过逐步求和(消元)非查询变量,避免直接计算庞大的联合概率分布,从而高效地计算出目标变量的边缘概率。
简单示例:链式结构
首先,我们通过一个简单的链式图模型来理解变量消元的基本步骤。假设我们有一个包含变量A、B、C、D、E的链,目标是计算变量E的概率分布 P(E)。
我们知道,这个概率与对除E外所有变量求和的未归一化度量 P̃(A, B, C, D, E) 成比例。公式如下:
P(E) ∝ Σ_{A,B,C,D} P̃(A, B, C, D, E)
与其先构造完整的联合分布再求和,我们可以更高效地计算。首先,将未归一化度量写成各因子的乘积。假设图中只有成对因子(对应图中的边),我们得到:
P̃(A, B, C, D, E) = φ₁(A,B) * φ₂(B,C) * φ₃(C,D) * φ₄(D,E)
现在,我们需要对A、B、C、D求和。关键观察是:如果一个因子的作用域中不包含某个求和变量,我们可以将该因子移到求和符号之外。因此,在首先对A求和时:
Σ_{A,B,C,D} [φ₁(A,B) * φ₂(B,C) * φ₃(C,D) * φ₄(D,E)]
= φ₂(B,C) * φ₃(C,D) * φ₄(D,E) * [Σ_A φ₁(A,B)]
对A求和的结果是一个只关于变量B的新因子,我们称之为 τ₁(B):
τ₁(B) = Σ_A φ₁(A,B)
于是,表达式简化为:
= φ₂(B,C) * φ₃(C,D) * φ₄(D,E) * τ₁(B)
此时,变量A已从模型中“消除”。
接下来,我们继续这个过程,消除变量B。现在对B求和,涉及B的因子是 φ₂(B,C) 和 τ₁(B):
Σ_B [φ₂(B,C) * τ₁(B)] * φ₃(C,D) * φ₄(D,E)
对B求和的结果是一个关于C的新因子 τ₂(C)。表达式进一步简化为:
= φ₃(C,D) * φ₄(D,E) * τ₂(C)
如此继续,依次消除C和D。最终,我们将得到一个仅关于变量E的表达式 τ₄(E),它与 P(E) 成比例。通过归一化 τ₄(E),即可得到 P(E)。
这个逐步求和的过程,就是变量消元算法的本质:通过改变求和顺序,将大范围的求和分解为一系列小范围的局部计算,从而避免处理高维的联合分布。
复杂示例:学生网络
现在,让我们在一个更复杂的模型——“学生网络”中应用变量消元算法。我们的目标是计算变量J的概率 P(J)。为此,我们需要从联合分布中消除除J之外的所有变量。
以下是学生网络的联合分布(已表示为因子乘积形式):
P̃(C, D, I, G, S, L, J, H) = φ_C(C) * φ_D(D|C) * φ_I(I) * φ_G(G|I,D) * φ_S(S|I) * φ_L(L|G) * φ_J(J|L,S) * φ_H(H|G,J)
我们需要消除变量:C, D, I, H, G, S, L。
以下是逐步消元过程:
第一步:消除变量C
涉及C的因子是 φ_C(C) 和 φ_D(D|C)。将它们相乘并对C求和,得到新因子 τ₁(D):
τ₁(D) = Σ_C [φ_C(C) * φ_D(D|C)]
第二步:消除变量D
涉及D的因子是上一步得到的 τ₁(D) 和 φ_G(G|I,D)。将它们相乘并对D求和,得到新因子 τ₂(G, I):
τ₂(G, I) = Σ_D [τ₁(D) * φ_G(G|I,D)]
第三步:消除变量I
涉及I的因子是 τ₂(G, I)、φ_I(I) 和 φ_S(S|I)。将它们相乘并对I求和,得到新因子 τ₃(G, S):
τ₃(G, S) = Σ_I [τ₂(G, I) * φ_I(I) * φ_S(S|I)]
第四步:消除变量H
涉及H的因子只有 φ_H(H|G,J)。对其求和:
τ₄(G, J) = Σ_H φ_H(H|G,J)
注意,φ_H(H|G,J) 本身是一个条件概率分布,对H求和结果应为1。但为了演示算法流程,我们仍将其表示为一个因子。
第五步:消除变量G
涉及G的因子是 τ₃(G, S)、φ_L(L|G) 和 τ₄(G, J)。这是目前遇到的作用域最大的因子(涉及L, G, S, J)。将它们相乘并对G求和,得到新因子 τ₅(L, S, J):
τ₅(L, S, J) = Σ_G [τ₃(G, S) * φ_L(L|G) * τ₄(G, J)]
第六步:消除变量S和L
现在剩下因子 τ₅(L, S, J) 和 φ_J(J|L,S)。实际上,φ_J(J|L,S) 已包含在之前因子的推导中,但最终我们需要将所有剩余因子相乘。为得到 P̃(J),我们对S和L求和:
P̃(J) = Σ_{L, S} [τ₅(L, S, J)]
最后,归一化 P̃(J) 即可得到 P(J)。
通过这个例子,我们看到即使对于复杂的网络,变量消元法也能通过局部计算,系统地消除非查询变量,最终得到目标变量的(未归一化)概率。
处理证据(观测值)
变量消元法同样可以处理包含证据(即某些变量被观测到特定值)的查询。例如,我们想计算 P(J | I=i, H=h)。
处理方法是:
- 减少因子:将所有涉及被观测变量I和H的因子进行“实例化”。即,将因子中对应变量固定为观测值。
- 例如,φ_I(I) 变为常数 φ_I(i)。
- φ_G(G|I,D) 变为 φ_G(G|i, D),不再依赖I。
- φ_H(H|G,J) 变为 φ_H(h|G,J)。
- 执行消元:得到一组减少后的因子集合。然后,像之前一样,对除查询变量J和已被观测的变量(I, H)之外的所有变量执行消元算法。注意,已被观测的变量不需要被消除(求和),因为它们已固定为单一值。
- 归一化:消元最终得到一个与 P(J, I=i, H=h) 成比例的因子。将其归一化,即可得到条件概率 P(J | I=i, H=h)。
这种方法为处理带证据和不带证据的查询提供了一个统一的框架。
算法的一般形式与总结
变量消元算法的核心是一个称为“消除变量”的例程。其伪代码如下:
函数 消除变量(因子集合 Φ, 待消元变量 Z):
Φ‘ ← 从Φ中提取所有作用域包含Z的因子
ψ ← 将Φ‘中所有因子相乘
τ ← 对ψ中的变量Z求和(消元)
Φ ← (Φ - Φ‘) ∪ {τ} // 移除已使用的因子,加入新因子
返回 Φ
整个变量消元算法的流程如下:
- 证据约简:若有证据,首先减少所有相关因子。
- 初始化:获得初始因子集合 Φ。
- 循环消元:对每一个非查询变量(且未被观测),按某个顺序调用“消除变量”函数,更新因子集合 Φ。
- 最终处理:当所有需要消除的变量都被处理后,将剩余因子相乘,得到关于查询变量的未归一化因子。
- 归一化:将该因子归一化,即得所求的概率分布。
该算法简单而强大,对贝叶斯网络和马尔可夫网络同样适用。它基于两个基本操作:因子乘积 和 因子求和(消元)。其正确性的关键在于,在对某个变量Z求和之前,必须将所有包含Z的因子乘在一起,这样才能确保求和操作是完整的。
总结

本节课中,我们一起学习了概率图模型推理的基础算法——变量消元法。
- 我们首先通过一个链式结构的例子,直观理解了算法如何通过逐步求和来高效计算边缘概率。
- 接着,我们在更复杂的学生网络上一步步演练了算法过程。
- 我们还学习了如何将算法扩展到处理带证据的查询,即通过先约简因子再消元的方式。
- 最后,我们总结了算法的一般形式,其核心是重复应用“因子乘积”和“变量求和”两个步骤,直到只剩下查询变量。

变量消元法是许多更高级推理算法(如信念传播)的基础。理解其原理,是掌握概率图模型推理的关键一步。
004:变量消元算法复杂度分析

在本节课中,我们将深入分析变量消元算法的计算复杂度。我们将探讨算法中的基本操作,理解复杂度如何随模型规模增长,并揭示消元顺序对计算效率的关键影响。
变量消元中的基本操作
上一节我们介绍了变量消元算法,本节中我们来看看其计算复杂度。首先,我们需要理解算法执行过程中涉及的两类基本操作:因子乘积和边缘化。接下来,我们将分别计算这两类操作所需的计算量。

因子乘积操作
因子乘积操作将多个因子合并为一个新因子。例如,将作用域为 AB 和 BC 的两个因子相乘,得到作用域为 ABC 的新因子。

以下是计算新因子中每个数值的过程:
- 新因子中的每一行数值,都是通过将原因子中对应行的数值相乘得到的。
- 假设生成新因子需要合并
Mk个因子,那么生成新因子的每一行需要进行Mk - 1次乘法运算。 - 因此,总的乘法运算次数为
(Mk - 1) * Nk,其中Nk是新因子中的行数(即取值组合数)。
边缘化操作
边缘化操作通过对一个变量求和来缩小因子的作用域。例如,对作用域为 ABC 的因子关于变量 B 求和,得到作用域为 AC 的新因子。
以下是边缘化操作的计算特点:
- 输出因子中的每一行数值,是通过对输入因子中多行数值求和得到的。
- 从另一个角度看,输入因子中的每个数值,恰好会被加到输出因子的某一行中一次。
- 因此,所需的加法运算次数的一个简单上界就是输入因子的大小
Nk。
变量消元的总复杂度
理解了基本操作后,现在我们来汇总变量消元算法的总计算复杂度。我们假设模型初始时有 M 个因子。
以下是关于算法中因子数量的分析:
- 在贝叶斯网络中,
M通常等于变量数N(每个变量对应一个条件概率分布)。证据观测可能会减少初始因子数量,因此M ≤ N。 - 在马尔可夫网络中,因子数量可能多于变量数(例如全连接的成对马尔可夫网络),因此我们用
M而非N来描述复杂度。 - 每个消元步骤会生成一个新因子。由于最多消元
N个变量,因此最多生成N个新因子。 - 算法过程中处理过的因子总数
M*满足:M* ≤ M + N。
现在,我们来分析算法的运算量。设 N_max 为算法过程中生成的最大因子的大小。
以下是各类运算量的上界分析:
- 乘法运算:每个因子最多被乘入一次,因此总的乘法运算次数 ≤
M* * N_max。 - 加法运算:每个消元步骤的边缘化操作最多需要
N_max次加法,共有N个步骤,因此总的加法运算次数 ≤N * N_max。

综合来看,算法的总计算量是 O(N * M* * N_max)。虽然这个表达式在因子数量和变量数量上是线性的,但关键在于 N_max。
N_max 是最大因子的大小。如果所有变量有 d 个取值,那么一个包含 k 个变量的因子大小是 d^k。因此,复杂度实际上由算法过程中产生的最大因子的作用域大小(变量数)决定,并随该作用域大小呈指数级增长。
复杂度实例与消元顺序的影响
为了直观理解复杂度,让我们回顾之前课程中的一个变量消元实例。算法生成了多个中间因子,其作用域大小分别为2、3、3、3、4、3。其中最大的因子包含4个变量,这决定了该算例的计算复杂度。
变量可以按任意顺序消元,但消元顺序会极大影响生成的最大因子的大小,从而影响计算效率。
以下是一个不合理的消元顺序示例:
- 在之前的网络例子中,如果首先消元变量
G,需要乘入三个因子(φ_L(L,G), φ_G(G,I,D), φ_H(H,G,J)),生成的作用域为 {L, I, D, H, J, G} 的因子包含6个变量,比最优顺序下的最大因子(4个变量)更大。
以下是一个更能说明问题的极端示例:
- 考虑一个简单的成对马尔可夫网络:变量
A和C通过一系列中间变量B1, B2, ..., Bk相连。 - 糟糕的顺序(先消元A):消元
A需要乘入k个因子 (A-B1, A-B2, ..., A-Bk),生成的作用域为 {A, B1, ..., Bk} 的因子,其大小随k指数增长。 - 好的顺序(先消元B_i):首先消元
B1,只需乘入两个因子 (A-B1, C-B1),生成一个作用域为 {A, C} 的小因子 τ1。依次消元所有B_i都会生成类似的二元因子 {A, C}。最后再将所有 τ_i 相乘。整个过程生成的最大因子只包含3个变量,复杂度大大降低。
总结
本节课中我们一起学习了变量消元算法的复杂度分析。

总结如下:
- 变量消元的计算复杂度在模型规模(因子数
M*和变量数N)上是线性的。 - 然而,真正的计算瓶颈在于算法过程中生成的
最大因子的大小,该大小随因子作用域中的变量数量呈指数级增长。 - 消元顺序的选择直接影响生成的中间因子的大小,因此选择一个明智的消元顺序对于控制计算复杂度至关重要。

理解复杂度有助于我们认识变量消元算法的优势与局限,并为后续学习更高效的推理算法奠定基础。
005:基于图的变量消元视角

在本节课中,我们将学习如何从图的角度来理解变量消元算法。通过将变量消元操作视为对图的操作,我们可以获得关于如何选择最优消元顺序的重要见解。
图视角下的变量消元
上一节我们介绍了变量消元的基本操作。本节中,我们来看看如何将这些操作映射到一个图上。
首先,考虑一个包含多个变量的初始概率图模型。为了从图的角度分析变量消元,我们需要将模型中的因子集合表示为一个无向图。这个过程的第一步称为“道德化”。
以下是道德化的步骤:
- 将图中所有有向边转换为无向边。
- 对于每个具有多个父节点的变量(即V型结构),在其所有父节点之间添加无向边,使它们“联姻”。
道德化后得到的图,称为该因子集合的“诱导马尔可夫网络”。它反映了所有变量之间通过因子产生的直接关联。
消元步骤的图操作
现在,让我们思考一次变量消元步骤对图做了什么。
当消除一个变量时,我们需要将所有包含该变量的因子相乘,然后对该变量求和以生成一个新的因子。在图上的对应操作是:
- 移除待消除的变量节点。
- 在移除之前,将该节点的所有邻居节点两两连接起来。
这个过程可以形象地理解为:一个变量在“离开世界”前举办了一场告别派对,邀请它所有的邻居朋友参加。在派对上,所有邻居互相认识并成为朋友。因此,在变量被消除后,它的所有邻居在图中的连接变得更加紧密。
如果某些邻居在消元前已经相连,则无需额外操作。如果某些邻居在消元前没有直接连接,那么消元步骤就会在它们之间引入一条新的边,这条边被称为“填充边”。
诱导图与团

通过按特定顺序执行一系列消元步骤,我们最终会得到一个图,它被称为在给定消元顺序 α 下的诱导图,记作 I(Φ, α)。
诱导图具有以下重要性质:
- 它是一个无向图。
- 图中的节点是原始变量。
- 如果两个变量在变量消元过程的任何阶段出现在同一个因子中,那么它们在诱导图中就有一条边相连。
诱导图中的“团”是一个非常重要的概念。一个团是指图中一个完全连通的子图(即子图中任意两个节点都有边直接相连)。一个极大团是指一个无法通过添加任何其他节点而继续保持完全连通性质的团。
以下是关于诱导图中团的关键结论:
- 在变量消元过程中产生的每一个因子,都对应诱导图中的一个团。
- 诱导图中的每一个极大团,都对应变量消元过程中产生的某个因子。
这个对应关系意味着,诱导图中最大团的大小直接决定了变量消元算法的计算复杂度。因为消元过程中产生的最大的因子,其作用域就是诱导图中最大的团。
诱导宽度与复杂度
基于诱导图,我们可以定义一个衡量变量消元复杂度的度量标准——诱导宽度。
- 诱导图的宽度:定义为图中最大团所包含的节点数减1。公式表示为:
宽度(I) = |最大团| - 1 - 图的最小诱导宽度:定义为在所有可能的消元顺序
α中,所能达到的最小宽度。公式表示为:
最小诱导宽度(G) = min_α 宽度(I(Φ, α))
最小诱导宽度代表了对于该图结构,变量消元算法所能达到的最佳(最低)计算复杂度。它是一个理论下界,意味着无论我们如何优化消元顺序,算法的复杂度至少与最小诱导宽度所指示的级别相当。

总结
本节课中,我们一起学习了如何从图论的视角来审视变量消元算法。

我们了解到,变量消元的每一步都可以视为对图的一次变换:消除一个变量会将其所有邻居连接起来。整个过程产生了一个诱导图,该图可能因为引入了填充边而比原图连接更紧密。
诱导图中的极大团与消元过程中产生的最大因子直接对应,而最大团的大小(即诱导宽度)决定了算法的计算复杂度。最小诱导宽度则为我们提供了评估和选择最优消元顺序的理论工具。

通过这种基于图的视角,我们能够更直观地理解变量消元的计算代价,并为后续学习更高效的推理算法奠定基础。😊
006:寻找消元顺序
在本节课中,我们将要学习如何为变量消元算法寻找一个好的消元顺序。我们将看到,虽然寻找最优顺序本身是一个困难问题,但存在一些简单有效的启发式方法。
概述
上一节我们介绍了变量消元算法的计算复杂度与消元顺序密切相关。本节中,我们来看看如何系统地寻找一个好的消元顺序,以降低计算成本。
寻找消元顺序的重要性
当我们讨论变量消元时,我们说无论使用何种消元顺序,变量消元算法都是正确的。但我们也展示了消元顺序会对算法的计算复杂度产生非常显著的影响。这就引出了一个问题:我们如何找到一个好的消元顺序?
幸运的是,我们最*基于图的计算分析为我们提供了如何寻找好的消元顺序的直觉。因为事实证明,诱导图的概念以及它指示变量消元复杂度的方式,可以让我们构建出具有良好计算特性的消元顺序的优良方法。
最优顺序的复杂性
我们能构造出多好的消元顺序呢?这里再次证明了任何有趣的问题都是NP难的。对于图H,确定是否存在任何消元顺序α,使得其诱导宽度小于或等于某个固定值K,这个问题是NP完全的。
你可能会对自己说,这并不奇怪,概率推断是NP完全的,所以显然找到一个非常好的消元顺序也将是NP完全的。但事实证明,这是一个独立的NP难问题。也就是说,即使你能解决这个问题,即使有人给了你最好的消元顺序,你仍然会遇到一些图,其宽度足够大,以至于你实际上无法在多项式时间内解决问题。因此,找到能给出最佳诱导宽度的消元顺序,通常并不能保证多项式时间的性能。所以这是两个独立的NP难问题。
启发式方法
那么,如何找到一个好的消元顺序呢?幸运的是,简单的启发式方法实际上效果很好。寻找好的消元顺序的一个标准方法是简单地执行贪婪搜索,一次消除一个变量。在消元的每个阶段,你使用某种启发式成本函数来决定接下来要消除哪个变量。
有一些明显的成本函数可以使用,而且事实证明它们效果出奇地好。
以下是几种常用的启发式成本函数:
- 最小邻居:选择在当前图中邻居数量最少的节点。这对应于产生最小的因子。
- 最小权重:计算因子中变量值域大小的乘积总和。这考虑了不同变量可能具有不同数量的取值。
- 最小填充:计算如果消除此节点,有多少对之前不是朋友的节点会因此次消除步骤而成为朋友。这衡量了超出先前已生成边的额外复杂度。
- 加权最小填充:这是最小填充的加权版本,不仅考虑新增边的数量,还考虑它们所连接变量的值域大小。
事实证明,在实践中经常使用的最小填充是一个相当好的启发式方法。
消元顺序与三角化
理解寻找消元顺序问题的一个重要方法是看以下结果。这个结果告诉我们,无论消元顺序如何,变量消元产生的诱导图都是三角化的。
三角化意味着图中不能存在长度大于3且没有“桥”(即连接环中非相邻顶点的弦)的环。

让我们来理解为什么这是真的。这里有一个简单的证明。考虑一组变量,并假设存在一个长度大于3的环。这些变量中必须有一个是第一个被消除的。假设C是第一个被消除的。当我们消除C时,我们最终会在B和D之间引入一条边。因为当C被消除时,C和B、C和D之间的边必须存在(根据我们之前的观察,在消除C时,你不会给C添加任何新邻居),所以在那一刻必须添加一条填充边。

因此,寻找消元顺序的另一种方法(除了前面提到的启发式方法)是找到原始图的一个低宽度三角剖分。图论文献中有大量关于三角剖分图的工作,我们在此不深入讨论,但你可以利用所有这些文献来寻找良好的低宽度三角剖分,然后用于构建消元顺序。
实际应用示例
现在让我们通过一个实际应用来证明消元顺序可以产生巨大差异。这个应用是机器人定位与建图。
在这个场景中,一个机器人在环境中移动。在每个时间点,它看到几个地标(它可以识别它们),并感知到最*地标的*似距离。
我们可以将其写成一个图模型。模型包含:
- 每个时间点的机器人位姿(随时间变化的随机变量)。
- 一组地标位置(固定的,不是随时间变化的随机变量)。
- 观测值(灰色部分),表示在特定时间机器人对特定地标的观测距离,它是机器人位姿和地标位置的函数。
如果我们为之前看到的机器人轨迹写出表示因子的马尔可夫网络,我们会看到:
- 浅蓝色的点代表每个时间点的机器人位姿。
- 时间持续性边连接相邻时间的位姿。
- 深蓝色的地标位置变量,连接到机器人曾观测到它的所有位姿(这是一个由V型结构诱导产生的边)。
那么,消元顺序重要吗?非常重要。
- 先消除位姿,后消除地标:产生的诱导图像一团巨大的“意大利面”,大多数地标都连接到所有其他地标。
- 先消除地标,后消除位姿:产生的诱导图在机器人位姿之间仍然连接相当密集,但远没有之前那么糟糕。
- 使用最小填充启发式:产生的诱导图非常稀疏,在整个轨迹过程中实际添加的填充边非常少。
由此可见,消元顺序确实会产生非常大的差异。


总结
本节课中我们一起学习了为变量消元寻找消元顺序。我们了解到,寻找最优消元顺序本身是一个NP难问题,并且这个难度与图模型推断的内在难度是不同的。
然而,我们也展示了基于图的变量消元视角为我们提供了一套非常简单直观的启发式方法,允许我们构建出良好的消元顺序。这些方法通过在变量消元过程中观察构建的诱导图,并试图保持其小而稀疏来实现。

这些启发式方法虽然简单,并且在最坏情况下可能无法提供最优性能,但在实践中通常相当合理,并且被广泛使用。
007:置信传播算法

在本节课中,我们将学习变量消元算法之外的另一类算法——消息传递算法。我们将看到,这类算法在某种程度上与变量消元密切相关,但它为我们执行求和与因子乘积步骤提供了额外的灵活性,从而有可能获得比最小消元序更低的计算复杂度。
从变量消元到消息传递

上一节我们介绍了变量消元算法。本节中,我们来看看一种替代方案:消息传递算法。其核心思想是将计算任务分解到多个“簇”中,让它们通过交换“消息”来协同工作,最终得到*似解。
考虑一个简单的马尔可夫网络。与其直接进行变量消元(尽管这个网络计算成本不高),我们不如构建一个簇图。簇图是一种数据结构,我们将从图模型中提取的小块知识(因子)放置到称为“簇”的节点中。
例如,我们可能有四个簇:
- 簇1:管辖变量 A 和 B。
- 簇2:管辖变量 B 和 C。
- 簇3:管辖变量 C 和 D。
- 簇4:管辖变量 A 和 D。
这些簇会相互“交谈”,试图说服对方,让它们对共同管辖的变量的看法达成一致。例如,簇1会与簇2讨论变量 B,告诉簇2它对 B 的看法,从而使簇2能更准确地了解 B 的分布。
簇图与初始化
首先,每个簇会获得自己的初始信息(因子)。我们将这些初始信念或证据称为 ψ。在简单例子中,ψ 就是原始模型中的因子 φ。
以下是簇图初始化的步骤:
- 构建簇图:它是一个无向图,节点是代表变量子集的簇,边连接相邻的簇。
- 分配因子:每个初始因子 φ_k 必须且只能被分配给一个簇。这个簇的管辖范围必须包含该因子的所有变量(即因子的作用域是簇变量集的子集)。这是为了避免证据被重复计算。
- 计算初始势函数:每个簇的初始信念 ψ_i 是其被分配的所有因子的乘积。如果某个簇没有被分配任何因子,则其 ψ_i = 1。
用公式表示,对于簇 i:
ψ_i = ∏_{φ 被分配给簇 i} φ
消息传递机制

初始化后,簇之间开始通过消息进行通信。最初,所有消息都被初始化为 1(即无信息状态)。
当一个簇(例如簇 i)想要发送消息给其邻居簇 j 时,它会执行以下操作:
- 收集它当前掌握的所有信息:包括它自己的初始信念 ψ_i,以及从除 j 以外的所有邻居簇那里收到的消息。
- 将这些信息相乘,得到一个关于其管辖变量的联合信念。
- 边缘化掉簇 j 不关心的变量(即那些在簇 i 的变量集中但不在簇 j 变量集中的变量)。
- 将结果作为消息 δ_{i→j} 发送给簇 j,这个消息的作用域是两簇共有的变量子集 S_{ij}。
消息传递的核心公式如下:
δ_{i→j}(S_{ij}) = ∑_{C_i \ S_{ij}} ( ψ_i × ∏_{k∈N(i)\{j\}} δ_{k→i} )
其中:
C_i是簇 i 的变量集。S_{ij}是簇 i 和 j 共有的变量子集。N(i)是簇 i 的邻居集合。∑_{C_i \ S_{ij}}表示对属于C_i但不属于S_{ij}的变量求和(边缘化)。
关键点:消息 δ_{i→j} 的计算不包含从目标簇 j 发来的消息 δ_{j→i}。这是为了防止信息在两者间循环强化,导致信念无限放大。
算法流程与信念计算
基于上述机制,置信传播算法可以概括如下:

- 初始化:
- 将每个因子 φ 分配给一个合适的簇。
- 计算每个簇的初始势函数 ψ。
- 将所有消息 δ 初始化为 1。
- 迭代消息传递:
- 重复选择图中的一条边 (i, j)。
- 根据上述公式,沿该边传递消息 δ_{i→j} 和 δ_{j→i}(通常异步进行)。
- 计算最终信念:
- 当满足某种停止条件(如消息变化很小或达到固定迭代次数)后,计算每个簇的最终信念。簇 i 的信念 β_i 是其自身初始势函数与所有传入消息的乘积:
β_i = ψ_i × ∏_{k∈N(i)} δ_{k→i}
- 当满足某种停止条件(如消息变化很小或达到固定迭代次数)后,计算每个簇的最终信念。簇 i 的信念 β_i 是其自身初始势函数与所有传入消息的乘积:
这些 β_i 被称为伪边缘分布,它们*似表示了对应变量子集的联合分布。
算法的特性与表现

置信传播算法有几个重要的未定义方面:
- 停止条件:何时结束迭代?常见策略是检查消息的变化是否小于某个阈值,或设置最大迭代次数。
- 消息调度策略:按什么顺序选择边来传递消息?简单的轮询顺序是可行的,但存在更高效的调度策略。

那么,这个算法有效吗?答案是:既有效又需要谨慎。
- *似性:在一般的带环图中,该算法可能不收敛,或者收敛到一个*似解,而非精确的边缘概率。从理论上讲,它得到的信念是伪边缘分布。
- 实际效果:尽管是*似算法,但在许多实际应用中(如图像处理、医疗诊断网络),其计算结果与精确边缘分布非常接*,表现出色。研究表明,在许多存在大量环路的网络中,置信传播算法能给出高质量的*似。
总结

本节课中我们一起学习了置信传播算法。它是一种在簇图上通过传递消息进行推理的*似算法。每个簇汇总来自其他邻居(除接收方外)的信息,经过边缘化后,将关于共享变量的摘要信息发送给邻居。这种设计避免了信息的直接重复计算。虽然该算法在带环图上可能不保证收敛或精确性,但其产生的伪边缘分布在众多实际问题上非常接*真实结果,因此被广泛使用。
008:团图的性质 📊

在本节课中,我们将学习信念传播算法所依赖的团图需要满足的关键性质。我们将详细探讨族保持性和运行相交性这两个核心属性,并介绍一种简单且常用的团图构造方法——贝塔团图。
团图回顾
上一节我们介绍了信念传播算法是在团图上传递消息的。但当时并未具体说明如何构造这个团图,以及它需要满足哪些性质才能支持有效的消息传递。

首先,让我们回顾一下团图的定义。团图是一个无向图,其节点是包含变量子集的团,边则关联一个子集 S_IJ,该子集是连接两个端点的两个团的交集。
团图的关键性质
为了确保信念传播算法能正确工作,团图必须满足两个关键性质。
性质一:族保持性
第一个性质称为族保持性。这个性质非常直观。给定一个因子集合 Φ,我们需要能够将每个因子 φ_K 分配到某个团 C_α(K) 中,使得该团能够容纳该因子的作用域。
为了使团图能够实现这一点,它必须满足一个约束:对于因子集合 Φ 中的每一个因子 φ_K,都存在一个团 C,使得 C 能够容纳 φ_K 的作用域 Scope[φ_K]。这意味着你可以将这个因子“放入”这个团中。

这就是族保持性。它确保了原始模型中的所有信息都能在团图中得到表示。
性质二:运行相交性
第二个性质理解起来稍微复杂一些,它叫做运行相交性。我们先看定义,再理解其含义。
定义如下:假设我们有一对团 C_I 和 C_J,以及一个同时属于这两个团的变量 X。运行相交性要求,在 C_I 和 C_J 之间存在一条唯一的路径,使得该路径上的所有团及其边上的子集都包含变量 X。
这意味着什么?举个例子,如果变量 X 同时出现在团 C_7 和团 C_5 中,那么必须存在一条连接 C_7 和 C_5 的路径,并且路径上的每个节点(团)和边(子集)都包含 X。这条路径必须是唯一的。
现在,我们来理解这个定义中“存在性”和“唯一性”两方面的直觉。
- 存在性:想象一下,如果出于某种原因,C_7 和 C_5 之间没有这样一条包含 X 的路径。那么,这两个各自拥有关于 X 信息的“社区”就永远无法就 X 进行交流,信息无法传递和整合。这显然不是我们想要的,因此我们需要这条路径存在。
- 唯一性:这部分理解起来更微妙一些。假设存在两条不同的路径都包含 X。现在考虑消息传递算法:C_3 可以向 C_5 发送关于 X 的信息(例如,“我认为 X 取值为1”)。C_5 整合这个信息后,可能通过另一条路径将信息传回 C_3。这会在图中形成一个反馈环,导致关于 X 的信念被不断自我强化,从而产生非常极端和有偏差的概率估计。为了避免(或至少减少)这种风险,我们需要防止这种环路,因此要求路径是唯一的。
需要指出的是,防止这种环路只能减少问题,而非完全消除。例如,如果图中存在强相关的变量 X 和 Y,信息可能会通过 Y 间接地形成反馈,这仍然是信念传播算法在处理强相关性模型时表现不佳的原因之一。这一点我们将在后续课程中深入探讨。
现在,让我们回到运行相交性,并给出一个等价的定义以加深理解:运行相交性等价于说,对于任何变量 X,包含 X 的所有团和边子集构成一棵树。


这棵树必须是连通的(因为路径必须存在),且不能是带环的图(因为路径必须唯一)。你可以这样理解:每个变量都在团图中诱导出自己的一棵小树,关于该变量的信息就在这棵树上流动。
性质检验与非法图例
理解了定义后,让我们用之前的例子来检验一些团图是否满足运行相交性。我们已经讨论过族保持性,现在重点关注运行相交性。
考虑变量 B。在有效的团图中,包含 B 的团和边子集形成了一棵树。然而,并非所有结构都合法。
以下是违反运行相交性的非法团图示例:
- 违反存在性:如果团 C_2 包含 B,但无法通过一条包含 B 的路径连接到其他包含 B 的团,这就违反了存在性。
- 违反唯一性:如果包含 B 的团和边子集形成了一个环(例如,在团1和团4之间有两条不同的路径都包含 B),这就违反了唯一性。
如果我们希望团图既能允许 B 和 C 之间的相关性信息传递(这是上图中缺失的),又能满足运行相交性,我们可以调整边的连接方式,确保对于 B(以及其他所有变量),包含它的部分构成一棵树。
构造团图:贝塔团图
那么,我们如何构造一个满足这些性质的团图呢?一个非常简单(虽然在某些方面是退化的)、因其简洁而常用的结构叫做贝塔团图。这个术语来源于统计物理学。
在贝塔团图中,有两种类型的团:
- 大团(因子团):对应原始因子集合 Φ 中的每一个因子 φ_K。每个大团的作用域就是该因子 φ_K 的作用域。
C_K 的作用域 = Scope(φ_K) - 小团(变量团):对应每一个单独的变量 X。每个小团的作用域只包含该变量本身。
C_X 的作用域 = {X}
连接规则是:当一个变量 X 属于一个大团 C_K 的作用域时,我们就在大团 C_K 和变量团 C_X 之间添加一条边。
根据之前例子的因子集合,我们可以构造出如下贝塔团图:


你可以看到,这个图是“退化”的,因为消息只能在因子团和单变量团之间传递,每一步都会丢失变量之间的相关性信息。然而,它构造简单,并且保证满足运行相交性。为什么呢?以变量 D 为例,包含 D 的部分(变量团 D 以及所有包含 D 的大团)天然形成了一棵以 D 为中心的星形树,这符合运行相交性的要求。
总结
本节课中,我们一起学习了团图必须满足的两个核心性质:
- 族保持性:确保原始概率图模型中的所有因子都能被分配到团图中合适的团内,从而完成模型的编码。
- 运行相交性:具有双重目的。首先,它连接了关于任一变量的所有信息,使得这些信息能在图中传递和整合;其次,它通过防止紧密的反馈环路,避免了消息在传递过程中自我强化而导致的计算结果严重偏差。

我们还介绍了一种基础的团图构造方法——贝塔团图。它因其定义简单且性质有保证,常被作为默认选择。然而,更丰富的团图结构(如我们之前讨论过的类型)能够在计算成本和信息保存度之间提供非常不同、有时是显著更优的权衡。增大团的规模虽然会增加消息传递的计算开销,但同时也能更好地在消息传递过程中保持变量间的依赖关系,减少信息损失。
009:置信传播的性质


在本节课中,我们将深入探讨置信传播算法,并理解它所具有的一些重要性质。
校准与收敛
上一节我们介绍了置信传播的基本流程,本节中我们来看看算法收敛时的一个重要性质:校准。

一个聚类图被称为校准的,如果图中不同聚类关于它们共享变量的信念是一致的。具体来说,对于任意两个相邻的聚类 i 和 j,它们关于共享变量子集 S_ij 的边际信念应该相等。用公式表示如下:
sum_{C_i \ S_ij} beta_i(C_i) = sum_{C_j \ S_ij} beta_j(C_j)
其中,beta_i 和 beta_j 分别是聚类 i 和 j 的信念。
置信传播算法的一个重要性质是:算法的收敛意味着校准。
为了理解这一点,让我们进行一个简单的推导。当置信传播收敛时,相邻聚类间传递的消息在下一步与上一步相等。这意味着对于任意边 (i, j),有 delta_{i->j}^{new} = delta_{i->j}^{old}。
根据信念的定义和消息更新规则,我们可以推导出,在收敛状态下,聚类 i 和 j 关于共享子集 S_ij 的边际信念都等于同一条边上两个方向消息的乘积:
mu_{ij}(S_ij) = delta_{i->j} * delta_{j->i}
由于 mu_{ij} 对两个聚类是相同的,这就证明了校准性质。这个共享的边际信念 mu_{ij} 被称为子集信念。

重参数化
基于校准性质,我们可以得到另一个关键性质:重参数化。
在算法收敛后,我们得到一组聚类信念 {beta_i} 和子集信念 {mu_{ij}}。这些信念共同构成了一种新的参数化方式,但它仍然完整地编码了原始的未归一化概率分布。
以下是重参数化的核心关系:
P-tilde(X) = (∏_i beta_i(C_i)) / (∏_{(i,j)∈E} mu_{ij}(S_ij))
其中,P-tilde(X) 是原始的未归一化联合分布(即所有初始势函数 Psi_i 的乘积)。这个公式表明:
- 分子是所有聚类信念的乘积。
- 分母是所有子集信念的乘积。
- 两者相除后,所有消息因子(
delta)相互抵消,最终结果就是所有初始势函数的乘积。
因此,置信传播算法并没有丢失原始分布的任何信息,它只是将信息重新分配到了各个聚类的局部信念和它们之间的共享信念中,形成了一种更方便计算边际概率的参数化形式。
总结

本节课中我们一起学习了置信传播算法的两个核心性质:

- 收敛意味着校准:当算法收敛时,图中所有相邻聚类关于共享变量的边际信念会达成一致。
- 重参数化:收敛后得到的聚类信念和子集信念,共同构成原始联合分布的一个等价表示。这种表示具有校准性,使得我们可以从包含某个变量的任意聚类中直接读取关于该变量的信息,为后续的概率查询提供了便利。

通过理解这些性质,我们能够更好地把握置信传播算法的内在机理及其结果的可靠性。
010:团树算法正确性
在本节课中,我们将学习信念传播算法的一个特例——团树算法。我们将看到,当算法运行在一种称为“团树”的特殊数据结构上时,不仅能保证收敛,还能保证收敛到概率推理的精确解。

从链式结构到团树
上一节我们介绍了在一般聚类图上运行的信念传播算法。本节中,我们来看看一个更特殊的场景:在“团树”这种数据结构上传递消息。团树是聚类图的一个特例,但正是在这种结构上,信念传播算法能获得更强的性能保证,即快速收敛到精确答案。
链式结构上的消息传递
让我们从最简单的树结构——一条链开始。考虑一个链式无向马尔可夫随机场或条件随机场,为简化起见,我们只考虑成对势函数。

以下是消息传递的过程:
- 从最左边的团开始,团1向团2发送消息。由于此时没有其他传入消息,该消息就是团1势函数对变量A的求和,得到一个关于变量B的消息。
- 团2接收消息后,将其与自身的势函数相乘,并对变量B求和,得到一个关于变量C的消息,发送给团3。
- 此过程持续进行,直到消息传递到链的末端。反向的消息传递遵循相同的规则,但每个团在向外发送消息时,不会乘入从目标团接收到的消息。
这种消息传递方式有一个重要特性:最终计算得到的信念是精确的。让我们以团3为例进行验证。
团3的信念是自身势函数与来自团2和团4的传入消息的乘积。通过展开这些消息的定义,我们发现最终表达式是所有初始势函数的乘积,并对不在团3内的所有变量进行了求和。这非常类似于变量消除算法。
变量消除的正确性保证
变量消除算法正确的关键在于,在求和消除一个变量之前,必须乘入所有包含该变量的因子。在上述链式例子中,我们可以验证这一点:
- 消除变量E时,只乘入了包含E的因子ψ4。
- 消除变量A时,只乘入了包含A的因子ψ1。
- 消除变量B时,乘入了包含B的因子ψ2,以及从消除ψ1后留下的、也包含B的因子。
因此,消息传递过程遵循了合法的变量消除顺序,从而保证了结果的正确性。
团树的定义与性质
现在,让我们将这个概念扩展到更一般的“团树”。团树是一种无向树,其节点是变量的集合(称为“团”),边连接着这些团。

与一般聚类图的关键区别在于,团树要求连接两个团的边上的“分离集”必须恰好等于这两个团的交集。
团树作为聚类图的特例

团树是聚类图的一个特例,因此它也必须满足聚类图的两个核心性质:族保持性和运行交集性。
族保持性要求网络中的每个因子都必须能被分配到至少一个范围足以容纳其所有变量的团中。


运行交集性在树结构下可以简化为:对于任意两个包含同一变量X的团,变量X必须出现在连接这两个团的唯一路径上的每一个团和分离集中。

复杂团树示例

让我们看一个更复杂的团树示例,它对应我们之前用于演示变量消除的学生网络。

以下是该网络中的因子分配:
- 团
{C, D}分配了因子P(C)和P(D|C)。 - 团
{G, I, D}分配了因子P(G|I,D)。 - 团
{G, S, I}分配了因子P(I)和P(S|I)。 - 以此类推。
可以验证,此团树满足运行交集性。例如,变量G出现在多个团中,并且确实出现在连接这些团的路径的所有团和分离集上。

在此团树上的消息传递过程与链式类似,只是分离集可能包含多个变量,在传递消息时需要对这些变量全部求和。


运行交集性与算法正确性
运行交集性(连同族保持性)是保证团树上消息传递算法正确的关键。其核心思想在于,它确保了变量消除的顺序是合法的。
考虑一个变量X,它出现在团Ci和Cj中。根据运行交集性,X必须出现在连接Ci和Cj的路径上的所有团中。现在,假设在从团Ck向团Cl传递消息的过程中,变量X被求和消除(即不出现在输出消息的范围内)。那么,根据运行交集性,X不可能出现在团Cl中(否则它也会出现在分离集Skl中,从而不会被消除)。这意味着,在消除X的那一刻,所有包含X的因子都已经被乘入到了当前的消息计算中,因为任何其他包含X的团要想与当前团联系,其路径必须经过当前团,而它们的消息尚未传入。


让我们在学生网络的团树示例中验证这一点。考察团 {G, S, I} 的信念计算,它最终是网络中所有势函数的乘积,并对变量 C, D, J, L, H 进行了求和。我们可以验证,在消除其中任何一个变量时(例如D),所有包含该变量的因子(如 P(G|I,D) 和 P(D|C))都已在计算中被乘入。

总结

本节课中我们一起学习了团树算法。我们了解到,信念传播算法可以运行在一种树状的特殊聚类图——团树上。团树必须满足族保持性和运行交集性。当算法在团树上运行时,其计算过程本质上是变量消除算法的一种并行化实现。正因如此,算法不仅能使信念达到校准状态,更能保证计算出的就是未归一化联合分布的精确边缘概率。
011:团树算法计算 🧮

在本节课中,我们将学习团树算法的高效计算策略。我们将看到,通过利用树结构的特性并精心安排消息传递的顺序,可以极大地提升算法的计算效率,而不仅仅是保证其正确性。
从消息传递到高效计算
上一节我们定义了团树算法,它本质上就是在树状图上运行的置信传播算法。事实证明,我们可以利用树结构的特性,显著改善该算法的计算行为。
让我们回到一个非常简单的树结构中的消息传递过程,这个树只有四个团:C1(AB), C2(BC), C3(CD), C4(DE)。我们来观察消息的行为。

这里有消息 Delta_12(在边1-2上传递的消息)、Delta_23 等,总共六条消息。现在我们可以注意到一个非常重要的特性:Delta_12 一旦计算完成,就永远不会改变。因此,Delta_12 在第一次计算后立即收敛。
那么 Delta_23 呢?这取决于 Delta_23 何时被传递。如果它在团2收到来自团1的消息之前就被传递了,那么当团2收到消息后,情况可能会改变。但如果团2足够“聪明”,它会等待。一旦它等到那条消息(因为那条消息不会再变),那么 Delta_23 也就不会再改变了。同理,Delta_34 需要等待更久,它需要等待 Delta_23。但如果它等到 Delta_12 传递给团2,并且 Delta_23 传递给团3之后,再发送 Delta_34,那么 Delta_34 也不会再改变。
因此,如果消息传递按照正确的顺序等待,那么整个树的消息可以在一次正向传递中收敛。从左到右并非唯一方向,从右到左也会得到完全相同的行为。所以,我们可以通过一次从左到右的传递和一次从右到左的传递,计算出整个树的所有消息。
对于像这样的链式结构,这种方法实际上有自己的名字,称为前向-后向算法,常用于隐马尔可夫模型等链式结构表示中。
关键在于,计算所有这些消息的总工作量,只是每个方向上一次消息传递的步骤:一次从左到右,一次从右到左。一旦所有消息传递完毕,我们就得到了正确的置信度,它们代表了因子乘积 P_tilde(Φ) 的边际分布。因此,我们通过在这个团树上进行两次“扫描”,计算出了图中所有团的边际分布。
通用策略与消息传递顺序
更一般地说,如果一个团 CI 在发送消息给邻居 CJ 之前,等待并接收了来自所有其他邻居的最终消息,那么它发送给 CJ 的消息 Delta_IJ 也将是最终的。那么,我们总能找到一个能达到此目标的消息传递顺序吗?会不会出现大家互相等待,最终卡住、永远不发送消息的情况?
关键在于,我们可以从叶子节点开始。来自叶子节点的消息总是立即成为最终的。一旦叶子节点的消息被确定,我们就可以发送其父节点的消息,依此类推。因为这是一个树结构,所以保证你能找到一个合法的消息传递顺序。
如果我们以正确的顺序传递消息,那么我们只需要传递 2(K-1) 条消息,其中 K 是团的总数。为什么?因为一个有 K 个节点的树有 K-1 条边,而每条边有两个方向的消息,所以总共有 2(K-1) 条消息。

合法与非法的消息传递顺序示例
让我们看几个消息传递顺序的例子,看看哪些可行,哪些不可行。

我们可以从任意叶子节点开始,比如 C2。C2 传递消息后,哪个团可以传递下一个消息?C3 还不行,因为它还在等待其他团的消息。所以我们必须去另一个叶子节点,例如 C1。C1 现在可以传递消息了。C3 和 C4 仍然不是候选,因为它们各自还在等待另一条消息,但 C6 可以传递消息。现在我们可以激活 C4,C4 现在可以向 C3 发送消息,因为它已经收到了除 C3 之外的所有消息。C7 可以向 C3 传递消息。注意,在这个过程中,我如何排序有很多任意的决定,我本可以接下来用 C5。现在 C3 可以选择传递消息了,然后是 C5。
此时,每个团都收到了除一个邻居外的所有消息。所以现在我们可以开始向另一个方向传递消息了:C5 可以向 C3 传递消息,C3 可以向 C2、C7 或 C4 中的任何一个传递消息。此时,C4 可以向 C6 和 C1 传递消息。
那么,什么是非法的消息传递顺序呢?例如,如果 C1 向 C4 传递了消息,而 C4 急于求成,紧接着就向 C3 发送消息,这就是一个非法的顺序。因为 C4 还没有获得传递消息给 C3 所需的全部信息,它仍在等待来自 C6 的消息,所以这不是一个好的排序。
团树作为高效查询的数据结构
团树还具有其他非常优雅的计算特性,使其成为一个有用的数据结构。让我们思考一下可以使用团树回答的查询类型。
以下是一些可能的查询:
- 团内变量查询:如果我们想查询出现在同一个团中的单个变量或一组变量的后验分布,我们可以取任何包含所有这些变量的团,并对该团中我们不关心的变量进行求和,从而得到仅关于这些变量的后验。注意,这个后验是未归一化的度量 P_tilde,为了得到归一化的度量,你需要重新归一化。
- 引入新证据的增量推理:你可能想针对某个变量引入新证据,并查询另一个变量。这是一种增量推理形式:你已经校准了团树,现在你说:“等等,我有了另一个观察结果,让我们看看现在会发生什么。”事实证明,团树非常擅长处理这种情况。
我们将这种情况分为两种:简单情况和稍复杂的情况。
情况一:证据变量 Z 和查询变量 X 在同一个团中


这实际上非常简单。假设我们有一个包含 Z 和 X 的团(如果还有其他变量也没关系,我们总是可以去掉它们)。我们现在可以通过限制注意力到与我的证据 Z 一致的条目来“约减”这个团。这称为团约减。然后我们得到 P_tilde(Z, X),为了得到后验,我们可以对相关变量求和并归一化。这样就能进行增量推理。
情况二:证据变量和查询变量不在同一个团中
让我们用一个例子来想象,我想在 A 上观察证据,并查询 B。

在这种情况下,我可以这样做:我可以将这个指示函数(或我们称之为因子的约减)乘入一个包含证据的团中。在这个例子中,我们将把指示函数 δ(A=a) 乘入团1的因子 Ψ1 中,这相当于从团1的置信度中移除所有与该证据不一致的条目。
现在,当我们改变 Ψ1 时会发生什么?想象一下我们从头开始进行整个计算:忘记之前所做的一切,思考一下,如果我们用新的 Ψ1 而不是旧的 Ψ1 传递消息,这个模型会发生什么。一些消息会改变,哪些消息会改变?Delta_12 会改变,因为 Ψ1 变了。Delta_23 会改变,因为 Delta_12 变了。Delta_34 会改变,但如果我们关心的是这边团3的置信度,我们就不关心 Delta_34。其他消息呢?Delta_43 不会改变,Delta_32 也不会改变,Delta_21 也不会改变。
因此,只有团树中消息的一个子集会因为这个改变而改变。这意味着在计算我们关于团3的置信度时,我们至少可以重用一半(甚至更多)的消息。我们唯一需要重新计算的消息,是沿着通往包含我们想查询的变量 X(本例中是团3)的团的路径上的消息。
总结

本节课中我们一起学习了团树算法的高效计算策略。
总结来说,如果我们有一个包含 K 个团的团树,并且我们以谨慎的顺序传递消息(即从叶子节点开始并向内传播),那么我们可以构建一个顺序,使得 2(K-1) 条消息就足以计算团树中的所有置信度。这意味着我们得到了模型中每个单一变量的后验分布。
将此与运行变量消除并计算 n 个不同变量的后验所需的计算成本进行对比,这里我们获得了相当可观的计算节省,实际上是变量数量的量级。因此,我们能以仅两倍于变量消除的成本计算所有边际分布,而不是 n 倍于变量消除的成本。

我们还展示了,通过缓存或存储消息,我们可以重用推理结果,例如在增量查询的上下文中,这为我们提供了一个有用的数据结构,可以在获得额外证据时不断更新。
012:团树与独立性 🧠
在本节中,我们将深入探讨团树算法的计算复杂性。我们已经知道团树算法具有高效且正确的特性,但推理问题本质上是NP难的,因此必然存在某些情况下计算成本会显著增加。本节将分析这种隐藏成本的具体来源。

团树算法的性质回顾
我们已证明团树算法具有以下重要性质:
- 它保证在每个团上都能得到正确的边缘概率。
- 这些边缘概率彼此一致。
- 计算可通过团树上的一次向上传递和一次向下传递完成,效率较高。
然而,概率图模型中的推理问题是NP难问题,这意味着在某些情况下运行团树算法时必然存在计算成本。接下来我们将尝试理解这种隐藏成本可能出现在何处。
团树计算复杂性分析

为了分析团树的计算复杂性,我们首先定义一些符号。考虑团树 T 中的一条边 IJ,我们将变量分为三组:
- W<I:位于
IJ边I侧的变量(不包含子集S<sub>IJ</sub>中的变量)。 - W>J:位于
IJ边J侧的变量(不包含子集S<sub>IJ</sub>中的变量)。 - SIJ:位于中间的子集变量。
这三组变量互斥且完备,覆盖了树中的所有变量。
现在,我们提出一个关键定理:团树 T 满足运行交集性质(Running Intersection Property)当且仅当对于每条边 IJ,给定中间子集变量 S<sub>IJ</sub>,左侧变量 W<sub><I</sub> 与右侧变量 W<sub>>J</sub> 条件独立。即子集 S<sub>IJ</sub> 分隔了左侧与右侧的变量。
运行交集性质是证明团树算法正确性的关键,因此这一条件至关重要,它定义了团树算法所有优良行为的根本属性。

具体示例分析
让我们通过一个具体例子来理解这一定理。考虑以下团树结构,并关注子集 {G, S}:
- 左侧变量(蓝色):
C, I, D - 右侧变量(绿色):
H, J, L - 子集变量(红色):
G, S
在对应的马尔可夫网络(由贝叶斯网络的因子导出)中:
- 红色变量
G, S位于中间。 - 蓝色变量
C, I, D位于左侧。 - 绿色变量
H, J, L位于右侧。
通过简单观察可发现,蓝色变量与绿色变量之间所有路径都必须经过红色变量。因此,给定 G, S,蓝色变量与绿色变量条件独立。这正好验证了定理:子集分隔了左侧与右侧的变量。
一般性论证
现在,我们尝试给出更一般性的论证。假设在诱导的马尔可夫网络中,存在一条从左侧变量到右侧变量的路径,且该路径不经过子集 S<sub>IJ</sub>。这意味着存在一条边连接了左侧的某个变量和右侧的某个变量,例如 D 和 H。
由于因子保持性质,涉及 D 和 H 的因子必须位于团树的某个团中。假设该团位于绿色侧。但 H 同时是蓝色侧的变量,根据运行交集性质,H 必须出现在从该团到蓝色侧团路径上的所有团中,特别是必须出现在子集 S<sub>IJ</sub> 中。这与 H 不在子集中的假设矛盾。因此,这样的路径不可能存在,从而证明了条件独立性。

计算复杂性的含义
我们最初提出这些性质具有计算含义,那么具体体现在哪里?从子集需要分隔图成为条件独立部分这一事实,我们可以得出什么结论?
在许多图结构中,这暗示了某种最小复杂度,有时可能相当大。让我们通过两个简单但常见的例子来观察这一点。
示例一:完全二分图
考虑一个完全二分图,其中两组变量之间没有内部边,但所有交叉边都存在。例如,在课程难度与学生智力的模型中,难度变量与智力变量之间没有边,但每对难度-智力变量之间因观测到的学生成绩而存在边。
那么,我们能为这个图构造的最小子集是什么?例如,仅包含两个 A 变量能否将图分隔为两个条件独立的部分?答案是否定的,因为例如两个 B 变量可以通过未包含在子集中的其他 A 变量连接。
经过进一步思考,不难发现,能够将图分解为有意义部分的最小子集必须包含某一侧的所有变量。因此,任何有意义的团树中,子集的最小尺寸必须大于或等于 min(k, m),其中 k 和 m 分别是两侧变量的数量。
示例二:网格图
另一个例子是网格图,例如伊辛模型或图像分析中的像素网格。考虑如何将这样的图分解为条件独立的部分。
我们可以构造具有较小子集的团树,例如一个子集仅分离 A11 与其他部分。但这样剩下的部分仍然很大。如果我们尝试构造一个团树,使得 A11 在一侧,A44 在另一侧,那么任何这样的团树都必须有一个尺寸至少为 n 的子集(对于 n × n 的网格)。这意味着,如果试图将网格的一个角与对角分离,子集的大小至少是网格的维度。其他分解方式也不会更好。

总结
本节课中,我们一起学习了以下内容:
- 团树算法的性质:我们回顾了团树算法能保证正确边缘概率且计算高效的特点。
- 运行交集性质与条件独立性:我们证明了运行交集性质等价于团树中每条边的子集分隔了左侧与右侧变量,使其条件独立。
- 计算复杂性分析:通过完全二分图和网格图两个例子,我们展示了运行交集性质如何导致子集的最小尺寸必须足够大,从而在某些图结构中引发指数级计算成本。
- NP难问题的体现:这种最小复杂度要求正是推理问题本质为NP难的具体表现,即使使用最优的团树也无法避免。

这些分析帮助我们理解了团树算法在保持正确性和高效性的同时,其计算成本的根本来源,以及为何在某些复杂图结构中精确推理会变得非常困难。
013:团树与变量消元

在本节课中,我们将学习变量消元算法与团树算法之间的深刻联系。我们将看到,一次变量消元的运行过程,可以自然地解释并构造出一个正确的团树结构。这回答了“团树从何而来”以及“如何构建一个好的团树”这两个基本问题。
从变量消元到团树
上一节我们介绍了变量消元算法。本节中,我们来看看如何将一次变量消元的运行过程,重新解释为在团树上传递消息的过程。

变量消元算法包含一系列步骤。在每一步中,它会将一组因子相乘,生成一个范围较大的中间因子,我们称之为 λᵢ。然后,算法从 λᵢ 中消去一个变量,得到一个范围较小的新因子,我们称之为 τᵢ。τᵢ 会被放回可用因子池中,在后续计算另一个大因子 λⱼ 时被使用。
我们可以将这个过程视为计算实体之间的消息传递。每个中间因子 λᵢ 可以看作团树中的一个团。而由某个 λᵢ 产生、并被另一个 λⱼ 使用的因子 τᵢ,则可以视为从一个团(对应 λᵢ)传递给另一个团(对应 λⱼ)的消息。
总结来说,变量消元算法定义了一个图结构:
- 为每个因子 λᵢ 创建一个团 Cᵢ。
- 如果在计算 λⱼ 时使用了由 λᵢ 产生的因子 τᵢ,则在 Cᵢ 和 Cⱼ 之间连一条边。
- 这条边代表的消息就是 τᵢ。
实例分析
让我们通过之前用过的“增强版学生网络”例子,具体看看这个过程。
第一步变量消元将因子 φ_C 和 φ_{C,D} 相乘,得到 λ₁,其作用域是 {C, D}。这对应图中的第一个团。
第二步消去变量 D。它使用上一步产生的 τ₁ 与原始因子 φ_G 相乘,得到 λ₂,其作用域是 {G, I, D}。由于 λ₂ 的计算使用了 τ₁,因此在团 {C, D} 和团 {G, I, D} 之间有一条边,传递的消息就是 τ₁,其作用域是 {D}。

后续步骤以此类推。最终,我们得到了一个由变量消元过程诱导出的图结构。
观察这个图,你会发现它比我们最初为这个网络构建的团树要大。原因在于,我们得到了三个相邻的团,且一个团是另一个团的子集(例如 {J, L} ⊆ {J, S, L} ⊆ {G, J, S, L})。实际上,将一个计算拆分成多个子集团并没有额外好处,完全可以在最大的那个团中完成所有计算。因此,一个典型的后处理步骤是移除冗余的团,将它们合并到包含它们的最大的团中。
验证团树性质

我们已经看到如何通过变量消元过程得到一个类似团树的结构。但它是一个合格的团树吗?我们需要验证它是否满足团树的三个关键性质。
以下是我们可以证明的性质:
-
树结构:变量消元产生的图是一棵树。因为每个中间因子 τ 一旦产生,只会被恰好消耗一次。消耗后,它就从因子集中移除。这形成了一个有向树结构(每个节点最多有一个父节点),忽略边的方向后就是一棵无向树。
-
族保持性:该树满足族保持性。因为原始因子集 Φ 中的每一个因子 φ,都必然在变量消元过程的某一步中被使用(最终所有因子都会被乘在一起)。因此,每个原始因子 φ 的作用域,必然被包含在某个中间因子 λᵢ 的作用域中,而 λᵢ 对应一个团。这正是族保持性所要求的。
-
运行相交性:该树满足运行相交性。这个性质是指:如果变量 X 同时出现在两个团 Cᵢ 和 Cⱼ 中,那么 X 也必须出现在连接 Cᵢ 和 Cⱼ 的路径上的每一个团中。
- 证明思路:在变量消元过程中,每个变量只被消去一次。假设变量 X 在团 Cₓ 中被消去(这是最后一个包含 X 的团)。现在考虑任意另一个包含 X 的团 Cᵧ。由于 X 没有被消去在连接 Cᵧ 和 Cₓ 的路径上,那么 X 必须存在于 Cᵧ 传递给其父团的消息 τ 的作用域中。而消息 τ 的作用域是其产生团作用域的子集,因此 X 也必然在 Cᵧ 的父团中。通过归纳论证,可以得出 X 必须出现在从 Cᵧ 到 Cₓ 的整条路径上的每一个团中。对于任意两个包含 X 的团,此论证同样成立。

因此,一次变量消元的运行过程,隐式地定义了一个正确的团树。
构建与计算意义
这个发现具有重要的实践意义:
- 构建团树:要获得一个满足族保持性和运行相交性的团树,我们可以简单地模拟一次变量消元过程。这并不意味着真正执行昂贵的消元计算,而是通过分析“哪些因子会被乘在一起”以及“产生的因子会被谁使用”,来确定团的构成和团之间的连接。这正是我们在前面例子中所做的。
- 计算成本:这样构建出的团树,其计算成本本质上与运行变量消元算法相当。因为产生的团的大小,正好对应变量消元中产生的中间因子的大小。
- 计算边际:然而,如之前所述,团树算法通过动态编程缓存消息,避免了重复计算。这使得我们能够以大约两倍于单次变量消元的成本,计算出网络中所有变量的边际概率。
- 启发式方法:我们讨论过用于寻找好的变量消元顺序(以产生较小的中间因子)的启发式方法。这同一套启发式方法,同样可用于构建一个尽可能小且高效的团树。

本节课中我们一起学习了变量消元与团树算法之间的核心联系。我们了解到,一次变量消元过程可以自然地诱导出一个正确的团树结构,这回答了团树的起源问题。通过模拟变量消元(而非实际执行),我们可以构建团树,并利用其消息传递机制高效地计算网络中所有变量的边际概率。用于优化变量消元顺序的启发式方法,同样适用于优化团树的构建。
014:实践中的置信传播 🧠

在本节课中,我们将要学习置信传播算法在通用聚类图上的实际应用。我们将探讨该算法可能遇到的收敛性和准确性问题,并介绍实践中用于改善其性能的几种关键技巧。
上一节我们介绍了置信传播算法的基本概念,本节中我们来看看它在实际运行中可能遇到的问题。
收敛性与准确性问题
置信传播算法在通用聚类图上运行时,是一个迭代算法,其中消息根据先前的消息定义。该算法可能不收敛,即使收敛,也可能无法得到正确答案。现在我们将讨论这些问题有多严重,以及实践中用于改善算法在这两方面表现的一些技巧。
为了获得直观理解,让我们回顾一下误解示例。这个例子并非原始误解示例,而是我们修改了势函数 Phi_1(A,B),使其值更大,从而让A和B之间达成一致的“推力”更强。在这个例子中,我们可以看到置信传播算法出现了明显的振荡行为。
X轴是迭代次数,Y轴是某种距离真实分布(真实边缘概率)的度量。为什么会出现如此强烈的振荡?让我们看看这些势函数的作用。这里的势函数推动A和B达成一致。当消息传递时,A和B想要一致,B和D也想要一致,B和C想要一致,但C和D却非常想要不一致。因此,当消息传递时,你会从两边得到相互冲突的消息。例如,在C这边,它被推动与D不一致;另一方面,当你沿着环路走一圈时,实际上又促使C与D一致。这种在环路或循环上的冲突,导致了消息从一边或另一边传递时产生振荡行为。

这种特定的配置——紧密的环路、强大的势函数和冲突的方向——可能是置信传播算法表现最差的场景。在这种情况下,无论是收敛性还是获得结果的准确性,它都可能表现不佳。
在这个例子中,算法最终确实收敛了,但可以看到它花费了大约300次迭代。对于这种规模的图来说,300次是很多的。有些情况下,即使运行到500次迭代也完全没有收敛。也许运行10,000次会收敛,但这很难说。那么,我们如何改善网络的收敛性和准确性呢?
应避免的做法:同步置信传播
首先,让我们看看不应该做什么。最重要的一点是避免使用一种称为同步置信传播的算法变体。在同步置信传播中,所有消息被并行更新。所有处理器(或聚类)同时启动,查看所有传入消息,并一次性计算所有传出消息。
从实现简单性和并行化能力的角度来看,这是一个很好的算法,因为你可以为每个聚类分配一个处理器,它们并行工作且彼此之间没有依赖。
不幸的是,同步置信传播实际上并不是一个非常好的算法。下图显示了已收敛消息数量随时间变化的函数。你可以看到,随着时间的推移有一定改善,然后它会在某个已收敛消息数量上趋于*稳。

相比之下,让我们看看异步置信传播的行为,其中消息一次更新一个。请注意,这个算法规定得不够明确,因为我们没有指定更新的顺序,稍后会回到这个问题。但仅仅通过以异步方式传递消息这一简单优点,行为就得到了改善,无论是在消息收敛的速度上,还是在已收敛消息的数量上。
这里使用的消息传递顺序并不是特别好。下图展示了一个更好的消息传递顺序。它需要稍长一点的时间来确保某些消息收敛,但请注意,最终在不算太长的时间内,它实际上实现了100%的收敛。
以下是关于此事的一些重要观察:
- 收敛性是置信传播中的一个局部属性。有些消息收敛得相当快,而有些可能永远不收敛。当算法运行一段时间后,有些消息仍未收敛时,人们通常会直接停止算法,并接受当前结果。
- 同步置信传播的收敛性比异步置信传播差得多,这就是为什么目前很少有人实际使用同步置信传播。
- 如果我们使用异步置信传播,消息传递的顺序不仅会影响收敛速度,甚至可能更令人惊讶地影响实际收敛的消息范围。

如何选择消息传递顺序?
有几种不同的调度算法,我将介绍两种比较流行的。
第一种称为树再参数化。它的做法是选择一棵树,然后以与团树算法中相同的方式在该树中传递消息,以“校准”那棵树,同时保持所有其他消息固定。例如,我们可能从校准红色的树开始,这意味着我按这个方向传递消息,然后朝另一个方向传递,同时保持所有其他消息固定。接着我选择另一棵树,比如蓝色的树,并校准它。我继续这样做,挑选一棵树,运行并校准它。需要满足的约束是:首先,我的树必须覆盖所有边,否则我会遗漏某些需要传递的消息;其次,虽然不是硬性约束,但如果树更大(即选择尽可能覆盖图的大部分而不包含环路的生成树),往往会提高性能。
第二种消息调度算法称为残差置信传播。它的做法是尝试寻找“好”的消息,即那些高价值、影响大的消息。它会寻找两个信念差异很大的聚类,如果它们差异大,意味着传递该消息可能会对接收聚类产生较大影响。因此,算法维护一个基于预估影响大小(例如相邻聚类间差异的某种启发式度量)排序的边优先级队列,并总是从队列顶部选取消息进行传递。
改善收敛性的另一个技巧:*滑(阻尼)
另一个用于改善置信传播算法收敛性的重要技巧称为*滑或消息阻尼。这是一种常用于减少基于定点方程(其中左边根据右边定义)的动态系统振荡的通用技巧。

在原始置信传播算法中,我们将 delta_ij 定义为其他 delta 的函数,我们已经看到这可能导致振荡行为。原始置信传播消息更新公式为:
delta_i->j = f(other deltas)
现在,我们将采用一种*滑版本,不让消息变化过于剧烈。我们将使用新旧消息的加权*均,其中权重为 lambda:
delta_i->j_new = lambda * f(other deltas) + (1 - lambda) * delta_i->j_old
事实证明,这同样可以抑制系统中的振荡,并增加其收敛的机会。
让我们看一些示例行为。下图显示了红色线代表的同步置信传播,以及已收敛消息的百分比。1代表完美收敛。我们可以看到同步算法在大约20%到25%的收敛消息处趋于*稳,这在实际中几乎无用,因为如果只有20%的消息收敛,那么剩余的消息意义不大。
绿色线代表无*滑的异步算法。我们可以看到,即使没有*滑,异步算法的性能也明显优于同步算法(我们甚至没有展示无*滑的同步算法,因为它会更差)。最后,蓝色线代表带*滑的异步算法。我们可以看到它在某个时间点实现了完美收敛。
你还可以查看单个消息或单个信念(边缘概率)的行为。下图仍然是一个伊辛网格(测试各种*似推理算法收敛性的标准设置)。这里的黑线是真实的边缘概率。你可以看到,同步置信传播基本上无限期地在其周围来回振荡,而异步置信传播则相当快地收敛,并且非常接*正确答案。
但并非总是如此。下图显示了同一模型中不同变量的情况,黑线同样是真实值。在这里我们可以看到,异步确实改善了收敛性,但收敛到的答案并不完全正确。在实践中,根据一开始提到的所有因素(环路的紧密程度、势函数的强度或峰值程度),你会看到这两种行为,这些因素将决定有多少因子具有这种振荡行为以及答案的错误程度。
总结
本节课中我们一起学习了改善置信传播算法实际应用的几种方法。
总结一下,实现BP收敛有两个主要技巧:阻尼(*滑) 和智能消息传递。使用这些技巧通常更容易获得收敛性,但收敛性并不保证正确性。对这两者都有负面影响的糟糕情况是:强大的势函数将你拉向不同方向,以及紧密的环路。

最后需要指出的是,还有一些新算法在这两方面(收敛性和结果准确性)都有显著更好的行为,虽然我们没有时间深入探讨所有这些主题。
015:环状置信传播与消息解码 📡

在本节课中,我们将探讨概率图模型领域一个引人入胜的故事:环状置信传播算法与噪声信道消息解码问题之间的联系。这个相对较新的发现对两个领域都产生了深远影响。
消息解码问题概述
想象一下,我们需要通过一个噪声信道发送 K 个比特。如果直接发送这些比特,接收端将无法从接收到的噪声比特中准确还原原始信息,因为我们不知道哪些比特被破坏了。
为了解决这个问题,人们发展了编码理论。K 个比特通过一个编码器,生成 N 个比特(通常 N > K)。这些比特被实际传输,接收端得到一组噪声比特 Y₁ 到 Yₙ。解码的目标是得到比特 V₁ 到 Vₖ,使其尽可能接*甚至完全等同于原始发送的比特 U₁ 到 Uₖ。
这种编码的码率定义为 R = k / n,即 n 个传输比特中承载了 k 比特的实际信息。
比特错误率是衡量解码准确性的指标,定义为解码比特与原始比特不同的*均概率。
信道类型与信道容量
不同的信道具有不同的噪声特性。以下是几种重要的信道模型:
- 二进制对称信道:发送0时,以概率0.9收到0,以概率0.1收到1;发送1时,以概率0.9收到1,以概率0.1收到0。错误是对称的。
- 二进制擦除信道:比特不会被篡改,但可能被“擦除”(丢失)。接收端知道哪些比特丢失了(用“?”表示),这比不知道比特是否被篡改的情况更有利。
- 高斯信道:叠加在信号上的噪声是模拟的高斯噪声。
信息论学者为这些信道定义了信道容量,它代表了理论上信道能无错误传输信息的最大速率。例如,二进制对称信道的容量略高于0.5,而二进制擦除信道的容量等于其正确接收概率(如0.9),这表明“知道错误位置”的信道容量更高。
香农定理与香农极限
香农在其著名的香农定理中,建立了信道容量与比特错误概率之间的关系,明确划分了可达区域与不可达区域。
- 可达区域:理论上可以构造出编码方案,实现在该区域内任意一点的性能(特定的码率和比特错误率组合)。
- 不可达区域:无论编码方案多么巧妙,都无法实现该区域内的性能。

信道容量之所以称为“容量”,正是因为它是这个性能边界的关键标度。逼*这个理论边界(香农极限)成为了编码领域的核心目标。
编码性能的演进与Turbo码革命

在20世纪90年代中期之前,实际编码方案(如旅行者号、卡西尼号任务使用的编码)的性能距离香农极限仍有相当差距。
1993年,Berrou等人发表的论文《接*香农极限的纠错编码》引发了革命。他们提出的Turbo码性能远超当时所有已知编码,逼*了香农极限,以至于最初无人相信。
那么,Turbo码的魔力何在?这与概率图模型有何关联?
Turbo码与概率推断
本质上,解码是一个概率推断问题:我们需要计算在给定接收到的噪声证据 Y 的条件下,原始信息比特 U 的后验概率分布 P(U | Y)。
Turbo码并未直接精确求解这个推断问题,而是采用了一种迭代方法:
- 使用两个编码器对原始比特进行编码。
- 两个对应的解码器分别处理接收到的噪声比特。
- 每个解码器基于自己的证据计算比特的后验概率,并将其传递给另一个解码器,作为对方新的先验信息。
- 这个过程不断迭代,直到收敛。
令人惊讶的是,这种看似启发式的迭代算法,其性能非常接*最优的比特决策。
与环状置信传播的联系
后续的研究(如McEliece, MacKay, Frey等人)揭示,Turbo码的解码算法实际上是在运行一种环状置信传播的变体。
每个解码器在其内部的可处理网络上进行精确推断,然后将计算出的“信念”(即后验概率)作为消息传递给另一个解码器。这正是LBP算法中因子(或团)之间传递消息 δ_{i→j} 的过程。
这一认识在两个领域引发了革命:
- 对概率图模型领域的革命:在Turbo码成功之前,环状置信传播因其在环状图上缺乏收敛性和正确性保证而被忽视。Turbo码的巨大成功促使人们重新审视LBP,引发了大量关于其何时、为何有效的研究,并催生了诸多改进算法。
- 对编码领域的革命:既然解码可以视为在特定图结构上运行LBP,那么就可以设计更多适合LBP的编码方案。其中最成功的一类是低密度奇偶校验码。
低密度奇偶校验码
LDPC码实际上由Gallager在1962年发明,但因精确推断计算复杂而被长期搁置。借助LBP进行解码的思路使其重获新生。

在LDPC码中,发送的比特包括原始信息比特和奇偶校验比特。校验比特是信息比特子集的奇偶和(模2加),用于检错和纠错。
例如,发送4个信息比特 (U₁, U₂, U₃, U₄) 和3个校验比特:
- X₅ = U₁ ⊕ U₂ ⊕ U₃
- X₆ = U₁ ⊕ U₂ ⊕ U₄
- X₇ = U₂ ⊕ U₃ ⊕ U₄
码率 R = 4/7。
这种结构天然地对应一个因子图或团图:
- 变量节点:代表每个信息比特 Uᵢ。
- 因子节点:代表每个奇偶校验约束(连接相关的变量节点)。
- 证据:来自信道的噪声观测 Yᵢ。

在这个图上运行环状置信传播,就是LDPC码的解码过程。消息在变量节点和因子节点之间迭代传递,逐步逼*比特的后验概率。

总结与应用

本节课我们一起学习了环状置信传播与消息解码之间深刻而互惠的联系。
- 核心联系:Turbo码等现代高性能解码算法,本质上是在特定因子图上运行环状置信传播,以*似求解后验概率
P(U | Y)。 - 双向影响:
- 编码理论的成功实践复兴并验证了概率图模型中的LBP算法。
- 概率图模型的视角启发并催生了(如LDPC码)等一系列逼*香农极限的新型编码方案。
- 广泛应用:基于LBP的解码技术已成为当今数字通信的基石,广泛应用于数字视频广播、移动通信、卫星传输、无线网络等诸多领域。

可以说,这是概率图模型最普遍和成功的应用之一,源于两个学科意想不到的融合。
016:最大和消息传递
在本节课中,我们将学习如何将用于计算边缘概率的精确推理算法,改造为求解最大后验概率(MAP)问题的算法。我们将看到,通过一个关键的数学变换,可以将因子乘积问题转化为求和问题,并在此基础上构建“最大和”消息传递算法。
概述:从边缘概率到最大后验概率

到目前为止,我们的讨论主要集中在为计算图模型中的边缘概率问题构建算法。然而,一个完全不同但同样重要的推理问题是:寻找一个具有最高概率的、连贯的联合赋值,即最大后验概率(MAP)赋值。
我们已经知道,不能简单地通过求解边缘概率问题,然后为每个变量选择概率最高的赋值来得到MAP赋值。因此,我们需要一套不同的算法来解决MAP问题。现在,我们将讨论其中的第一种算法,它本质上遵循了与精确边缘概率推理相同的思路,只需稍作修改即可用于计算MAP赋值。
将乘积转化为求和
为了使算法生效,我们需要做的第一个操作是将乘积转化为求和。我们观察到,我们的分布 P 正比于一系列因子的乘积:
如果我们试图找到这个特定乘积的 argmax,它也可以被表述为对数求和表达式的 argmax:
其中,每个 θ_k 是势函数 φ_k 的对数。这基本上等同于将表示因子的表格中的每个条目转换为其对数,从而得到一个因子求和表达式,而不是因子乘积。
这样做有很好的理由:首先,求和比乘积更容易处理;其次,当乘以许多非常小的数字时,会出现数值下溢问题,而将其转换为求和则在数值上是一个更稳健的算法实现。
现在,我们考虑上面写出的问题,即寻找一个我们称之为 θ(x1, ..., xn) 的表达式的 argmax,它被定义为这些 θ_k 在较小作用域上的因子之和。
链式结构中的最大和变量消除
现在我们已经将问题简化为求一个求和表达式的最大值,接下来我们将回到链式结构的简单示例,并思考如何在链中执行最大和变量消除。这个过程看起来几乎与我们之前讨论的和积算法完全相同。
假设我们现在要做的只是找到表达式 θ(A, B, C, D) 的最大值。就像在和积算法中一样,我们可以将最大化操作分解为对 A、B、C、D 的逐个最大化。
我们可能不太习惯接下来要展示的这种操作,但同样有效的是,因为 θ2、θ3 或 θ4 都不依赖于 A,我们可以将它们加到对 θ1(A,B) 求最大值之后的结果上。
这将给我一个因子,看起来像 max_A θ1(A,B)。我将其称为 λ1(B),因为请注意,这不是一个常数,而是一个依赖于 B 的函数。对于 B 的不同取值,将有不同的 A 使表达式最大化,也会有不同的最大值。因此,λ1(B) 就是 max_A θ1(A,B)。
这个过程有效地从表达式中消除了变量 A,并给了我一个少了一个变量的最大化问题,只剩下 B、C、D 和 E。
因子操作:求和与最大化
就像在和积算法的背景下一样,我们可以将所有操作视为对因子的操作,而不仅仅是将其视为表达式。因此,之前我们定义了因子乘积和因子边缘化等操作,现在我们可以定义因子求和与因子最大化等类似操作。
- 因子求和:一个非常直观的操作,执行我们在这里所做的操作。如果我们想定义因子乘积中 (A1, B1, C1) 这一行,我们将把来自 (A1, B1) 的条目 3 和来自 (B1, C1) 的条目 4 相加,得到 7。我们可以类似地定义因子求和中的所有其他条目。
- 因子最大化:与我们边缘化一个因子的方式相同,这是一种“最大边缘化”。它的作用是:例如,如果我想消除 B,我有这两行(比如 A1, B1, C1 和 A1, B2, C1),它们仅在 B 上不同。那么我的新条目 (A1, C1) 将是这两行条目的最大值,在本例中是 7。类似地,对于 (A1, C2),我将得到 4.5、2 和 4.5 的最大值,即 4.5。这是边缘化的另一种形式,我使用最大化操作而不是求和操作来移除变量 B。
最大和变量消除算法
现在我们已经定义了这两种操作,我们可以回到链式结构,将最大和变量消除定义为一组因子操作,其中我依次消除 A、B 等。
例如,在如上一步消除了 A 之后,我现在可以通过注意到唯一依赖于 B 的因子是 θ2(B,C) 和 λ1(B) 来执行完全相同的操作。其他两个因子可以移到最大化操作之外。

这将给我一个关于 B 的最大化操作,其因子是 θ2(B,C) 和从上一步消除中得到的 λ1(B) 这两个因子的和。这将给我一个新的因子 λ2(C),该过程以与和积变量消除完全相同的方式继续。
这就是算法的基本过程。
最大边缘化与团树算法
现在让我们思考一下,在这个执行过程结束时,我们得到的最终因子是什么。在得到 λ2 和 λ3 之后,我们得到 λ4(E)。对于给定的值 e,λ4(e) 是什么?它是通过对 θ(A,B,C,D,E) 关于 A、B、C、D 最大化得到的。因此,这是在强制 E = e 的条件下,我能得到的最佳可能赋值(即最佳分值)。这是一个因子,它为 E 的每个可能取值 e 给出了该分值。这被称为 最大边缘化。
就像我们将和积变量消除用于定义团树算法一样,我们可以对最大积或最大和算法做完全相同的事情,使用完全相同的数据结构。
这里我们将使用完全相同的团树,我们有团 AB、BC 和 DE。我们将像往常一样,利用族保持性质将势函数分配给适当的团。
现在让我们看看消息是如何在这个团树架构中传递的。最初,团 AB 将定义消息 λ12,这是通过关于 θ1 最大化 A 得到的,结果得到的关于 B 的消息被传递给团 2。团 2 可以接收该消息,将其与自己的因子 θ2 相乘(在最大和中是相加),得到消息 λ23。同样的事情发生在团 3 将消息传递给团 4 时(在这种情况下作用域是 D)。因此,消息传递过程完全相同,只是使用最大和操作代替了和积操作。
我们同样可以在另一个方向上传递消息,例如从 4 到 3(作用域 D),从 3 到 2,从 2 到 1。在和积团树背景下成立的所有性质在这里也成立。
首先请注意,例如,一旦消息 λ12 被发送,它就永远不会再改变,它被一劳永逸地定义了。λ23 一旦接收到消息 λ12,它也就稳定下来,永远不会改变。λ34 也是如此。因此,我们可以进行一次从左到右的传递来计算所有从左到右的消息,并进行一次类似的从右到左的传递来计算所有从右到左的消息。一旦完成,它们就都收敛了。
其次要注意的是这个团的值是什么。我们可以看到,当我最终从两边获得所有消息时,我已经整合了 θ1、θ2、存储在团本身的 θ3,以及从右侧消息传入的 θ4,并最大化消除了所有变量 A、B 和 E。因此,我剩下的是关于团 3 的一个因子,它是网络中所有因子之和关于 A、B 和 E 的最大值。

总结一下,一旦团 i 从除邻居 j 之外的所有邻居接收到最终消息,那么该消息也是最终的,永远不会改变。并且所有叶节点的消息都是立即最终的。因此,我们有一个在两次传递后收敛的算法,并在每个团处给出正确的最大边缘化。
算法验证与校准性质
让我们举一个简单的例子来说服自己这个算法做的是正确的事情。我现在看一个只有 A、B、C 的简单网络,有两个因子:θ1(A,B) 和 θ2(B,C)。
首先,我们构建整体的 θ,即 θ1 和 θ2 的和。通过查看计算出的数字,我们看到 MAP 赋值是 (A1, B1, C1),值为 7。
现在看看在这个非常简单的两个团的团树上会发生的消息传递过程。θ1 分配给团 1,θ2 分配给团 2。让我们看看传递的两条消息。
AB 向 BC 传递一条消息,该消息是关于变量 A 的最大边缘化。我们可以看到,对于 B1,我们在 3 和 -1 之间取最大值,得到 3;对于 B2,我们在 0 和 1 之间取最大值,得到 1。
完全相同的过程给了我们从左到右传递的这条消息,其中我最大边缘化了 C,得到了这个消息。
现在,这两个团各自接收其消息(注意这里立即收敛了,因为每个方向只有一条消息要传递)。因此,我在这里得到的是这个因子加上传入消息的和。例如,对于第一行 (A1, B1),我从这里得到 3,从那里得到 4,所以 3+4=7。对于 (A1, B2),我从这里得到 0,从那里得到 2,所以 0+2=2。
我可以执行完全相同的操作来得到右侧的这个因子,通过将这个和那个相加,我得到这里的这个因子。你会注意到,神奇的是,每个因子中单独的 MAP 赋值分别是左边的 (A1, B1) 和右边的 (B1, C1)。因此,我在这里得到的是与 (A1, B1) 一致的最可能赋值,而在这里得到的是与 (B1, C1) 一致的最可能赋值。
如果你回去检查这个大表格,你可以确信这不仅对 (A1, B1) 成立。例如,如果你看 (A2, B1),你会发现你在这里得到的值 3,是与 (A2, B1) 一致的最可能赋值的分值。确实,我们在这里得到的值是 3,所以一切正常。
收敛后的结果与校准

那么,关于这个算法一旦收敛,我们能说些什么呢?重要的是,我们可以在每个团计算信念,这些信念精确地代表了该团的最大边缘化。
我们如何计算这些信念?与和积算法类似,我们查看分配给该团的因子 θ_i,并将传入的消息加给它(记住,在和积中我们是相乘,因为那时是做乘积而不是求和)。
这个信念编码了什么?这个信念正是最大边缘化。具体来说,对于给定团 C_i 的任何赋值,我们可以查看该赋值的最佳可能补全的分值,这就是该团信念的值。
它是关于所有未分配给该团的变量 W_i 的最大化。
拥有最大边缘化的一个重要结果是,我们在这里也得到了一个校准性质。团必须在它们共享的变量上达成一致。
为了理解这一点,让我们看看简单两团示例中的这两个团,以及我们为团 1 和团 2 计算的信念。校准性质告诉我们,例如,如果我们看这个团关于变量 B 的含义,这个团告诉我们,B1 的最佳可能补全的分值是 7,B2 的最佳可能补全的分值是 3。这个团,如果我们看它,告诉我们 B1 的最佳可能补全的分值也是 7,B2 的最佳可能补全的分值也是 3。因此,这两个团在它们共享的作用域变量 B 上达成了一致。
总结

本节课中,我们一起学习了如何将用于求解边缘概率的和积消息传递算法,改造为用于求解最大后验概率(MAP)的最大和消息传递算法。
总结来说,我们可以在最大和的背景下应用与和积完全相同的团树算法。消息以相同的方式传递,团树以相同的方式构建。唯一的区别是消息传递操作使用最大和操作,而不是和积操作。

与和积算法完全一样,收敛在单次向上和向下传递后实现。其结果是在每个团处获得一组信念,这些信念代表了该团的最大边缘化。作为提醒,最大边缘化告诉我们,对于每个赋值,该赋值的最佳可能补全的分值是多少。
017:从校准团树解码最大后验概率赋值 🧩
在本节课中,我们将要学习如何从一个已经校准的团树中,解码出具体的最大后验概率赋值。上一节我们介绍了执行最大和消息传递的算法,本节中我们来看看如何利用该算法的输出来构建一个实际的赋值。

概述
最大和消息传递算法可以计算出每个团的最大边缘概率。然而,仅凭这些最大边缘概率,我们并不能直接得到一个全局一致的最大后验概率赋值。本节将探讨如何从校准后的团树中解码出这样的赋值,并处理赋值不唯一的情况。
唯一MAP赋值的情况
如果最大后验概率赋值是唯一的,那么解码过程非常简单。
在之前展示的例子中,赋值 A1, B1, C1 是唯一的MAP赋值。我们看到,在团1中,A1 B1 是最大化赋值;在团2中,B1 C1 是最大化赋值。由于校准性质,所有团的选择必须一致。这意味着,无论我们从哪个团中选取变量 B 的值,结果都将是相同的。
因此,当MAP赋值唯一时,我们只需在每个团中选择其对应的最大化赋值,即可组合出全局的MAP赋值。

非唯一MAP赋值的情况
如果最大后验概率赋值不唯一,解码过程会变得复杂,因为我们在某些团中可能面临多个选择。
考虑一个校准收敛后的团树示例。假设我们有两个团:
- 在第一个团(包含变量A和B)中,赋值
A1, B1和A2, B2都具有最大值2。 - 在第二个团(包含变量B和C)中,赋值
B1, C1和B2, C2都具有最大值2。
此时,我们不能独立地为每个团选择一个赋值。例如,如果我们为第一个团选择 A1, B1,为第二个团选择 B2, C2,那么变量 B 的值就产生了冲突(B1 vs B2)。直觉上,C2 与 B2 相匹配,而非 B1,因此赋值 A1, B1, C2 并不是一个好的MAP赋值。
我们需要选择的是 A1, B1 和 B1, C1,这样才能保证全局一致性。由此可见,任意的*局决胜可能无法产生一个有效的MAP赋值。
解决方案
主要有两种方法来解决非唯一MAP赋值的问题。
方法一:扰动因子
第一种方法是稍微调整问题本身,以使MAP赋值变得唯一。
具体做法是,为所有因子添加一个微小的随机扰动。在概率上,这几乎可以保证产生一个唯一的MAP赋值。一旦赋值唯一,我们就可以使用前面所述的简单解码方法。
方法二:顺序赋值解码
第二种方法是使用一个按顺序构建MAP赋值的程序,逐个团地进行选择。
以下是该过程的步骤:
- 从第一个团(例如AB团)开始,在它的最大化赋值集合中任选一个(例如
A1, B1)。 - 移动到下一个相邻的团(例如BC团)。此时,我们必须考虑已固定变量(这里是
B=1)的约束。 - 在第二个团的所有最大化赋值中,只选择那些与已固定变量值一致的赋值(即选择包含
B=1的赋值,如B1, C1)。 - 重复此过程,沿着团树依次进行,每次选择都与之前已做的选择保持一致。
这种算法的复杂度与最初校准团树的复杂度基本相同,因此不会带来额外的计算负担。
总结

本节课中我们一起学习了如何从校准后的团树中解码最大后验概率赋值。我们了解到,当MAP赋值唯一时,解码是直接的。当赋值不唯一时,我们可以通过向因子添加微小扰动来强制其唯一性,或者采用一种按顺序、保持一致的赋值选择算法。这两种方法在实践中都被广泛用于从校准团树中解码MAP赋值。
019:对偶分解直觉理解 🧩
在本节课中,我们将学习一种用于解决MAP(最大后验概率)推理问题的通用算法——对偶分解。我们将看到如何将复杂的优化问题分解为多个可独立求解的“子问题”,并通过引入“惩罚项”来协调这些子问题的解,使其最终达成一致。
问题定义与背景
我们之前定义了MAP推理问题,即在一个概率图模型中找到概率最高的变量赋值。我们讨论了一些特定类别的模型,对于这些模型,MAP问题是可高效求解的。一类是树宽足够低的模型,可以使用变量消除或团树算法等技术。我们还讨论了其他一些可以进行高效推理的特殊模型类别。

现在,我们将讨论一种通用算法,它可以用于解决任何MAP问题。当然,需要记住MAP问题是NP难问题,因此我们无法得到一个适用于所有问题的完全多项式时间算法。我们将要讨论的这类方法被称为对偶分解。它源于将MAP推理问题日益视为一个优化问题的观点,并建立在优化理论领域的技术之上。
问题重构
首先,让我们以一种便于分析的方式重新表述问题。这只是一种便利的转换。我们假设要优化的MAP问题(我们已将其重新表述为最大和问题,而非最大积问题)由两种不同类型的因子之和组成:
- 单变量因子:作用域为单个变量 \(X_i\)。
- 多变量因子:作用域为多个变量。
显然,我们可以将单变量因子合并到包含该变量的某个更大的因子中。但事实证明,将它们保留在模型中会带来便利,原因稍后会变得清晰。
因此,我们的目标是找到最高概率赋值 \(x\) 的值(暂时先讨论如何找到这个值,稍后再讨论如何找到具体的赋值)。我们试图找到使以下总和最大化的 \(x\):
分解与协调的直觉
我们可以做一件事(虽然这是错误的,但我们可以尝试):忘记我们正在尝试进行一个联合赋值。相反,我们戴上“眼罩”分别考虑每个问题。我们将单独找到优化每个因子 \(\theta_i(x_i)\) 的 \(x_i\),并对更大的因子做同样的事情。
当然,这将是一个非常糟糕的解决方案,因为优化一个 \(\theta_i\) 的 \(x_i\) 将与包含 \(x_i\) 的某个更大因子所选择的 \(x_i\) 完全不一致。你将得到一个完全不连贯的“联合”赋值——它根本不是联合赋值,而是一堆互不相同的赋值。
对偶分解所做的,就是尝试进行类似的分而治之,但它会以一种试图迫使这些局部决策问题彼此达成一致的方式来进行。
引入惩罚项
那么,我们如何做到这一点呢?我们将通过引入一组成本(或惩罚项)来实现。这些成本将驱动每个局部问题,希望最终能与其他局部问题所做的决策达成一致。
回到我们的表达式,我们现在要做的是(这实际上是一个等式):
让我们确认这个表达式确实等于第一行。原因在于,对于每个在因子 \(f\) 作用域内的变量 \(i\),我在这里添加了一项 \(\lambda_{f \to i}(x_i)\),又在这里减去了相同的表达式。因此,它们相互抵消了。
到目前为止,我们保持了等式。但现在,我要真正让每个“智能体”做出自己的决定。之前,最外层还有一个最大化操作。现在,我要让每个智能体查看它所拥有的那一小部分因子(包括为了与其他智能体达成一致而引入的惩罚项),然后各自进行独立的优化。
你可以将这些惩罚项视为 \(f\) 和 \(i\) 之间传递的消息,是它们沟通的方式:\(f\) 告诉 \(i\) 它认为应该做什么,同时 \(i\) 也告诉 \(f\)。
对偶函数与上界
这里有一个重要的点:上面这个函数,我们称之为 \(L(\lambda)\),请注意它只是 \(\lambda\) 的函数,而不再是 \(x\) 的函数,因为我们已经对 \(x\) 进行了最大化。根据惩罚参数 \(\lambda\) 的选择,你会得到这个函数的不同值。
对于任何 \(\lambda\) 值,这个函数 \(L(\lambda)\) 都是原始MAP目标值 \(\text{MAP}(\theta)\) 的一个上界。
让我们理解一下为什么。我们已经看到上面这一行实际上等于原始目标。在这里,我强制使用同一个 \(x\) 来最大化整个表达式。而在这里,我让每一项分别进行优化。这给了我更多的自由度,因为在这里,\(i\) 可以选择一个 \(x_i\),而 \(f\) 可以选择另一个 \(x_f\)。由于所有智能体都选择相同赋值的情况,是这里优化问题可以考虑的赋值之一,因此这里能获得的总价值,通常只会高于我强制它们全部一致时能获得的价值。一般来说,我对优化空间施加的约束越多,我能获得的价值就越低。
引入一些记号,我们将在后续演示中使用:

- 变量 \(i\) 的“智能体”(称为从属问题或子问题)优化的函数记为 \(\theta_i^\lambda(x_i)\)。
- 因子 \(f\) 的“智能体”优化的函数记为 \(\theta_f^\lambda(x_f)\)。
具体示例:四变量环
让我们举一个例子让这一切更具体,因为刚才的讨论有些抽象。回到我们的四变量环示例,我们有变量 \(x_1, x_2, x_3, x_4\),以及四个成对势函数,这次我们用字母表示以避免索引混淆:\(\theta_F(x_1, x_2)\), \(\theta_G(x_2, x_3)\), \(\theta_H(x_3, x_4)\), \(\theta_K(x_1, x_4)\)。
现在,分解将如何在这里工作?我们暂时假设将按照边(即原始因子)进行分解。
以下是每个“从属问题”的优化问题:
- 因子从属问题(例如 \(F\)):优化 \(\theta_F(x_1, x_2) - \lambda_{F \to 1}(x_1) - \lambda_{F \to 2}(x_2)\)。它有自己的势函数,以及两个惩罚项,试图让它与 \(x_1\) 和 \(x_2\) 的变量从属问题达成一致。
- 变量从属问题(例如 \(x_1\)):优化 \(\theta_1(x_1) + \lambda_{F \to 1}(x_1) + \lambda_{K \to 1}(x_1)\)。它有自己的单变量势函数,以及来自包含它的因子(\(F\) 和 \(K\))的惩罚项,这些项试图让它与这些因子从属问题达成一致。
其他因子(\(G, H, K\))和变量(\(x_2, x_3, x_4\))的从属问题结构类似。

构建从属问题的通用原则
在上一个示例中,我们是在一个非常简单的场景下进行的,即按照模型原始规范中的因子来分解。但情况并非必须如此。事实上,我们需要满足的唯一约束是:每个从属问题必须被定义为一组因子的子集,并且这个子集本身要允许高效的精确求解(即可独立高效优化)。
例如,回到四变量环网络,我们可以引入两个更大的从属问题,而不是四个小的(\(F, G, H, K\)):
- 一个从属问题对应 \(F\) 和 \(G\) 的组合(\(FG\) 从属问题)。
- 另一个从属问题对应 \(H\) 和 \(K\) 的组合(\(HK\) 从属问题)。
在这种情况下,我们仍然有代表单个变量的 \(x_1, x_2, x_3, x_4\) 从属问题。现在,\(FG\) 从属问题需要与 \(x_1, x_2, x_3\) 的变量从属问题达成一致,因此它有三个对应的 \(\lambda\) 惩罚项。\(HK\) 从属问题类似,需要与 \(x_1, x_3, x_4\) 达成一致。对于变量从属问题,例如 \(x_1\),它需要与 \(FG\) 和 \(HK\) 两个从属问题都达成一致,因此它有两项惩罚。而 \(x_2\) 只出现在 \(FG\) 从属问题中,因此只有一项惩罚。
如何选择从属问题分解
在成对网络中,我们通常的做法是将因子集划分为一组不相交的树。这正是我在上一张幻灯片中展示的:我们将其划分为一棵包含 \(F, G\) 的树和另一棵包含 \(H, K\) 的树。它们是不相交的,意味着每个边因子恰好被分配给一棵树。因为它们是树,我们知道如何使用变量消除或团树算法等技术高效地优化它们。

但我们也讨论过,还有其他类别的因子允许高效推理,例如匹配问题、或我们称之为“关联/规则/超模”的模型等。所有这些都属于可高效求解的类别。我们可以将一大堆符合某个高效类别的因子组合在一起,形成一个从属问题。
总结
在本节课中,我们一起学习了对偶分解算法的核心直觉。我们了解到:
- MAP推理问题可以重构为一个带惩罚项的优化问题。
- 通过将原问题分解为多个可独立高效求解的“从属问题”,我们可以并行处理。
- 引入的惩罚项(\(\lambda\)) 充当了协调消息,迫使不同从属问题的解趋向一致。
- 我们定义了一个对偶函数 \(L(\lambda)\),它对于任何 \(\lambda\) 都是原始MAP目标值的上界。
- 从属问题的构建原则是:每个子问题本身必须是可高效精确求解的模型(如树、匹配等)。

对偶分解的威力在于其通用性,它将寻找最优赋值的问题,转化为寻找最优协调参数 \(\lambda\) 以收紧上界的问题。在后续课程中,我们将探讨如何实际地优化这些 \(\lambda\) 参数。
020:对偶分解算法

在本节课中,我们将学习对偶分解算法的具体实现步骤。上一节我们介绍了该算法的基本直觉,本节中我们来看看如何将这种直觉转化为一个实际的算法。
算法概述
对偶分解算法将一个复杂的优化目标分解为多个独立的“从属”子问题,并通过在这些子问题之间传递信息,促使它们就最终的MAP赋值达成一致。
算法初始化
每个从属问题都有自己的目标函数。对于变量 Xi 对应的从属问题,其目标函数包含其自身的局部目标项。对于因子 F 对应的从属问题,其目标函数也包含其自身的局部目标项。
此外,我们为每个从属问题引入一组“激励”项,这些项会修改其目标函数,以促使它与其他从属问题达成一致。具体来说,我们希望变量 Xi 的从属问题与包含 Xi 的因子 F 的从属问题达成一致,反之亦然。
算法开始时,将所有激励项 λ 初始化为零。此时,每个从属问题仅基于其自身的局部目标做出决策。
迭代过程
随着算法演进,激励项会发生变化。以下是每次迭代 t 的步骤:
- 从属问题优化:每个从属问题优化其当前的目标函数。
- 变量
Xi的从属问题优化θ_i_hat(λ),得到其最优赋值x_i_star。 - 因子
F的从属问题优化θ_F_hat(λ),得到其最优赋值x_F_star。
- 变量

- 处理分歧与更新激励:检查每个因子
F与其作用域内的每个变量I的赋值是否一致。- 如果存在分歧(即
x_F_star中Xi的赋值与x_i_star不同),则需要调整激励函数。 - 对于激励项
λ_{F,i},我们进行如下更新:- 对于变量
Xi从属问题选择的赋值x_i_star,其激励值减少α_t。 - 对于因子
F从属问题选择的赋值x_F_star,其激励值增加α_t。
- 对于变量
- 这种更新会使变量从属问题和因子从属问题的偏好朝相反方向移动,从而促使它们在未来迭代中达成一致。
- 如果存在分歧(即
收敛性
在参数 α_t 满足一定较弱条件下,激励项 λ 保证会收敛。这些条件是:
α_t需要足够大,使得其影响能累积:∑_t α_t = ∞。α_t需要足够小,以确保最终收敛:∑_t α_t^2 < ∞。

可以证明,无论初始化如何,λ 都会收敛到一个唯一的全局最优值。
收敛后的处理
当算法收敛时,每个从属问题都得到了其作用域内变量的局部最优解。但这并不总是足够。

以下是收敛后可能遇到的情况及处理方法:
-
情况一:所有从属问题达成一致
- 如果所有从属问题在其共享变量上的赋值都一致,那么这个一致的联合赋值就是原问题的保证的MAP赋值。问题已解决。
-
情况二:从属问题未达成一致
- 如果从属问题未能在共享变量上达成一致,我们就面临一个解码问题:需要将不同从属问题收敛到的不同解组合成一个单一的联合赋值。
解码问题的解决方案
有多种启发式方法可以解决解码问题,虽然没有特别强的性能保证,但在实践中通常效果良好。

以下是几种常见方法:
-
方法一:选取单一从属问题的解
- 如果分解方式使得某个从属问题(如一个生成树)覆盖了所有变量,可以直接采用该从属问题的MAP解作为全局赋值。
-
方法二:多数投票
- 让每个从属问题对其作用域内的每个变量
Xi的赋值进行“投票”,然后对每个变量采用得票最多的赋值。
- 让每个从属问题对其作用域内的每个变量
-
方法三:加权*均
- 对算法迭代过程中传递的关于每个
Xi的信息序列进行某种加权*均。
- 对算法迭代过程中传递的关于每个
-
方法四:评估并选择最优
- 一个关键观察是,对于任何赋值
x,其得分函数θ(x)很容易计算。因此,可以生成多个候选解(例如,使用多个不同的分解或解码策略),计算每个解的θ(x),然后选择得分最高的那个。实践证明,这种方法通常能得到比任何固定策略更好的解。
- 一个关键观察是,对于任何赋值
最优性保证与停止准则
对偶分解算法提供了一个重要的理论保证:对于任何 λ,函数 L(λ) 是真实MAP赋值得分的上界。
这意味着,对于任何候选解 x,其得分 θ(x) 满足:
θ(x) ≤ MAP_score ≤ L(λ)
虽然我们不知道真实的 MAP_score,但我们可以计算 θ(x) 和 L(λ)。它们的差值 L(λ) - θ(x) 给出了当前候选解与真实最优解之间差距的上限。如果这个差值足够小,我们就可以满意地停止迭代,即使不能保证找到了精确的最优解。
算法设计选择

在实现对偶分解时,有几个重要的设计选择:
- 问题分解为从属问题的方式
- 包含更多因子、规模更大的从属问题优化起来更昂贵,但通常能改善收敛性,并使解更接*真实MAP赋值。

-
从属问题局部最优解的选择
- 一个从属问题可能有多个同等最优的赋值。选择哪个赋值会影响与其他从属问题达成一致的速度。
-
步长
α_t的调整策略- 如何调整步长以在快速收敛和保证收敛之间取得*衡。存在一些保证收敛的硬性规则(通常较慢),以及一些在实践中效果更好、同样保证收敛的巧妙规则,这是一个活跃的研究领域。
-
解码策略的选择
- 如前所述,当从属问题未达成一致时,需要选择一种启发式解码方法。
算法总结

本节课中我们一起学习了对偶分解算法的完整流程。
对偶分解是一种通用的MAP推理算法,其核心思想是将模型分解为可处理的组件(从属问题)。每个从属问题在本地求解,然后通过传递 λ 消息来促使它们达成一致。任何可处理的MAP子类都可以用作从属问题,这使得算法可以处理大型、结构丰富的组件。
该算法有坚实的理论支撑(本质上是对MAP问题的对偶问题进行次梯度优化),提供了到最优解距离的上界,并明确了达成一致即找到精确解的条件。

在实践中,该算法优缺点并存:
- 优点:通用性强;提供较好的收敛性理论保证;能利用快速、专门的MAP子程序处理大型组件。
- 缺点:通常不是最快的算法;包含大量可调参数和设计选择,在实践中需要较多调试才能获得良好性能。
022:马尔可夫链蒙特卡洛方法概述

在本节课中,我们将要学习一类非常强大且在实践中广泛应用的采样方法——马尔可夫链蒙特卡洛方法。这类方法允许我们设计一个迭代的采样过程,通过一系列步骤,从我们难以直接采样的目标分布中生成样本。
马尔可夫链蒙特卡洛:2.1:什么是马尔可夫链?
上一节我们介绍了MCMC方法的总体目标。本节中,我们来看看其核心工具——马尔可夫链。
马尔可夫链是一种从难以直接采样的分布 P 中进行采样的方法。例如,当我们想从一个包含证据的贝叶斯网络或一个马尔可夫网络中采样时,通常没有直接的方法。马尔可夫链为我们提供了一种通用机制。
马尔可夫链定义了一个迭代过程:最初生成的样本并非来自分布 P,但随着过程的进行,生成的样本会越来越接*来自 P 的样本。
一个马尔可夫链定义在一个状态空间上,我们用 x 来表示状态。下图展示了一个简单的状态空间示例:

马尔可夫链定义了一个概率转移模型。给定当前处于状态 x,该模型定义了转移到另一个状态 x‘ 的概率。这是一个概率分布,满足以下公式:
对于任意 x,所有可能转移到的状态 x‘ 的概率之和为1。
在示例中,一只“蚱蜢”从状态0开始。它有0.25的概率向右移动,0.25的概率向左移动,0.5的概率停留在原地。这个概率分布在链的大部分状态中重复,除了两端的状态(例如在-4时,向左移动会“撞墙”,因此停留的概率变为0.75)。
我们可以模拟这个随机过程:蚱蜢从状态0开始,每一步根据概率选择向左、向右或停留。
马尔可夫链蒙特卡洛:2.2:时间动态与*稳分布
理解了马尔可夫链的基本构成后,我们来分析其随时间演化的行为。
我们可以问:在时间步 T+1,状态为 x‘ 的概率是多少?这可以通过一个递推关系得到,该关系依赖于时间步 T 的状态分布。
如果我们已经计算了蚱蜢在时间 T 可能处于各个状态 x 的概率分布 P(x),那么到达 x‘ 的概率就是:对所有可能的 x,求和 P(x) * T(x -> x‘),其中 T 是转移概率。这给出了一个联合分布,然后对时间 T 的状态 x 进行边缘化,就得到了 T+1 时刻的分布。
回到蚱蜢例子,我们可以模拟这个过程。下图展示了前三步的演化:

对于许多马尔可夫链(稍后会描述条件),随着过程演化,概率分布会逐渐“均衡化”。这意味着在时间 T 处于状态 x‘ 的概率,与在时间 T+1 处于 x‘ 的概率几乎相同。这个极限分布被称为*稳分布,通常用 π 表示。
*稳分布满足以下方程:
π(x‘) = Σ_x [ π(x) * T(x -> x‘) ]
即,从*稳分布出发,经过一次转移后,得到的分布仍然是它本身。
这个概念实际上是谷歌PageRank算法的核心:它计算的是在网络中进行随机游走时,最终到达某个网页的概率。
马尔可夫链蒙特卡洛:2.3:计算*稳分布示例
为了具体理解*稳分布,让我们看一个简单的三状态马尔可夫链例子。

例如,从状态1,有0.75的概率去状态2,0.25的概率留在状态1。我们可以为*稳分布 π 写出方程。
以下是*稳分布需要满足的方程组:
- π(x1) = 0.25 * π(x1) + 0.5 * π(x3)
- π(x2) = 0.75 * π(x1) + 0.5 * π(x3)
- π(x3) = 0.5 * π(x2)

这个方程组本身是欠定的(因为所有 π 同时乘以一个常数仍是解),但我们可以加上概率分布必须归一化的约束:π(x1) + π(x2) + π(x3) = 1。
解这个线性方程组,可以得到唯一的*稳分布。可以验证,对于之前的蚱蜢例子,其*稳分布是均匀分布。
马尔可夫链蒙特卡洛:2.4:收敛条件——正则性
并非所有马尔可夫链都会收敛到一个*稳分布。一个保证收敛的充分条件是正则性。
一个马尔可夫链是正则的,如果满足以下条件:
存在一个整数 K,使得对于每一对状态 (x, x‘),在恰好 K 步内从 x 转移到 x‘ 的概率大于0。
注意量词的顺序:先确定一个 K,然后要求所有状态对都满足。这个条件保证了无论从哪个初始状态开始,马尔可夫链都会收敛到唯一的*稳分布。
直接检查这个条件可能比较困难。实践中常用的一个充分条件是:
- 每对状态 x 和 x‘ 都通过一条概率大于0的路径相连。
- 每个状态都有自转移概率(即可以停留在原地)。
如果满足这两个条件,我们可以取 K 为状态图(以状态为节点,以正概率转移为边)的直径(最远两状态间的距离)。那么,对于任何状态对,我们都可以在少于或等于 K 步内到达目标状态,不足的步数用自转移填补,从而恰好用 K 步到达。这就保证了正则性。因此,人们通常通过添加自转移来保证链的正则性。

本节课中我们一起学习了马尔可夫链蒙特卡洛方法的基础——马尔可夫链。我们定义了马尔可夫链及其状态空间和转移模型,分析了其时间动态并引入了关键的*稳分布概念。通过示例,我们看到了如何计算*稳分布。最后,我们探讨了保证马尔可夫链收敛到唯一*稳分布的正则性条件及其充分判断方法。这为我们提供了一种通用的、间接从复杂分布中采样的强大框架。
023:使用马尔可夫链

在本节课中,我们将学习如何在实际算法中使用马尔可夫链,从难以直接采样的分布中生成样本。我们将探讨如何判断马尔可夫链是否已经“混合”,以及如何有效地利用生成的样本进行概率计算。
马尔可夫链的使用流程
上一节我们介绍了马尔可夫链的概念,它允许我们从难以处理的分布中生成样本。本节中,我们来看看如何在一个具体的算法流程中使用它。

假设我们的目标是计算与某个分布 P 相关的概率,但由于某些原因,我们无法直接从 P 中采样。此时,我们可以使用马尔可夫链来解决这个问题。
首先,我们构造一个马尔可夫链 T,其唯一的*稳分布是 P。通常,这需要是一个正则马尔可夫链。然后,我们从这个分布生成样本。具体步骤如下:
- 从某个任意的初始分布 P0 中采样初始状态 X0。
- 由于 P0 与 P 不同,我们不能直接使用初始样本来估计与 P 相关的事件。
- 因此,我们开始沿着链“行走”,根据转移模型采样 X_{t+1}。
- 因为链会收敛到*稳分布,最终我们将得到一个非常接*从目标分布 P 中采样的样本。
然而,这里存在一个关键问题:我们需要“行走”多久,才能开始使用这些样本?我们不希望使用初始阶段的样本,因为它们离 P 还很远。我们需要等待链足够接*其*稳分布,这个状态被称为 混合。
混合是指 P_t(时间 t 的分布)足够接* π(*稳分布)。此时,我们可以认为样本质量足够好,可以开始收集。
如何判断链是否混合?
判断一个链是否已经混合,通常没有简单的答案。这是马尔可夫链方法中一个棘手的部分。
一般来说,你无法真正证明一个链已经混合。但在某些情况下,你可以证明它没有混合。如果你运行了大量测试,并且没有证据表明链未混合,那么你可能会假设它实际上已经混合了。
那么,如何判断链没有混合呢?你可以计算链内统计量。
以下是具体方法:
- 在链的一次运行中,观察不同的“窗口”。
- 比较这些窗口之间的各种统计量,例如到达某个特定状态的概率。
- 如果不同窗口的统计量相*,那么链可能已经达到了某种收敛状态。
然而,这种方法并不完全可靠。例如,如果概率空间存在两个高概率但难以相互到达的区域,而链只在其中一个区域游走,那么即使链未混合,单个运行窗口内的统计量也可能看起来相似。
更可靠的评估标准是:在不同空间区域初始化多个链的运行,然后比较这些不同运行之间的统计量。这样,如果一个链运行在一个区域,另一个链运行在另一个区域,统计量的差异就能表明混合尚未发生。
评估混合的统计量示例
以下是评估混合时可能用到的具体统计量示例。
1. 样本的对数概率
计算样本的对数概率(或未归一化的对数概率,我们稍后会讨论)。然后比较不同链运行的结果。
- 示例一:一条链从任意状态初始化,另一条从高概率状态初始化。如果两条链的对数概率值最终趋于一致,则可能已经混合。
- 示例二:如果两条链的对数概率值始终相差甚远,则显然没有混合,需要运行更长时间。
2. 状态子集的概率
在链运行一段时间后(假设混合可能已经发生),我们选择一个“窗口”,计算某个统计量,例如状态 X3 等于特定值(如2)的概率。
然后,我们从不同初始化的链运行中计算这个统计量,并进行散点图比较。
- 如果散点图中的点大部分聚集在对角线附*,表明两条链给出了相似的估计,可能已经混合。
- 如果许多点远离对角线(例如,一个运行中概率很高,另一个中概率为零),则表明没有混合。
如果对许多统计量进行测试,结果都倾向于“可能已混合”,那么我们就有理由相信混合已经发生。
如何使用混合后的样本?
一旦确定链已经混合,我们就可以开始收集样本。这里有一个重要的观察:一旦链混合,所有后续样本都来自*稳分布。也就是说,如果 X_t 来自 π,那么 X_{t+1}, X_{t+2} 等也都来自 π。
因此,我们可以使用混合后收集的每一个样本,因为它们都来自正确的分布。事实上,有论文证明,使用每一个样本比每隔一百个样本收集一次效果更好。
你可能会问:如果所有样本都来自正确分布,为什么有些论文建议每隔很多步才收集一个样本?这是因为,时间上相邻的样本是相关的。即使 X_t 和 X_{t+1 都来自 π,X_{t+1 通常也与 X_t 非常接*。因此,你得到的不是两个独立的样本,而是两个高度相关的样本。

认识到这一点很重要:即使你收集了1000个样本,也不意味着你拥有1000个独立同分布样本的信息量。因此,你不能直接应用那些假设样本独立同分布的误差界。
尽管如此,使用这些相关样本仍然比不使用要好。这里存在一个双重困境:混合越慢的链,其样本间的相关性也往往越强。因此,一个“不好”的链在两方面都表现不佳:需要更长时间混合,且收集的样本因相关性而信息量较低。
算法总结与影响
以下是使用马尔可夫链进行*似推理的完整算法步骤及其影响总结。
算法步骤:
- 并行运行 C 条链。
- 为每条链从一个任意分布中采样一个初始状态。
- 重复以下步骤,直到确信混合已发生:
- 对每条链,根据转移模型生成下一个样本(随机游走)。
- 比较不同链之间窗口统计量(如前所述),以判断是否混合。
- 初始化一个空的样本集合。
- 重复以下步骤,直到收集到足够样本:
- 从每条链中生成一个样本,并将其加入样本集合。
- 使用收集到的样本计算任何你关心的期望值,无论是示性函数还是更复杂的函数。
方法的影响总结:
- 优点:
- 马尔可夫链是一类非常通用的方法,适用于一般概率模型(不限于概率图模型)的*似推理。
- 通常易于实现,因为局部采样步骤往往很直接。
- 当生成足够多、远离初始分布的样本时,具有良好的理论性质。
- 缺点:
- 大量可调参数和设计选择:混合时间多长?测量哪些统计量?统计量多接*才算混合?收集多少样本?评估混合的窗口多大?这些选择都会影响结果,使得在实践中运行MCMC方法需要进行大量精细的调整。
- 收敛可能很慢:设计出具有良好混合性质的链非常困难。
- 难以判断是否有效:很难确定链是否真的混合了,以及样本之间的相关性是否足够低,从而能对目标量做出可靠的估计。

本节课中,我们一起学习了如何将马尔可夫链应用于实际推理算法。我们探讨了判断链是否“混合”的方法,理解了混合后样本的相关性问题,并总结了马尔可夫链蒙特卡洛方法的完整流程及其优缺点。掌握这些是有效应用MCMC进行*似推理的关键。
024:吉布斯抽样 🎲

在本节课中,我们将学习一种用于从概率图模型中抽样的通用方法——吉布斯抽样。我们将了解其工作原理、具体步骤、优缺点以及在实际应用中的局限性。

概述
上一节我们介绍了马尔可夫链及其收敛到*稳分布的条件。本节中,我们将探讨如何构建一个特定的马尔可夫链(吉布斯链),用于从任意概率图模型中抽样。我们将看到,吉布斯抽样通过一系列简单的条件抽样步骤,将复杂的联合分布抽样问题转化为更易处理的子问题。
吉布斯链的定义
我们的目标分布是吉布斯分布 P_Φ(x₁, …, x_n)。这个分布可以来自无向图模型的因子乘积,也可以来自给定证据后,由贝叶斯网络化简得到的因子集。接下来的讨论对因子集 Φ 的来源(有向或无向模型)不做区分。
吉布斯链的状态空间是变量集 X 的所有可能完整赋值 x 的集合。这是一个指数级大的空间。吉布斯链本身是一个简单易懂的马尔可夫链,其运行方式如下:

假设我们有一个起始状态 x⁽ᵗ⁾。我们将按照某个任意顺序,依次处理每个变量 Xᵢ。对于每个变量,我们从给定其他所有变量当前值的条件分布中,为该变量抽样一个新值。
我们用符号 x_¬ᵢ 表示除 Xᵢ 外所有变量的赋值。例如,对于三个变量 X₁, X₂, X₃,我们会依次:
- 从 P(X₁ | x₂, x₃) 中抽样 X₁。
- 从 P(X₂ | x₁, x₃) 中抽样 X₂。
- 从 P(X₃ | x₁, x₂) 中抽样 X₃。
当所有变量都被(可能地)更新后,我们就得到了一个新的状态 x⁽ᵗ⁺¹⁾。这便完成了吉布斯链的一步转移。

具体示例
让我们在一个具体的图模型——学生网络——中演示这个过程。假设我们观察到证据:L = l⁰ 和 S = s¹。现在,我们需要从后验分布 P̃_Φ(D, I, G | l⁰, s¹) 中抽样。
我们从一个任意初始赋值开始,例如 {D⁰, I⁰, G¹}。然后依次进行条件抽样:
- 抽样 D:从 P(D | I⁰, G¹, l⁰, s¹) 中为 D 抽样,假设得到 D¹。新状态为 {D¹, I⁰, G¹}。
- 抽样 I:从 P(I | D¹, G¹, l⁰, s¹) 中为 I 抽样,假设得到 I¹。新状态为 {D¹, I¹, G¹}。
- 抽样 G:从 P(G | D¹, I¹, l⁰, s¹) 中为 G 抽样,假设得到 G³。新状态为 {D¹, I¹, G³}。
这样,我们就完成了一步吉布斯抽样,得到了一个新的样本 {D¹, I¹, G³}。
条件抽样的高效计算
你可能会问,计算条件概率 P(Xᵢ | x_¬ᵢ) 本身不也很难吗?实际上,在图模型背景下,这个计算可以被大大简化。
条件分布 P(Xᵢ | x_¬ᵢ) 可以写成一个比值:
P(Xᵢ | x_¬ᵢ) = P̃_Φ(Xᵢ, x_¬ᵢ) / ∑_{x‘ᵢ} P̃_Φ(x‘ᵢ, x_¬ᵢ)
由于 P̃_Φ 是未归一化的因子乘积,其归一化常数 Z 在分子分母中会相互抵消。因此,我们只需要计算两个未归一化测度的比值。
关键在于,分子 P̃_Φ(Xᵢ, x_¬ᵢ) 是涉及所有变量的因子乘积。但当我们固定 x_¬ᵢ 后,许多因子变成了常数。实际上,P(Xᵢ | x_¬ᵢ) 正比于所有作用域包含 Xᵢ 的因子的乘积。
考虑一个马尔可夫网络示例,其因子为 φ₁(A,B), φ₂(B,C), φ₃(C,D), φ₄(A,D)。要计算 P(A | b, c, d),我们有:
P(A | b, c, d) ∝ φ₁(A, b) * φ₄(A, d)
可以看到,最终我们只需要计算与变量 A 直接相连的因子(即其马尔可夫毯中的因子)的乘积。对于大型图模型,这带来了巨大的计算节省,因为每次抽样只需要考虑目标变量及其邻接变量。
吉布斯链的性质与局限性
吉布斯链是否总是具有我们期望的性质(如收敛到唯一的*稳分布)呢?答案是否定的。
一个经典的例子是“异或”网络。假设 Y = X₁ ⊕ X₂,且我们观察到 Y = 1。如果我们从状态 {X₁=0, X₂=1} 开始吉布斯抽样:
- 抽样 X₁:给定 X₂=1, Y=1,X₁ 只能为 0。
- 抽样 X₂:给定 X₁=0, Y=1,X₂ 只能为 1。
因此,链将永远停留在状态 {0, 1},无法访问另一个同样合理的状态 {1, 0}。这是一个非混合链的例子。
另一方面,如果模型中所有因子的条目都为正(即没有零概率),则可以证明吉布斯链是正则的,从而保证收敛。但“正则”是一个很弱的条件,它只保证“最终”收敛,而不保证在合理时间内收敛。
例如,在图像分割任务中,如果相邻超像素之间有很强的关联势函数,且初始赋值整体错误(如将道路误标为水域),那么吉布斯抽样可能会陷入局部模式,因为每个像素都被其邻居的强约束“锁定”,导致链混合极其缓慢。
总结

本节课中,我们一起学习了吉布斯抽样。以下是其核心要点:
优点:
- 原理简单:它将复杂的联合分布抽样转化为一系列单变量的条件抽样。
- 计算高效:每一步条件抽样只涉及目标变量及其邻接变量(马尔可夫毯),计算成本低。
缺点与局限:
- 混合缓慢:当变量间存在强相关性或概率分布呈尖峰状时,链的混合速度可能非常慢。
- 适用性限制:它要求我们能够从条件分布(即相关因子的乘积)中高效抽样。这对于离散模型通常可行,但对于连续变量或连接稠密的模型可能不适用。

因此,尽管吉布斯抽样是概率图模型中最简单直观的MCMC方法之一,但在实际应用中,我们常常需要更巧妙的算法来应对其混合缓慢的问题。我们将在后续课程中探讨这些更高级的算法。
025:梅特罗波利斯-黑斯廷斯算法
在本节课中,我们将学习梅特罗波利斯-黑斯廷斯算法。这是一种通用的马尔可夫链蒙特卡洛方法,用于从难以直接采样的分布中生成样本。我们将了解其核心思想——可逆链与细致*衡方程,并学习如何通过设计“提议分布”来构建具有期望*稳分布的马尔可夫链。
马尔可夫链蒙特卡洛与可逆链

上一节我们介绍了马尔可夫链蒙特卡洛采样的基本概念。它为解决从复杂分布中采样的问题提供了一个通用框架。然而,这个框架留下了一个关键问题:如何设计一个具有我们期望的*稳分布的马尔可夫链?吉布斯链是图模型背景下的一个通用解决方案,但它对某些类型的图模型收敛速度较慢。那么,如果遇到吉布斯链收敛性不佳的图模型,我们该如何设计马尔可夫链呢?
事实证明,存在一类通用的方法,称为梅特罗波利斯-黑斯廷斯算法。该算法为我们提供了一种通用方法来设计具有期望*稳分布的马尔可夫链。实际上,对于给定的*稳分布,我们可以构建一系列不同的马尔可夫链,它们以不同方式探索状态空间,然后从中选择或构建一个对我们的分布具有良好收敛性质的链。
梅特罗波利斯-黑斯廷斯方法背后的关键见解是可逆链的概念。
那么,链可逆意味着什么?
想象我们有一个具有特定*稳分布 π 的链。我们将考虑两个不同的实验。在第一个实验中,我们根据概率分布 π 在状态空间中选取一个点,然后根据链定义的转移模型 T,从我们选取的状态出发随机选择一条边。在第二个实验中,我们完全重复这个过程,再次根据 π 选取一个点,并根据 T 选择一条出边。
如果一个链是可逆的,那么在上述过程中,沿着红色边(从状态 i 到 j)的概率,恰好等于在另一个方向上沿着绿色边(从状态 j 到 i)的概率。也就是说,先选取 i 然后转移到 j 的概率,等于先选取 j 然后转移到 i 的概率。
用数学符号表示,这告诉我们:
π(x) * T(x → x') = π(x') * T(x' → x)
这个方程被称为细致*衡方程。并非所有马尔可夫链都满足这个性质。但事实证明,可逆马尔可夫链具有优雅的性质,使得我们可以构造它们以获得特定的*稳分布。
具体来说,我们可以证明(这个证明并不困难):如果细致*衡方程成立,并且 T 是一个正则马尔可夫链,那么 T 有唯一的*稳分布(根据正则性可知),并且这个*稳分布就是 π。
让我们来证明这一点。证明过程非常简洁。
我们从细致*衡方程开始:
π(x) * T(x → x') = π(x') * T(x' → x)
现在,我们对等式两边关于 x 求和。由于两边相等,求和后仍然相等:
∑_x [π(x) * T(x → x')] = ∑_x [π(x') * T(x' → x)]
观察右边,π(x') 不依赖于求和变量 x,因此可以提到求和符号外面:
∑_x [π(x) * T(x → x')] = π(x') * ∑_x [T(x' → x)]
因为 T 是从 x' 出发的转移概率分布,其所有出边的概率之和必然等于 1:
∑_x [T(x' → x)] = 1
因此,我们得到:
∑_x [π(x) * T(x → x')] = π(x')
这正是*稳分布 π 的定义。所以,这个简洁的证明表明,一个相对于特定分布 π 可逆的链,必然以 π 为其*稳分布。
为什么这个定义比底部那个涉及对整个(通常是指数级大的)空间求和的*稳分布定义更有用?因为细致*衡方程更具建设性,它允许我们构造 T 以匹配 π。这正是梅特罗波利斯-黑斯廷斯算法背后的思想。
梅特罗波利斯-黑斯廷斯算法设计
那么,梅特罗波利斯-黑斯廷斯链是如何工作的呢?
它从一个提议分布 Q 开始。这个分布 Q 可以在状态空间中自由“漫游”,不像吉布斯链那样只进行局部小步移动。Q 可以提议移动到状态空间中非常遥远的部分。当然,仅凭 Q 本身,其*稳分布与我们关心的目标*稳分布 π 毫无关系。
因此,我们需要一个“评判者”。评判者的作用是:当提议分布 Q 提出一个移动建议时,它决定是否“接受”这个提议。评判者会说:“你想从 x 移动到 x'?好吧,我以多大的概率允许你这么做?”这个概率就是接受概率 A。对于每一对状态 (x, x'),A(x → x') 是一个二元随机变量的接受概率。
这就产生了以下过程(我们尚未说明如何选择 Q 或 A,先理解过程):
在每一个状态 x,我们从提议分布 Q(x → ·) 中采样一个潜在的后继状态 x'。我们有一个移动到 x' 的提议(用虚线表示)。然后,评判者决定是否接受这个提议。如果提议被接受,我们就实际执行这个转移;如果提议被拒绝,我们就停留在原地。
这会产生什么样的转移模型 T?有两种情况:
- 如果 x' ≠ x,即提议移动到另一个状态。那么,转移到 x' 的唯一机会是:首先提议移动到 x',并且这个提议被接受。因此,转移概率为:
T(x → x') = Q(x → x') * A(x → x') - 如果 x' = x,即停留在原地。这有两种可能:要么提议留在 x 并被接受(我们通常假设提议留在原地总是被接受),要么从 x 提议移动到其他状态 x'',但该提议被拒绝。因此,转移概率为:
T(x → x) = Q(x → x) + ∑_{x'' ≠ x} [Q(x → x'') * (1 - A(x → x''))]
这样就定义了一个马尔可夫链。但如上所述,没有理由期望它具有特定的*稳分布。
现在,我们引入细致*衡方程的直觉,并利用它来构造一个具有我们所需性质的接受概率 A。
我们的目标是:给定一个提议分布 Q,我们想要选择 A,使得细致*衡方程成立。如果对于 (Q, π) 细致*衡成立,那么就能保证整个过程具有正确的*稳分布。
我们考虑 x ≠ x' 的情况(当 x = x' 时,等式显然成立)。我们希望以下等式成立:
π(x) * T(x → x') = π(x') * T(x' → x)
代入 T 的表达式:
π(x) * [Q(x → x') * A(x → x')] = π(x') * [Q(x' → x) * A(x' → x)]
现在,我们将两个接受概率移到等式一边,其他项移到另一边,得到对接受概率比率的约束:
A(x → x') / A(x' → x) = [π(x') * Q(x' → x)] / [π(x) * Q(x → x')]
我们定义这个比率为 ρ。不失一般性,我们假设 ρ ≤ 1(如果大于1,我们可以交换 x 和 x' 的角色)。
现在我们需要选择 A(x → x') 和 A(x' → x) 的值以满足这个等式。一个简单的方法是取两者中较小的那个(我们假设是分子对应的那个),并令:
A(x → x') = ρ
A(x' → x) = 1
这立即满足了约束条件。当然,我们也可以选择其他值(例如,都设为 ρ/2 和 1/2),但那样会降低提议被接受的概率,导致链移动得更慢,因为停留在原地的次数会更多。因此,我们选择的是在满足比率约束条件下可能的最大接受概率。
将其整合为一个通用公式,我们得到接受概率的表达式:
A(x → x') = min( 1, [π(x') * Q(x' → x)] / [π(x) * Q(x → x')] )
如果你仔细看这个公式,会发现它对 A(x → x') 和 A(x' → x) 都能给出正确的值。
提议分布 Q 的选择与挑战
这告诉我们如何根据给定的 Q 来选择 A。接下来的问题是:如何选择 Q?这通常是最具挑战性的部分。

选择 Q 是一门艺术,在许多应用中并不容易。但在思考如何选择之前,让我们先看看 Q 必须满足的一些条件。
从 A 的表达式可以看出,它涉及一个比率。要保证这个比率有定义,分母不能为零。因此,Q 必须满足一个可逆性条件:如果 Q(x → x') > 0,那么 Q(x' → x) > 0,反之亦然。这保证了比率总是良定义的。
这个条件对 Q 的设计造成了一种张力。
- 一方面,我们希望 Q 非常“宽广”。如果你在当前状态,你希望 Q 能提议移动到非常遥远的地方,因为移动得越远,在状态空间中探索得越快。你不希望像吉布斯链那样只停留在当前赋值附*,你希望快速移动,这能改善混合速度。
- 另一方面,如果提议分布非常宽广,你可能会从一个 π 值较低的区域移动到一个 π 值非常高的区域(或者相反)。想象状态空间 X 上 π 的“高度”分布。如果你移动得很远,很容易陷入 π(x) 远大于 π(x') 的情况。看看这对接受概率意味着什么:接受概率 A(x → x') 会变得非常低。这反过来又会导致混合速度变慢,因为你虽然尝试了全局性的移动,但很少被接受。
因此,在设计提议分布 Q 时,需要在“探索广度”和“接受概率”之间取得*衡。
示例:匹配问题
让我们看一个马尔可夫链的例子,其中提议分布的选择会产生巨大影响。这是一个匹配问题,也可以表述为一个图模型。
假设我们有一组红点和一组蓝点,我们希望将红点与蓝点进行匹配。每条边(连接红点和蓝点)都有一个权重,表示这个红点与该蓝点匹配的“满意度”。这在很多问题中都很常见,例如将传感器读数匹配到跟踪目标,或将一幅图像的特征匹配到另一幅图像。
将匹配问题表述为图模型的一种方式是:每个红点是一个变量 X_i,每个蓝点代表一个可能的值。X_i = j 表示将第 i 个红点匹配到第 j 个蓝点。
我们可以定义一个概率分布:首先,它必须是一个合法匹配(即每个红点匹配到不同的蓝点),否则概率为零。对于合法匹配,其概率与匹配中所有边权重的指数和成正比:P(assignment) ∝ exp( sum of qualities of matched edges )。在这个例子中,我们可以将边的质量直观地视为距离,红点更倾向于匹配距离*的蓝点。

如果在这个模型上运行吉布斯采样,过程会非常缓慢。例如,选取一个红点变量,尝试为它分配一个新的蓝点值。由于大多数蓝点可能已经被其他红点匹配,那些导致冲突的赋值概率为零(不可能)。因此,红点只能匹配到当前未被匹配的蓝点,这使得状态变化非常缓慢。
梅特罗波利斯-黑斯廷斯解决方案
现在,我们看看如何使用梅特罗波利斯-黑斯廷斯算法,并设计一个不同的提议分布来解决这个问题。这种方法称为“增广路径”提议分布。
假设这是当前的匹配。我们按以下方式构造一个提议:
- 随机选择一个变量(红点),比如 X_i。
- 忽略当前匹配,为它“提议”一个新的蓝点值(可以随机选择,概率与距离等有关)。假设我们为它提议了蓝点 B_j,而 B_j 当前正被另一个红点 X_k 匹配。
- 现在,红点 X_k 失去了它的伙伴,所以它也需要一个新的蓝点。我们为 X_k 提议一个新的蓝点值。
- 这个过程继续,直到我们最终为一个“空闲”的蓝点(当前未被任何红点匹配)提议了一个匹配,或者我们形成了一个环。
- 最终,我们得到了一条由交替的“当前边”和“提议边”组成的路径或环(称为交替路径或交替环)。通过将这条路径上的所有边从“当前”状态切换到“提议”状态,我们得到了一个新的合法匹配。这就是我们的提议。
通过一些数值计算,可以得出这个提议分布的接受概率。事实证明,这是一个非常好的提议分布。

性能比较
让我们比较一下不同方法的性能。
如果只应用吉布斯采样,可以看到四条不同颜色的链(代表四个独立的运行)。X轴是步数,Y轴是某个用于衡量混合情况的统计量(例如,第一个红点匹配到第一个蓝点的概率)。可以看到,链中存在大量的长程波动,概率随时间变化缓慢,表明链需要很长时间才能从一个区域移动到另一个区域。
相比之下,使用刚才描述的增广路径提议分布的梅特罗波利斯-黑斯廷斯算法则完全不同。概率曲线几乎完全*坦,四条链几乎重合,随时间窗口的变化非常小。
甚至还有一种更好的提议分布(对增广路径稍作修改),它能实现几乎完美的混合。
如果我们查看用于评估混合的另一个指标(例如,比较不同链对同一统计量的估计),可以看到吉布斯链的估计非常嘈杂,不同链给出的估计差异很大。而第一个梅特罗波利斯-黑斯廷斯算法的估计几乎落在对角线上(表示一致),更好的那个算法则完全落在对角线上,实现了完美混合。

总结
本节课中我们一起学习了梅特罗波利斯-黑斯廷斯算法。这是一个非常通用的框架,用于构建具有特定*稳分布的马尔可夫链。
它要求你提出一个提议分布 Q,并且这个分布需要满足一定的条件(正反方向概率均不为零)才能有效。一旦给出了这样的提议分布,细致*衡方程这个简洁的公式就能告诉我们如何构造接受概率 A,以确保获得正确的*稳分布。

这非常强大,因为它赋予了我们巨大的灵活性来设计提议分布,从而快速探索状态空间并移动到遥远的区域。然而,正如我们所看到的,选择提议分布是一个关键的设计点,对性能有巨大影响。这更像是一门艺术而非精确的科学,通常需要大量的思考和工程实践。
026:时序模型中的推断

在本节课中,我们将要学习如何将之前讨论的推断策略应用于基于模板的模型,例如动态贝叶斯网络和盘模型。我们将探讨这些策略的适用性,以及由这些模型结构带来的新挑战和计算问题。
概述
在之前的几节课中,我们讨论了许多不同的推断策略,以及它们如何应用于各种图模型。一个自然的问题是,这些相同的策略能否应用于我们之前定义的基于模板的模型?这些模型通过动态贝叶斯网络、盘模型或其他使用重复结构的表示法来定义。我们将看到,答案是既肯定又否定的。相同的策略可以应用,但也会出现一些有趣的新挑战。
动态贝叶斯网络与盘模型的推断

首先,让我们回顾一下动态贝叶斯网络是如何定义的。动态贝叶斯网络使用一个初始时间零分布(通常是一个贝叶斯网络)和一个定义转移模型的2-TBN来指定。我们可以将这两个部分组合起来,展开或“接地”成一个贝叶斯网络。一旦完成,这个接地网络就和其他任何贝叶斯网络一样。因此,我们为回答任何贝叶斯网络查询而开发的任何推断技术都可以在此上下文中使用。
具体来说,一旦我们为给定的轨迹长度展开DBN,我们就可以在接地网络上运行你喜欢的推断算法,来回答诸如“给定某些证据(例如到时间2的观测或整个序列的观测),汽车在时间2的位置是什么?”之类的问题。
同样的情况也适用于盘模型。以我们之前讨论的大学示例中的简单盘模型为例,其中有学生、课程和成绩。我们可以展开该网络,生成一个接地网络。这个展开的网络再次成为一个普通的贝叶斯网络,因此我们可以对该网络运行推断,以回答诸如“给定某些成绩信息,我们对特定学生智力的预测分布是什么?”等问题。
时序模型中的新挑战:信念状态跟踪
然而,这些基于模板的模型带来了一些困难或新的维度,其中一个重要方面是它们引入了新的问题。这在时序模型的背景下尤其明显,我们常常对所谓的“信念状态跟踪”感兴趣,即随着系统演化,持续跟踪其状态。
从某种意义上说,这只是一个传统的概率推断任务,因为它对应于询问:给定智能体到时间T为止获得的观测,我们在时间T的状态概率分布是什么?这里的 O_{1:T} 是 O_1, O_2, ..., O_T 的简写。这是一个可以在展开网络上使用标准概率推断技术来回答的推断任务。
但是,如果我们想要在长轨迹过程中跟踪这个概率分布,而不必维护一个可能无限大的网络并持续在其上运行推断,就存在一个需要解决的挑战。
幸运的是,事实证明,我们可以以一种动态的方式做到这一点,而无需在任何时间点都跟踪巨大的展开网络。这直接源于图模型的马尔可夫性质。
具体来说,我们将通过一个两阶段过程来实现。首先,我们计算 σ_{t+1}^•。这里的点表示,虽然这是时间 t+1 状态的一个分布,但它没有考虑时间 t+1 的观测。其定义如下:
σ_{t+1}^• = P(S_{t+1} | o_{1:t})
现在,我们可以对这个概率表达式进行相当直接的操作。首先,我们在条件条的右侧引入 S_t 并对其求和:
σ_{t+1}^• = Σ_{s_t} P(S_{t+1} | s_t, o_{1:t}) * P(s_t | o_{1:t})
接下来,我们应用由图模型结构产生的独立性。具体来说,给定时间 t 的状态,时间 t+1 的状态独立于之前发生的一切。这允许我们使用条件独立性来简化表达式:
σ_{t+1}^• = Σ_{s_t} P(S_{t+1} | s_t) * σ_t
这里,P(S_{t+1} | s_t) 就是我们的转移模型,而第二项 P(s_t | o_{1:t}) 正是我们之前计算并试图跟踪的信念状态 σ_t。这使我们能够从 σ_t 生成 σ_{t+1}^•。
第二步是考虑时间 t+1 的观测模型。我们来看这涉及什么。现在我们有了上一张幻灯片定义的 σ_{t+1}^•,我们想用新的观测 o_{t+1} 来条件化它,从而推导出信念状态 σ_{t+1}。

σ_{t+1} = P(S_{t+1} | o_{1:t+1})
我们应用贝叶斯规则来重新表述:
σ_{t+1} = (P(o_{t+1} | S_{t+1}, o_{1:t}) * P(S_{t+1} | o_{1:t})) / P(o_{t+1} | o_{1:t})
σ_{t+1} = (P(o_{t+1} | S_{t+1}) * σ_{t+1}^•) / P(o_{t+1} | o_{1:t})
这是一个贝叶斯规则的直接应用。我们可以再次检查这个表达式中的每一项。分子中的第一项是给定状态的观测概率,根据条件独立性,过去的观测可以移除。第二项正是我们刚刚计算的 σ_{t+1}^•。这样就得到了上面的表达式,它很容易处理,因为分子中的每一项要么是我们模型的一部分(观测模型),要么是我们之前计算过的 σ_{t+1}^•。分母是一个归一化常数,可以通过计算分子然后归一化来得到。
机器人定位示例
回到我们之前见过的例子,让我们看看机器人定位。这是一个我们已经讨论过的模型。现在,让我们看看这在信念状态跟踪问题的实际背景下如何体现。
在一个场景中,绿色圆圈代表机器人的真实位置,这对机器人是未知的,因为机器人正试图定位自己。蓝色线条是机器人在过程中每个点获得的声纳观测读数。返回的声纳读数长度大致对应于机器人与墙壁的距离,但这里存在一些噪声。例如,有时声纳似乎穿过了墙壁,尽管它本应给出更*的读数。红色圆点可视化地表示了机器人对自己位置的信念。初始阶段,这是一个均匀的概率分布,因为机器人不知道自己在哪。随着时间的推移,分布会变得越来越集中,因为机器人对自己可能位置的信念状态变得越来越确定。
我们可以看到,随着机器人获得越来越多的观测,其信念分布变得越来越集中。由于对称性,机器人起初不确定自己在走廊的哪一侧,因此分布有两个峰值。但当机器人走进一个房间后,它发现这个房间与底部的房间不同。最终,机器人几乎确定地定位了自己,因为只有一个位置与其在整个轨迹中接收到的观测一致。
计算问题与纠缠

与这些基于模板的模型相关的第二个挑战是计算问题。我们当然可以生成一个展开的贝叶斯网络,并使用标准推断技术计算任何变量子集的后验。但是,能够从一个相当小的模板生成这些非常大的概率图模型的一个后果是,我们确实可以生成非常大的模型,而大型概率图模型可能会带来新的推断挑战,即如何将推断扩展到那种规模的模型。

具体来说,如果我们看一下由展开的DBN产生的展开模型,并回想一下我们之前关于特定概率图模型的概率推断复杂性的分析,我们会记得,例如,如果我们想在这个展开的网络上运行精确推断(比如团树推断),并且希望团树中时间零变量在一部分,而未来某个时间T的变量在另一个团中,那么分离这些变量所需的最小子集必须包含所有持久变量(即那些在时间 t 到 t+1 之间存在边的变量)。因此,这可能会给精确推断带来巨大的计算成本,尤其是当我们有大量持久变量时。
理解这一点的另一种方式是通过“纠缠”的概念。如果我们的目标是维护时间3变量的信念状态,并思考如何在不维护时间3变量的完整显式联合分布的情况下做到这一点,我们很快意识到我们别无选择,因为时间3的变量之间没有条件独立性。虽然它们在时间片内没有直接连接,但它们之间存在活跃迹,例如:天气时间3 -> 天气时间2 -> 故障时间2 -> 故障时间3。这意味着,当只考虑时间3的变量时,给定时间3的任何其他变量,它们彼此之间并不是条件独立的。这种纠缠过程在动态贝叶斯网络中跟踪信念状态的过程中发生得非常迅速,最终意味着,如果你想维护精确的信念状态,在大多数情况下它将是完全相关的。
盘模型中的计算问题

类似的计算问题也出现在盘模型中。以我们展开的学生示例盘模型为例,左边是课程难度,右边是学生智力,中间是成绩。我们讨论过这种二分马尔可夫随机场的计算复杂性。一般来说,假设成绩关联相当密集,对于精确推断,我们预期的最低成本是左边变量数 M 和右边变量数 N 的最小值,即 min(M, N)。假设大学有相当多的课程和更多的学生,这很快就会变得难以处理,从而产生了对*似推断方法的需求。
*似推断的成功案例
尽管如此,*似推断方法可以非常成功。让我们用一个无向模板模型的例子来结束这部分内容。这里的任务是将网页分类到不同的类别中。虽然可以使用标准的机器学习技术根据网页包含的单词单独对网页进行分类,但事实证明,通过考虑网页之间的连接(即链接页面类别之间的无向边),可以显著提高性能。例如,从数据中学习到的模型显示,学生很可能链接到教师,教师链接到学生的可能性较小,教师链接到其他教师的可能性更小。这为我们提供了相互链接的网页标签之间相关性的信息,从而带来了性能上的显著提升,例如将错误率从18%降低到略高于12%。

总结

本节课中,我们一起学习了在时序模型中进行推断的方法。原则上,可以通过展开接地网络并使用标准推断方法来完成。然而,时序模型特别提出了新的推断任务,例如实时信念状态跟踪,这需要我们的方法进行一定的调整。此外,另一个复杂性来源是,通过展开这些模型得到的接地网络通常非常大,有时连接非常密集,需要仔细设计算法方法并使用*似方法,以应对规模增加带来的复杂性。
027:推断方法总结与选择指南 📊

在本节课中,我们将总结本单元所学的各种推断方法,并探讨如何根据具体任务和模型特性,在精确推断与*似推断、边缘概率计算与最大后验概率计算之间做出合理选择。

2.7.1:任务选择:边缘概率 vs. 最大后验概率 🎯
我们首先需要回答的问题是:哪个任务更适合我们的问题?是计算边缘概率,还是计算最大后验概率分配?这两种选择在应用场景上存在不同的权衡。
计算边缘概率通常是一种更稳健的方式,因为我们并非只选择一个单一的假设,而是计算一系列不同选项的概率分布。例如,我们可以观察最佳选项的概率是仅比次优选项高一点,还是高出很多,这为我们判断推断结果的鲁棒性提供了指导。同时,计算出的概率也为决策支持提供了基础,例如在与效用模型结合时。
另一方面,最大后验概率计算适用于另一类场景。例如,在语音识别或图像分割问题中,获得一个整体上连贯的联合赋值,有时比获得推理问题中各个独立部分(如单个像素或音素)的最佳答案更为重要。因此,连贯性这一概念有时至关重要,值得以牺牲一定的鲁棒性为代价。
从计算角度看,最大后验概率问题存在一系列比计算边缘概率更易处理的模型类别。因此,出于计算效率的考虑,我们有时会选择使用最大后验概率解决方案。此外,特别是在使用*似推断时,最大后验概率分配通常能为我们提供关于答案接*正确程度的理论保证,例如在对偶分解算法中。而对于计算边缘概率的*似推断,则难以获得类似水*的置信度。
然而,在运行*似推断时,这两类问题又存在不同的权衡。在计算边缘概率时,*似推断算法因其“软”赋值特性,误差往往会被削弱,推断中某一部分的不准确性通常不会显著传播到模型的其他部分,因此在计算边缘概率时,*似推断通常能提供更稳健的答案。另一方面,在最大后验概率方面,我们至少可以在许多情况下(例如在对偶分解等算法中)通过观察算法得到的赋值质量来评估算法是否有效。因此,权衡点再次不同。在一些应用中,人们实际上会尝试两种方法,看看哪种在下游任务中表现更好。
2.7.2:边缘概率推断算法概览 🔍
上一节我们讨论了任务选择,本节中我们来看看有哪些具体的算法可用于边缘概率推断。

以下是本课程讨论过的边缘概率推断算法:
- 精确推断:例如变量消除和团树算法。总的来说,如果问题规模足够小,使得精确推断在内存和团规模方面可行,那么使用精确推断可能是最佳选择。这种方式遇到的问题较少,如果内存允许,速度通常会非常快。
- *似推断:如果无法进行精确推断,我们讨论了不同类型的*似算法。其中包括在图结构上进行消息传递的一系列算法(循环信念传播是其中较常见但不是唯一的一种),以及从分布中采样的抽样方法类别。
这些是不同的算法类别,坦率地说,通常很难提前判断哪种算法对给定的模型类别效果更好。我们将在后续的幻灯片中简要讨论可能使一种算法优于另一种的因素。

2.7.3:最大后验概率推断算法概览 🗺️
接下来,我们转向最大后验概率推断的算法。
同样,我们拥有执行精确推断的算法,并且在这种情况下,其适用范围实际上比计算边缘概率更广。除了树宽较低(这是边缘概率算法有效的类别)的情况外,我们还看到了其他例子,例如具有关联势函数或规则势函数的模型,以及多种其他情况。再次强调,如果可以执行精确推断,这通常是最佳选择,如果问题是可处理的,它通常会提供最佳性能。
其次是基于优化的方法类别。这些方法可以是精确的(这使其归入上一类别),但更多时候我们会发现自己需要使用某种*似方法,例如我们讨论过的对偶分解算法。正如我们所说,这些方法通常至少能够估计我们算法相对于最优答案的性能,即使我们无法达到最优答案。
最后,还有在空间上进行搜索的一系列算法。这可以是简单的爬山搜索(这是标准搜索方法的直接应用),但也相当常见的是使用某种抽样方法,如马尔可夫链蒙特卡洛抽样,来探索空间中的一系列不同赋值,然后从中选择具有最高对数概率的赋值。这是一种非常常用的技术,它可能无法提供从优化方法中获得的那种保证,但通常非常容易实现,因此使用相当频繁。

2.7.4:*似推断的挑战与考量 ⚠️
如果我们不得不求助于使用*似推断,那么有哪些问题可能会使情况复杂化,或者可能使一种算法优于另一种呢?
第一个复杂因素与连接结构有关,即模型的连接密集程度。总的来说,模型连接越密集,对消息传递算法越不利。消息传递算法不喜欢密集连接的模型,因为消息在非常短的循环中传播,这可能导致收敛性问题以及精度不足。
抽样方法受连接结构的影响较小。
第二个复杂因素是影响的强度,即相互连接的节点在偏好某些值组合方面的耦合紧密程度。一般来说,影响越强,对两类算法都越困难,因为它会在变量之间产生更强的耦合,这可能使消息传递算法和抽样算法都复杂化。例如,对于朴素的吉布斯抽样,这使得从当前配置转移到不同配置变得非常困难。
当影响朝不同方向作用时,影响强度会成为一个更严重的问题。例如,如果在一个循环中,一条路径倾向于让这些变量采用一种配置,而另一条路径试图让它们采用不同的配置组合(就像我们在误解网络示例中看到的那样,一条路径希望一对变量取值一致,另一条则希望它们不一致),这确实会给两类方法带来严重问题。我认为,这*似推断困难的核心在于似然函数的形状。如果似然函数有多个峰值,这会使大多数*似算法变得困难,而这些峰值越尖锐,情况就越复杂。多个峰值正是由方向相反的强影响产生的,因此这确实是*似推断中许多复杂性的来源。

2.7.5:应对挑战模型的策略 🛠️
那么,假设我们有一个存在上述问题的模型,我们该如何应对呢?
首先,是审视网络并识别问题区域,即那些紧密耦合且可能受到相反影响的变量子集。然后,我们尝试思考如何使这些问题区域中的推断更加精确。例如,如果我们有一个紧密耦合且可能存在相反影响的区域,我们如何防止我们的*似推断算法陷入该区域给出不精确答案或不收敛的陷阱?
以下是一些策略:
- 对于团图方法:我们可以将整个问题区域放入一个团中。这在计算方面会带来一些成本,因为我们必须处理更大的团,但就性能改进而言,这可能是非常值得的。
- 对于抽样方法:我们可以考虑对多个变量进行联合提议移动。也就是说,不是抽样单个变量,我们可以使用成本稍高的抽样程序对整个块进行抽样。同样,就算法的整体性能而言,这最终可能是非常值得的。
- 对于最大后验概率问题:我们可以将这整组变量放入一个单独的“从属问题”中。这同样会在计算方面带来一些成本,但可以显著改善算法的收敛性。
因此,当我们面对一个不易被传统推断技术解决的复杂模型时,推断的设计往往需要一些技巧。我们需要深入研究我们的模型,思考如何处理其不同部分,以及哪种推断方法最适合处理这些不同部分。我们经常发现,对于复杂模型,通过组合不同的推断算法可以获得最佳性能,其中一些部分使用精确推断(例如在*似推断方法,如抽样或信念传播的背景下处理这些较大的块)。因此,需要针对这些更具挑战性的模型,创造性地思考推断问题。
总结 📝

本节课中我们一起学习了如何为概率图模型选择合适的推断方法。我们比较了计算边缘概率和最大后验概率的不同考量,回顾了各自的精确与*似算法类别,并深入探讨了影响*似推断性能的关键因素(如连接密度和影响强度)。最后,我们学习了应对复杂模型挑战的策略,即识别问题区域并组合使用不同的推断技术。推断方法的选择需要根据具体任务、模型特性和计算资源进行综合权衡,有时甚至需要创造性地组合多种方法以达到最佳效果。
001:学习概述

在本节课中,我们将学习概率图模型的最后一个重要模块:如何从数据中学习一个概率图模型。在深入具体的学习算法细节之前,我们先探讨一下为何要从数据中学习概率图模型、可能遇到的不同学习场景,以及如何评估学习算法的结果。
学习问题的设定
我们假设存在一个真实的分布,通常记为 P。在许多情况下(尽管并非总是如此),我们可能假设 P 实际上是由某个概率图模型 M* 生成的。这个假设允许我们讨论学习到的模型与生成分布的真实模型 M* 之间的差异。
从这个分布 P* 中,我们获得一个包含 M 个实例的数据集 D = {D1, ..., DM}。我们假设这些实例是从分布 P* 中采样得到的。

除了数据,我们可能还拥有一定程度的领域专业知识,可以将一些先验知识融入模型中。事实上,与许多其他不易融入先验知识的学习算法相比,能够融入先验知识是概率图模型学习的一个优势。
结合专家知识和数据学习,我们最终可以得到一个网络,用于查看或用于不同目的。

贝叶斯网络中的学习场景
为了使概念更具体,让我们看看贝叶斯网络中的不同学习场景。马尔可夫网络中的问题看起来非常相似。
以下是几种主要场景:
- 已知结构,数据完整:我们假设网络结构是已知且正确的。输入数据干净完整,每个实例中所有变量都有观测值。我们的目标是学习该网络的条件概率分布。
- 未知结构,数据完整:我们拥有相同类型的完整数据集,但初始网络没有边。我们需要推断边的连接结构以及条件概率分布。
- 已知结构,数据不完整:此时,训练数据中有些变量未被观测到。正如我们将看到的,这会显著地使学习问题复杂化。
- 未知结构,数据不完整:这是最具挑战性的场景,我们既不知道结构,数据也不完整。
- 含隐变量的学习:我们可能遇到一种情况,我们知道变量 X1、X2 和 Y,但最终学习到的模型除了包含 X1、X2 和 Y,还包含一个额外的隐变量 H。我们可能事先不知道 H 的存在,也没有观测到它的任何值,但我们希望学习一个包含 H 的模型。

学习概率图模型的目的
现在,让我们思考学习概率图模型的原因。
1. 用于概率推理的模型
最明显的原因是我们需要一个模型,可以像使用手动构建的模型一样,用于回答概率查询。无论是条件概率查询还是关于新实例的最大后验概率查询。

2. 用于特定预测任务的模型
一个相关但略有不同的学习任务是,当我们关心一个特定的预测问题时。例如,我们可能特别关心根据一组观测变量 X 来预测一组目标变量 Y。图像分割(X 是像素,Y 是类别标签)和语音识别(X 是声学信号,Y 是音素序列)都是此类例子。
尽管在这种情况下,我们通常关心一个专门的目标(如像素级分割准确率或词准确率),但出于算法和数学上的便利,我们常常选择优化似然或条件似然来训练模型。虽然似然并不总是我们真正关心目标的完美替代品,但它数学上方便处理,因此常被使用。然而,重要的是要在测试数据上根据真实目标评估模型性能,而不仅仅是使用似然作为学习算法成功与否的评估标准。

3. 用于知识发现

第三种使用概率图模型学习的场景在性质上相当不同。在这种情况下,我们可能不关心将模型用于任何特定的推理任务,而是关心推断结构本身。也就是说,我们的目标是知识发现或结构发现,试图尽可能接*真实的生成模型 M*。
使用概率图模型学习进行此任务可以帮助我们区分直接依赖和间接依赖。例如,如果我们看到数据中 X 和 Y 相关,我们想推断这是否对应于它们之间的直接概率交互,还是通过第三个变量 Z 产生的。在某些情况下,学习贝叶斯网络时,我们可能能够推断边的方向性,从而获得关于因果关系的直觉。在其他情况下,学习包含隐变量的模型时,这些隐变量的存在、位置以及其值分配给不同实例的方式,都能为我们提供大量关于领域结构的信息。
在许多情况下(尽管并非总是),我们通过使用基于似然的目标进行训练来解决这个学习问题。我们知道这对于结构准确性来说不是一个特别好的替代品,但从数学和算法的角度来看,它是一个非常方便的优化目标,因此常在实践中使用。然而,重要的是不要使用似然(即使是测试集似然)作为评估模型性能的唯一目标。在许多情况下,评估需要通过与我们已知的关于真实模型 M* 的有限先验知识进行比较来完成。

评估与过拟合
训练集似然与过拟合
我们之前提到,训练集似然倾向于使模型过拟合。这是一个普遍的观察结果:当你选择模型 M 以优化训练集似然时,它往往会严重地过拟合统计噪声,即生成训练集时发生的随机波动。

过拟合以几种不同的方式发生:
- 参数层面的过拟合:参数拟合了训练数据中的随机噪声。这可以通过使用正则化或参数先验来避免。
- 结构层面的过拟合:可以证明,如果我们优化训练集似然,复杂的结构总是胜出。也就是说,我们总是倾向于选择模型允许的最复杂结构。因此,如果我们试图拟合结构,重要的是要么限制模型复杂度,要么惩罚模型复杂度,以免学习到毫无理由的、极其复杂的模型。

超参数选择
我们讨论的所有这些不同选择(如参数先验、正则化强度、复杂度界限或惩罚)都称为超参数。我们需要在实际应用学习算法之前选择这些超参数,而这个选择通常对学习算法的性能有巨大影响。

如何选择超参数?
- 在训练集上选择:这是一个糟糕的想法,因为训练集上的最优做法是最大化复杂度,这会使超参数选择变得无效。
- 在测试集上选择:这也是一个糟糕的想法,因为这会使我们的性能评估过于乐观,因为我们根据测试集性能优化了这些重要参数。
正确的策略是使用一个验证集,这是一个独立于训练集和测试集的数据集。另一种变体是在训练集上使用交叉验证,迭代地将训练集分割为训练部分和验证部分,用于选择超参数。这些概念在其他学习算法的背景下也很常见,在这里同样重要。

为何选择概率图模型学习
最后,让我们讨论何时应该使用概率图模型学习,而不是通用的机器学习算法。
- 预测结构化对象:概率图模型学习在我们试图预测的不是单个输出变量(如二元结果),而是结构化对象时特别有用。例如,标记整个序列(如语音识别或自然语言处理中的序列标注),或标记整个图(如图像分割中标记所有像素网格)。这允许我们利用多个预测变量之间的相关性,通常能显著提高性能。
- 融入先验知识:概率图模型允许我们以一种许多其他算法难以实现的方式,将先验知识融入模型。
- 单一模型,多种用途:我们可以学习一个单一的概率图模型,用于多种不同的任务和回答不同类型的查询,而传统学习算法通常学习一个特定的 X->Y 映射。
- 直观的知识发现:虽然其他学习算法也可用于知识发现,但在概率图模型的背景下尤其有用,因为其知识形式通常特别直观。


总结
在本节课中,我们一起学习了概率图模型学习的基本概述。我们首先定义了学习问题的设定,即从真实分布 P* 生成的数据中学习模型。接着,我们探讨了贝叶斯网络中的几种主要学习场景:已知/未知结构、数据完整/不完整以及含隐变量的学习。
然后,我们分析了学习概率图模型的三个主要目的:用于通用概率推理、用于特定预测任务以及用于知识发现。我们强调了评估模型时使用测试集和验证集的重要性,以避免过拟合,并讨论了超参数选择的关键策略。
最后,我们总结了概率图模型学习相较于通用机器学习算法的独特优势,包括处理结构化预测、融入先验知识、单一模型多用途以及提供直观的知识发现形式。这些概念为我们后续深入具体的学习算法奠定了坚实的基础。


002:正则化-过拟合问题

在本节课中,我们将要学习机器学习中的一个核心问题——过拟合。我们将探讨什么是过拟合,它如何影响线性回归和逻辑回归等算法的性能,并初步了解解决过拟合问题的两种主要方法。

什么是过拟合?
上一节我们提到了学习算法可能遇到的性能问题。本节中,我们来看看一个具体且常见的问题:过拟合。
让我们继续使用线性回归预测房价的例子,其中我们希望通过房屋大小来预测价格。
我们可以用线性函数来拟合这些数据。如果这样做,可能会得到一条直线。但这并不是一个很好的模型。观察数据可以发现,随着房屋面积增大,房价的增长趋势似乎会逐渐*缓。因此,这个算法对训练数据的拟合并不好。我们称这个问题为欠拟合。
另一个描述此问题的术语是,该算法具有高偏差。这两个术语大致意味着算法甚至不能很好地拟合训练数据。“偏差”是一个历史或技术术语,其核心思想是:如果算法坚持用直线拟合数据,就好像它有一个非常强烈的先入之见或偏见,认为房价会随面积线性变化。尽管有相反的数据证据,这种偏见仍导致它拟合出一条直线,最终对数据的拟合效果很差。
在中间情况下,我们可以用二次函数来拟合数据。对于这个数据集,拟合二次函数可能会得到一条曲线,效果相当不错。
另一个极端情况是,如果我们用一个四次多项式来拟合数据。这里有5个参数 θ0 到 θ4。利用这些参数,我们实际上可以拟合出一条穿过所有五个训练样本的曲线。我们可能会得到一条看起来上下波动非常剧烈的曲线。一方面,这似乎对训练集拟合得非常好,因为它穿过了所有数据点。但这仍然是一条非常曲折的曲线,我们并不认为这是预测房价的好模型。
这个问题我们称之为过拟合。
另一个描述此问题的术语是,该算法具有高方差。“高方差”是另一个历史或技术术语,其直观理解是:如果我们拟合如此高阶的多项式,那么假设函数几乎可以拟合任何函数。可能的假设空间太大、太易变,而我们没有足够的数据来约束它以得到一个好的假设。这就是过拟合。在中间情况下并没有特定的名称,但二次多项式函数似乎恰好适合拟合这些数据。
简单回顾一下,当特征过多时,就会出现过拟合问题。此时,学习到的假设可能对训练集拟合得非常好,以至于成本函数可能非常接*0甚至正好为0。但最终可能会得到一条过度拟合训练集的曲线,以至于无法很好地推广到新样本,即无法很好地预测新房屋的价格。这里的“推广”指的是假设函数对于训练集中未见过的新样本(新数据、新房屋)的应用能力。
以上我们看了线性回归中的过拟合案例。类似的情况也适用于逻辑回归。
这是一个有两个特征 x1 和 x2 的逻辑回归例子。我们可以用一个简单的假设来拟合逻辑回归,例如 hθ(x) = g(θ0 + θ1*x1 + θ2*x2),其中 g 是S型函数。如果这样做,最终会得到一个试图用直线分隔正负样本的假设。这看起来并不是一个很好的拟合。因此,这又是一个欠拟合或假设具有高偏差的例子。
相反,如果在特征中加入二次项,那么可能会得到一个看起来更像这样的决策边界。这是一个对数据相当好的拟合,可能是在这个训练集上能得到的最好结果之一。
最后,在另一个极端,如果拟合一个非常高阶的多项式,生成许多高阶多项式项和特征,那么逻辑回归可能会扭曲自身,非常努力地寻找一个决策边界,以极尽所能地拟合每一个训练样本。如果特征 x1 和 x2 用于预测肿瘤是恶性还是良性,这看起来并不是一个用于预测的好假设。因此,这又是一个过拟合、假设具有高方差且不太可能很好推广到新样本的例子。
在后续课程中,当我们讨论调试和诊断学习算法可能出错的地方时,会提供具体的工具来识别何时发生过拟合以及何时发生欠拟合。
但现在,让我们讨论一下,如果认为发生过拟合,我们可以采取什么措施来解决它?
如何解决过拟合问题?
在之前的例子中,我们有一维或二维数据,因此可以直接绘制假设函数图,观察发生了什么,并选择合适次数的多项式。例如,在房价预测的例子中,我们可以绘制假设函数图,看到它拟合了一条非常曲折、到处波动的曲线,然后可以用这样的图表来选择合适次数的多项式。
因此,绘制假设函数图可能是决定使用多少次多项式的一种方法,但这并不总是有效。事实上,更多时候我们可能面临的学习问题是拥有大量特征,而不仅仅是选择多项式次数的问题。当我们有如此多的特征时,绘制数据和可视化以决定保留或舍弃哪些特征也变得困难得多。
具体来说,如果我们试图预测房价,有时我们可能拥有大量不同的特征。所有这些特征似乎可能都有用。但是,如果我们有很多特征而训练数据很少,那么过拟合就可能成为一个问题。
为了解决过拟合,我们主要有两个选择。
以下是第一种选择:
- 减少特征数量:我们可以手动检查特征列表,尝试决定哪些是更重要的特征,从而决定应该保留哪些特征,舍弃哪些特征。在本课程后面,我们还将讨论模型选择算法,这些算法可以自动决定保留和舍弃哪些特征。减少特征数量的想法可以很好地工作并减少过拟合,当我们讨论模型选择时,会更深入地探讨这一点。但缺点是,舍弃一些特征的同时,也舍弃了关于问题的一些信息。例如,也许所有这些特征实际上对预测房价都有用,所以我们可能并不想丢弃我们的信息或特征。
上一节我们介绍了通过减少特征数量来对抗过拟合。本节中,我们来看看第二种选择:正则化。
以下是第二种选择:
- 正则化:在这种方法中,我们将保留所有特征,但会减小参数
θj的大小或数值。当我们有很多特征,且每个特征都对预测y值有一点贡献时(就像我们在房价预测例子中看到的那样,我们可能有很多特征,每个特征都有点用),这种方法效果很好。因此,也许我们不想丢弃它们。
这从很高的层面描述了正则化的思想。我意识到所有这些细节可能对你来说还不完全清楚,但在下一个视频中,我们将开始精确地阐述如何应用正则化以及正则化的确切含义,然后我们将开始弄清楚如何使用它来使学习算法运行良好并避免过拟合。

总结

本节课中,我们一起学习了机器学习中的过拟合问题。我们了解到,当模型过于复杂(例如使用高阶多项式)时,可能会过度拟合训练数据中的噪声和细节,导致在新数据上表现不佳,即泛化能力差。相反,过于简单的模型则会导致欠拟合。为了解决过拟合,我们初步探讨了两种主要策略:一是减少特征数量以简化模型,二是通过正则化技术来约束模型参数的大小,从而在保留所有特征的同时控制模型复杂度。在接下来的课程中,我们将深入探讨正则化的具体实现。
003:正则化代价函数

在本节课中,我们将学习正则化的核心概念与工作原理。正则化是一种用于防止机器学习模型过拟合的技术,它通过修改代价函数来约束模型参数的大小,从而获得更简单、泛化能力更强的模型。

正则化的直观理解 🧠
上一节我们介绍了过拟合问题,即模型在训练集上表现很好,但在新数据上表现不佳。本节中我们来看看正则化如何帮助我们解决这个问题。
通过幻灯片上的手绘示例,我们可以部分理解正则化的直觉。但更好的方式是亲自实现它,并在编程练习中观察其效果。
假设我们用一个二次函数拟合数据,效果很好。但如果使用一个高阶多项式,可能会得到一条非常曲折的曲线,它在训练集上拟合得很好,但实际上是过拟合,泛化能力差。
考虑以下情况:假设我们惩罚参数 θ₃ 和 θ₄,使它们变得非常小。具体来说,我们在原有的*方误差代价函数基础上,添加两项惩罚项:+ 1000 * θ₃² + 1000 * θ₄²。
为了使这个新的代价函数最小化,θ₃ 和 θ₄ 必须非常小,否则惩罚项会很大。因此,在最小化过程中,θ₃ 和 θ₄ 会趋*于0。这相当于去掉了模型中的这两个高阶项。结果,我们基本上得到了一个二次函数,它对数据的拟合更好,也更简单。
在这个例子中,我们惩罚了两个较大的参数值。更一般地,正则化的核心思想是:参数值较小通常对应于更简单的假设。更简单的假设通常更*滑,因此也更不容易过拟合。
虽然“小参数对应简单假设”的推理可能目前还不完全清晰,但通过 θ₃ 和 θ₄ 的例子,希望能给你一些直观感受。
正则化的通用方法 🔧
在房价预测的例子中,我们可能有100个特征(如面积、卧室数量、楼层数等)。与多项式例子不同,我们无法预先知道哪些特征(对应哪些参数)是不重要的。
因此,在正则化中,我们不会只挑选个别参数进行惩罚,而是修改代价函数,使其惩罚所有参数(通常不包括 θ₀)。
以下是修改后的线性回归正则化代价函数:
J(θ) = \frac{1}{2m} \left[ \sum_{i=1}^{m} (h_θ(x^{(i)}) - y^{(i)})^2 + \lambda \sum_{j=1}^{n} θ_j^2 \right]
其中:
- 第一项是原来的均方误差代价。
- 第二项是正则化项,它惩罚所有参数
θ₁到θₙ的*方和。 λ称为正则化参数。
λ 控制着两个目标之间的权衡:
- 拟合训练数据:由第一项体现,我们希望模型能很好地拟合训练集。
- 保持参数较小:由第二项体现,我们希望得到一个更简单的模型,避免过拟合。
对于房价预测,即使我们使用了所有高阶多项式特征,只要在目标函数中加入了正则化项,我们最终可能得到一条像洋红色曲线那样更*滑、更简单的函数,它对数据的假设更好。
正则化参数 λ 的影响 ⚖️
在正则化线性回归中,正则化参数 λ 的选择至关重要。
- 如果
λ设置得非常大:参数θ₁到θₙ会受到极大的惩罚,导致它们都趋*于0。这相当于模型变成了h_θ(x) = θ₀,即一条水*的直线。这种模型无法拟合数据,称为欠拟合或高偏差。它对于数据有太强(且错误)的先入之见。 - 如果
λ设置得当:可以在很好地拟合数据和保持模型简单之间取得*衡,从而获得良好的泛化性能。 - 如果
λ = 0:则正则化项消失,模型变回原来的普通最小二乘回归,可能出现过拟合。
因此,为了使正则化效果良好,需要谨慎选择 λ 的值。在本课程后续关于模型选择的部分,我们将讨论自动选择正则化参数 λ 的各种方法。
总结 📝

本节课中我们一起学习了正则化的核心思想。正则化通过向代价函数中添加一个惩罚项(通常是参数*方和)来约束模型参数的大小,从而倾向于选择更简单的模型,以对抗过拟合。正则化参数 λ 控制着模型复杂度和拟合程度之间的权衡。选择适当的 λ 是获得一个泛化性能良好模型的关键。

在接下来的课程中,我们将把这些思想具体应用到线性回归和逻辑回归中,使它们能够避免过拟合问题。
004:评估假设

在本节课中,我们将学习如何评估一个由算法学习得到的假设。理解如何正确评估模型是机器学习中的关键一步,它直接关系到我们能否判断模型的好坏以及后续的改进方向。在后续课程中,我们将以此为基础,探讨如何防止过拟合与欠拟合的问题。

训练误差的局限性
当我们拟合学习算法的参数时,通常会选择那些能最小化训练误差的参数。你可能会认为获得一个非常低的训练误差值是一件好事。
然而,我们已经知道,仅仅因为一个假设具有较低的训练误差,并不意味着它必然是一个好的假设。我们已经见过假设如何出现过拟合的例子,从而导致模型无法泛化到训练集之外的新样本。
评估假设的挑战
在这个简单的例子中,我们可以绘制假设函数 H(x) 的图像来观察发生了什么。但在一般情况下,对于特征数量多于一个的问题,或者像这样具有大量特征的问题,绘制假设函数的样子变得困难甚至不可能。
因此,我们需要其他方法来评估一个假设。
标准评估方法:训练集与测试集
评估学习到的假设的标准方法如下。假设我们有一个数据集,这里我展示了10个训练样本,但通常我们可能有几十、几百甚至几千个训练样本。
为了确保能够评估我们的假设,我们要做的是将拥有的数据分成两部分:第一部分将作为我们通常的训练集,第二部分将作为我们的测试集。
一个典型的数据分割比例是大约 70% 的数据用于训练集,30% 的数据用于测试集,训练集占比更大。
如果我们有一个数据集,我们可能只将大约70%的数据分配给我们的训练集(这里 M 照常表示训练样本的数量),剩余的数据则被分配为我们的测试集。这里我将使用符号 M_test 来表示测试样本的数量。
一般来说,下标 test 表示来自我的测试集的样本。因此,(x1_test, y1_test) 是我的第一个测试样本。
最后一个细节:虽然这里我画得好像前70%去了训练集,后30%去了测试集,但如果数据有任何排序,实际上最好将数据的随机70%发送到训练集,随机30%发送到测试集。所以,如果你的数据已经是随机排序的,你可以直接取前70%和后30%。但如果你的数据没有随机排序,最好在将前70%作为训练集、后30%作为测试集之前,先随机打乱或重新排序训练集中的样本。
训练与测试流程
以下是一个相当典型的训练和测试学习算法(例如线性回归)的流程:
-
从训练集学习参数:首先,你从训练集学习参数
θ,即最小化通常的训练误差目标函数J(θ)。这里的J(θ)仅使用你所有数据中的那70%(即训练数据)来定义。 -
计算测试误差:然后,你计算测试误差,我将其表示为
J_test。具体做法是,取你从训练集学习到的参数θ,代入以下公式计算测试集误差:J_test(θ) = (1/(2 * M_test)) * Σ (h_θ(x_test^(i)) - y_test^(i))^2这基本上是在你的测试集上测量的*均*方误差。这和你预期的差不多:用参数为
θ的假设运行每一个测试样本,然后测量你的假设在M_test个测试样本上的*方误差。
当然,这是使用线性回归和*方误差度量时的测试集误差定义。
分类问题的评估
如果我们处理的是分类问题,比如使用逻辑回归呢?在这种情况下,训练和测试逻辑回归的过程非常相似。
首先,我们从训练数据(即前70%的数据)中学习参数 θ。然后,我们如下计算测试误差:
J_test(θ) = (-1/M_test) * Σ [ y_test^(i) * log(h_θ(x_test^(i))) + (1 - y_test^(i)) * log(1 - h_θ(x_test^(i))) ]
这与我们一直用于逻辑回归的目标函数相同,只是现在它是用我们的 M_test 个测试样本来定义的。
虽然 J_test 的这个定义是完全合理的,但有时存在另一种更容易解释的测试集度量标准,即误分类误差,也称为 0/1 误分类误差(0/1表示你要么正确分类一个样本,要么错误分类)。
让我来定义一下。我将预测 h_θ(x) 在给定标签 y 时的误差定义如下:
error(h_θ(x), y) = 1, 如果 (h_θ(x) ≥ 0.5 且 y=0) 或 (h_θ(x) < 0.5 且 y=1)
error(h_θ(x), y) = 0, 其他情况(即分类正确)
这两种情况基本上对应于你的假设在阈值为0.5时错误标记了样本:要么假设认为它更可能是1,但实际是0;要么假设认为它更可能是0,但实际标签是1。
然后,我们可以使用误分类误差度量来定义测试误差:
J_test(θ) = (1/M_test) * Σ error(h_θ(x_test^(i)), y_test^(i))
这只是我写出的一种方式,表示这正是我的假设在我的测试集中错误标记的样本比例。这就是使用0/1误分类误差度量时的测试集误差定义。

总结
本节课中,我们一起学习了评估学习算法所得假设的标准方法。核心在于将数据集分割为训练集和测试集,通常按 70/30 的比例。我们首先在训练集上学习模型参数,然后在未见过的测试集上计算误差来评估模型的泛化能力。对于回归问题,常用均方误差;对于分类问题,除了类似逻辑回归的损失函数,更直观的评估指标是误分类误差率,它直接反映了模型分类错误的样本比例。

正确评估假设是模型选择和改进的基石。在下一节中,我们将运用这些思想来帮助我们做诸如为学习算法选择多项式次数等特征,或选择学习算法的正则化参数等决策。
005:模型选择与训练-验证-测试集


在本节课中,我们将要学习如何解决模型选择问题,例如选择多项式的阶数或正则化参数。我们将介绍如何将数据集划分为训练集、验证集和测试集,并利用验证集进行模型选择,从而获得对模型泛化能力的可靠估计。
过拟合与泛化误差
上一节我们介绍了过拟合的概念。一个模型在训练集上表现良好,并不意味着它是一个好的假设。更普遍的原则是,一旦参数在某个数据集(例如训练集)上拟合,那么在该数据集上测量的假设误差(例如训练误差)不太可能是实际泛化误差的良好估计。泛化误差衡量的是假设在未见过的数据上的表现。
模型选择问题
现在,让我们考虑模型选择问题。假设你想决定用几阶多项式来拟合数据,或者选择学习算法的正则化参数λ。这被称为模型选择问题。在我们的讨论中,我们将不仅介绍如何将数据拆分为训练集和测试集,还会介绍如何拆分为训练集、验证集和测试集。
数据集划分方法
为了解决模型选择中的偏差问题,我们通常将数据集划分为三个部分,而不是两个。
以下是三个部分及其典型划分比例:
- 训练集:用于拟合模型参数。通常占总数据的60%。
- 验证集:用于模型选择和调整超参数。通常占总数据的20%。
- 测试集:用于最终评估所选模型的泛化性能。通常占总数据的20%。
我们用 m_train、m_cv、m_test 分别表示各集合的样本数量。验证集样本记为 (x_cv^(i), y_cv^(i))。
相应地,我们可以定义三种误差:
- 训练误差:
J_train(θ),在训练集上计算。 - 验证误差:
J_cv(θ),在验证集上计算。 - 测试误差:
J_test(θ),在测试集上计算。
使用验证集进行模型选择
上一节我们介绍了数据集划分,本节中我们来看看如何具体使用验证集进行模型选择。
假设我们需要在10个不同阶数的多项式模型(从1阶到10阶)中选择一个。参数 d 代表多项式的阶数。
以下是使用验证集进行模型选择的步骤:
- 对于每个候选模型(
d = 1, 2, ..., 10),使用训练集最小化代价函数,得到对应的参数向量θ^(1), θ^(2), ..., θ^(10)。 - 使用验证集计算每个假设的验证误差:
J_cv(θ^(1)), J_cv(θ^(2)), ..., J_cv(θ^(10))。 - 选择验证误差最小的模型。例如,假设4阶多项式(
d=4)的验证误差最低,则我们选择该模型。 - 最后,使用测试集来评估所选模型(
d=4,参数为θ^(4))的泛化误差,即计算J_test(θ^(4))。
通过这个方法,我们使用验证集来拟合超参数 d,而测试集则被完整地保留下来,用于提供对最终模型泛化性能的无偏估计。
关于实践的建议

需要指出的是,在当前的机器学习实践中,有些人会直接使用测试集进行模型选择,然后用同一个测试集报告误差。这种做法不是好的实践。虽然如果你有一个非常庞大的测试集,这可能不是一个特别糟糕的做法,但大多数机器学习从业者建议不要这样做。更好的做法是拥有独立的训练集、验证集和测试集。尽管有时你会看到有人只使用训练集和测试集,但如果可能,我建议你不要这样做。
总结

本节课中我们一起学习了模型选择的核心方法。我们了解到,直接使用测试集进行模型选择会导致对泛化误差的乐观估计。为了解决这个问题,我们将数据集划分为训练集、验证集和测试集。我们使用训练集来拟合模型参数,使用验证集来选择最佳模型(或调整超参数),最后使用测试集来获得对最终模型泛化能力的可靠、无偏的评估。这是确保机器学习模型评估结果可信的关键步骤。
007:正则化与偏差方差


在本节课中,我们将深入探讨正则化如何影响学习算法的偏差与方差。我们将学习如何自动选择最佳的正则化参数 λ,并理解训练误差与交叉验证误差随 λ 变化的关系。
正则化对偏差与方差的影响
上一节我们介绍了正则化可以防止过拟合。本节中,我们来看看正则化如何影响学习算法的偏差和方差。
假设我们正在拟合一个高阶多项式,如上图所示。为了防止过拟合,我们使用如下所示的正则化项,即添加一个惩罚项来保持参数值较小。通常,正则化项从 j=1 求和到 n,而不是从 j=0 开始。
让我们考虑三种情况。
以下是三种不同的正则化参数 λ 取值情况:
- λ 值非常大(例如 λ = 10,000):在这种情况下,所有参数 θ1, θ2, θ3 等都将受到严重惩罚,最终大多数参数值会接*于零。假设函数 h(x) 将大致等于 θ0,结果是一条*似*坦的直线。这种假设具有高偏差,会严重欠拟合数据集。
- λ 值非常小(例如 λ = 0):在这种情况下,由于我们拟合的是高阶多项式,且几乎没有正则化,我们最终会陷入高方差的过拟合状态。
- λ 值适中:只有当 λ 取值既不太大也不太小,我们才能得到能合理拟合数据的参数 θ。
自动选择正则化参数 λ
那么,我们如何自动为正则化参数 λ 选择一个好的值呢?重申一下,这是我们的模型和学习算法的目标函数(使用正则化时)。
让我定义 J_train(θ) 为不包含正则化项的优化目标。之前在不使用正则化时,我将 J_train(θ) 定义为与成本函数 J(θ) 相同。但在使用正则化时,我们将 J_train(训练集误差)定义为训练集上的*方误差和(或*均*方误差),不考虑正则化项。类似地,交叉验证集误差 J_CV 和测试集误差 J_test 也按此定义,即它们在各自数据集上的*均*方误差(不含正则化项)。
公式:
J_train(θ) = (1/(2m)) * Σ (h_θ(x^(i)) - y^(i))^2 (对训练集求和)
以下是自动选择 λ 的步骤:
- 设定一个 λ 值的尝试范围。例如,可以尝试 λ = 0, 0.01, 0.02, 0.04, 0.08, ... , 10.24。通常按 2 的倍数递增,这大约会得到 12 个不同的 λ 值。
- 对于这 12 个 λ 值中的每一个,分别最小化成本函数 J(θ),得到对应的参数向量 θ。我们将其记为 θ¹, θ², ..., θ¹²。
- 使用交叉验证集评估所有这些假设(即这些不同的 θ)。计算每个参数向量在交叉验证集上的*均*方误差。
- 选择在交叉验证集上误差最小的那个模型对应的 λ 值。假设我们选择了 θ⁵。
- 最后,为了报告模型在未知数据上的表现,我们使用独立的测试集来评估选定的参数 θ⁵,得到测试集误差。
训练误差与交叉验证误差随 λ 的变化
为了更好地理解训练误差和交叉验证误差如何随正则化参数 λ 变化,我们来绘制 J_train 和 J_CV 的曲线图。
- 当 λ 很小时,我们使用的正则化很少,过拟合的风险较高(高方差区域)。此时,模型可以相对较好地拟合训练集,所以 J_train 会很小。但由于过拟合,模型在交叉验证集上表现不佳,所以 J_CV 会很大。
- 当 λ 很大时,我们面临高偏差问题,可能连训练集都拟合不好(欠拟合)。因此,J_train 会很大。同时,由于欠拟合,模型在交叉验证集上表现也很差,所以 J_CV 也很大。
因此,J_train(θ) 倾向于随着 λ 的增加而增加,因为大的 λ 对应高偏差,可能无法很好地拟合训练集。而小的 λ 对应可以自由地用高阶多项式拟合数据。
交叉验证误差 J_CV(θ) 的曲线通常呈 U 形:
- 在右侧(λ 大),处于偏差主导区域,交叉验证误差高。
- 在左侧(λ 小),处于方差主导区域(过拟合),交叉验证误差也高。
- 在中间某个适中的 λ 值处,交叉验证误差达到最小,这个 λ 值通常效果最好。
在实际数据集上,得到的曲线可能比这里展示的理想化曲线更杂乱、更有噪声,但通常能观察到这种大致的趋势。通过观察交叉验证误差的曲线图,我们可以手动或自动地选择使交叉验证误差最小的 λ 值。绘制这样的图表有助于我更好地理解情况,并验证是否为正则化参数 λ 选择了一个好的值。
总结
本节课中,我们一起学习了正则化对学习算法偏差和方差的影响。我们了解到:
- 过大的 λ 会导致高偏差(欠拟合)。
- 过小的 λ 会导致高方差(过拟合)。
- 适中的 λ 才能取得良好的*衡。
我们还掌握了通过在一系列 λ 值上训练模型,并使用交叉验证集选择最佳 λ 的自动选择方法。最后,我们分析了训练误差和交叉验证误差随 λ 变化的典型曲线,这有助于诊断和选择最佳的正则化强度。

在接下来的视频中,我们将基于所有这些关于偏差和方差的见解,构建一个称为“学习曲线”的诊断工具,用于判断学习算法是存在偏差问题、方差问题,还是两者兼有。
008:最大似然估计基础 🎯

在本节中,我们将学习参数估计中最核心的构件——最大似然估计。我们将从一个最简单的学习问题开始,即估计一组参数,并在此基础上构建更复杂问题的解决方案。
从最简单的学习问题开始
我们从一个最简单的学习问题开始讨论,即估计一组参数。参数估计的关键构件被称为最大似然估计。我们首先将定义它,然后在更复杂问题的背景下进行构建。

让我们回到最简单的学习问题:我们从一个有偏的硬币生成数据,这是一个伯努利分布。变量X取值为1的概率由某个参数θ定义,因此取值为0的概率是1-θ。
假设我们获得了一个数据集D,它包含许多实例x₁到x_M,这些实例是从分布P中独立同分布采样得到的。
让我们回顾一下独立同分布的含义。第一个“独立”意味着每次抛掷彼此独立。“同分布”意味着它们都从同一个分布P中采样。我们的目标是利用这些数据来重建参数θ。
将问题建模为概率图模型
让我们将其视为一个概率图模型。事实上,这是我们之前在讨论盘模型时见过的概率图模型。
这里我们有一个参数θ,以及同一实验的一堆重复样本,即这些x变量。它们从θ独立采样。如果我们将其视为一个图模型,我们可以看到每个X都依赖于θ,并且在已知θ的条件下,它们彼此条件独立。因此,给定θ,它们是独立同分布的。
如果将其视为图模型,它需要有条件概率分布。对于第m次抛掷,给定θ的条件概率分布是:X取值为x₁的概率是θ,取值为x₀的概率是1-θ。这是一个完全合法的条件概率分布,其父节点是θ。θ是X变量的父节点,它是一个连续变量,但我们之前处理过这类变量。
定义最大似然估计的目标
既然我们已经将其指定为概率图模型,现在可以回过头来思考最大似然估计如何工作。
目标是找到一个参数θ(在区间[0,1]内),它能很好地预测数据集D。特定参数θ的质量取决于它预测D的好坏程度,也可以视为给定特定θ值时数据的似然性。
让我们尝试理解这意味着什么。我们可以问:给定一个特定的θ值,我们观测到的数据集D的概率是多少?
由于在给定θ的条件下,抛掷或实例X_i是条件独立的,我们可以将其写为所有M个实例的概率乘积。

现在,让我们在一个具体示例的背景下思考这个问题。假设我们抛掷这枚硬币五次,得到三次正面和两次反面(或三个1和两个0)。
如果我们实际写下这个概率函数的样子,我们可以看到它将是:给定θ得到正面的概率,乘以给定θ得到反面的概率,再乘以得到正面的概率,再乘以另一个正面的概率。第一个正面给定θ的概率是θ,反面的概率是1-θ,然后是1-θ,θ,θ。最终结果是θ³(1-θ)²。
这正是此处绘制的函数。现在,如果我们寻找能最好预测数据的θ,我们只需将其定义为最大化此函数的θ。从最大值向下画一条线,我们可以看到该函数在θ=0.6处达到最大,这并不奇怪,它等于我们观测到的五次抛掷中三次正面的比例。
推广到一般情况
让我们将其推广。假设在这个背景下我们观测到M_H次正面和M_T次反面,我们想要找到使似然函数最大化的θ。正如在简单示例中一样,这个似然函数将包含θ出现M_H次和(1-θ)出现M_T次。这将给我们一个似然函数,其形式与上一行看到的类似。

如果我们思考如何最大化这样的函数,通常采取以下步骤:首先,考虑对数似然(用小写L表示)比考虑似然本身更方便,它只是上述表达式的对数。这样做的好处是将乘积转化为求和,从而得到一个更简单的优化目标,但其最大值完全相同。
现在,我们可以继续采用最大化此类函数的标准方法:对对数似然函数求导,并求解θ。这将给出一个最优解,正如我们所期望的那样,它是正面次数占总抛掷次数的比例。这就是对数似然函数的最大值,因此也是似然函数的最大值。
充分统计量的概念
在最大似然估计的背景下,一个重要的概念是充分统计量。这个概念在我们进一步展开时也很重要。

在抛硬币的例子中,我们计算θ时,将似然函数定义为此形式。注意,这个表达式不关心正面和反面出现的顺序,它只关心正面的次数和反面的次数。这足以定义似然函数,因此也足以最大化似然函数。
在这种情况下,M_H和M_T就是这个特定估计问题中所谓的充分统计量,因为它们足以理解似然函数并对其进行优化。
更一般地说,数据的函数是一个充分统计量,如果它是一个从实例到R^k中某个向量的函数,并且满足以下性质:对于任意两个数据集D和D‘,以及任何可能的参数θ,如果S(D)等于S(D‘),那么这两个数据集的似然函数是相同的。

S(D)是什么?S(D)是所有实例的充分统计量之和。我们试图做的是查看一堆数据集,并使用一个更小、更紧凑的概念来总结数据集,即统计量,它丢弃了数据中对于重建其似然函数不必要的方面。
多项分布的例子
让我们看一个多项分布的例子,这是我们之前伯努利例子的推广。假设我们有一组变量X的测量值,X可以取k个可能的值。
在这种情况下,充分统计量就像之前一样:之前我们有正面次数和反面次数,这里我们有每个k值出现的次数,即M₁, M₂, ..., M_k。例如,如果你在寻找一个六面骰子的充分统计量,你将得到M₁到M₆,分别代表骰子出现1到6的次数。
那么,在这种情况下充分统计量函数是什么?它是一个k维元组,包含不同值的计数,即变量不同值的数量。对于值x_i,其充分统计量是一个向量,其中只有第i个位置是1,其他位置都是0。如果我们对所有数据实例的S(x_m)求和,你将得到一个向量,只有当第m个数据实例出现该特定值时,你才会得到1的贡献。因此,结果将是[M₁, M₂, ..., M_k]。
这是一个充分统计量,因为似然函数可以重构为θ_i^{M_i}的乘积,其中这里的θ_i是参数P(X = x_i)。

高斯分布的例子
让我们看一个不同的例子:高斯分布的充分统计量。提醒一下,这是一个一维高斯分布,有两个参数:μ(均值)和σ²(方差)。它可以写成我们之前见过的形式。
我们可以用以下方式重写指数部分:基本上展开指数中的二次项,最终得到一个似然函数,其指数部分包含-x²乘以一项,加上x乘以一项,再减去一个常数项。现在可以看出,高斯分布的充分统计量是x²、x和1。因为当我们对多个x的出现计算P(x)的乘积时,最终会对不同数据案例的x²求和,对不同数据案例的x求和,而这一项就是数据案例的数量。
因此,数据集D的S将是:对所有m的x_m²求和,对所有m的x_m求和,以及数据案例的数量N。由此,我们可以重建似然函数。
如何进行最大似然估计
正如我们讨论过的,我们希望选择θ以最大化似然函数。如果我们直接优化前面幻灯片中多项分布的函数,最大似然估计结果非常简单:对于值x,其估计就是数据中x出现的比例。这同样是一个非常自然的估计。
对于高斯分布,我们最终得到以下最大似然估计:均值是经验均值(即所有数据案例的*均值),标准差是经验标准差。
总结
本节课中我们一起学习了最大似然估计。最大似然估计是一个非常简单的基本原则,用于在给定数据集D的情况下从一组参数中进行选择。
我们可以通过用充分统计量总结数据集来计算最大似然估计,充分统计量通常比原始数据D简洁得多,这为我们提供了一种计算高效的方式来总结数据集以进行估计。

事实证明,对于我们关心的许多参数分布,给定充分统计量后,最大似然估计具有易于计算的闭式解。
009:贝叶斯网络的最大似然估计 🎯

在本节课中,我们将学习如何对贝叶斯网络中的所有参数进行最大似然估计。我们将从单一参数的情况扩展到更复杂的网络结构,并探讨参数共享和数据碎片化等重要概念。
从单一参数到完整网络
上一节我们介绍了单一参数的最大似然估计原理。本节中,我们来看看如何对一个给定结构的贝叶斯网络中的所有参数进行最大似然估计。
考虑一个通用的贝叶斯网络,其变量不一定是二值的。参数集包括:
- 所有变量
X的取值对应的参数θ_x。 - 所有父节点
X和子节点Y的取值对应的条件参数θ_y|x。
这就是通用情况下,表格条件概率分布对贝叶斯网络的参数化。
似然函数的分解
现在思考参数集 θ 的似然函数。似然函数是给定参数下数据的概率,由于数据独立同分布,它可以分解为所有数据实例 (x^m, y^m) 相对于参数 θ 的概率乘积。
对于贝叶斯网络,我们可以利用链式法则将这个联合概率分解。在这个简单例子中,就是父节点 X 的概率乘以给定 X 时 Y 的条件概率。
通过重新排列乘积顺序,我们可以将似然函数分解为两个“局部似然”函数的乘积:
- 一个仅依赖于参数
θ_x的变量X的似然。 - 一个仅依赖于参数
θ_y|x的变量Y给定其父节点X的似然。
更一般地,对于一组变量 X1 到 Xn,我们可以重复这个过程。利用贝叶斯网络的链式法则,将每个数据实例的概率分解为每个变量 Xi 给定其父节点 Ui 的概率乘积。通过交换乘积顺序,我们再次得到一系列项的乘积,每一项被称为变量 Xi 的局部似然。
如果我们假设不同的条件概率分布不共享参数,那么每个条件概率分布都可以被独立地估计。这意味着我们可以通过优化这个局部似然项,来独立于其他变量地优化变量 Xi 的参数。
表格条件概率分布的进一步分解
对于表格条件概率分布,局部似然可以进一步分解。以下是分解步骤:
我们将数据实例按照变量 X 及其父节点 U 的具体取值 (x, u) 划分到不同的“桶”中。对于每一个取值组合 (x, u),我们收集所有满足该组合的数据实例 m。
对于这些实例,概率 P(X^m = x | U^m = u) 就是条件概率分布中对应的条目 θ_x|u。因此,局部似然函数变成了所有可能 (x, u) 组合的乘积,其中每个参数 θ_x|u 被提升到其在数据中出现次数 M[x,u] 的幂次。
于是,最大似然估计的结果正如我们所料:
公式: θ̂_x|u = M[x,u] / M[u]
其中 M[u] 是父节点取值为 u 的总次数。
具有共享参数的模型:以隐马尔可夫模型为例
现在考虑参数共享模型的最大似然估计。我们首先在一个马尔可夫链的背景下分析,然后扩展到隐马尔可夫模型。
对于一个仅包含状态变量 S 的马尔可夫链,其似然函数在马尔可夫假设下,可以分解为从时间 1 到 T 的状态转移概率的乘积。
我们可以进一步按特定的状态对 (Si, Sj) 来重组这个乘积。关键点在于,由于模型的时间不变性,从 Si 转移到 Sj 的概率在任何时间点都是相同的参数 θ_Si->Sj。
因此,似然函数最终变为所有状态转移参数 θ_Si->Sj 的乘积,每个参数被提升到其充分统计量——即数据中观察到从 Si 转移到 Sj 的次数 M[Si->Sj]——的幂次。
此时,参数 θ_Si->Sj 的最大似然估计为:
公式: θ̂_Si->Sj = M[Si->Sj] / Σ_k M[Si->Sk]
现在将其扩展到隐马尔可夫模型。除了与之前相同的状态转移似然项,我们还增加了观测似然项,即每个时间点给定状态 S_t 下观测到 O_t 的概率。

采用相同的重组过程,我们得到两个部分的乘积:
- 状态转移部分:
∏_ij (θ_Si->Sj)^(M[Si->Sj]) - 观测发射部分:
∏_ik (θ_O=k|S=i)^(M[S=i, O=k])
这里新增的充分统计量 M[S=i, O=k] 统计了在相同时间点,状态为 i 且观测为 k 的次数。
核心要点总结
本节课中我们一起学习了贝叶斯网络最大似然估计的核心思想和方法。

以下是主要结论:
- 似然函数分解:对于条件概率分布参数互不重叠的贝叶斯网络,其似然函数可分解为每个变量对应的局部似然函数的乘积。这使得我们可以分别优化每个变量。
- 表格条件概率分布的分解:当使用表格条件概率分布时,局部似然可进一步分解为每个父节点取值组合对应的多项分布的似然乘积。这允许我们像估计单一多项分布参数一样,独立地估计每一个条件概率分布条目。
- 共享参数的处理:对于具有共享条件概率分布的模型(如隐马尔可夫模型),我们只需在所有使用该分布的地方累积充分统计量,然后以相同的方式进行最大似然估计。
一个重要问题:数据碎片化
从最大似然估计的形式 θ̂_x|u = M[x,u] / M[u] 中,我们可以观察到一个重要现象,这在应用时需要谨记。
当父节点的数量增加时,可能的父节点取值组合 u 的数量会呈指数级增长。这意味着我们需要将数据划分到的“桶”的数量急剧增加。
其后果是,大多数“桶”(即大多数父节点取值组合 u)中只会分配到极少甚至为零的数据实例。此时,基于 M[u] 进行的任何参数估计都将是不可靠的。当父节点很多时,大多数多项分布参数的估计质量都会很差。

这个概念被称为数据碎片化。它带来了一个重要启示:当数据量有限,相对于模型复杂度(维度)不足时,使用更简单的模型结构(即使它做出了错误的独立性假设,即删除了本应存在的边)有时能在测试数据的对数似然等指标上,获得比使用更复杂但正确的结构更好的泛化性能。 这是因为简单模型参数更少,每个参数能从更多数据中学习,从而得到更稳健的估计。
010:贝叶斯估计

在本节课中,我们将要学习参数估计的另一种方法——贝叶斯估计。我们将探讨它如何克服最大似然估计的某些局限性,并理解其核心概念与计算过程。
概述
上一节我们介绍了最大似然估计,它试图优化给定参数下数据的似然性。本节我们将讨论一种提供更好特性的替代方法——贝叶斯估计。
最大似然估计的局限性
首先,我们需要理解为什么最大似然估计并不完美。
考虑以下两个场景。在第一个场景中,两支球队比赛了10次,第一支球队赢了7场。如果我们使用最大似然估计,第一支球队获胜的概率是0.7,这看起来是一个合理的预测。
在第二个场景中,我们从口袋里拿出一枚硬币,抛掷10次,其中7次正面朝上。最大似然估计会得出完全相同的估计值,即下一次抛掷出现正面的概率也是0.7。然而,仅基于这10次抛掷的结果做出这样的推断似乎不那么合理。
为了进一步阐述这个场景,想象我们拿着同一枚硬币,耐心地抛掷了10,000次,并且确实有7,000次正面朝上。此时正面的概率仍然是0.7,但相比之前只有10次抛掷的情况,这个推断现在可能更可信。

最大似然估计完全没有能力区分这三种场景:一种是熟悉的情况(如两支球队比赛),另一种是不熟悉的事件(如抛硬币);以及抛硬币10次与抛硬币10,000次之间的区别。这些区别在最大似然估计中都不明显。
贝叶斯估计框架
为了提供一个替代的形式化方法,我们将回到将参数估计视为概率图模型的观点。

在这个模型中,我们有参数 θ,数据依赖于参数 θ。但与之前只试图找出最可能的 θ 值不同,现在我们将采用一种截然不同的方法:我们假设 θ 本身是一个随机变量。它是一个连续值随机变量,在抛硬币的例子中,其取值范围在 [0,1] 之间。这是贝叶斯形式化的核心:任何我们不确定的事物,都应被视为一个随机变量,我们对其维持一个概率分布,并随着数据的获取而更新。
与最大似然估计的对比
让我们理解这种观点与最大似然估计观点的区别。

和以前一样,给定 θ,抛掷结果是独立的。但现在我们明确将 θ 视为随机变量,如果 θ 未知,那么抛掷结果在边际上就不是独立的。例如,如果我们观察到 x1 等于正面,这会告诉我们一些关于参数的信息,会增加我们相信参数偏向正面而非反面的概率,从而会改变我们对其他硬币抛掷结果的概率估计。因此,在未给定 θ 的情况下,硬币抛掷结果是边际依赖的。

这实际上给了我们一个关于所有硬币抛掷结果和参数的联合概率模型。使用我们在此绘制的概率图模型,我们可以通过该贝叶斯网络的链式法则分解这个概率分布。
我们得到 P(θ),这是网络根节点的参数先验分布,然后是给定 θ 下 x 的概率。由于网络结构,给定 θ 时它们是条件独立的。因此,我们可以将其分解为 θ 的先验乘以各个数据点在给定 θ 下的概率的乘积。
后面这部分正是我们之前熟悉的似然函数,即给定参数下数据的概率。在抛硬币的例子中,我们已经知道其形式为:θ^(正面次数) * (1-θ)^(反面次数)。
但现在我们多了一个项:P(θ),即我们从 θ 的先验分布中得到的概率。现在,由于我们有了先验分布,实际上也有了联合分布,我们可以继续计算给定数据集 D 后,参数 θ 的后验分布。
在观察了 M 次硬币抛掷的结果后,我对参数有了一个新的概率分布。通过简单的贝叶斯规则应用,后验分布等于似然函数乘以先验分布,再除以数据的概率。重要的是,正如在其他贝叶斯规则应用中一样,分母是一个归一化常数。
这里的“常数”是相对于 θ 而言的。这意味着如果我知道如何计算分子,我可以通过对 θ 的值进行积分来推导分母,从而得到使这个密度函数合法的归一化常数。
狄利克雷分布

当我们的参数描述了一个在 K 个不同值上的多项分布(例如参数 θ)时,最常用的参数分布是所谓的狄利克雷分布。

狄利克雷分布由一组称为超参数的 α1 到 αK 来刻画。这是为了与实际参数 θ 区分开来。
使用这些超参数定义的概率分布是 θ 的一个密度函数 P(θ),其形式如下。让我们先看依赖于参数 θ 的这部分。我们看到,对于多项分布中的每个条目 θ_i,我们有一个形式为 θ_i^(α_i - 1) 的表达式,其中 α_i 是相关的超参数。
为了使这是一个合法的密度函数,我们还需要一个归一化常数(配分函数),其形式如下(我们暂时不深入讨论),它是这些伽马函数之比的比值。伽马函数由以下积分定义。目前,我们不需要担心这个,因为我们现在真正关心的是内部表达式的形式,知道它需要被归一化以产生密度。
直观上,这些超参数 α 对应于我们迄今为止看到的样本数量。让我们理解为什么这种直觉成立。
狄利克雷分布示例

但在深入之前,让我们看几个狄利克雷分布的例子。这是一个特殊情况,即随机变量只有两个值,所以它实际上是伯努利随机变量的分布。在这种情况下,狄利克雷通常被称为 Beta 分布,但 Beta 分布只是具有两个参数的狄利克雷分布。

这里有几个狄利克雷(Beta)分布的例子。绿色线是 Dir(2,2),我们注意到它在中间有一个峰值,这对应于参数围绕中心值 0.5 的更强信念。当我们转到 Dir(5,5) 时,峰值变得更大。随着我们获得的数据量及其混合比例的变化,这个分布会向左或向右移动。随着数据越来越多,分布变得越来越尖锐。
粗略地说,α_正面 和 α_反面 之间的混合比例决定了峰值的位置,而 α 的总和决定了分布的尖锐程度。
后验分布计算
现在我们对狄利克雷分布有了一些了解,让我们看看在获得数据后它是如何更新的。
考虑一个情况,我们有一个先验分布,假设是狄利克雷分布。我们有一个从多项分布导出的数据集 D 的似然函数。现在我们想计算在观察到数据 D 后,参数 θ 的后验分布 P(θ|D)。
似然函数我们之前已经见过,对于具有 M_i 个取值为 x_i 的实例的数据集,其形式为:∏_i θ_i^(M_i)。
先验具有狄利克雷分布的形式,带有相关的超参数 α_i。
观察这一点很重要:似然函数中的 θ_i 项和先验中的 θ_i 项具有完全相同的指数形式。因此,当将似然函数与先验相乘时,你可以合并同类项(那些以 θ_i 为底的指数项),最终得到的后验分布看起来也完全像一个狄利克雷分布,因为它将具有形式:∏_i θ_i^(M_i + α_i - 1)。
所以,如果我们的先验是 Dir(α1, ..., αK),数据计数为 M1, ..., MK,那么后验分布就简单地是一个具有超参数 (α1 + M1, ..., αK + MK) 的狄利克雷分布。
这再次表明,狄利克雷分布的超参数代表了我们所见到的计数。如果先验地,我们看到 X 的计数是 α_i,现在我们又看到了额外的 M_i 次计数,那么在后验中,我们对于该特定事件的总计数就是 α_i + M_i。
共轭先验
从形式的角度来看,这是一个有用的术语:先验和后验具有相同形式的情况被称为共轭。因此,在这种情况下,狄利克雷分布是多项分布的共轭先验,因为如果我们有狄利克雷先验和多项似然,我们会得到狄利克雷后验。
事实证明,许多参数族都有一个很好的共轭先验,它允许我们以封闭形式维护参数上的概率分布,因为该参数的分布始终保持在同一表示族中(在此例中是狄利克雷族)。


总结
本节课中我们一起学习了贝叶斯学习的框架。
贝叶斯学习将参数视为随机变量(连续值随机变量),这使我们能够将学习问题重新表述为一个简单的推断问题。我们所做的是获取随机变量上的分布,并使用证据(即观察到的训练数据)来更新它。
具体来说,在离散随机变量的背景下,我们有多项分布作为似然函数,狄利克雷分布作为先验。我们遇到了这种非常优雅的情况:狄利克雷先验与多项分布是共轭的,这意味着后验与先验具有相同的形式。
这反过来又允许我们以封闭形式保持参数的分布,并且在我们不断更新它的过程中,其形式始终保持不变。该更新过程使用数据的充分统计量,通常以非常高效的形式进行。


011:贝叶斯预测

在本节课中,我们将要学习贝叶斯预测。我们将探讨如何在拥有参数分布(如狄利克雷分布)的模型中进行预测,理解先验信念如何影响预测,并观察随着数据量的增加,预测如何收敛到最大似然估计的结果。

概述
上一节我们定义了贝叶斯估计的概念,即在参数上有一个先验分布,并随着新数据的积累持续维护参数的后验分布。本节中,我们来看看如何利用这种包含参数分布的模型来对新实例进行预测。
使用参数分布进行预测
假设我们有一个模型,其参数θ服从一个具有特定超参数集的狄利克雷分布。如果我们想对依赖于参数θ的变量X的值进行预测,这本质上就变成了一个概率推断问题。
变量X取某个特定值x_i的概率,等于给定参数θ时X取该值的概率,乘以θ的先验分布,然后对θ的所有可能值进行积分(即边缘化)。
用公式表示如下:
P(X = x_i) = ∫ P(X = x_i | θ) * P(θ) dθ
对于狄利克雷-多项式模型,这个积分的结果是一个简洁的表达式:
P(X = x_i) = α_i / Σ_j α_j
其中,α_i是狄利克雷分布的超参数。这个结果非常直观:对新实例的预测值,就是对应于该结果的超参数α_i占所有超参数总和的比例。这再次印证了超参数可以被视为“伪计数”的直观理解。
贝叶斯预测的动态过程
现在,我们把上述结果与数据积累的过程结合起来,看看贝叶斯预测如何随数据量的增长而变化。
假设参数θ初始服从超参数为α的狄利克雷分布。我们已经观测到M个数据实例X_1, ..., X_M,现在想要预测第M+1个数据实例。
我们要求解的是条件概率P(X_{M+1} | X_1, ..., X_M)。通过引入参数θ并利用条件独立性,我们可以将其推导为:
P(X_{M+1} | X_1, ..., X_M) = ∫ P(X_{M+1} | θ) * P(θ | X_1, ..., X_M) dθ
其中,P(θ | X_1, ..., X_M)正是给定前M个数据后θ的后验分布。正如前一节所示,这个后验分布本身也是一个狄利克雷分布,其超参数更新为α_i + M_i,其中M_i是观测到结果i的次数。
因此,对新实例X_{M+1}的预测公式变为:
P(X_{M+1} = x_i | X_1, ..., X_M) = (α_i + M_i) / (α + M)
这里,α = Σ_i α_i,M = Σ_i M_i。

等效样本量的作用
参数α(所有超参数α_i之和)被称为等效样本量。它代表了在接收到真实数据X_1, ..., X_M之前,我们想象中的先验样本数量。
α的大小决定了先验信念的强度:
α较大:表示我们对先验有很强的信心,真实数据需要更多才能将我们的估计从先验值“拉”开。α较小:表示先验信念较弱,即使数据量不大,我们的估计也会迅速接*数据中观察到的经验频率。
示例:伯努利试验预测

让我们通过一个简单的伯努利试验(如抛硬币)例子来具体理解。
- 先验:我们选择一个均匀先验,即认为正面概率θ在[0,1]上均匀分布。这对应于一个超参数为
α = [1, 1]的狄利克雷分布。 - 数据:我们观测到5次抛掷,结果是4次正面(
M_1=4),1次反面(M_0=1)。 - 预测下一次抛掷:
- 最大似然估计:直接使用观测频率,预测正面概率为
4/5 = 0.8。 - 贝叶斯估计:使用公式
(α_1 + M_1) / (α + M) = (1+4)/(2+5) = 5/7 ≈ 0.714。
- 最大似然估计:直接使用观测频率,预测正面概率为
可以看到,贝叶斯估计的结果(0.714)被先验(0.5)“拉”向了中间,不像最大似然估计(0.8)那样完全依赖少量数据。
可视化影响
以下是不同条件下预测值随数据量增加而变化趋势的定性描述:
1. 固定数据比例,改变先验强度(α):
假设观测数据中正反面的比例固定为1:4。
- 当
α较小时(先验弱),只需少量数据,预测值就会迅速接*数据中的经验比例(0.2)。 - 当
α较大时(先验强),需要更多的数据才能将预测值从先验值(0.5)“拉”向经验比例(0.2)。
2. 固定先验强度(α),改变先验均值:
假设等效样本量α固定。
- 我们从不同的先验均值(例如,认为正面概率是0.8或0.2)开始。
- 随着数据积累,所有预测最终都会收敛到数据中的经验比例(0.2)。
- 初始先验离经验比例越远,收敛所需的数据量就越大。

贝叶斯预测的优势:*滑性与鲁棒性
从实用角度看,贝叶斯估计提供了一种*滑性。数据的随机波动不会像在最大似然估计中那样引起预测值的剧烈跳跃,尤其是在数据量较少的阶段。
例如,在抛硬币实验中,最大似然估计的预测线(蓝色)在数据量少时会围绕真实值大幅上下波动。而使用了先验的贝叶斯估计预测线则*滑得多,对随机噪声不那么敏感。这使得贝叶斯方法在数据稀疏的情况下具有更好的泛化能力和鲁棒性。

总结
本节课中我们一起学习了贝叶斯预测的核心思想。
贝叶斯预测结合了两种“充分统计量”:
- 来自真实数据的统计量(
M_i)。 - 来自构成先验分布的想象样本的统计量(超参数
α_i)。
预测新实例时,贝叶斯方法有效地结合了这两者:P(next instance) ∝ α_i + M_i。
随着数据量无限增加(渐*极限),真实数据项M将占据主导地位,先验的贡献会变得微不足道。因此,在极限情况下,贝叶斯预测会收敛到与最大似然估计相同的结果。
然而,在学习的早期阶段,即数据量还很少的时候,先验信念会产生相当显著的影响。狄利克雷超参数α不仅决定了我们初始的信念,也决定了这些信念的强度——即需要多少数据才能让经验分布的影响力超过先验。

最重要的是,正如我们在简单例子中看到的,这种贝叶斯学习范式在数据稀疏的情况下,因其*滑性和结合先验知识的能力,通常比单纯依赖数据频率的方法具有更强的鲁棒性和更好的泛化性能。
012:贝叶斯网络的贝叶斯估计 📊

在本节课中,我们将学习如何将贝叶斯估计的思想应用于贝叶斯网络的参数估计问题。我们将看到,在特定假设下,参数的后验分布可以分解为独立部分的乘积,这使得计算变得高效。我们还将探讨如何为网络中的所有参数设置先验分布。
从单变量到贝叶斯网络 🔄
上一节我们介绍了单变量(如多项式随机变量)的贝叶斯估计。现在,我们将回到概率图模型的世界,思考如何将这些思想应用于估计贝叶斯网络中的参数。

让我们再次画出表示贝叶斯网络中贝叶斯估计的概率图模型。与单变量情况类似,我们将把定义参数的随机变量显式地注入到模型中。这里我们有两个随机变量:θ_X(代表X的条件概率分布CPD)和 θ_Y|X(代表给定X时Y的CPD)。请注意,每个变量实际上都是向量值,因为每个CPD中都会有多个实际数值,但我们在图中用单个圆圈表示。
从图模型中读取结论 🔍
现在,我们可以观察这个网络并得出一些重要结论。
第一个重要结论是:在给定参数的情况下,实例(即X,Y数据对)是相互独立的。我们可以通过注意到,如果以 θ_X 和 θ_Y|X 为条件,那么X,Y数据对之间就变得相互独立(d-分离),因此条件独立性是图模型结构的直接结果。
第二个可以从图中直接读取的性质是:θ_X 和 θ_Y|X 是边缘独立的。因此,我们所有参数的先验可以写成每个CPD先验的乘积:
P(θ) = ∏_i P(θ_{X_i}),其中 i 遍历网络中的随机变量。
由此,通过写出图模型并观察表达式的含义,可以得出:在给定完整数据的情况下,参数θ的后验也是独立的。原因是完整数据“分离”了两个CPD的参数。例如,在这个网络中,如果我们观测到所有变量,可以看到 θ_X 和 θ_Y|X 之间没有有效路径(例如,X2阻断了从 θ_X 到 θ_Y|X 的路径)。
因此,后验分布可以分解:
P(θ_X, θ_Y|X | D) = P(θ_X | D) * P(θ_Y|X | D)
这意味着,就像最大似然估计可以将估计问题分解为分别估计每个CPD一样,我们在这里也可以做同样的事情,只不过现在使用的是贝叶斯估计。我们不是为CPD选择一个单一的参数设置,而是分别计算这些独立的后验,然后将它们组合成一个完整的后验。
表格CPD的进一步分解 📋
对于表格形式的CPD,我们可以进行更精细的分解。考虑一个简单情况,X是二值随机变量。那么CPD P(Y|X) 包含两个多项式:一个对应 Y|X=1,另一个对应 Y|X=0。
在这个模型中,我们假设先验中 θ_Y|X=1 和 θ_Y|X=0 是独立的(图中没有边连接它们,所以它们是边缘独立的)。可以证明,在后验中它们也是独立的。这一点证明起来稍微复杂一些,因为即使给定完整数据,图中也存在一个通过观测变量Y激活的有效V型结构路径。但如果我们回顾之前关于上下文特定独立性(特别是多路复用器CPD)的例子,可以推导出它们在后验中确实是条件独立的。
因此,后验可以再次写成乘积形式:
P(θ_X, θ_Y|X=1, θ_Y|X=0 | D) = P(θ_X | D) * P(θ_Y|X=1 | D) * P(θ_Y|X=0 | D)
推广到一般贝叶斯网络 🌐
我们可以将此推广到一般的贝叶斯网络。假设我们有一个具有表格CPD的贝叶斯网络,其参数形式为 θ_X|u,其中 u 是父变量 U 的某个取值。
如果对每个这样的多项式参数,我们都指定一个具有适当超参数 α 的狄利克雷先验,那么结合单变量多项式的后验分析,我们可以证明:后验分布也是一个狄利克雷分布,其超参数等于先验超参数加上数据中关于该子节点与其父节点特定组合的充分统计量(计数)。
具体公式如下:对于代表子节点值 x 和父节点取值 u 的多项式条目,其后验超参数为:
α_{x|u}^{posterior} = α_{x|u}^{prior} + M[x, u]
其中 M[x, u] 是数据中 X=x 且其父节点 U=u 的实例数量。
先验的来源与设定 🧭
既然我们知道了如何用数据更新先验以形成后验,接下来让我们思考先验从何而来。为贝叶斯网络中所有节点构建先验看起来可能令人望而生畏。
然而,存在一种通用方案,它既简单又具有良好的理论性质。该方案如下:
- 定义一个先验贝叶斯网络,它具有一组参数 θ⁰。
- 定义一个等效样本大小 α,它将应用于网络中的所有节点。
- 为了指定超参数 α_{x|u}(对于赋值
X=x和U=u),我们只需计算在这个参数化先验网络P_θ⁰中X=x且U=u的概率,然后乘以等效样本大小 α:
α_{x|u} = α * P_θ⁰(x, u)
在许多情况下,我们可以直接让 θ⁰ 是均匀分布参数,这使得计算非常简单。这提供了一种简单、连贯的方式来同时指定所有超参数。

让我们看一个例子。假设我们有一个先验网络 X → Y,并且我们假设 X 和 Y 上的均匀分布,即 θ⁰ 是均匀的。
现在,考虑我们实际想要估计参数的网络结构 X → Y(X和Y都是二值的)。那么:
- θ_X 的先验是超参数为
[α/2, α/2]的狄利克雷分布(因为均匀分布下P(X=0)=P(X=1)=1/2)。 - θ_Y|X=0 的先验是超参数为
α * P_θ⁰(x=0, y)的狄利克雷分布。在均匀分布下,P(x=0, y=0) = P(x=0, y=1) = 1/4,所以超参数为[α/4, α/4]。θ_Y|X=1 同理。
这种设定是合理的:它告诉我们,我们“看到”的X的样本数与Y的样本数在概念上是相关的(通过α联系),只是Y的样本需要根据X的取值进行划分。
贝叶斯估计的效果:一个示例 📉
让我们通过一个伪真实世界的例子,看看使用贝叶斯估计的效果。这里使用的是一个真实的“ICU警报网络”,用于监测重症监护室中的患者。该网络有37个变量,共504个参数。

我们没有真实数据,但可以从这个已知网络中采样实例,然后假装不知道其真实参数,尝试通过从样本中学习来恢复参数。这是一个比现实更干净的学习场景,因为数据恰好来自我们试图学习的网络结构本身。

上图展示了学习效果。X轴是样本数量,Y轴是学习到的分布与真实分布之间的距离(使用相对熵/KL散度,数值越小表示越接*)。
- 蓝色线对应最大似然估计。我们可以看到它非常锯齿状(波动大),并且始终高于其他所有线。即使有高达5000个数据点,它仍未接*真实分布。
- 其他彩色线对应贝叶斯估计(使用均匀先验网络,但不同的等效样本大小α)。
- 绿色线(α=5)和橙色线(α=10)几乎重合,且远低于最大似然估计线。
- 随着先验强度增加(α=50,深蓝色线),开始时性能稍差,但到了约2000个数据点,其表现已经接*α=5的情况。即使α=50这样较强的先验,其收敛到正确分布的速度也远快于最大似然估计。
这个例子表明,贝叶斯估计,即使是使用简单的均匀先验,也能通过结合先验知识,在数据量有限时提供更稳定、更准确的估计,并更快地收敛。
总结 📝

本节课中,我们一起学习了贝叶斯网络中的贝叶斯参数估计。
- 核心分解:如果我们假设参数先验独立,那么它们在给定完整数据后的后验也独立。这使得我们可以将复杂的后验分布维护为单个参数后验的乘积,大大简化了计算。
- 计算方法:对于多项式贝叶斯网络,我们可以使用与最大似然估计相同的充分统计量(即子节点值与父节点取值的计数)进行贝叶斯估计。
- 最大似然估计公式:
θ_{x|u}^{MLE} = M[x, u] / M[u] - 贝叶斯估计公式:
θ_{x|u}^{Bayesian} = (α_{x|u} + M[x, u]) / (∑_x‘ α_{x’|u} + M[u])
两者形式相似,但贝叶斯估计在分子分母中加入了先验超参数 α。
- 最大似然估计公式:
- 先验设定:我们介绍了一种有效的先验获取方法,即通过指定一个先验贝叶斯网络分布和一个等效样本大小 α,来一致地生成所有必需的超参数。
通过结合先验知识与观测数据,贝叶斯估计为我们提供了一种在数据稀疏时更稳健、在数据充足时能快速收敛的参数学习框架。


014:条件随机场的最大似然估计


在本节课中,我们将学习如何将马尔可夫随机场的最大似然估计思想,应用于条件随机场的学习。我们将探讨其目标函数、梯度计算,并通过一个图像分割的实例来具体说明,最后比较CRF与MRF在训练成本上的差异。
概述
上一节我们介绍了马尔可夫随机场的最大似然估计。本节中,我们来看看其扩展模型——条件随机场的最大似然估计方法。CRF的核心目标是学习在给定观测变量 X 的条件下,目标变量 Y 的条件概率分布。
CRF模型回顾
条件随机场用于计算在给定一组观测变量 X 时,特定目标变量集 Y 的概率。其未归一化密度 P̃(x, y) 的参数化方式与MRF相同(例如,因子乘积或对数线性模型)。关键区别在于,CRF使用一个与 x 相关的配分函数 Z(x),以确保对于给定的 x,我们得到的是在 y 上的归一化条件分布。
其条件概率公式为:
P(y | x) = (1 / Z(x)) * P̃_θ(x, y)
其中,配分函数 Z(x) = Σ_y P̃_θ(x, y) 仅对 y 进行归一化。
条件对数似然目标函数
CRF的学习数据是一组配对数据 (X, Y),其中训练数据中两者均被观测到。合适的目标函数是条件对数似然(更准确地说,是对数条件似然)。
对于 M 个数据实例,目标函数定义为:
L(θ) = Σ_m log P_θ(y^m | x^m)

将其展开(以对数线性模型为例),我们得到:
L(θ) = Σ_m [ Σ_i θ_i * f_i(x^m, y^m) - log Z(x^m) ]
这个形式与MRF的似然函数非常相似。
梯度计算
我们对参数 θ_i 求目标函数的梯度。经过推导,梯度表达式为:
∂L/∂θ_i = Σ_m [ f_i(x^m, y^m) - E_θ[f_i(x^m, Y) | x^m] ]
这个梯度是两项期望之差:
- 经验期望:特征函数在观测数据 (x^m, y^m) 上的值。
- 模型期望:在给定 x^m 的条件下,特征函数关于模型分布 P_θ(Y | x^m) 的期望值。
重要提示:此处的模型期望是在固定 x^m 的情况下,仅对变量 Y 求期望,这与MRF中对所有变量求期望不同。
实例:图像分割模型
让我们通过一个简化的图像分割模型来具体理解梯度计算。模型有两个特征,且参数是共享的。
以下是模型的两个特征定义:
- 特征 F1 (单点特征):对于图像中的每个超像素 S,如果其标签 Y_S 是“草地”,则该特征值为该超像素的*均绿色通道值 g_S,否则为0。
- 公式:
F1(x, y) = Σ_S 1{Y_S = “grass”} * g_S
- 公式:
- 特征 F2 (成对特征):对于每一对相邻的超像素 (S, T),如果它们的标签相同(同为“草地”或同为“奶牛”),则特征值为1,否则为0。
- 公式:
F2(x, y) = Σ_{(S,T)相邻} 1{Y_S = Y_T}
- 公式:

现在,我们将这些特征代入梯度公式。对于单个训练图像 m:
-
参数 θ1 的梯度:
∂L/∂θ1 = Σ_S [ 1{Y_S = “grass”} * g_S - P_θ(Y_S = “grass” | x^m) * g_S ]- 第一项(经验期望)对所有实际标记为“草地”的超像素求和其绿色值。
- 第二项(模型期望)对所有超像素求和,但用模型预测的“该超像素为草地”的概率 P_θ(Y_S = “grass” | x^m) 加权其绿色值。
-
参数 θ2 的梯度:
∂L/∂θ2 = Σ_{(S,T)相邻} [ 1{Y_S = Y_T} - P_θ(Y_S = Y_T | x^m) ]- 第一项对所有实际标签相同的相邻超像素对计数。
- 第二项对所有相邻超像素对,求和它们标签相同的模型预测概率。
在这两种情况下,梯度都是经验计数与模型预测概率期望之间的差值。
训练成本比较:CRF vs MRF

理解CRF与MRF训练的计算成本差异至关重要。
- MRF训练:每个梯度步长需要计算一次模型期望,这涉及在完整联合分布 P(x, y) 上运行推断。虽然昂贵,但每个梯度步只需一次推断。
- CRF训练:从梯度公式
∂L/∂θ_i = Σ_m [ ... - E_θ[f_i(x^m, Y) | x^m] ]可以看出,模型期望项 E_θ[f_i(x^m, Y) | x^m] 对于每个训练实例 x^m 都是不同的。因此,每个梯度步长需要进行 M 次条件推断(M是训练实例数),这比MRF昂贵得多。
模型复杂性的权衡
然而,不能仅凭推断次数来简单判断成本。必须权衡所有影响计算复杂度的因素。
在CRF中,我们计算的是条件概率 P(y | x)。此时,观测变量 x 是固定的(已实例化),因此模型中的因子仅涉及目标变量 y,图模型更简单。
如果我们因为CRF训练推断成本高而想改用MRF训练,就需要为联合分布 P(x, y) 建模。这通常更复杂,因为:
- 模型包含更多变量(x 和 y)。
- 在许多CRF应用场景中(如上述图像分割),观测变量 x(如*均绿色值)可能是连续值。在MRF中为其定义合理的参数化分布(如高斯混合模型)非常棘手且难以处理。

因此,尽管CRF训练中每个梯度步的推断次数更多,但每次条件推断本身的计算成本通常远低于MRF中联合分布的推断,并且避免了为复杂观测特征建模分布的难题。
总结
本节课中,我们一起学习了条件随机场的最大似然估计。

- 数学形式:CRF学习在数学形式上与MRF学习非常相似。其(条件)似然函数同样具有凹性,通常使用相同的优化算法(如L-BFGS)。
- 梯度计算:关键区别在于梯度计算。CRF的梯度需要在每个梯度步长中,为每个训练实例运行一次条件推断,这比MRF(每个梯度步一次推断)成本更高。
- 模型权衡:选择CRF还是MRF不能只考虑训练成本。CRF的条件模型 P(y | x) 通常比MRF的联合模型 P(x, y) 更简单,每次推断更快,并且避免了为观测变量建模的困难。在实际应用中,需要根据具体模型复杂度、推断成本以及整体泛化性能来综合权衡选择哪种框架。
015:MRF与CRF的MAP估计
在本节课中,我们将要学习如何为马尔可夫随机场(MRF)和条件随机场(CRF)引入参数先验,以解决最大似然估计容易过拟合的问题。我们将重点介绍最大后验概率(MAP)估计方法,并比较两种常用的先验分布:高斯先验(L2正则化)和拉普拉斯先验(L1正则化)。
从最大似然估计到MAP估计
上一节我们介绍了MRF和CRF的最大似然估计。然而,与贝叶斯网络一样,最大似然估计容易对训练数据的特定细节产生过拟合。因此,我们希望引入参数先验来*滑参数估计,尤其是在数据量有限的初期阶段。
在贝叶斯网络中,我们可以使用共轭先验(如狄利克雷先验),并与似然函数结合得到闭式解的后验分布,计算上非常优雅。但在MRF和CRF中,似然函数本身就没有闭式解,因此后验分布也无法优雅地计算。

那么,我们如何在MRF和CRF学习中融入先验思想,以获得正则化的好处呢?

这里的核心思想是使用最大后验概率(MAP)估计。我们有一个先验分布,但我们不维持一个闭式后验,而是计算参数的最大后验估计。这与我们在概率图模型中进行MAP推理的概念相同:我们计算一个单一的、最可能的参数赋值。


两种常见的参数先验
在MRF或CRF学习的背景下,MAP估计通常如何实现?一个典型的解决方案是为每个参数 θ_i 单独定义一个先验分布。
以下是两种最常用的先验分布:
1. 高斯先验(L2正则化)
为每个参数 θ_i 定义一个零均值的单变量高斯分布,其方差为 σ²。
- 公式:
P(θ_i) ∝ exp(-θ_i² / (2σ²)) - 超参数:方差
σ²。σ²越小,我们越确信参数接*零;σ²越大,我们越倾向于相信数据。
2. 拉普拉斯先验(L1正则化)
另一种常用的先验是拉普拉斯先验。
- 公式:
P(θ_i) ∝ exp(-|θ_i| / β) - 超参数:尺度参数
β。与高斯分布类似,β控制着分布围绕零的紧密程度。
这两种先验都鼓励参数值向零靠*,但方式不同。我们将每个参数的先验乘在一起,得到联合参数先验 P(θ)。
MAP估计的目标函数
现在,让我们看看在这两种先验下,MAP估计的具体形式。MAP估计的目标是找到最大化联合分布 P(D, θ) 的参数 θ。
根据概率论,联合分布等于似然 P(D|θ) 与先验 P(θ) 的乘积。由于对数函数的单调性,最大化联合分布等价于最大化其对数。
MAP目标函数:
θ_MAP = argmax_θ [ log P(D|θ) + log P(θ) ]
其中,log P(D|θ) 是对数似然,log P(θ) 是对数先验(即正则化项)。
接下来,我们看看这两种先验对应的正则化项。
L2与L1正则化的比较
当我们取负对数先验(即惩罚项)时,可以更清楚地看到区别:
- 高斯先验(L2正则化):负对数先验正比于
θ_i²。- 效果:这是一个二次惩罚,将参数推向零。当参数值较大时,惩罚力度很强;当参数接*零时,惩罚力度减弱。因此,使用L2正则化的模型往往是稠密的,即许多参数值很小但不为零。
- 拉普拉斯先验(L1正则化):负对数先验正比于
|θ_i|。- 效果:这是一个线性惩罚,无论参数值大小,都给予一致的推力使其归零。这使得模型倾向于将那些对似然函数贡献不大的参数精确地推到零。因此,使用L1正则化的模型往往是稀疏的。
稀疏性具有重要价值:更稀疏的模型通常意味着更少的特征或更简单的图结构(移除边),这使得模型更容易理解,并且推理计算通常更高效。


总结
本节课中我们一起学习了在无向图模型(MRF/CRF)中引入MAP估计来避免过拟合。
- 动机:由于似然函数中参数的耦合,我们无法像贝叶斯网络那样高效地进行完整的贝叶斯估计(维持参数后验)。因此,我们采用MAP估计作为替代,它结合了先验信息。
- 方法:MAP估计的目标是最大化
对数似然 + 对数先验。常用的先验是高斯先验(L2正则化)和拉普拉斯先验(L1正则化)。 - 核心区别:两者都将参数推向零以防止过拟合,但L1正则化(拉普拉斯先验)能产生稀疏解。这相当于自动进行了特征选择或图结构学习,使模型更简洁、计算更高效。


016:结构学习概述
在本节课中,我们将要学习贝叶斯网络结构学习的基本概念。我们将探讨为什么需要学习网络结构,分析结构错误(如缺失边或多余边)对模型性能的影响,并介绍结构学习的一般范式:通过定义评分函数和搜索算法来寻找最优网络结构。

我们之前讨论了在给定网络结构的情况下,学习贝叶斯网络参数的问题。
但情况并非总是如此。我们并不总是拥有一位能够充分理解领域结构、清楚变量之间关系的领域专家,来为我们提供一个足够好的网络。
那么,在哪些情况下会发生这种情况呢?第一种情况是,我们确实希望使用一个网络来执行各种查询,例如在医疗领域或其他场景中进行新的医疗查询。

在这种情况下,虽然可能存在一些领域知识,但这些知识可能不足以构建一个足够好用的模型。通过利用数据并学习数据所揭示的最显著的依赖关系,我们可能会做得更好。

第二种情况是,我们甚至不一定关心使用这个网络,我们只是想发现网络结构。这种应用模式出现在例如科学或生物数据集中,其目标仅仅是更好地理解变量之间的相互关系,从而加深对领域的认识。
让我们暂时关注上述两种情况中的第一种,即我们的目标是为了使用而学习一个网络。让我们思考可能发生的错误类型,以及它们如何影响网络在新实例上的应用能力。

假设真实的网络是这里的这个。现在,让我们考虑学习算法可能犯的不同类型的错误。例如,一种情况是学习算法可能学到一个缺失了一条边的网络。
另一方面,它可能学到一个我们添加了一条边的网络。当然,也可能存在两种情况混合的例子,但让我们分别思考这两种错误类型。
如果我们缺失了一条边,学习到的网络所暗示的独立性实际上是不正确的。相对于真实网络(我们称之为 G),我们学到的网络做出了与 G 不符的独立性假设。
相反,在添加了多余边的情况下,我们引入了虚假的依赖关系。例如,此时在变量 A 和 B 之间就存在一个虚假的依赖关系。那么,这有什么影响呢?
如果缺失了一条边,那么正确的分布 P* 就无法被学习到。一般来说,如果 P* 与这里的网络 G* 相关联(即 G* 是 P* 的一个完美映射),那么我们就无法使用一个缺失了边的网络来学习 P*。
这看起来可能非常糟糕。我们或许会更倾向于右边这种错误模型,尽管它有这些多余的边,但它确实允许我们正确地学习 P。也就是说,在 A 和 B 之间的这条额外边上,存在一组参数设置,使得正确的分布 P 仍然可以在这个网络结构上被估计出来。
因此,似乎这种错误模型实际上比缺失边的模型更好。但经验表明,这实际上是一种过于简化的观点。具体来说,具有多余边的模型会导致参数数量增加。而我们需要从有限的数据中估计的参数越多,正确估计它们的难度就越大。我们在讨论“数据碎片化”问题时已经谈过这一点:随着父节点数量的增加,每个父节点配置下的数据量会减少。
因此,由此得出的一个重要结论是,正如我们已经看到的,这可能导致更差的泛化能力,即在未见过的实例上表现更差。
所以,事实是,有时拥有更少的边实际上可能比拥有更多的边泛化得更好,即使正确的分布无法被编码。因此,缺失边和多余边之间的权衡是微妙的,并不总是清楚哪种情况能给我们带来最佳性能。

基于以上介绍,我们通常如何从数据中学习贝叶斯网络结构呢?一般的范式是:我们定义一个评分函数,用于评估每个结构与数据的匹配程度。在后续课程中,我们将细化这个范式。

这里我们有一个数据集 D,以及三个示例网络结构。我们将定义一个评分函数,告诉我们每个网络结构相对于我们所见数据的优劣程度。
然后,我们的目标是搜索一个能最大化该评分的网络结构。这样,我们就把学习问题转化成了一个优化问题。
这是一个在组合空间(即网络结构的空间)上的优化问题。通过定义一个评分函数,我们得到了要优化的目标。现在,我们需要提出一个算法来优化这个评分。因此,我们将这个问题分解为评分组件和优化组件,并将在后续部分分别讨论它们。


本节课中,我们一起学习了贝叶斯网络结构学习的必要性、结构错误对模型的影响,以及结构学习的基本框架:通过评分函数评估网络结构,并通过搜索算法寻找最优结构。我们了解到,在有限数据下,模型复杂度(边数)与泛化能力之间存在微妙的权衡。
017:似然分数 📊

在本节中,我们将学习贝叶斯网络结构学习中的一个核心概念:评分函数。我们将首先探讨最简单的评分函数——似然分数,理解其定义、计算方式以及优缺点。
概述
贝叶斯网络结构学习可以看作由两部分组成:一是定义一个评分函数来评估不同网络结构的优劣;二是设计一个搜索或优化过程,以选择得分最高的网络。本节我们将重点讨论第一部分,即评分函数,并首先介绍最简单的似然分数。
似然分数的定义
我们已经知道,似然可以用来评估一个给定网络(及其参数)的质量。似然分数定义为:对于一个给定的图结构 G,我们找到能最大化数据 D 的对数似然的最优参数 θ̂,并将此最大对数似然值作为图 G 的分数。
用公式表示,图 G 的似然分数为:
score_L(G) = log P(D | G, θ̂_G)
其中,θ̂_G 是在给定图 G 和数据 D 的条件下,参数的最大似然估计。
这意味着,对于任何一个图结构,我们先找出其最优参数,然后用这个最优参数下的数据似然来评估该图的质量。
一个简单例子
为了更直观地理解似然分数,让我们看一个包含两个随机变量 X 和 Y 的简单例子。我们比较两个图:
- G₀:X 和 Y 之间没有边(相互独立)。
- G₁:存在一条从 X 指向 Y 的边。
根据之前参数估计的知识,我们可以分解对数似然函数。
对于图 G₀,其似然分数为:
score_L(G₀) = Σ_m [log θ̂_{x[m]} + log θ̂_{y[m]}]
其中,求和遍历所有数据实例 m,x[m] 和 y[m] 是第 m 个实例中 X 和 Y 的取值,θ̂ 是图 G₀ 下的最大似然参数。
对于图 G₁,其似然分数为:
score_L(G₁) = Σ_m [log θ̂_{x[m]} + log θ̂_{y[m] | x[m]}]
这里的 θ̂ 是图 G₁ 下的最大似然参数。
深入分析:互信息
为了更深入地比较这两个图,我们计算它们分数的差值:score_L(G₁) - score_L(G₀)。经过一系列代数变换(利用充分统计量和经验分布 P̂),这个差值可以简化为:
score_L(G₁) - score_L(G₀) = M * I_{P̂}(X; Y)
其中:
- M 是数据实例的总数。
- I_{P̂}(X; Y) 是在经验分布 P̂ 下,变量 X 和 Y 之间的互信息。
互信息的计算公式为:
I_{P̂}(X; Y) = Σ_{x,y} P̂(x, y) log [ P̂(x, y) / (P̂(x) P̂(y)) ]
它衡量了联合分布 P̂(X, Y) 与假设 X 和 Y 独立时的分布(即边缘分布的乘积 P̂(X)P̂(Y))之间的*均“距离”。互信息越大,表示 X 和 Y 之间的相关性越强。
上一节我们通过一个双变量例子引入了互信息的概念。现在,让我们将其推广到任意网络。

对于一个任意的贝叶斯网络图 G,其似然分数可以重新表述为:
score_L(G) = M * Σ_i I_{P̂}(X_i; Pa_{X_i}) - M * Σ_i H_{P̂}(X_i)
其中:
- Pa_{X_i} 表示图中节点 X_i 的父节点集合。
- H_{P̂}(X_i) 是变量 X_i 在经验分布 P̂ 下的熵。
- 第二项
- M * Σ_i H_{P̂}(X_i)是一个与图结构 G 无关的常数。
这个结果非常重要,它表明:
一个网络的似然分数越高,当且仅当图中每个节点与其父节点之间的互信息之和越大。
这非常直观:我们为一个变量选择的父节点,应该是与它相关性最强(互信息最大)的那些变量。这符合我们构建贝叶斯网络以捕捉变量间强依赖关系的初衷。
似然分数的问题:过拟合
虽然互信息的解释很直观,但它也揭示了似然分数的一个严重缺陷。回顾两个图的分数差值公式:
score_L(G₁) - score_L(G₀) = M * I_{P̂}(X; Y)
根据信息论,互信息 I_{P̂}(X; Y) 总是非负的。并且,它等于零的充要条件是 X 和 Y 在分布 P̂ 中严格独立。
问题在于:即使在真实的底层分布中 X 和 Y 是独立的,由于抽样带来的随机波动,在有限数据集 D 上得到的经验分布 P̂ 中,它们也几乎不可能达到完美的独立。因此,互信息 I_{P̂}(X; Y) 几乎总是大于零。
这意味着,在这个例子中,添加边 X → Y 几乎总是能提高似然分数。这个结论可以推广:对于似然分数而言,添加更多的边几乎总是使分数更高。因此,完全连通的网络(即最大可能的图)通常会取得最高的似然分数。
这导致了显著的过拟合问题:更复杂的模型(更多边)有更多参数,会将数据分割到更小的“桶”里,每个桶内的数据实例很少,使得参数估计不可靠。模型只是记住了训练数据中的噪声,而未能捕捉真实的底层结构,泛化能力会很差。

如何避免过拟合?
既然似然分数容易导致过拟合,我们有什么策略来应对呢?主要有两种思路:
-
限制假设空间:这是一种硬性约束。例如,我们可以限制每个节点最多能有多少个父节点,或者直接限制模型的总参数数量。这种方法简单直接,但不够灵活,可能会阻止算法学习到真正需要的复杂结构。
-
使用带复杂度惩罚的评分函数:这是一种更灵活的策略。评分函数在奖励模型对数据拟合程度的同时,也会惩罚模型的复杂度。这样,只有当变量间的相关性信号足够强,能够抵消复杂度惩罚时,算法才会选择添加边。这类评分函数又主要分为两种:
- 显式复杂度惩罚分数:如BIC(贝叶斯信息准则)、AIC(赤池信息准则)等,在似然项后直接减去一个与模型参数数量成正比的惩罚项。
- 贝叶斯分数:遵循贝叶斯范式,对未知参数引入先验分布并进行积分(*均)。我们将在后续章节看到,这天然地产生了一种*衡拟合优度和模型复杂度的分数。
总结

本节课我们一起学习了贝叶斯网络结构学习中的似然分数。
- 我们首先定义了似然分数:它使用给定图结构 G 下的最大似然参数 θ̂_G,计算数据 D 的对数似然值作为评分。
- 通过一个双变量例子,我们推导出图结构的优劣可以归结为变量与其父节点间的互信息大小。这为选择父节点提供了清晰的信息论解释:应选择相关性最强的变量。
- 然而,分析也揭示了似然分数的核心缺陷:互信息非负的性质导致它总是倾向于选择更复杂的模型(更多的边),从而引发过拟合。
- 最后,我们简要讨论了避免过拟合的两种主要策略:限制假设空间和使用带复杂度惩罚的评分函数(包括显式惩罚和贝叶斯方法)。

理解似然分数的优点和局限性,为我们后续学习更鲁棒、更实用的评分函数(如贝叶斯分数)奠定了重要基础。
018:BIC与渐*一致性 📊
在本节课中,我们将学习贝叶斯网络结构学习中的一种重要评分函数——BIC评分。我们将探讨它如何通过惩罚模型复杂度来避免过拟合,并理解其具有的渐*一致性性质。
结构学习与评分函数


上一节我们介绍了将贝叶斯网络结构学习视为在结构空间上优化一个评分函数。在此过程中,一个关键的设计选择是决定使用哪个评分函数。
我们的首次尝试是使用似然评分。但我们已经看到,似然评分非常容易过拟合,并且只要结构空间允许,它总会学习到最复杂的网络。
引入复杂度惩罚
现在,我们考虑一种不同的方法。这种方法不是(或不仅仅是)约束结构空间,而是对我们学习到的结构的复杂度施加惩罚,从而迫使学习算法在模型复杂度与数据拟合度之间进行权衡。
具体来说,我们现在要看的评分被称为BIC评分。
以下是BIC评分的公式:
Score_BIC(G : D) = log P(D | θ̂_G, G) - (log M / 2) * dim(G)
让我们看看BIC评分惩罚复杂度的一种方式。BIC评分包含两项:第一项是图及其相对于数据的最大似然参数的似然值。这是一个熟悉的项,它与似然评分代表的意义相同。如果单独使用这一项,我们会得到同样的过拟合行为。
但我们在此之上增加了一个惩罚项,即公式右边的第二项。该项是 -(log M / 2) * dim(G)。

我们来理解一下这些不同的部分:
- M 是训练实例的数量。
- dim(G) 是网络中独立参数的数量。
我们在多项式网络的背景下讨论过独立参数的概念。作为提醒,一个多项式分布的独立参数数量比多项式条目数少一个。由此我们可以计算任何多项式网络的独立参数数量。这基本上计算了我们在网络中估计独立参数时所拥有的自由度数量。
因此,这两项相互*衡。我们已经看到,左边的项(对数似然)试图推动模型更好地拟合训练数据;而右边的惩罚项则试图保持独立参数的数量(从而降低网络复杂度)。因此,该评分在数据拟合度和模型复杂度之间提供了一种权衡。
这是这种权衡的一种选择。实际上,还有其他评分使用这两项之间不同的权衡方式。但BIC评分在实践中非常常用,并且有几个独特的动机,其中一些我们会讨论,另一些则不会。不过,值得指出的一点是,这个评分的负数通常被称为MDL准则,其中MDL代表最小描述长度。实际上,最小描述长度的概念为此提供了信息论上的证明。而另一个证明则源于一个更贝叶斯的准则,这也是BIC实际上代表贝叶斯信息准则的原因。
BIC评分的渐*行为
现在,让我们看看这个惩罚评分的渐*行为。我们已经看到,在似然评分的背景下,无论我们有多少训练数据,我们几乎总是会选择我们假设允许的最密集连接的网络。
但当我们使用这种惩罚评分时,情况就不再如此了。为了理解这一点,让我们分解前两项中的第一项(即似然评分),并提醒自己,至少在多项式网络的背景下,似然评分可以重写为以下形式:

Score_L(G : D) = M * Σ_i MI_P̂(X_i; Pa_{X_i}^G) + M * Σ_i H_P̂(X_i)
这是似然评分的分解,它包含这两项。第一项是数据实例数 M 乘以变量 X_i 与其在网络中的父节点之间的互信息之和,该互信息是相对于经验分布 P̂ 的。似然评分中的第二项也是一个项,即 M 乘以变量在经验分布中的熵之和。正如我们之前讨论过的,这一项与 G 无关,因此不影响选择哪个结构,因为它对所有结构都是相同的。
因此,我们有两项在相互制衡。我们有这里的红色项,即 M 乘以互信息之和;我们还有第二项,即蓝色项,它是 (log M / 2) 乘以 G 中独立参数的数量。
现在,如果我们考虑这两项,我们会发现互信息项随 M 线性增长,而复杂度项随 M 对数增长。因此,随着我们获得越来越多的数据实例,我们会更加强调数据拟合度,而较少强调模型复杂度。直观上,我们可以推断,随着数据实例增多,我们会更倾向于学习更复杂的结构。
渐*一致性
这个性质产生了一个关于BIC评分非常重要的结果,这个结果被称为一致性。一致性告诉我们,当样本数量增长到无穷大时,我们会得到什么行为,即我们会学习到哪个网络。
这里我们假设数据实际上是从一个特定的真实结构 G* 生成的。一致性性质表明,随着 M 增长到无穷大,最大化评分的结构将是真实结构 G*。
这一点本身并不完全准确,因为真实结构 G* 可能有其他几个与其I等价的结构。我们已经看到,似然评分(实际上惩罚项也是如此)对于I等价的网络是相同的。因此,最大化评分的不仅仅是真实结构本身,而是真实结构或任何其他与其I等价的结构。但就我们的目的而言,这没问题,因为我们实际上学到了概率分布的正确表示。
为了理解为什么这个结果成立,我们将给出一个非常高层次的直观论证,而不是完全形式化地证明这个定理。
首先,考虑为什么这不会导致过拟合,即为什么在最大化评分时,随着实例数量增长到无穷大,我们不会学习到虚假的边。
我们回到这里的公式,我们看到随着 M 增长到无穷大,P̂ 将趋*于 P,其中 P 是我真实的底层分布。因此,我们在这里的第一项中得到的,本质上是 X_i 与其父节点相对于 P* 的互信息。在 P* 中,X_i 与其父节点之间的互信息,从添加额外的、虚假的父节点中得不到任何好处。因为在真实的底层分布 P* 中,不存在额外的独立性或相关性。因此,在这一点上,更复杂的结构在第一项方面将与 G* 大致相同,但虚假的边将在蓝色项的参数数量方面让我们付出代价。所以,虚假的边不会对数据似然项有贡献,但会受到更多的惩罚,因此我们将选择对应于 G* 的更稀疏的网络。
反之,为什么我们不会欠拟合?也就是说,为什么我们最终会学习到所有正确的边?这是因为数据似然项告诉我们,必需的边(例如,在 G* 中或在I等价网络中的边),如果我们没有包含它们,这个互信息项将低于其可能的值。因此,通过在模型中包含这些项,我们将获得更高的评分。并且由于这个互信息项随 M 线性增长,而惩罚项随 M 对数增长,最终第一项将占主导地位,学习算法添加 G* 中所需的边将是有益的。
这是一个高层次、非常粗略的论证,但至少它提供了关于一致性为何成立的直觉。

总结

本节课中我们一起学习了BIC评分。BIC评分是一种非常简单的评分,它在模型复杂度与数据拟合度之间进行权衡,因此具有渐*一致性这一重要性质。这意味着,如果数据实际上是由一个网络 G* 生成的(该网络是分布的一个完美映射),那么随着 M 增长到无穷大,G* 或与其I等价的网络将具有最高的评分。
019:贝叶斯分数 🧮
在本节课中,我们将学习贝叶斯分数。这是一种用于贝叶斯网络结构学习的评分函数,它基于贝叶斯原理,能有效避免过拟合问题。我们将探讨其定义、计算方式、关键性质及其与似然分数的区别。

贝叶斯分数概述
上一节我们介绍了贝叶斯网络结构学习是优化网络结构空间上的评分函数的问题,并讨论了最简单的似然分数存在严重的过拟合问题。本节中,我们将探讨一种基于贝叶斯原理推导出的不同分数。我们将看到,尽管它在表面上与似然分数有相似之处,但在避免过拟合方面表现更佳。

贝叶斯分数源于贝叶斯范式,该范式认为,任何我们不确定的事物都需要有一个概率分布来描述。因此,如果我们对图结构不确定,就需要有一个图结构的先验分布;如果我们对参数不确定,就需要有一个参数的概率分布。
现在,如果我们将优化问题定义为寻找最大化给定数据 D 时图 G 的概率的图 G,即 P(G|D)。使用贝叶斯定理重写这个概率,我们得到以下表达式:

P(G|D) = [P(D|G) * P(G)] / P(D)
让我们分别看看每一项。第一项 P(D|G) 被称为边际似然,是给定图结构时数据的概率。第二项 P(G) 是图结构的先验分布。最后一项 P(D) 是分母,被称为数据的边际概率。重要的是,数据的边际概率与 G 无关,因此不会影响我们选择哪个图。在寻找单个图或最大化分数的图的模型选择问题中,我们可以忽略它。
因此,我们定义贝叶斯分数 score_B(G) 相对于数据集 D 为这个表达式分子的对数,即边际似然的对数加上图先验的对数:
score_B(G) = log P(D|G) + log P(G)
我们可能认为这个分数会因为使用了图先验而避免过拟合。虽然先验可以发挥作用,但实际上第一项(边际似然)的作用远比它重要。让我们更深入地看看边际似然。
深入理解边际似然

边际似然 P(D|G) 与对数似然不同,因为它对所有可能的参数设置进行积分。从数学角度看,我们将在概率表达式中引入变量 θ_G,然后将其积分掉(因为是连续空间,所以用积分而不是求和)。
P(D|G) = ∫ P(D|G, θ_G) * P(θ_G|G) dθ_G
上述表达式中的第一项 P(D|G, θ_G) 是似然,正是我们在对数似然分数中使用的成分。但重要的是,与似然分数不同,我们不是仅针对最大似然参数 θ_hat_G 计算 P(D|G, θ_G),而是计算这个概率在所有可能参数设置上的*均值。这给了我们一个对给定特定结构的数据概率的、不那么乐观的评估,因为我们必须考虑所有可能的参数设置 θ_G,而不仅仅是恰好针对我们数据集的那个 θ_hat 参数集,并使用参数先验进行*均。
这种不那么乐观的评估是为什么它可能不会过拟合那么多的一个直觉解释。但事实证明,关于为什么这个分数能减少过拟合,还有另一个可能更直观的解释。

让我们看看这个边际似然项 P(D|G),并将其重写为所有实例 x_1 到 x_M 给定 G 的概率。我们将使用概率的链式法则(不是贝叶斯网络的链式法则)来分解这个联合分布:
P(D|G) = P(x_1|G) * P(x_2|x_1, G) * P(x_3|x_1, x_2, G) * ... * P(x_M|x_1, ..., x_{M-1}, G)
观察每一项,每一项实际上都是在给定先前实例 x_1 到 x_{M-1} 的情况下,对未见实例 x_M 进行预测。因此,你可以将其视为几乎在进行某种交叉验证或泛化能力估计,因为我们是在估计给定先前实例预测未见实例的能力。所以,P(D) 在某种意义上将某种泛化能力分析纳入了其中。
你可能会说,标准的似然分数肯定也做了完全相同的事情。但稍加思考就会发现,如果我们想对最大似然参数集进行这种分析,那么该参数集 θ_hat_G 依赖于所有实例。因此,我们不能以这种方式分解它,因为如果我们右边有 θ_hat_G,它已经包含了所有实例,包括未见过的实例。这又是为什么最大似然分数倾向于过拟合的另一个直觉解释。
现在,贝叶斯分数可能看起来有点吓人,因为它包含所有这些积分,我们不知道如何计算它。事实证明,对于多项式贝叶斯网络的情况,贝叶斯分数实际上可以使用一个称为伽马函数的函数以闭式形式写出。

伽马函数如上所示,它也是一个积分,但事实证明伽马函数实际上是阶乘函数的连续扩展,因为 Γ(x) = x * Γ(x-1),并且大多数计算机都有伽马函数的实现。
利用伽马函数,我们实际上可以将 P(D|G) 重写为如下形式的一个乘积:
P(D|G) = ∏_i [ ∏_{u_i} [ Γ(α_{i|u_i}) / Γ(α_{i|u_i} + M_{i|u_i}) ] * ∏_{x_i^j} [ Γ(α_{i|u_i, x_i^j} + M_{i|u_i, x_i^j}) / Γ(α_{i|u_i, x_i^j}) ] ]
其中:
i遍历所有变量。u_i遍历变量X_i父节点的所有可能赋值。x_i^j遍历变量X_i本身的所有可能值。α是狄利克雷先验参数。M是充分统计量。
虽然这个表达式看起来可能仍然有点吓人,但它是可以直接插入计算机并轻松计算的东西。
边际似然的另一个有价值的性质是,如果我们进一步观察它并取其对数,我们会发现这个表达式(最初是变量 i 的乘积)实际上在对数下变成了 i 的和,其中每一项只涉及变量 X_i 及其父节点集的“族分数”。因此,就像我们之前见过的其他分数一样,评分函数分解为仅涉及 X_i 及其父节点的项之和。我们将看到,这个性质从计算角度来看可能非常重要。

先验分布的选择
从边际似然出发,表达式中的第二项是 log P(G)。为了容纳这一项,我们需要一个图结构的先验 P(G)。人们使用了多种不同的先验,事实证明一个相当常见的选择是简单地使 P(G) 为常数。虽然它没有明确地对复杂性施加任何惩罚,但由于边际似然对复杂性施加了惩罚,它通常效果很好。
但是,如果我们想引入额外的复杂性惩罚,我们可以使先验成为对边数或参数数量进行指数惩罚的东西,从而诱导额外的稀疏性。重要的是,我们实际上并不想定义一个在所有可能结构(甚至更严格地说,在所有可能无环结构)上正确归一化的图结构先验概率。但幸运的是,我们不需要这样做,因为分布 P(G) 中的归一化常数在不同的网络中是恒定的,因此可以完全忽略。我们只需要考虑随图结构变化的项,而忽略归一化常数或配分函数。

这是结构先验,那么参数先验呢?
在贝叶斯分数上下文中最常用的参数先验是所谓的 BDE 先验。我们在讨论贝叶斯网络的参数估计时实际上已经见过 BDE 先验。作为提醒,BDE 先验由两个组成部分定义:
- 一个等效样本大小
α,这是我们在某个想象世界中可能见过的实例总数。 - 一个概率分布
P_0,通常由一个先验贝叶斯网络B_0编码,它编码了我们对世界的先验信念。
因此,我们为变量 X_i 的特定值组合及其父节点的特定赋值定义想象计数为:
α_{i|u_i, x_i^j} = α * P_0(x_i^j, u_i)
一个重要的注意事项是,图 G 中变量 X_i 的父节点与先验网络 B_0 中 X_i 的父节点不同。事实上,在许多情况下,我们选择网络 B_0 为一个没有边的网络,其中所有变量都是独立的。然后我们计算 B_0 中的概率分布,并用它来计算给定图 G 的学习问题上下文中的超参数 α。重要的是,单个网络 B_0 为我们提供了所有候选网络的先验,因此我们不需要为指数级的网络获取先验;我们有一个单一的网络 B_0 和一个单一的等效样本大小,我们可以用它来计算我们感兴趣评估的所有可能网络的参数先验 P(θ|G)。
除了方便之外,为什么选择这个先验而不是其他先验?事实证明,可以证明这个先验是多项式贝叶斯网络的唯一先验,具有以下重要性质:如果两个网络是 I-等价 的,那么它们具有相同的贝叶斯分数。也就是说,如果我们使用不符合此模式的另一组狄利克雷先验,我们可能会遇到两个 I-等价网络 G 和 G‘ 具有不同贝叶斯分数的情况。在将其纳入参数先验方面,这没有真正的理由,因为这些网络在表示概率分布或同一组概率分布的能力上是完全等价的。那么,为什么其中一个的贝叶斯分数会与另一个不同呢?或者,如果我们确实有一些先验知识认为其中一个图比另一个更合适,我们应该将其放入我们的结构先验中,而不是参数先验中。

贝叶斯分数的渐*行为
BDE 分数的一个有趣性质与其渐*行为有关。让我们考虑当样本数 M 趋于无穷大时,BDE 分数(或一般的贝叶斯分数)会发生什么。

事实证明,当 M 趋于无穷大时,具有狄利克雷先验的网络 G 的边际似然对数满足以下等式:
log P(D|G) = log P(D|G, θ_hat_G) - (log M / 2) * Dim(G) + O(1)
其中:
- 第一项
log P(D|G, θ_hat_G)是给定最大似然参数的数据的对数似然。这就是我们见过的似然分数,它在拟合数据方面有一些好的性质,但也容易过拟合。 - 第二项是
-(log M / 2) * Dim(G),其中M是实例数,Dim(G)是独立参数的数量(对于多项式分布,是分布中的条目数减 1)。这一项带有负号,意味着随着参数数量的增加,边际似然的对数将会减少。因此,这两项之间存在一种张力:第一项(如我们所见)试图拥有更复杂的网络以最大化数据拟合度,而第二项则试图通过减少参数数量来降低模型的复杂性。 - 第三项
O(1)表示在形式符号上,这一项相对于M是常数,意味着它不随实例数M增长。这意味着随着实例数量的增长,只有前两项在选择哪个结构将被选中方面发挥作用。
前两项恰好有一个名字,叫做 BIC 分数,它只关注似然成分和惩罚项。在本课程的另一部分,我们讨论了 BIC 分数及其一些性质,特别是例如,当 M 增长到无穷大时,该分数是一致的,这意味着正确的图或其 I-等价图之一,将在我们考虑的所有可能图中具有最高分数。
因此,这再次证明了贝叶斯分数是避免过拟合的一种方法,因为在大样本极限下,我们将学习到正确的图,要么是正确图,要么是其 I-等价图之一。

总结

本节课中我们一起学习了贝叶斯分数。让我们总结一下关键点:
- 核心思想:贝叶斯分数使用贝叶斯原理,特别是对我们不确定的参数进行*均,以避免过拟合。
- 常见形式:贝叶斯分数最常实例化为一个称为 BDE 的特定变体,它要求我们评估一个先验网络以计算参数先验,但这同时也为我们提供了一个将先验知识纳入学习算法的自然位置。
- 重要性质:BDE 先验具有 I-等价网络具有相同分数 的重要性质。
- 渐*行为:在大样本极限下,贝叶斯分数等价于一个称为 BIC 的不同分数(我们在本课程中单独分析)。由于这种等价性,可以证明它是渐*一致的,即当
M趋于无穷大时,它能学习到正确的网络。 - 实际考虑:虽然这种渐*行为很重要,但同样重要的是要认识到,我们通常没有非常大量的样本(至少在大多数应用中没有)。因此,考虑在更合理的样本数
M下的行为也很重要。在这种情况下,可以证明 BIC 分数倾向于欠拟合模型结构,即它会学习过于稀疏的模型。


020:学习树结构网络 🌳
在本节课中,我们将学习如何为概率图模型学习最优的树结构网络。我们将从定义结构评分标准开始,然后探讨如何在所有可能的候选结构中优化这个评分,并首先聚焦于树结构这一特定情况。
概述
结构学习的目标是找到一个能最好地匹配数据的图结构。这是一个优化问题:输入是训练集、评分函数和可能的结构空间,输出是一个网络。计算效率的关键在于评分函数的可分解性,即评分可以分解为各个变量与其父节点组成的“家庭”的评分之和。
为什么学习树结构? 🤔
我们首先关注学习树或森林的问题。森林是指每个变量最多有一个父节点的图,它可以是多个不连通的组件。而树则要求图是连通的。
尽管树的表达能力有限,但我们仍关注它,原因有三:
- 数学上的优雅性:这带来了高效的优化算法。
- 计算的高效性:即使对于高维问题,也能有效求解。
- 泛化能力强:由于其参数化非常稀疏,树结构更不容易过拟合,尤其在数据量(M)相对于网络复杂度较小时,可能提供更好的泛化性能。
树结构学习的公式化 📝
我们引入符号:令 P(i) 表示变量 Xi 的父节点,若 Xi 无父节点,则 P(i) = 0。
对于一个可分解的评分函数(如似然、BIC或BDE评分),其总评分是各个家庭评分之和。对于树或森林,每个变量最多有一个父节点,因此总评分可以写为:
总评分 = Σ_{i: P(i)≠0} [得分(Xi | P(i))] + Σ_{i: P(i)=0} [得分(Xi)]
通过巧妙的数学变换,我们可以将这个表达式重写为:
总评分 = 常数 + Σ_{i: P(i)≠0} [得分(Xi | P(i)) - 得分(Xi)]
这里的“常数”部分对所有树结构都相同,不影响结构间的比较。因此,优化总评分等价于优化这个求和项。我们可以将其视为边权重的求和。
定义边权重与算法 🧮
基于上述推导,我们定义从节点 i 到节点 j 的边的权重为:
W(i->j) = 得分(Xj | Xi) - 得分(Xj)
这个权重衡量了将 Xi 设为 Xj 的父节点所带来的评分增益。
对于评分等价的评分函数(我们讨论的三种都是),可以证明 W(i->j) = W(j->i)。这意味着边的权重是无向的。此外,对于似然评分,这个权重正比于变量 Xi 和 Xj 之间的互信息,总是非负的。而对于BIC或BDE,权重可能为负,表示增加这条边可能因复杂度惩罚而降低总评分。
基于这些观察,我们得到以下高效算法:
- 构建无向加权图:以所有变量为节点。对于每对变量
(i, j),计算权重W_ij = max(得分(Xj | Xi) - 得分(Xj), 0)。取最大值是为了剔除负权重,便于后续优化。 - 寻找最大权重生成树:使用标准的最大权重生成树算法(如Prim或Kruskal算法)在这个无向加权图上找到一棵树,使得所有边的权重之和最大。这是一个时间复杂度为 O(n²) 的高效过程。
- 生成最终森林:如果算法结果中存在权重为0的边(它们源自原始计算中的负权重),则移除这些边。最终得到的可能是一个连通树,也可能是一个由多棵树组成的森林,这就是相对于评分函数的最优结构。
实例分析 🏥
以ICU警报网络为例。下图左侧是原始网络结构,右侧是应用上述树学习算法得到的结果。
- 红色边:在学到的树中存在,并且在原始网络中也存在。
- 蓝色边:在学到的树中存在,但不在原始网络中(伪边)。

这个例子说明,虽然学到的树中很多边确实反映了真实结构,但也会引入一些伪边。这些伪边通常源于原始网络中通过间接路径产生的变量相关性。此外,学到的树本质上是无向的,算法本身无法确定边的方向,即无法推断因果关系的前后顺序。
总结 🎯


本节课我们一起学习了概率图模型中树结构的学习方法:
- 结构学习是一个在组合图空间上的优化问题。
- 评分函数的可分解性是高效计算的关键,它将全局评分分解为局部家庭评分之和。
- 对于树或森林结构,我们可以将优化问题转化为在无向加权图上寻找最大权重生成树的问题。
- 利用标准的图算法(如Prim或Kruskal算法),我们可以在 O(n²) 的时间内找到全局最优的树结构,这适用于我们讨论过的所有评分等价标准(似然、BIC、BDE)。
- 学到的树结构具有表达简洁、抗过拟合的优点,但可能无法捕获变量间所有的依赖关系,且边的方向性信息缺失。
021:学习通用图-启发式搜索

概述
在本节课中,我们将要学习如何为通用贝叶斯网络结构(而不仅仅是树结构)寻找最优评分。我们将了解到这是一个NP难问题,因此需要采用启发式搜索方法,特别是贪婪爬山算法及其改进策略。

从树结构到通用图结构
上一节我们介绍了将贝叶斯网络结构学习视为一个优化问题,并将其分解为定义评分函数和设计优化算法两部分。我们讨论了当网络结构被限制为树或森林(每个变量至多有一个父节点)时,如何高效地解决此优化问题。
那么,当我们试图学习一个不受限制的网络,或者限制比树结构更宽松的网络时,该如何处理呢?
通用结构学习的挑战
我们的输入是一个训练集、一个评分函数以及一组可能的网络结构。期望的输出是在我们愿意考虑的结构集合中,能最大化评分的某个网络结构。
在树结构的背景下,我们可以应用一个简单的贪婪算法来寻找最大权重生成树。然而,对于更通用的网络,即使只允许每个节点最多有两个父节点,这种构建树的贪婪算法也不再有效,无法保证找到评分最优的网络。
事实上,一个简单算法无法解决此问题并不令人意外,因为有如下定理:对于任何大于1的K值,寻找具有最高评分、且每个节点最多有K个父节点的最佳网络是一个NP难问题。当K=1时,我们回到了树或森林的上下文,存在多项式时间算法。但对于K=2,问题就变成了NP难问题。因此,不太可能为此问题找到高效的算法。
启发式搜索:贪婪爬山法
那么,我们该怎么办呢?标准的解决方案是采用某种启发式的爬山搜索。
我们从一个当前网络开始(稍后会讨论如何初始化),然后考虑可以对该网络进行的各种修改。例如,我们可以考虑进行可能提高(也可能不提高)网络相对于评分的质量的局部扰动。
在设计启发式搜索算法时,有两个主要的设计选择需要决定:
- 操作符集合:即我们可以采取的、将一个网络扰动为另一个网络的步骤集合。例如,我们刚才看到的例子中,我们采取了局部步骤:添加边、删除边或反转边。这些都是对网络相当小的扰动。也有算法使用更大的全局步骤,例如将整个节点从网络中取出并插入到其他地方,这种步骤成本更高,但在网络空间中移动的幅度也更大。
- 搜索技术:我们最终使用哪种搜索技术?是使用所谓的“贪婪爬山法”(只求尽快向上爬升),还是采用其他类型的局部组合搜索算法(有很多种)?
让我们从讨论贪婪爬山法开始,它是当今使用的大多数贝叶斯网络学习算法的基础。
贪婪爬山法的工作原理
贪婪爬山法如何工作?
- 初始化:从一个给定的网络开始。初始网络通常是空网络,因为空网络能引入稀疏性,避免网络过于复杂而导致过拟合。我们也可以从通过之前讨论的高效树学习算法得到的最佳树开始,或者从一个随机网络开始(这是一种更广泛探索空间的方式)。我们还可以从多个随机起点开始,或者在有领域专家知识的情况下,利用先验知识来初始化过程。
- 迭代改进:初始化后,我们迭代地尝试改进网络。我们考虑基于我们定义为合法的操作符可以采取的不同步骤。然后,对于每个可能的改变,我们计算其得到的评分。
- 贪婪选择:应用最能提高评分的那个改变。这就是“贪婪”的部分:我们查看所有可能的改变,并贪婪地选择最能提高评分的那个。
- 重复与终止:这给了我们一个新的网络,然后我们可以再次考虑可以应用于这个新网络的下一步可能改变,并重复此过程。这个过程一直持续到我们“卡住”为止,即我们可用的所有修改都无法提高评分。当这种情况发生时,我们就到达了一个所谓的“局部最大值”,即网络空间中没有改变能导致评分提高的一个点。
贪婪爬山法的缺陷
这个贪婪爬山过程有哪些缺陷?
- 局部最大值:这个局部最大值可能只是一个局部最优,而非全局最大值。如果我们从某个点开始,只采取小的爬山步骤,我们可能会到达一个相对于全局最大值来说非常差的局部最大值。
- 高原:高原是指在我们周围有一大堆网络,它们的评分都基本相同。虽然某些方向可能在经过一定步数后最终通向一个“山峰”,但其他方向可能不会。问题在于,从评分的角度来看,所有方向看起来都一样,我们不知道应该朝哪个方向前进。这在贝叶斯网络结构学习中很常见,因为当你有一个网络时,通常存在许多与之等价的其他网络(例如,通过反转边得到的网络),它们具有相同的评分。在这些等价网络之间移动,不清楚哪一个最终会让我们跳出高原,进入一个评分更高的网络。

操作符选择:为什么需要边反转?
局部最大值和高原的问题也与我们使用的搜索操作符有关。我们讨论了边添加、边删除和边反转。有人可能会问,为什么我们需要边反转?毕竟,边反转可以通过先删除一条边再添加另一条边来替代。
这与我们搜索的贪婪性有关。考虑一个例子:假设有一个生成数据的真实图 G*,我们试图从中学习网络。我们从空网络开始,假设网络中A和C之间、B和C之间存在强相关性,并且B和C之间的相关性更强,因此我们先添加这条边。此时,从C到B的边和从B到C的边是完全对称的,这两个网络等价,评分相同。我们可以任意选择从C到B的边。然后,我们添加另一条边,比如从A到C。现在,从C到B的边是“错误”的,我们实际上希望反转它。但如果没有边反转操作,唯一的方法就是先删除那条边,然后再添加另一个方向的边。然而,删除那条边会在评分上造成很大损失,因为它原本是一条非常好的边。因此,删除它不是一个贪婪的(即评分提升的)步骤。如果我们没有边反转操作,这个带有从A到C和从C到B的边的网络就会成为一个局部最大值。除非我们有边反转步骤,否则仅通过一步贪婪搜索无法跳出这个局部最大值。因此,边反转是避免这些常见局部最大值的一种方法。但它并不能解决所有局部最大值,特别是那些更大的局部最大值。

改进策略:避免局部最优
那么,人们通常使用什么算法来解决这个问题而不陷入这些常见的局部最大值呢?

一个相当好且简单的算法是:我们确实使用贪婪爬山法,但用两种策略来增强它,以尝试避免局部最大值和高原。
- 随机重启:如果你在爬升过程中卡住了,就采取一定数量的随机步骤,然后重新开始爬升。希望是,如果我们处在一个相对较浅的局部最大值,那么少量的随机步骤会将我们移入一个更好最大值的吸引区域,然后我们将继续爬升到一个更好的最优点。
- 禁忌表:这是一种避免反复踏足同一区域的方法,对局部最大值和高原都有用。我们保存一份最*采取步骤的列表(禁忌表),并限制我们的搜索不能反转这些步骤。具体来说,如果“添加边A->B”在我们的禁忌表上,那么只要这个添加步骤还在最*步骤列表中,“删除边A->B”就是我们不可以做的操作。这迫使我们向前推进,而不是重复做同样的步骤、反转它、尝试另一个版本、再反转它。事实证明,这有助于避免局部最大值,也有助于在高原地带取得进展。


实践效果与应用
那么,这在实践中效果如何呢?首先看一个合成数据的例子:这是我们之前在贝叶斯网络参数估计中见过的ICU警报网络。这里展示了两种学习场景:蓝线(下方)是仅学习参数(给定真实结构);绿线是同时尝试学习参数和结构。X轴是数据实例数量M,Y轴是学习到的网络与真实网络之间的距离(用KL散度或相对熵衡量)。我们可以看到,当只尝试学习参数时,至少在初始阶段(样本数较少时),性能更好。但随着数据越来越多,即使只有大约2000个样本,两者的性能已经非常接*。这表明结构学习问题本质上并不比单独的参数估计困难太多。
然而,这个结果需要谨慎看待,因为从合成数据(这里的数据是从网络生成的)中学习的问题实际上比从真实数据集中学习更容易。合成数据在相关性结构上具有更清晰、更强的信号。因此,这里的性能可能有点误导性,不能完全代表我们在数据不如合成数据“完美”时正确学习网络结构的能力。
尽管如此,在许多应用中,即使使用真实数据,贝叶斯网络结构学习也带来了显著优势。
- 交通预测:微软研究院的一个应用旨在预测交通堵塞的发生地点,以及可能出现比正常情况更少或更多交通的“意外”地点。该应用利用高速公路上的传感器数据,通过贝叶斯网络结构学习来预测没有传感器的路段以及未来30或60分钟的交通状况。学习到的网络揭示了不同路段、事故报告和时间等因素之间复杂的相互关系,其中一些相关性可能不是人类专家能轻易推断出来的,从而获得了更好的预测性能。
- 科学发现:另一个非常不同的应用是在科学发现领域。一个实验测量了单个细胞中不同蛋白质的水*,目标是发现一种蛋白质水*如何影响另一种蛋白质水*的调控机制。将贝叶斯网络学习应用于此问题,以尝试理解细胞内的调控网络。学习到的边中,许多(特别是标记为蓝色的)是文献中已知的,这验证了算法的有效性。更重要的是,一些学习到的边(标记为红色的)在文献中支持较弱或仅在其它细胞类型中已知,但在这个实验的B细胞中未被证实。其中一条边随后在湿实验室中被测试并发现同样存在于这些细胞中,揭示了不同生物通路之间的“串扰”。这是一个很好的例子,说明贝叶斯网络结构学习可以用于知识发现本身,而不仅仅是提高预测性能。
总结
本节课中我们一起学习了通用贝叶斯网络结构学习的启发式搜索方法。
我们了解到,在森林/树结构之外,寻找最高评分的网络结构是一个NP难问题,通常使用简单的启发式搜索来解决。最常用的是使用局部步骤(如边添加、删除或反转)来修改网络的贪婪爬山法。为了避免由此产生的局部最优,我们通常不仅使用简单的爬山法,还通过使用禁忌表(避免撤销最*的更改)和随机重启来修改它,以探索空间的不同部分。

虽然这是一个非常成功的策略,但实际上还有更好的算法,它们能在空间中同时进行更大的更改。这些算法计算成本更高,实现更困难,但可以在空间中实现更大的移动,因此,特别是在信号不明确的大型空间中,可以比简单的贪婪搜索找到更好的结构。
022:学习通用图-搜索与可分解性 🧠


在本节课中,我们将要学习如何将通用贝叶斯网络结构的学习问题视为一个组合优化问题,并探讨如何利用可分解性这一特性,来显著降低搜索算法的计算成本。
上一节我们介绍了将结构学习视为搜索问题,本节中我们来看看这个搜索算法的计算复杂度,以及如何通过优化来提升效率。

算法复杂度分析 🔍
首先,我们来分析一个朴素实现该搜索算法的计算成本。
以下是算法每一步需要评估的操作数量:
- 在一个包含 N 个节点的贝叶斯网络中,存在 N × (N-1) 条可能的边。
- 对于每条边,如果它存在于当前图中,我们可以删除或反转它;如果不存在,我们可以添加它。
- 因此,在算法的每一步,我们需要评估 O(N²) 个可能的操作。
接下来,评估每个候选后继网络(即应用一个操作后得到的新网络)的成本如下:
- 由于分数的可分解性,网络的总分是每个变量与其父节点构成的“家庭”分数之和,共有 N 个分量。
- 计算每个家庭分数需要遍历训练数据以获取充分统计量,这需要 O(M) 时间,其中 M 是训练实例的数量。
- 因此,评估一个网络需要 O(N × M) 时间。
- 此外,还需要检查操作后的图是否无环,这通常需要 O(|E|) 时间,其中 |E| 是图中的边数。
综合以上,每个搜索步骤的总计算成本约为 O(N² × M × N),这在变量数(N)较大时会变得难以处理。

利用可分解性优化计算 💡
那么,我们如何改进呢?关键在于利用分数的可分解性。
考虑一个具体的操作,例如在原始网络中添加一条从 B 到 D 的边。原始网络的总分 Score(G_original) 可分解为:
Score(G_original) = Score(A | ∅) + Score(B | ∅) + Score(C | {A, B}) + Score(D | {C})
添加边 B→D 后,新网络 G_new 的分数为:
Score(G_new) = Score(A | ∅) + Score(B | ∅) + Score(C | {A, B}) + Score(D | {C, B})
我们可以发现,只有变量 D 的家庭分数发生了变化。因此,我们无需重新计算整个网络的分数,只需计算分数差(Delta Score):
Δ = Score(G_new) - Score(G_original) = Score(D | {C, B}) - Score(D | {C})
这个 Δ 值仅涉及单个家庭(D 的家庭)的计算。
以下是不同操作的影响范围:
- 添加边:只影响一个家庭(子节点所在的家庭)。
- 删除边:只影响一个家庭(子节点所在的家庭)。
- 反转边:影响两个家庭(原父节点和原子节点各自的家庭)。
这意味着,在评估一个操作时,我们只需重新计算受影响的少数家庭,而不是整个网络,从而大幅降低了计算量。
在连续搜索步骤中缓存结果 🗂️

可分解性带来的第二个优化是在连续的搜索步骤中避免重复计算。
假设在上一步中,我们执行了添加边 B→D 的操作。现在,在下一步中,我们需要再次评估所有可能的操作,其中包括删除边 B→D。
请注意,这个“删除 B→D”的操作我们在上一步(添加边之前)已经评估过一次。更重要的是,在评估这个操作时,变量 D 的家庭构成(父节点集合)在上一步和当前这一步是相同的(都是 {B, C})。因此,这个操作的 Δ 分数也完全相同,我们没有必要重新计算它。
总结来说:我们只需要重新计算那些在上一步操作中发生了变化的家庭所涉及的 Δ 分数。其他未受影响的操作的分数可以沿用之前计算的结果,无需更新。

优化后的成本与数据结构 🚀
综合以上优化,让我们重新评估计算成本。
决定并执行一个移动后的成本:一次移动通常只影响 1 到 2 个家庭。对于每个受影响的家庭,最多有 O(N) 条与之相关的边需要重新计算 Δ 分数。计算每个 Δ 需要 O(M) 时间。因此,这一步的成本是 O(N × M),比朴素实现的 O(N³ × M) 降低了两个数量级。
选择最佳移动的成本:朴素方法需要遍历 O(N²) 个操作并计算分数。我们可以通过使用优先队列数据结构来优化:
- 我们维护一个按 Δ 分数排序的所有可能操作的优先队列。
- 当执行一步移动后,只有 O(N) 个受影响的操作的 Δ 分数需要更新。我们将它们从队列中取出,更新后重新插入。
- 更新和重新插入 O(N) 个元素到优先队列的成本是 O(N log N)。
- 此后,最佳操作始终位于队列顶端,可以在常数时间内取出。
这样,选择移动的成本从 O(N²) 降低到了 O(N log N)。
高级优化策略:缓存与剪枝 ⚡
基于另一个观察,我们可以获得更高的计算效率:在大多数网络学习算法中,合理的家庭结构(即哪些变量可能成为某个变量的父节点)是有限的、重复出现的。
以下是两种利用该特性的方法:
- 缓存充分统计量:由于相同的家庭组合(如变量 A 和 B 同时作为某个家庭的成员)可能在搜索过程中多次出现,我们可以预先计算并缓存这些组合的充分统计量。当再次需要时,直接从缓存中读取,避免重复遍历整个数据集,这能极大降低计算成本。
- 限制候选父节点集:对于每个变量,我们可以预先根据领域知识或简单启发式方法,确定一个较小的、合理的候选父节点集合(例如 K 个),而不是考虑所有其他 N-1 个变量。这样,需要评估的操作数量就从 O(N) 降到了 O(K)。虽然这是一种启发式剪枝,可能影响最终结果,但在实践中通常是一个很好的*似,能显著提升速度。
总结 📝
本节课中我们一起学习了如何优化贝叶斯网络结构搜索的计算效率。

- 朴素的结构搜索算法(如贪婪爬山法)在变量数 N 较大时,计算成本(O(N³ × M))会变得非常高。
- 通过利用分数的可分解性,我们可以将计算集中在受局部操作影响的少数家庭上,并将成本降低到 O(N × M)。
- 在连续的搜索步骤中,我们可以避免为未变化的家庭重复计算分数差。
- 使用优先队列管理待评估操作,可以将选择最佳操作的成本从 O(N²) 降至 O(N log N)。
- 进一步的优化包括缓存常用的充分统计量,以及预先剪枝不合理的候选父节点,从而在实践中实现更高效的学习。

这些技术共同作用,使得学习大规模贝叶斯网络结构变得可行。
023:不完整数据学习概述 🧩

在本节课中,我们将要学习如何处理不完整数据下的模型学习问题。我们将探讨数据缺失的原因、如何形式化地描述缺失机制,并理解不完整数据给学习任务带来的核心挑战。
从完整数据到不完整数据 🔄
上一节我们介绍了从完整数据中学习模型结构和参数的方法。本节中,我们将转向一个更具挑战性的情境:当我们只有部分观测数据时,如何进行学习。
这种情况出现在多种场景中。例如,某些变量从未被观测到,它们是隐藏的或潜在的。此外,当某些测量未被执行时,也会出现数据缺失。
我们将看到,这些情境在学习任务的定义和计算层面都带来了显著挑战。

为何关注潜在变量? 🤔
首先,我们来探讨为何需要关注潜在变量。
一个原因是,潜在变量通常能产生更稀疏、因而更容易学习的模型。假设我们有一个真实的网络 G*,其中包含一个潜在变量 H 和多个可观测变量 X、Y。如果 H 是潜在的,我们只能学习一个关于可观测变量的网络。这个新网络的结构会变得非常复杂,参数数量可能从17个激增至59个。因此,虽然学习包含潜在变量的模型本身有难度,但为了获得更简洁的模型,这种权衡可能是值得的。
另一个原因是,潜在变量本身可能具有意义,它们能帮助我们揭示数据中的有趣结构。例如,在处理人体扫描的3D点云数据时,我们希望发现点云中对应身体部位的聚类。每个点可以关联一个潜在变量,表示它属于哪个身体部位。
缺失数据的复杂性 🧩
理解了潜在变量的价值后,我们来看看缺失数据带来的复杂性。
假设我们得到一串数据序列,其中包含一些问号表示缺失值。如果我们不知道数据为何缺失,就无法正确处理它。

考虑两个不同的场景:
- 实验者抛硬币,硬币偶尔掉到地上,实验者没有记录掉落时的结果。
- 实验者抛硬币,但他不喜欢“反面”,因此有时不报告“反面”的结果。
在这两种情况下,如果我们想从数据集中学习,应该采用非常不同的估计方法。在第一种情况下,我们可以忽略问号,仅从观测到的序列(如 HTHH)中学习。在第二种情况下,我们不能忽略缺失的测量,因为它们本质上大多是“反面”,忽略它们会导致错误的估计。
因此,为了在不完整数据下正确学习,我们需要考虑数据缺失的机制。
如何建模缺失数据? 📊
为了形式化地建模缺失数据,我们引入以下概念:
- 模型变量 (X): 定义我们模型的随机变量集合。
- 可观测性变量 (O): 总是被观测到的变量。
O_i = 1表示X_i被观测到,O_i = 0表示未被观测到。 - 观测值变量 (Y): 总是被观测到的变量。
Y_i的值域与X_i相同,但包含一个特殊值(如“?”)表示未观测到。
在真实场景中,我们观测到的是 Y 和 O,而 X 是未被观测到的。Y 是 X 和 O 的确定性函数:
Y_i = X_i (当 O_i = 1 时)
Y_i = ? (当 O_i = 0 时)
利用这些变量,我们可以建模之前提到的两种场景。在硬币掉落的场景中,可观测性模式 O 独立于硬币的真实值 X。而在实验者不喜欢反面的场景中,X 的值会影响 O(即是否被观测到)。

随机缺失假设 📉
那么,在什么情况下我们可以忽略缺失机制,只关注观测数据的似然呢?答案是当数据满足“随机缺失”假设时。

随机缺失意味着,在给定所有观测值 Y 的条件下,可观测性变量 O 与未观测到的变量 H 独立。也就是说,一旦你告诉我观测到了什么,某些值是否缺失这一事实本身不提供关于未观测变量的额外信息。
这个概念有些微妙。举个例子:病人去看医生,医生决定是否进行胸部X光检查。如果医生没做这个检查,这可能暗示病人没有咳嗽等症状,因此未观测到X光结果这一事实本身就提供了关于疾病(未观测变量)的信息,这不满足随机缺失。但是,如果病历中记录了病人的主诉是“腿部骨折”,那么在给定这个观测变量的条件下,是否进行X光检查的模式就不再提供关于肺结核等未观测疾病的信息,这就满足了随机缺失。
为了简化后续讨论,我们将默认假设数据是随机缺失的。
似然函数的挑战 🎯
不完整数据带来的下一个复杂之处在于,其似然函数可能具有多个全局最优解。
直观上,这几乎是显而易见的。如果一个潜在变量有值0和1,那么将0和1互换名称并相应地反转所有关联参数,会得到一个完全等价的模型。这意味着似然函数存在对称的“镜像”峰值。
当存在多个潜在变量时,问题会变得更糟,全局最优解的数量会随潜在变量数量呈指数级增长。即使只是部分数据点缺失某些变量的值,也可能导致多个局部和全局最优解。
为了更深入地理解,我们来比较完整数据和不完整数据情况下的似然函数。

对于一个简单的两变量模型 X -> Y,在完整数据情况下,其似然函数具有优美的分解形式,是各实例概率的乘积,取对数后变为参数的和,易于处理。
而在不完整数据情况下(例如 X 的值缺失),似然函数变为观测值 Y 的概率,这需要对 X 的所有可能取值求和。例如,P(Y=0) 等于 P(X=0, Y=0) + P(X=1, Y=0)。展开后,表达式包含了 X 的参数和 Y|X 的参数相乘再相加的形式。
这意味着:
- 似然函数不再按变量或CPD分解:
X的参数和Y|X的参数出现在同一表达式中。 - 计算似然需要概率推断:因为涉及对未观测变量的求和。
- 似然函数形态复杂:不完整数据的整体似然函数是所有可能数据补全方式对应的似然函数之和。这些单独的似然函数可能是凹的,但它们的和会形成具有多个峰值的复杂形态。
- 参数间产生相关性:在完整数据中,参数估计是独立的。但在不完整数据中,例如当
X未观测时,选择P(X)的参数值会影响哪些数据实例被归为X=0或X=1,从而影响P(Y|X=0)和P(Y|X=1)的估计,在它们之间引入了相关性。
总结 📝
本节课中,我们一起学习了不完整数据下的学习概述。

- 我们首先明确了不完整数据(包括潜在变量和随机缺失)在实践中非常普遍。
- 我们探讨了为何要关注潜在变量:它们可以带来更简洁的模型,并能揭示数据的内在结构。
- 我们认识到,正确处理缺失数据必须考虑其生成机制,并引入了“随机缺失”这一重要假设来简化问题。
- 最后,我们深入分析了不完整数据给似然函数带来的核心挑战:多峰性、参数不可识别性(存在多个等价最优解)以及计算复杂性(似然函数不再分解,且计算需要推断)。

这些挑战使得不完整数据下的学习成为一个困难但重要的问题,我们将在后续课程中探讨解决这些挑战的方法。
024:期望最大化算法简介

在本节课中,我们将要学习如何处理数据缺失情况下的模型学习问题,并重点介绍一种强大的迭代优化算法——期望最大化算法。
缺失数据下的学习难题
上一节我们讨论了存在缺失变量时模型学习的复杂性。本节中,我们来看看这种复杂性在参数估计中的具体表现。
缺失数据使得似然函数的形态变得非常复杂。在数据完整的情况下,似然函数通常是一个优美的对数凹函数,我们可以用简单的公式进行闭式求解。然而,当数据存在缺失时,似然函数会变成一个复杂的、多峰的函数,如下图所示,这使其无法直接优化求解。

优化策略一:梯度上升法 🧗
面对这种复杂的函数,一种通用的策略是使用梯度上升等优化方法。其基本思想是:从参数空间的一个初始点出发,计算该点的梯度(即函数上升最快的方向),然后沿该方向移动一小步,到达新的点。重复此过程,直到达到一个局部最优点。

为了提高收敛速度,可以使用更高效的方法,如线搜索或共轭梯度法。
在贝叶斯网络的背景下,我们可以推导出对数似然函数梯度的闭式解。对于一个特定的参数 θ(x_i | u_i)(例如,在多项式贝叶斯网络中,x_i 是节点 X_i 的一个取值,u_i 是其父节点的一个取值组合),其梯度公式如下:
梯度公式:
∇θ(x_i|u_i) L(θ) = (1 / θ(x_i|u_i)) * Σ_m P_θ(X_i = x_i, U_i = u_i | o[m])
其中,L(θ) 是对数似然函数,o[m] 是第 m 个数据实例中的观测值。我们需要对每个数据实例 m 和每个变量族 (X_i, U_i) 计算给定观测下该族取特定值的概率 P_θ(X_i = x_i, U_i = u_i | o[m])。
这意味着,在梯度上升的每一次迭代中,我们都需要为每一个数据实例运行一次概率推理,以计算这些后验概率。虽然由于族保持性质,一次校准(如团树传播)可以同时得到一个实例中所有变量族的概率,但计算成本依然很高。
以下是梯度上升法的优缺点分析:
- 优点:策略灵活,不仅适用于表格CPD,通过导数的链式法则也能扩展到非表格CPD。
- 缺点:
- 需要确保优化后的参数构成合法的概率分布(即所有值非负且和为1),这引入了约束优化问题。
- 为了获得良好的收敛性,通常不能使用简单的梯度上升,而需采用共轭梯度等更复杂的方法,进一步增加了计算成本。
优化策略二:期望最大化算法 🔄
第二种策略是专门为优化似然函数设计的算法,称为期望最大化算法。其核心直觉在于我们面临一个“鸡生蛋,蛋生鸡”的问题:
- 如果数据是完整的,那么参数估计很容易(我们有闭式解)。
- 如果参数是已知的,那么估计缺失数据的概率也很容易(这是一个定义明确的概率推理问题)。
EM算法通过迭代方式解决这个问题:从一组初始参数开始,交替执行以下两步,直到收敛。


E步:计算期望
在E步中,我们利用当前参数 θ^t 来“补全”数据。注意,这是一种“软补全”,我们计算的是缺失变量的概率分布,而非一个硬赋值。

具体来说,对于每个数据实例 d[m] 和每个变量族 (X, U),我们计算:
P_θ^t (X=x, U=u | o[m])
其中 o[m] 是实例 m 中的观测值。
然后,我们利用这些概率计算期望充分统计量。在数据完整时,充分统计量 M(x,u) 是看到组合 (x,u) 的次数。现在,我们使用期望计数:
期望充分统计量公式:
M̂_θ^t (x, u) = Σ_m P_θ^t (X=x, U=u | o[m])
M步:最大化参数
在M步中,我们将上一步得到的期望充分统计量 M̂_θ^t 当作真实的充分统计量来使用,并据此进行最大似然估计。
例如,对于多项式贝叶斯网络,更新参数的公式为:
参数更新公式:
θ^{t+1} (x|u) = M̂_θ^t (x, u) / M̂_θ^t (u)
其中 M̂_θ^t (u) = Σ_x M̂_θ^t (x, u)。这实质上就是基于软计数计算条件概率。


实例:贝叶斯聚类 🧩
让我们通过一个简单的例子——贝叶斯聚类(或朴素贝叶斯模型)来具体说明。该模型有一个潜在的类变量 C(缺失)和多个观测特征 X_i。假设给定类别 C 后,所有特征相互独立。
在这个设定下,应用EM算法:
- E步:计算每个数据实例属于每个类别的概率
P_θ^t (C | x[1], ..., x[n]),以及每个特征与类别共现的期望计数。 - M步:使用这些软计数更新参数。
- 更新类先验:
θ^{t+1}(c) = (Σ_m P_θ^t (C=c | o[m])) / M - 更新特征似然:
θ^{t+1}(x_i | c) = (Σ_m P_θ^t (X_i=x_i, C=c | o[m])) / (Σ_m P_θ^t (C=c | o[m]))
- 更新类先验:
算法总结与对比 📊
与梯度上升法类似,EM算法在每次迭代中也需要为每个数据实例运行一次推理来计算后验概率。同样得益于族保持性质,一次校准即可获得所需的所有概率。
以下是EM算法的优缺点分析:
- 优点:
- 易于实现:可以在已有的完整数据最大似然估计程序基础上,增加一个计算期望统计量的E步即可实现。
- 收敛迅速:经验表明,EM算法在迭代初期能非常快速地提升似然函数值。
- 缺点:
- 后期收敛慢:在迭代后期,收敛速度可能会显著下降。
- 可能陷入局部最优:与梯度法一样,它找到的通常是局部最优解。


本节课中我们一起学习了处理含缺失数据参数估计的两种主要策略:通用的梯度上升法和专用的期望最大化算法。我们深入探讨了EM算法的两个步骤(E步和M步),理解了其如何通过迭代的“软补全”和参数更新来优化似然函数,并通过贝叶斯聚类的例子加深了理解。这两种算法都需要在每次迭代中进行概率推理,是解决不完全数据学习问题的核心工具。
025:EM算法分析
在本节课中,我们将深入探讨期望最大化算法的理论基础。我们将了解EM算法为何有效,以及其背后的数学直觉。


上一节我们介绍了EM算法的基本流程。本节中,我们将从理论层面分析其工作原理,并理解算法中使用的公式是如何推导出来的。
EM算法与梯度上升法类似,也是一种局部搜索过程。但它使用了一种对似然函数“不那么局部”的*似。具体来说,如果我们有一个对数似然函数,梯度上升法会在当前点用一个直线(线性函数)来*似该函数。而EM算法则使用一个曲线函数来*似,这个曲线函数本身就是一个对数似然函数,更准确地说,是完整数据下的对数似然函数。构建了这个*似后,算法会跳转到这个*似函数的最大值点。由于这个*似函数是完整数据的对数似然,我们可以通过最大似然估计以闭式解的形式求出其最大值。这就是EM算法背后的核心直觉。

为了形式化这一直觉,我们从一个数据实例开始分析。设 D 为观测数据,H 为该实例中的隐变量。我们假设,通过某种方式,我们得到了隐变量 H 在该实例中可能取值的某个分布 Q(H)。
首先,让我们回顾一下当数据完整时(即观测到D和H),对数似然函数的形式。给定参数 θ 和数据对 (D, H),对数似然函数可以分解为网络中所有变量的求和:
L(θ; D, H) = Σ_i Σ_{x_i, u_i} 1{X_i = x_i, Pa_i = u_i} * log(θ_{x_i|u_i})
这里,1{...} 是指示函数,当变量 X_i 及其父节点 Pa_i 在赋值 (D, H) 中分别取值为 x_i 和 u_i 时,其值为1,否则为0。我们以这种复杂形式书写,是为了后续推导的便利。
现在,我们考虑隐变量 H 的分布 Q(H)。我们来看这个对数似然函数相对于分布 Q 的期望值。由于期望的线性性质,我们可以将期望运算推进到求和内部:
E_{H~Q}[L(θ; D, H)] = Σ_i Σ_{x_i, u_i} E_{H~Q}[1{X_i = x_i, Pa_i = u_i}] * log(θ_{x_i|u_i})
关键的一步是简化这个期望。指示函数的期望等于该事件发生的概率。因此:
E_{H~Q}[1{X_i = x_i, Pa_i = u_i}] = Q(X_i = x_i, Pa_i = u_i)
于是,期望对数似然函数变为:
E_{H~Q}[L(θ; D, H)] = Σ_i Σ_{x_i, u_i} Q(X_i = x_i, Pa_i = u_i) * log(θ_{x_i|u_i})
接下来,我们考虑有多个数据实例的情况。对于第 m 个数据实例,我们使用当前参数 θ^t 来定义隐变量的分布,即后验概率 Q_m^t(H) = P(H | D_m, θ^t)。
我们对所有数据实例的期望对数似然进行求和:
Σ_m E_{H~Q_m^t}[L(θ; D_m, H)] = Σ_i Σ_{x_i, u_i} [ Σ_m P(X_i = x_i, Pa_i = u_i | D_m, θ^t) ] * log(θ_{x_i|u_i})
观察方括号内的求和项 Σ_m P(X_i = x_i, Pa_i = u_i | D_m, θ^t),这正是我们在EM算法的E步中计算的期望充分统计量,记作 \bar{M}[x_i, u_i]。
因此,总期望对数似然函数可以重写为:
Σ_m E_{H~Q_m^t}[L(θ; D_m, H)] = Σ_i Σ_{x_i, u_i} \bar{M}[x_i, u_i] * log(θ_{x_i|u_i})
这个形式非常重要。它完全等同于一个完整数据下的对数似然函数,只不过使用的是期望充分统计量 而非实际计数。我们知道如何最大化这种形式的函数——其最优解就是标准的最大似然估计解:
θ_{x_i|u_i}^{t+1} = \bar{M}[x_i, u_i] / Σ_{x_i'} \bar{M}[x_i', u_i]

这正是EM算法的M步。
回到最初的图示,那个蓝色的*似曲线就是期望对数似然函数。E步通过计算期望充分统计量来构建这个函数,而M步则通过最大化它来得到新的参数估计 θ^{t+1},从而进入下一次迭代。
基于这种理解,我们可以证明关于EM算法的两个重要性质:
以下是EM算法的两个关键性质:
- 单调性:在每次迭代中,似然函数(或对数似然函数)都不会下降。即
L(θ^{t+1}) ≥ L(θ^t)。 - 收敛性:当算法收敛时,即参数不再变化(
θ^{t+1} = θ^t),那么 θ^t 是似然函数的一个驻点(梯度为零的点)。虽然理论上驻点可能是局部极小值、局部极大值或鞍点,但在实践中,由于EM算法是一种爬山过程,几乎不可能恰好收敛到一个局部极小值。因此,当算法收敛时,我们通常可以认为找到了一个局部极大值。这与梯度下降法所能提供的保证是类似的。

本节课中我们一起学习了EM算法的理论分析。我们了解到,EM算法通过构建并最大化一个期望对数似然函数(即完整数据似然的*似)来迭代优化参数。E步负责计算期望充分统计量以构建这个函数,而M步则通过闭式解最大化它。我们还证明了算法具有单调收敛到局部最优解的良好性质。
026:实践中的EM算法

在本节课中,我们将探讨期望最大化(EM)算法在实际应用中的表现。我们将分析其收敛行为、可能遇到的问题以及相应的解决策略。
上一节我们介绍了EM算法的公式,本节中我们来看看它在实践中的具体表现。
收敛行为分析
首先,让我们观察EM算法在迭代过程中的行为。下图展示了迭代次数(横轴)与*均训练实例的对数似然(纵轴)之间的关系。

观察发现,对数似然值随着迭代次数单调递增,这验证了EM算法的理论性质。然而,在迭代初期(如前8-10次),对数似然值提升非常迅速,之后增速则显著放缓。
我们可能会认为,当迭代到第10次左右,对数似然不再显著增加时,算法就已收敛,可以停止。但实际情况并非如此简单。
参数空间与似然空间
下图展示了同一模型下,迭代次数与不同模型参数值的变化关系。

可以看到,尽管在第10次迭代后,对数似然(左图)不再明显改善,但参数空间(右图)中的多个参数值却发生了剧烈变化。例如,蓝色参数值显著下降,而黑色参数值显著上升。
这表明,似然空间的收敛并不等同于参数空间的收敛。因此,在评估算法收敛时,我们可能需要同时关注参数空间的变化。
过拟合问题
继续运行EM算法直至完全收敛并不总是最佳选择。下图左侧再次展示了训练集上的对数似然,右侧则展示了在未参与训练的测试集上的对数似然。

测试集的对数似然在迭代初期(约10次前)也快速上升,但之后便开始逐渐下降。这意味着,当算法继续微调参数以略微提升训练集似然时,实际上可能对训练数据中的噪声进行了过拟合,导致模型在未见数据上的性能下降。
为了避免这种数值过拟合,主要有两种策略:
以下是两种主要的解决策略:
- 使用验证集或交叉验证:通过监测验证集上的对数似然来确定最佳停止迭代次数
T。当验证集性能开始下降时便停止迭代。这种方法计算成本较高,因为需要在测试实例上运行推断。 - 使用MAP估计而非MLE:与完整数据情况下的估计类似,引入先验可以*滑参数估计,使其对训练数据中的噪声不那么敏感。公式表示为:
θ_MAP = argmax_θ P(θ|D) = argmax_θ P(D|θ)P(θ)。
局部最优问题
EM算法和梯度上升法一样,通常只能找到对数似然函数的局部最优解。
下图展示了在不同训练样本量 m(横轴)下,算法从25个不同随机起点运行后找到的 distinct 局部最优解的数量(纵轴)。

- 蓝线代表25%数据随机缺失的情况。
- 红线代表50%数据随机缺失的情况。
- 黑线代表存在一个完全不可观测的隐变量的情况。
观察发现:
- 在数据缺失的情况下(蓝、红线),初始时局部最优解数量很多,几乎每次运行都找到一个不同的解。但随着训练数据量增加,算法能更好地识别出全局结构,主导的局部最优解数量减少。
- 缺失数据越多(比较红线和蓝线),减少局部最优解数量的过程就越慢。
- 当存在隐变量时(黑线),无论有多少数据,局部最优解问题始终存在。
局部最优的影响
局部最优并非无关紧要。下图展示了不同EM运行最终达到的训练集对数似然值的分布。

可以看到,不同运行最终达到的对数似然值差异巨大。这意味着,算法收敛到哪个局部最优解,会显著影响其最终性能。

因此,初始化策略对EM这类算法的性能至关重要。
以下是几种常见的初始化策略:
- 多重随机重启:从多个随机初始参数点开始运行EM,选择最终训练对数似然最高的那次运行。
- 利用先验知识:如果有关于参数或变量赋值(例如,实例到聚类的分配)的先验知识,可以用来初始化算法。
- 使用更简单的算法初始化:EM算法功能强大,但也更容易陷入某些局部最优。可以先使用更简单、对局部最优不那么敏感的算法进行初始化,例如在聚类问题中使用K-means或层次凝聚聚类算法,然后再运行EM进行优化。
总结
本节课中我们一起学习了EM算法在实际应用中的关键问题:
- 对数似然函数的收敛不等同于参数空间的收敛,评估收敛需谨慎。
- 运行至完全收敛可能导致数值过拟合,可采用早停或MAP估计来缓解。
- 局部最优问题无法避免,且缺失数据越多,局部最优越多;但增加数据量有助于缓解此问题(隐变量情况除外)。
- 不同的局部最优解会导致性能差异显著,因此智能的初始化策略对于学习含隐变量或缺失数据的模型至关重要。


027:潜在变量应用与挑战 🎯
在本节课中,我们将学习期望最大化算法最常见的应用场景:处理包含潜在变量的学习问题。潜在变量是指那些我们永远无法直接观测到,但对于捕捉数据分布中重要潜在结构至关重要的变量。我们将通过多个具体例子,探讨EM算法如何在这些场景中应用,并讨论相关的挑战。
潜在变量应用实例 📊
上一节我们介绍了EM算法的基本原理,本节中我们来看看它在不同领域的实际应用。以下是几个典型的例子,展示了潜在变量模型如何帮助我们理解复杂数据。
贝叶斯聚类
一个最简单的例子是贝叶斯聚类。在这个场景中,我们有一个潜在的类别变量和一组可观测的特征。我们的目标是将数据实例分割成不同的类别,并假设每个类别内的观测特征具有相似的分布。在许多应用中,这个分布采用朴素贝叶斯模型的形式,即给定类别后,特征之间相互独立。
一个具体的应用是用户分群。例如,微软研究院的Jack Breze及其同事对MSNBC网站用户进行了分群,依据是用户点击了网站上的哪些新闻故事。以下是分析得到的四个用户群:
- 商业与技术读者群:这个群体的用户最可能点击关于商业和技术的文章,例如关于电子邮件投递或DVD播放器购买的新闻。
- 体育新闻读者群:这个群体的用户主要点击体育类故事。
- 头条新闻读者群:占用户总数的29%,主要点击网站首页推广的头条新闻。
- 全站浏览读者群:这个群体令人意外,他们会在整个网站浏览,寻找各种“软新闻”。这个发现对网站重新设计以更好地服务这类用户具有启示意义。
语音识别
一个非常不同的应用是语音识别。我们之前讨论过,语音识别的标准表示是隐马尔可夫模型。在HMM中,我们有隐藏变量和参数。

- 参数:HMM的参数,例如音素间的转移概率,或对应于不同音素或其内部状态的声学观测概率。
- 潜在变量:将连续的声学信号分割成属于哪个音素、以及音素内哪个状态的部分。这些是隐藏变量,并且数量巨大。
为了训练一个良好的语音识别HMM,标准策略是自底向上的引导训练:首先使用音素数据库为每个音素单独训练音素HMM。这一步同样需要使用EM算法,因为音素内部到其构成部分的分解是没有标签的。训练好单个音素模型后,可以用它们来初始化更高级别的词模型训练,并在整个词训练的过程中继续优化音素HMM参数。这种良好的参数初始化能让E步中的分割相对正确,从而在语音识别问题中找到更好的局部最优解。

3D机器人地图构建
另一个应用是3D机器人地图构建。这个问题的输入是由移动机器人上的激光测距仪收集的一系列点云数据,目标输出是环境的一组*面构成的3D地图。
- 模型参数:环境中墙壁或*面的位置和角度。
- 潜在变量:将每个数据点关联到特定墙壁的分配变量。
EM算法在此有效工作:在E步,它确定哪些点属于哪面墙;在M步,它调整墙的位置以更好地拟合分配给它的点。通过处理原始嘈杂的点云数据,EM算法能构建出比原始数据合理得多、真实得多的环境*面地图。
人体姿态与骨架重建
还有一个应用是在3D激光扫描的背景下,从不同姿态的人体扫描数据中重建3D骨架。这里的一个关键问题是,将每次扫描中的点聚类分配到不同的身体部位。
- 聚类(部位):每个部位在多次扫描(同一人的不同姿态)中都有一个变换。如果我们知道点的部位分配(这是一个潜在的未观测变量),我们就可以预测这个点在两次扫描间如何变换。
- 挑战与改进:如果仅基于点本身进行聚类,效果很差,因为肌肉变形会引入噪声。但如果在模型中加入空间邻接性的软约束(这实际上是一个关联性的马尔可夫随机场约束),让相邻的点更可能被分配到同一个部位,那么聚类效果会显著提升。EM算法能很好地收敛,将点清晰地划分到不同部位,从而易于重建骨架。
直升机特技轨迹对齐
最后一个使用不同EM模型的应用是直升机特技演示轨迹对齐。输入是不同飞行员尝试完成的同一特技动作的不同轨迹,目标是对齐这些轨迹,并同时学习目标或模板轨迹的概率模型。

这可以表示为一个图模型:有一个潜在的意图轨迹(Z),以及模型参数(状态转移概率)。专家演示的观测是意图轨迹的噪声版本。但我们不知道每个观测点对应意图轨迹中的哪个时间点,因此引入了另一组潜在变量——时间索引(τ),它表示在某个演示时间点,专家处于意图轨迹的哪个状态。
这个问题可以用EM算法求解,其中有两组潜在变量(τ和Z)和一组模型参数。通过EM对齐,原本发散的不同飞行员轨迹能够很好地对齐,从而更容易学习到一个统一的模型,用于控制直升机飞出正确的轨迹。

潜在变量基数选择 🤔
关于潜在变量的一个重要问题是其取值数量(基数)的选择。这在前面提到的许多应用中都是隐含存在的,例如,我们应该有多少个用户群?一个音素应该分成多少段?
如果我们用似然度来评估模型,那么拥有更多潜在变量取值的模型总是会得到更高的似然度,因为它是一个表达能力更强的模型,这会导致过拟合。我们可以像在其他结构学习算法中一样,通过使用惩罚复杂度的评分函数来规避这个问题,例如BIC评分。不过BIC倾向于欠拟合,因此人们为不完备数据背景下的贝叶斯评分提出了多种扩展(通常是*似方法),这些方法在实践中往往比BIC效果更好。
还有其他策略:
- 使用聚类一致性度量的启发式探索算法:如果某个聚类内部不一致,则分裂它;如果两个聚类非常相似,则合并它们。
- 基于贝叶斯技术的方法:*年来非常流行,例如狄利克雷过程。这类方法不是为潜在变量选择一个固定的基数,而是维护一个关于基数的分布,然后使用像马尔可夫链蒙特卡洛这样的采样技术对不同基数进行*均。处理潜在变量基数选择问题通常是学习潜在变量模型时需要应对的较棘手问题之一。
总结 📝
本节课中我们一起学习了潜在变量在概率图模型学习中的关键作用。潜在变量是学习不完备数据时最常见的场景之一。当我们想要为结构丰富的领域构建模型时,引入这些潜在变量对于模型的成功至关重要。

我们了解到,潜在变量满足“随机缺失”的假设,因此期望最大化算法在此适用,并且被广泛用于优化潜在变量模型。然而,我们也再次认识到,在学习潜在变量模型时,我们会面临模型不可识别性以及存在多个最优解(通常甚至是彼此对称的)的严重问题,这凸显了良好初始化策略的重要性。最后,我们探讨了为潜在变量选择合适基数这一关键问题,以及*年来为解决该问题所发展的多种方法。
028:学习算法综述与实用指南 🧠


概述
在本节课中,我们将回顾并整合之前讨论过的多种学习算法,理解它们如何构成一个完整的机器学习流程。我们将从假设空间、目标函数和优化算法三个核心组件出发,探讨如何在实际问题中应用这些方法,并学习如何诊断和解决常见的模型错误。
假设空间:我们搜索什么 🔍
上一节我们回顾了学习算法的整体框架,本节中我们来看看第一个核心组件——假设空间。假设空间定义了我们要搜索的模型类别。
它主要包含两个可搜索的部分:
- 参数:模型的连续数值部分。
- 结构:模型的离散部分,例如图模型中的边。

根据搜索对象的不同,学习问题性质也不同:
- 搜索参数是连续优化问题。
- 搜索结构是离散优化问题。
- 同时搜索两者是混合优化问题。
此外,我们通常会对假设空间施加约束,原因有三:
- 计算效率:更小的搜索空间通常更容易处理。
- 降低模型容量:限制模型复杂度,以减少过拟合风险。
- 融入先验知识:引导学习算法找到更合理的模型。
目标函数:我们优化什么 📈
上一节我们定义了搜索空间,本节中我们来看看指导搜索的目标函数。最常用的目标函数是惩罚似然。

其公式为:
目标函数 = 对数似然 + 正则化项
- 对数似然:衡量模型(结构和参数)对训练数据的拟合程度。
- 正则化项:引导模型选择更简单、不易过拟合的配置。它包含两种形式:
- 参数先验:例如,在马尔可夫随机场中使用L2或L1正则,在贝叶斯网络中使用狄利克雷先验。它们的作用是*滑参数。
- 结构复杂度惩罚:当搜索结构时,惩罚具有更多边或参数的复杂模型。
另一种范式是贝叶斯评分,适用于仅搜索图结构并对参数积分的情况。
其公式为:
log P(G | D) = log P(D | G) + log P(G)
其中:
log P(D | G)是边际似然,其内部已包含对参数的规则化。log P(G)是图先验,作为对结构的正则化项。
优化算法:如何找到最优解 ⚙️
确定了搜索空间和目标后,我们需要合适的优化算法。算法的选择取决于搜索空间(连续/离散)和目标函数的性质。
以下是针对不同情况的优化方法:
连续空间优化
- 闭式解:对于具有多项式条件概率分布的贝叶斯网络,参数的最大似然估计有闭式解。
- 梯度上升:当无法获得闭式解时(如MRF学习、含缺失数据的学习),使用梯度上升或其变体(如共轭梯度、LBFGS)进行迭代优化。
- 期望最大化:专门用于处理含缺失数据时,对数似然函数存在多峰情况的优化。
离散空间优化
- 精确高效算法:对于树结构,最大权重生成树算法能在多项式时间内找到最优解。
- 局部爬山法:对于更复杂的结构空间,通常采用添加、删除、反转边等局部操作进行启发式搜索。
混合空间优化
同时优化参数和结构通常计算代价高昂,因为每次结构变动都需要重新优化参数来评估该变动的好坏。

超参数选择与模型评估 🎯
每个学习算法都有一组需要预先设定的超参数。例如:
- 狄利克雷先验的等效样本量。
- 正则化强度(L1/L2)。
- EM算法的停止准则。
- 结构惩罚的强度。
- 隐变量的取值数量(如聚类数)。
重要原则:不应在训练集上选择超参数,这会导致过拟合。
以下是正确的超参数选择与模型评估流程:

超参数选择方法
- 将数据分为训练集、验证集和测试集。
- 在训练集上用不同超参数训练模型。
- 在验证集上评估模型性能。
- 选择在验证集上性能最佳的超参数组合。
- 为更稳健,可使用交叉验证:多次划分训练/验证集,选取*均性能最好的超参数,最后用全部训练数据重新训练。
模型评估标准
- 测试集对数似然:衡量模型对未知数据的预测能力。
- 任务特定指标:如图像分割的准确率、语音识别的词错误率。优化最终任务指标通常能获得更好性能。
- 知识发现一致性:检查学习到的模型(如聚类结果、网络结构)是否与领域先验知识相符,可作为合理性检验。

常见错误模式诊断与修复 🩺

在模型开发过程中,识别和修复错误模式至关重要。以下是几种典型情况:
欠拟合
- 诊断:训练性能和测试性能都低。表明模型表达能力不足,无法捕捉数据中的模式。
- 修复方案:
- 减少正则化强度。
- 降低结构惩罚,允许学习更多边和交互。
- 增加特征:通过误差分析,针对模型出错的实例添加能改进预测的特征。
过拟合
- 诊断:训练性能高,但测试性能低。表明模型拟合了训练数据中的噪声。
- 修复方案:
- 增加正则化强度。
- 施加模型容量约束(如限制模型类别)。
- 减少特征数量,降低模型复杂度。

优化失败
- 诊断:优化算法未找到目标函数的良好解。可能由于多峰问题陷入局部最优,或学习率设置不当无法收敛。
- 修复方案:尝试不同的学习率、不同的随机初始化,比较目标函数值。若结果差异大,需尝试多个起始点或更仔细地设置优化参数。
目标函数失配
- 诊断:模型A的目标函数值优于模型B,但模型A在真正关心的性能指标(如分割准确率)上却差于模型B。
- 修复方案:重新设计目标函数,使其更好地匹配最终的性能评价指标。切勿试图通过“破坏”优化算法来弥补目标函数的缺陷。

总结:实践中的机器学习流程 🔄
本节课中,我们一起学习了如何将概率图模型的学习算法整合到一个完整的实践流程中。
一个典型的机器学习循环如下:
- 设计模型模板:确定变量、模型类型(有向/无向)、特征类型等。
- 通过交叉验证选择超参数:在训练集上进行。
- 用选定超参数训练模型:在完整训练集上进行。
- 在保留集上评估性能:诊断是否存在欠拟合、过拟合等错误模式。
- 进行误差分析并迭代:根据错误类型,重新设计模型、目标函数或优化算法,然后回到步骤1。
- 在独立测试集上报告最终结果:仅当模型开发完成后,才在从未参与过任何调整的独立测试集上评估性能,以获得对模型泛化能力的无偏估计。

记住,保留集在流程中已被用于指导模型选择,因此不能代表真正的“未见数据”。
029:总结与展望 🎯
在本节课中,我们将回顾整个概率图模型课程的核心内容,探讨其价值、应用场景以及不同设计选择之间的权衡。我们将看到,概率图模型是一个强大的统一框架,它融合了统计学与计算机科学的精华,使我们能够对复杂的不确定性问题进行建模、推理和学习。
为什么选择概率图模型?🤔
我们花费了整个课程来讨论概率图模型。我们讨论了表示层面的不同变体、可用于回答关于概率图模型各类问题的推理算法,以及可以从数据中学习概率图模型的算法。
现在,让我们退一步,思考概率图模型及其可能为我们带来的价值。
概率图模型在某种意义上,是统计学的基础思想与计算机科学重要技术的结合或联姻。
- 从统计学中,我们获得了坚实的概率论基础。它告诉我们什么是概率分布,以及如何利用它们来思考不确定性,并对概率分布进行各种操作,例如条件化。此外,还有基于概率分布进行决策的技术,如信息价值或决策制定。
- 从计算机科学中,我们获得了将高维空间上的概率分布视为一个对象,并利用图作为一种数据结构的思想。这使得我们能够设计算法,高效地操作这些高维对象。正是这些来自计算机科学的思想,使我们能够将这些坚实的概率论基础,应用到如今在许多场景下面临的复杂现实问题中。
声明式表示的价值 📝
能够将高维概率分布视为一个对象的关键在于,我们现在获得了关于世界知识的声明式表示。
这种声明式表示,即概率图模型,是一个独立的单元。我们可以将其与随后用于操作它的任何算法分开考虑。这一点很重要,因为它允许我们独立于算法来改进模型。我们可以开发模型,并考虑它是否适合我们的应用,然后应用一种或多种不同的算法来尝试回答关于该模型的问题。
它还允许我们将模型构建阶段与推理阶段分离开来。模型构建可以涉及从领域专家获取知识,或从数据中学习,或两者兼有。我们广泛讨论了学习方法,也在一定程度上讨论了知识获取方法。
何时应用概率图模型?🚀
在以下情况下,我们会应用概率图模型:
- 当数据存在噪声和不确定性时。这在任何应用中几乎都是成立的。
- 当我们有大量先验知识需要嵌入模型时。在概率图模型的背景下,这通常比在其他多种方法(例如许多传统的机器学习设置)中更容易实现。在这里,以一种自然的方式融入先验知识要简单得多。
- 当我们希望对多个相互关联的变量进行推理时。如果你只试图预测单个变量,概率图模型可能不是最理想的解决方案,可能有一系列其他方法(例如传统机器学习)同样或更具竞争力。但当你试图同时对多个变量进行推理时,纳入它们之间相互关系的能力通常非常强大,概率图模型在此可以大放异彩。
- 当我们希望构建由模块化构建块组成的、结构丰富的模型时。例如,在进行故障诊断或医疗诊断时,我们通常拥有这些小的模型构建块,它们可以在不同诊断问题的不同模型中重复出现。这种架构允许我们获取这些构建块,并通过重用组件快速构建出非常丰富的模型。
设计选择之间的相互作用 ⚙️
我们已经从一系列设计选择的角度讨论了概率图模型:表示侧的选择、我们选择使用的推理算法,以及我们可能采用的学习算法(如果需要学习的话)。
事实证明,尽管声明式表示允许我们将这些设计选择分开,孤立地考虑每一个,并分别开发每一个,但它们实际上并非完全独立。考虑它们之间的相互作用非常重要。
以下是这些设计选择相互关联的方式:
- 表示的影响:我们选择的表示方式显然会影响推理和学习的成本。我们讨论了不同类型图模型在推理成本上的差异,并且也展示了在学习设置中,学习有向模型或无向模型时,可学习性和复杂性问题是截然不同的。
- 推理算法的关联:推理算法与其他所有方面都相互关联。例如,在我们展示的许多学习算法中,推理算法被用作子程序。无论是在完全数据情况下的MRF或CRF学习,还是在任何不完全数据的学习设置中,思考推理算法的复杂性和特性对于设计良好的学习算法至关重要。此外,我们知道某些推理算法仅适用于特定类型的模型。因此,如果我们瞄准特定的推理算法,那会影响我们对表示的选择。
- 学习算法的约束:学习算法也对建模施加了重大约束。我们从数据中正确识别模式的能力,对我们的模型表达能力施加了重大约束。例如,只有某些类型的模式可能根据我们拥有的数据量(例如,完全数据或不完全数据)是可识别的。
权衡示例:图像分割 🖼️
让我们通过图像分割的例子,来看看其中一些权衡。
这里,我们需要做出的第一个设计决策是:是将其建模为贝叶斯网络(有向图模型)、MRF,还是CRF(我们试图根据特征X预测分割标签S_i,即建模P(S|X),而非联合分布)。
以下是我们可能为此类决策考虑的一些权衡:
- 建模的自然性:最初考虑时,一个有向模型(其中超像素之间存在有向边)似乎不是一个特别自然的选择。因为我们会选择哪个方向?例如,如果我们使用从图像左上角到右下角的有向边,这似乎没有意义。因此,这里更自然的建模范式似乎是MRF或CRF。
- 特征表示的丰富性:我们可能希望使用非常丰富的特征表示。这些特征X应该是结构丰富的,例如计算图像中不同的梯度、纹理和颜色的梯度、不同的直方图等。这些丰富的特征通常彼此高度相关,而我们知道相关特征在正确捕捉其相关结构方面很难建模。在这种情况下,CRF似乎是更好的选择,因为它避免了如何建模这些丰富特征之间相关结构的问题,允许我们使用丰富特征,而不会陷入错误建模相关性的陷阱,从而降低性能。
- 推理成本:我们需要考虑此类模型中的推理成本,这反过来又会影响建模。例如,对于某些类型的模型,当MRF或CRF中的势函数是关联的或规则的时,我们可以应用非常高效的推理算法(利用最小割等组合图算法),这比应用消息传递方案要快得多。但这给我们施加了约束:必须确保我们的势函数确实是关联的。这确实会影响我们的模型正确捕捉分布结构的能力。例如,使用关联势函数很容易捕捉“相邻像素倾向于具有相同标签”这一事实,但很难捕捉“牛倾向于在草地上,而不是在水上、路上或天空中”这类涉及不同类别之间关系的模式。
- 训练成本:MRF和CRF的训练成本比贝叶斯网络高。在这种情况下,我们可能仍然愿意承受这个代价,因为它在建模方面有好处。但在完全数据训练的情况下,训练贝叶斯网络在计算上比训练MRF或CRF要高效得多。因此,这是我们在表示侧做出的设计决策所付出的代价。
- 不完全数据学习:如果我们必须在数据缺失的情况下学习,这又设置了一个需要考虑的约束。假设我们有一个场景,其中分割标签未被观察到,即我们试图以无监督的方式学习分割。在这种情况下,S是未观察到的潜在变量。这意味着优化P(S|X)甚至没有意义,因为S从未被观察到。因此,在这种情况下,我们根本无法学习CRF。此时,我们必须转而使用不同的表示方案进行学习。这是另一个例子,说明了我们做出的不同选择与我们拥有的不同约束之间的交织:在这种情况下,不完全数据学习以可能意想不到的方式与表示选择相互作用。
混合与匹配策略 🔄
概率图模型及其模块化的一个重要好处是,它们允许我们在建模框架内混合和匹配不同的思想。
这之所以重要,是因为它为我们提供了比单独考虑每个主题作为解决方案更丰富的选择。我们通常可以以有趣的方式组合它们。
表示侧的混合:混合有向与无向边
让我们回到刚才讨论的图像分割,思考那些实际上混合了有向边和无向边的模型。
例如,如果我们试图从无监督数据中学习图像分割,我们可能在标签S上使用无向边(作为MRF),正如我们在图中看到的,这是我们之前讨论过的自然(或无方向性)选择。但我们有从S到特征X的有向边。这是一个半无向的模型:在这一层是无向的,但从S到X是有向的。
这为什么好?
- 它为我们提供了一个有意义的优化目标:我们试图使用模型参数和模型结构来优化解释我们所见图像的能力。
- 在这方面,它是一个生成模型,通过迫使我们以某种方式生成观测数据,可以让我们学习分布中的统计信息或模式。
- 通过使这个模型是有向的(而不是无向的,我们本可以通过在整个集合上做MRF来实现,那也会是一个生成模型),它实际上极大地促进了学习。因为每个势函数P(X_i | S_i)都可以单独学习,而无需尝试优化整个模型,因此效率要高得多。这是一个混合匹配策略优于完全有向或完全无向的统一模型的案例。
推理侧的混合:应用不同算法于不同部分
我们学习了各种不同的推理算法,可能会倾向于直接将模型扔进这些推理算法之一的“黑箱”中。但在某些情况下,考虑对模型的不同部分应用不同的推理算法会更有益。
例如,我们可能对某些变量子集使用信念传播或马尔可夫链蒙特卡洛方法,但对某些变量集可以进行精确推理,这在这些子集上产生更准确的结果,并可能使我们算法的收敛性和准确性都变得更好。
让我们看一个例子。这是一个我们之前见过的二分MRF,一侧有一组变量A,另一侧有变量B。假设变量之间存在相当密集的连接,甚至A和B之间可能是全连接的。
现在,想想我们可能想对这类模型使用哪种算法。
- 如果A或B的集合非常小,我们可以使用精确推理,但这通常不是情况。
- 一种可能是应用信念传播。但如果你看这个图,你会发现它有大量相当紧密的环。我们知道紧环对信念传播是个问题,因此我们可能会担心收敛质量和答案质量。
- 另一种方法是使用马尔可夫链蒙特卡洛方法,如吉布斯采样。但如果有很多A和B,那么我们是在一个非常大的高维空间上采样,我们知道高维空间中的采样方法在收敛速度和答案质量方面也有局限性。
这里我们可能考虑的一种可能性是马尔可夫链蒙特卡洛的变体:我们只对A进行采样(假设A比B少)。对于A的每个赋值(即我们每个粒子维护的赋值a_1^m, ..., a_K^m),我们以闭式形式维护B上的分布。因此,我们实际上对B进行精确推理,只对A进行采样。这将显著提高收敛速度以及我们估计量的统计特性。这只是众多例子中的一个,我们可以在信念传播中构造更大的团簇,在每个团簇内运行精确推理。混合不同的推理算法可以带来巨大好处。
学习侧的混合:应用不同算法于不同部分
学习侧的混合同样有用。我们可以将不同的学习算法应用于模型的不同部分。
再次回到我们的图像分割例子,现在我们假设回到了从完全观测数据中学习的情况。我们将考虑一个CRF。一种非常常见的做法是,为P(S|X)训练一个高质量、易于训练的模型(如支持向量机或某种逻辑回归)。我们可以非常高效地训练它,可以使用复杂的机器学习技巧(如核方法)来获得高精度的节点势函数。然后固定这些,使用CRF学习来学习高阶(例如成对甚至更高阶)的势函数。事实证明,这样做在许多情况下对过拟合的敏感性较低,并且训练速度要快得多。

综合应用示例:医疗分诊系统 🏥

通过将不同的功能片段、不同的思想组合在一起,我们可以构建一些非常棒的集成应用。我想以一个很酷的应用示例来结束本次讨论,它将一系列不同的思想整合到一个单一的框架中。


这是来自微软研究院的一项工作,他们在概率图模型的应用方面有着悠久的传统。它融合了来自语音识别、诊断和不确定性下决策制定的思想。

在该系统中:
- 价值信息被用来确定应该问哪些问题,以最大程度地提高诊断质量和在此贝叶斯网络(显示在右侧)中做出决策的能力。
- 当前模型和场景被用来指导语音识别系统,从而从语音识别中获得更高质量的结果。系统利用当前理解的情境来指导用户可能说什么的先验,而不是进行完全无引导的语音识别。

总结 📚

在本节课中,我们一起回顾并展望了概率图模型的广阔世界。

概率图模型为我们提供了一个在复杂、不确定领域中进行推理和学习的集成、连贯的框架。
多年来,人们已经开发了庞大的工具套件,可用于在此框架内完成不同的任务。我们可以将它们放在这个单一的统一框架中,解决比任何单一工具单独所能解决的更难的问题。

我们在本课程的不同例子中看到,这个框架被用于极其广泛的应用中,并且还有更多可以应用的领域。总的来说,我们可以看到,在这个范式下还有许多可以继续工作的地方,无论是将其用于可能感兴趣的新应用,还是改进表示、推理和学习的基础方法,以解决尚未遇到的新问题。

浙公网安备 33010602011771号