在为某些数据设计模型时,我们必须对产生这些数据的过程做出假设。事实上,我们可以说,模型就是这组假设,而这组假设就是模型。模型与它所表示的假设之间的关系如此重要,值得强调:

模型 = 关于数据的一组假设

选择在模型中包含哪些假设,是模型设计的关键环节。错误的假设会导致模型给出不准确的预测,正是这些有缺陷的假设造成了这种结果。然而,不做任何假设是不可能建立模型的——至少必须做出一些假设。

正如你在第 1 章中所见,本书将使用因子图来表示我们的模型。随着阅读的深入,你将学会如何构建对一组选定假设进行编码的因子图。同样,你也将学会观察一张因子图并推断出它所表示的假设。你可以把因子图看作一组假设的精确数学表示。例如,在第 1 章中,我们构建了一张因子图来表示关于一起谋杀之谜的一组精确假设。对于当前这个应用,我们需要对“一个具备特定技能集的候选人如何回答一组测试问题”这一过程做出假设。这将定义候选人的潜在技能与其测试答案之间的关系,随后我们可以将其反转,从测试答案中推断出他们的技能。

在设计因子图时,我们首先要选择希望图中包含哪些变量。图中至少必须包含表示我们实际拥有的数据的变量(候选人是否答对了每道题),以及我们想要了解的变量(技能)。正如我们将看到的,引入其它中间变量往往也很有用。选定变量之后,我们就可以开始向图中添加因子,以编码这些变量在答题过程中如何相互影响。通常从我们想要了解的变量(技能)开始,沿着这个过程一路推进,直到我们真正能够测量的变量(候选人是否答对了题目),这样做往往会很有帮助。

那么,从技能变量开始,这是我们的第一个假设:

1 每位候选人要么已掌握某项技能,要么没有掌握。

假设 2.1 意味着我们可以把候选人的技能表示为一个二值(true/false)变量:如果候选人掌握了该技能,则为 true;否则为 false。像我们目前见过的所有变量那样,只能取一组固定值之一的变量,称为离散变量。在本章后面,我们会遇到连续变量,它可以在一段连续取值范围内取任意值,例如 0 到 1 之间的任意实数。正如我们将看到的,连续变量在学习事件概率等许多用途上都非常有用。

接下来,我们需要对候选人拥有每项技能的先验概率做一个假设。

2 在看到任何测试结果之前,一位候选人拥有或不拥有某项特定技能的可能性是相等的。

假设 2.2 意味着每个技能变量的先验概率应中性地设为 50%,也就是 Bernoulli(0.5)。为使因子图保持较小,我们先考虑单个候选人回答图 2.1中三道题的情形。

将上述两个假设应用到这些题目所需的 csharpsql 技能上,得到如下最小因子图

图 2.2

图 2.2:展示二值技能变量 csharpsql先验因子图

记住,每一张因子图都表示图中各变量上的一个联合概率分布。这张因子图联合分布为:

$$ P(\text{csharp}, \text{sql}) = \text{Bernoulli}(\text{csharp}; 0.5)\,\text{Bernoulli}(\text{sql}; 0.5). \quad (2.1) $$

注意,联合概率中每一项都对应因子图中的一个因子(黑色方块)。

继续答题过程,我们现在必须对候选人的测试答案与其技能之间的关系做一些假设。假设他们具备某道题所需的全部技能,我们仍应允许他们有时会答错。如果我们让一位 SQL 专家做一些 SQL 题目,我们预期他们能答对多少?大概不是全部,但也许能答对 90% 左右。我们可以通过请一些真正的专家来做这样的测验、看看他们得多少分来检验这个假设,但现在我们先假设“十道错一道”是合理的:

3 如果候选人具备某道题所需的全部技能,那么他们通常会答对,只是每十次会犯一次错误。

对于候选人缺少某项必要技能的题目,我们可以假设他们随机猜测:

4 如果候选人不具备某道题所需的全部技能,他们会随机选一个答案。由于这是一道有五个选项的多项选择题,他们有五分之一的机会答对。

假设 2.3 和假设 2.4 告诉我们如何扩展因子图,以对图 2.1的前两道题建模。我们需要为每道题添加一个变量:如果候选人答对了则为 true,答错了则为 false。我们把这些变量叫做 isCorrect1(第一题)和 isCorrect2(第二题)。根据我们的假设,如果 csharp 为 true,我们预期 isCorrect1 也为 true,除非候选人犯了错误(因为第一题只需要 csharp 技能)。由于我们假设错误只在十次中发生一次,isCorrect1 为 true 的概率是 90%。如果 csharp 为 false,那么候选人就只能靠猜,答对的概率是五分之一,即 20%。这给出了如下条件概率表

表 2.1

表 2.1:条件概率表,展示在 csharp 的两个取值下 isCorrect1 每个取值的概率

我们把表示这个条件概率表因子称为 AddNoise,因为它的输出是输入的“带噪声”版本。由于我们的假设对所有技能同样适用,我们可以用同一个因子来关联 sqlisCorrect2。这样就得到前两道题的如下因子图

图 2.3

图 2.3:我们测试中前两道题的因子图

我们可以写出这张图所表示的联合概率分布,只需为两个 AddNoise 因子加入两个新项:

$$ P(\text{csharp}, \text{sql}, \text{isCorrect1}, \text{isCorrect2}) = \text{Bernoulli}(\text{csharp}; 0.5)\,\text{Bernoulli}(\text{sql}; 0.5)\,\text{AddNoise}(\text{isCorrect1}\mid\text{csharp})\,\text{AddNoise}(\text{isCorrect2}\mid\text{sql}). \quad (2.2) $$

对第三道题建模更复杂,因为这道题同时需要 csharpsql 两项技能。假设 2.3 和假设 2.4 提到候选人是否“具备某道题所需的全部技能”。因此对于第 3 题,我们需要引入一个新的中间变量,表示候选人是否同时具备 csharpsql 两项技能。我们把这个二值变量叫做 hasSkills:如果候选人同时具备该题所需的两项技能,则为 true,否则为 false。我们通过引入一个 And 因子来实现这一点,它把两个技能变量连接到 hasSkills 变量。And 因子的定义是:如果 $C$ 等于 $A$ AND $B$,则 $\text{And}(C\mid A, B)$ 为 1,否则为 0。换句话说,它强制子变量 $C$ 等于 $(A \text{ AND } B)$。And 因子是确定性因子的一个例子——更多细节见专栏 2.1。

专栏 2.1:确定性因子

在构建模型时,我们常常希望包含这样一个变量:它是模型中其它某些变量的固定函数。例如,我们可能希望一个二值变量在其它某些二值变量全部为 true 时为 true(AND),或在其中任意一个为 true 时为 true(OR)。对于连续变量,我们可能希望它是其它某些连续变量的和或积。

我们可以通过在因子图中放入一个确定性因子来实现这一点。确定性因子的条件概率分布的取值总是 1 或 0:当子变量等于父变量的目标函数时为 1,否则为 0。例如,如果我们希望添加一个变量 $C$,使其等于 $A$ AND $B$,我们可以添加一个确定性因子,其条件概率分布如下:

确定性 And 因子的条件概率表

注意,每当 $C$ 等于 $A$ AND $B$ 时,条件概率为 1,其余情况为 0。由于整体联合概率将该因子作为其中一项,因此任何 $C$ 不等于 $A$ AND $B$ 的变量取值组合,其概率都必定为零。所以这个确定性因子起到了约束作用,确保 $C=(A \text{ AND } B)$ 始终成立。

在本书中你将看到,确定性因子在各种各样的模型中都扮演着至关重要的角色。

下面是一张局部因子图,展示如何用 And 因子来构造我们所需的 hasSkills 变量:

图 2.4

图 2.4:And 因子是一个确定性因子,它约束 hasSkillscsharpsql 均为 true 时为 true,其余所有情况下为 false。

这张因子图联合概率分布为:

$$ P(\text{csharp}, \text{sql}, \text{hasSkills}) = \text{Bernoulli}(\text{csharp}; 0.5)\,\text{Bernoulli}(\text{sql}; 0.5)\,\text{And}(\text{hasSkills}\mid\text{csharp}, \text{sql}). \quad (2.3) $$

新增的 And 因子意味着我们现在在联合概率分布中多了一个 And 项。

现在我们可以把所有部分组合起来,为全部三道题构建一张因子图。我们只需用另一个 AddNoise 因子hasSkills 连接到 isCorrect3 变量:

图 2.5

图 2.5:图 2.1中三道多项选择题的因子图

这张因子图所表示的联合概率分布相当长,因为我们现在总共有六个因子节点,也就是说它包含六项:

$$ \begin{aligned} P(\text{csharp}, \text{sql}, \text{hasSkills}, \text{isCorrect1}, \text{isCorrect2}, \text{isCorrect3}) = {}& \text{Bernoulli}(\text{csharp}; 0.5)\,\text{Bernoulli}(\text{sql}; 0.5) \\ & \text{AddNoise}(\text{isCorrect1}\mid\text{csharp})\,\text{AddNoise}(\text{isCorrect2}\mid\text{sql}) \\ & \text{And}(\text{hasSkills}\mid\text{csharp}, \text{sql})\,\text{AddNoise}(\text{isCorrect3}\mid\text{hasSkills}). \end{aligned} \quad (2.4) $$

由于像这样的联合概率分布又大又难处理,通常用因子图来表达模型会更易读、也更易管理。

任何模型都必须包含与观测数据相对应的变量,且这些变量的类型要一致,这一点至关重要。这样才能通过把这些变量固定为相应的观测数据值,把数据附加到模型上。然后就可以用推断计算来求模型中任何其它(未观测)变量的边缘分布。对于我们的模型,我们需要确保能把测试结果数据附加到模型上——这些数据由每道题的一个“是/否”结果组成,取决于候选人是否答对了该题。我们确实可以把这些数据附加到模型上,因为我们有二值变量(isCorrect1isCorrect2isCorrect3),可以在候选人答对时把它们设为 true,答错时设为 false。

这个模型中还有一个尚未提及的假设。事实上,它通常是任何模型所做的最大假设之一!那就是模型的假定范围:即假设只有包含在模型中的变量才是相关的。例如,我们的模型完全没有提到候选人的精神状态(疲劳、紧张),也没有提到他们答题时所处的环境,或者是否存在作弊的可能,甚至候选人是否理解题目所用的语言。通过把这些变量排除在模型之外,我们做出了一个强假设:它们与候选人的答案是相互独立的(不影响候选人的答案)。

对范围的糟糕假设常常导致推断过程给出令人不满意的结果,例如预测准确率下降。模型的范围是一个应当在模型设计过程中被批判性评估的假设,哪怕只是为了识别出问题中被忽略的方面。所以,明确地说,我们“学习技能”模型的最后一个假设是:

5 候选人是否答对某道题,只取决于该候选人具备哪些技能,而不取决于任何其它因素。

在今后的模型中,我们不会再明确指出这个假设,但每当你设计或使用一个模型时,仔细考虑哪些变量被忽略了,是一个好习惯。

质疑我们的假设

构建好因子图之后,让我们暂停片刻,回顾一下我们迄今为止所做的假设。它们都汇总在表 2.2 中。

假设
1 每位候选人要么已掌握某项技能,要么没有掌握。
2 在看到任何测试结果之前,每位候选人拥有或不拥有某项特定技能的可能性相等。
3 如果候选人具备某道题所需的全部技能,那么他们会答对,只是每十次会犯一次错误。
4 如果候选人不具备某道题所需的全部技能,他们会随机选一个答案。由于这是一道有五个选项的多项选择题,他们有五分之一的机会答对。
5 候选人是否答对某道题,只取决于该候选人具备哪些技能,而不取决于任何其它因素。

表 2.2:我们模型中编码的五个假设。

仔细审查所有建模假设、确保它们合理,是非常重要的。例如,假设 2.1 是一个简化假设,它把候选人拥有某项技能的程度简化为一个简单的是/否变量。做出这类简化假设是很常见的——它们并非完全错误,但会使模型不那么精确。只要你记住这些简化假设可能会降低结果的准确性,就可以做出它们。假设 2.2 看起来似乎很安全,因为它只是假设“一无所知”。然而,它同时也假设了各技能变量之间是相互独立的,也就是说,知道某人拥有某项特定技能,并不能告诉你他们是否拥有其它任何技能的任何信息。如果某些技能之间以某种方式相关联,情况很可能并非如此。为使模型保持简单,我们暂时采用这个假设,但要把它记在心里,作为日后改进的候选。假设 2.3 和假设 2.4 更微妙一些:如果候选人具备某道题所需三项技能中的两项,他们真的就只能靠猜了吗?我们暂时继续使用这些假设——在本章后面,我们会展示如何诊断模型假设是否引发了问题,以及如何修正它们。假设 2.5,即没有其它变量是相关的,在假设有一位尽职的监考人管理测试的前提下是合理的。一位好的监考人会确保候选人的答案真实反映其技能,而不受外部条件或作弊的影响。

在用肉眼审查过我们的假设之后,我们现在可以试用这个模型,以确保这些假设在应用于真实示例数据时仍然说得通。

本页引入概念回顾

离散变量(discrete variables):只能取一组固定值之一的变量。例如,一个二值变量只能取 true 或 false 两个值。

连续变量(continuous variables):可以在一段连续取值范围内取任意值的变量,例如 0 到 1 之间的任意实数。

确定性因子(deterministic factor):定义了一个总是取 0 或 1 的条件概率因子。这意味着,给定父变量的值,就总能唯一确定(即计算出)子变量的值。例如,表示 AND 运算的因子就是一个确定性因子。更多细节见专栏 2.1。

自我评估 2.1

以下练习将帮助你巩固本节所学的概念。在做题时,回顾正文或下面的概念小结可能会有所帮助。

  1. 写出一个表示 OR 函数的确定性因子的条件概率表。当父变量 $A$ 和 $B$ 中任意一个为 true 时,子变量 $C$ 就应为 true。专栏 2.1 应该会对你有帮助。
  2. 写出你能在图 2.5 中找到的所有独立性条件独立性假设。对每一个假设,问问自己它是否合理——正如第 1 章所讨论的,对于独立性假设,你需要问自己“了解 A 是否会告诉我关于 B 的任何信息?”;而对于条件独立性假设,你需要问“如果我知道 X,了解 A 是否会告诉我关于 B 的任何信息?”。
  3. 如上所述,可能还有许多其它变量会影响测试结果(例如作弊、候选人的心理状态)。画一个贝叶斯网络,其中包含一个或多个这类额外变量,以及我们当前模型中的所有变量。你的贝叶斯网络只应在直接相互影响的变量之间连边。引入一些中间变量可能也会有帮助。如果可能,把你的贝叶斯网络展示给别人,讨论他们是否同意你所做的假设。

下一节:试验模型