我们的目标是构建一个能够评估在线游戏玩家技能的系统。作为迈向这一目标的第一步,我们需要先考察一个更简单的问题:在已经知道相关玩家技能的情况下,预测一局游戏的结果。这将使我们发展出解决“确定技能”这一更复杂问题所需的许多概念。

假设 Jill 将在 Xbox Live 上与 Fred 玩一局《光环》。在第 2 章中,我们用一个二值变量来表示一个人的软件开发技能,指示此人是否具备某项特定技能。当我们考虑一个人在《光环》这类典型 Xbox 游戏中的技能时,这种做法就不够用了,因为可能的技能水平存在很宽的谱系。相反,用一个连续值来表示一个人的技能更为合适。因此,我们的第一条建模假设是:

每个玩家都有一个技能值,用一个连续变量表示。

实力更强者未必获胜

实力更强的玩家并不总是胜者。

我们把 Jill 的技能记为 Jskill,把 Fred 的技能记为 Fskill。假设 Fred 的技能水平为 Fskill = 12.5,而 Jill 的技能为 Jskill = 15。这些数字看起来完全是随意的,而我们衡量技能所用的标度也的确是任意的。然而,真正重要的是玩家之间技能值的比较,稍后我们会看到如何赋予这些数字以意义。我们给 Jill 一个更高的技能值,以表明她是实力更强的玩家。

现在我们遇到了第一个挑战:在《光环》这类游戏中,实力更强的玩家并不总是胜者。如果 Jill 和 Fred 彼此对战很多局,我们会预期 Jill 赢下其中一半以上,但不一定全赢。我们可以通过为每个玩家引入表现(performance)这一概念来刻画对局结果中的这种变动性,它表达了玩家在某一具体对局中发挥得如何。在某一具体对局中表现更高的玩家将成为该局的胜者。技能水平高的玩家往往会有较高的表现,但其实际表现会在不同对局之间变化。与技能一样,表现最自然地用一个连续量来表达。我们把 Jill 的表现记为 Jperf,把 Fred 的表现记为 Fperf。图 3.2 展示了以 Fperf 为横轴、Jperf 为纵轴的图。对于落在对角线上方区域的点,Jill 是胜者;而在对角线下方,Fred 是胜者。

图 3.2

图 3.2:Jill 的表现与 Fred 的表现取值的示意图,展示了 Jill 获胜的区域与 Fred 获胜的区域。

建模某人发挥得如何

我们可以把一个人的技能看作他在许多对局中的平均表现。例如,Jill 的技能水平为 15,意味着她的表现将有 15 的平均值,但在某一具体对局中可能高一些或低一些。我们又一次要处理不确定性,我们将用一个合适的概率分布来做到这一点。我们预期表现偏离平均值越大就越不常见,因此其概率比接近平均值的取值更低。因此,直觉上表现应当呈现出如图 3.3 所示的“钟形曲线”形态,其中给定表现值的概率在技能值两侧逐渐下降。

图 3.3

图 3.3:一条“钟形曲线”的示意图,展示一个玩家的表现如何围绕其技能值随机变化。

因为表现是一个连续量,所以这条钟形曲线是一个概率密度的例子,我们此前在专栏 2.4中遇到过它。虽然我们已经勾勒出钟形曲线的大致形状,但要取得进一步进展,我们需要为这条曲线定义一个具体的形式。可能的选择有很多,但有一个格外特殊,因为它具有一些非常有用的数学性质。它被称为高斯概率密度(Gaussian probability density),是高斯分布(Gaussian distribution)的密度函数。

事实上,高斯分布具有如此多的良好性质,以至于它成为机器学习和统计学领域中使用最广泛的分布之一。一个特定的高斯分布完全由两个数字刻画:均值(mean),它设定曲线中心的位置;以及标准差(standard deviation),它决定曲线有多宽(关于这些概念的讨论见专栏 3.1)。图 3.4 展示了一个高斯分布,说明均值和标准差的含义。

图 3.4

图 3.4:均值为 15、标准差为 5 的高斯分布的图,展示了均值(红线)以及与均值相差正负一个标准差的取值(绿线)。服从此分布的随机变量大约有 68.2% 的概率取值落在均值的一个标准差之内(即两条绿线之间),有 95.4% 的概率落在均值的两个标准差之内(即 5 到 25 之间),有 99.7% 的概率落在均值的三个标准差之内(即 0 到 30 之间)。

要理解图 3.4 纵轴取值的尺度,请记住概率分布曲线下的总面积必须为一。注意该分布关于其最大值点对称——因为落在该点两侧的概率相等,所以这个中心点处的表现同时也是平均表现。

按照标准记号,我们把均值记为 $\mu$,把标准差记为 $\sigma$。使用这种记号,高斯密度函数可以写成

$$Gaussian(x; \mu, \sigma^2) = \frac{1}{(2\pi)^{1/2}\sigma} \exp\left\{ -\frac{(x-\mu)^2}{2\sigma^2} \right\}. \tag{3.1}$$

左端表示 Gaussian 是一个关于 $x$ 的概率分布,其取值依赖于 $\mu$ 和 $\sigma$ 的值。通常用标准差的平方来处理会更方便,我们把它称为方差(variance)并记为 $\sigma^2$(见专栏 3.1)。有时我们也会用到方差的倒数,它被称为精度(precision),$\tau = 1/\sigma^2$。大多数情况下我们会使用标准差,因为它与 $\mu$ 处在同一标度上(即具有相同的单位)。

专栏 3.1:均值、方差与标准差

假设我们对某个量 $x$ 进行多次测量,得到一组值 $x_1, x_2, \ldots, x_N$。例如,我们可能测量人群中成年人的身高。通过计算一些简单的统计量(statistic)来概括这组值的性质,往往非常有用。一个众所周知的统计量叫作均值,其定义为

$$\text{mean} = \frac{x_1 + x_2 + \ldots + x_N}{N} = \frac{1}{N} \sum_{n=1}^N x_n. \tag{3.2}$$

因此均值就是这些值的简单平均。另一个有用的统计量是方差,它衡量这些值围绕均值变动的程度,其定义为

$$\text{variance} = \frac{(x_1 - \text{mean})^2 + \ldots + (x_N - \text{mean})^2}{N} = \frac{1}{N} \sum_{n=1}^N (x_n - \text{mean})^2. \tag{3.3}$$

如果身高以米为单位测量,那么平均身高的单位仍然是米,而方差的单位则是米的平方。通常,用与测量均值相同的单位来衡量对均值的变动更有用,因此我们可以改用标准差,它由方差的平方根给出

$$\text{standard deviation} = \sqrt{\text{variance}}. \tag{3.4}$$

这样标准差的单位就是米,会是一个更易于解释的量,因为它直接告诉我们人群中身高的变动情况。例如,在某个特定人群中,平均身高可能是 1.64 米,标准差可能是 0.35 米。

数据集的统计量与产生该数据集的概率分布的参数之间存在一个重要联系。考虑方程 (3.1) 中的高斯分布。如果我们从该分布中抽取非常多的样本,那么这些样本的均值和方差统计量将几乎恰好等于该分布的均值和方差参数(见 Bishop [2006])。事实上,这正是为什么高斯分布的参数被称为“均值”和“方差”参数。一般来说,来自任何分布的一个非常大的样本集的统计量,都可以直接从该分布的参数计算出来,而无需实际进行任何采样

有时当我们使用高斯分布时,分布所适用的变量会是明确的。在这种情况下,我们可以简化记号,不再写 Gaussian$(x; \mu, \sigma^2)$,而只写 Gaussian$(\mu, \sigma^2)$。重要的是要认识到,$(\mu, \sigma^2)$ 只是一种简写记号,并不表示一个关于 $\mu$ 和 $\sigma^2$ 的分布。

现在让我们看看如何应用高斯分布来建模 Jill 与 Fred 之间的一局《光环》游戏。图 3.5 展示了描述 Jill 和 Fred 在他们这局《光环》游戏中取得各种表现的概率的高斯分布。

图 3.5

图 3.5:Jill(蓝色)和 Fred(红色)的表现的高斯分布图。

这里我们选择两个高斯分布的标准差相同,取 $\text{perfSD} = 5$(其中“perfSD”表示表现分布的标准差)。我们稍后会讨论这一选择的意义。我们能问的第一个问题是:“Jill 获胜的概率是多少?”。注意两个分布之间存在相当大的重叠,这意味着即使 Jill 技能更高,Fred 的表现值也有相当大的机会高于 Jill,从而他会赢下这局。你还可以看出,如果两条曲线分得更开(例如,如果 Jill 的技能为 30),那么 Fred 获胜的机会将大大减少。

我们已经在模型中引入了另外两条假设,值得把它们明确写出来:

每个玩家在每局游戏中都有一个表现值,它在不同对局之间是相互独立的,其平均值等于该玩家的技能。表现的变动对所有玩家都相同,围绕均值对称分布,并且更可能接近均值而非远离均值。

表现值最高的玩家赢得游戏。

如上所写,假设 3.2 表达了在线游戏领域专家可能具备的定性知识,对应于一个钟形的表现分布。这需要被精化为一个具体的数学形式,为此我们选择高斯分布,尽管我们可以预期其他钟形分布也会给出定性上相似的结果。

现在是引入本章第一个因子图的好时机。要构建这个图,我们从问题中每个随机变量的变量节点开始。到目前为止我们有两个变量:Fred 的表现,用连续变量 Fperf 表示;以及 Jill 的表现,记为 Jperf。它们中的每一个都由一个高斯分布描述,其均值是相应玩家的技能,具有共同的标准差 5,因此方差为 $5^2$:

$$\begin{aligned} p(\text{Jperf}) &= Gaussian(\text{Jperf}; 15, 5^2) \\ p(\text{Fperf}) &= Gaussian(\text{Fperf}; 12.5, 5^2). \end{aligned} \tag{3.5}$$

注意,正如在第 2.6 节中一样,我们用小写 $p$ 表示连续变量的概率密度,而用大写 $P$ 表示离散变量概率分布。

另一个不确定的量是游戏的胜者。为此我们可以使用一个二值变量 JillWins,当 Jill 是胜者时取值 true,当 Fred 是胜者时取值 false。这个变量的值由 JperfFperf 中哪一个更大决定——如果 Jperf 更大则为 true,否则为 false。像之前一样用 T 表示 true、F 表示 false,我们可以把这个分布表达为

$$P(\text{JillWins} = \text{T} \mid \text{Jperf}, \text{Fperf}) = \begin{cases} 1 & \text{如果}\,\, \text{Jperf} > \text{Fperf}, \\ 0 & \text{否则}. \end{cases} \tag{3.6}$$

由于概率之和为一,我们于是有

$$P(\text{JillWins} = \text{F} \mid \text{Jperf}, \text{Fperf}) = 1 - P(\text{JillWins} = \text{T} \mid \text{Jperf}, \text{Fperf}). \tag{3.7}$$

我们将把方程 (3.6) 中的条件概率称为 GreaterThan 因子,在绘制因子图时我们用“>”表示它。注意这是一个确定性因子,因为如果两个父变量的值都已知,子变量的值就被固定了。使用这个因子,我们现在就可以绘制因子图了。它有三个变量节点,每个都带有一个相应的因子节点,如图 3.6 所示。

图 3.6

图 3.6:两名技能已知的玩家 Fred 与 Jill 之间一局游戏的因子图。图中的变量为:Jill 的表现 Jperf、Fred 的表现 Fperf(均为 double 变量),以及表示 Jill 是否赢得游戏的 Jwinsbool 变量);对应的因子分别为 Gaussian(15, 5²)、Gaussian(12.5, 5²) 和 >

计算获胜的概率

我们要求 Jill 赢下这局《光环》的概率。我们可以通过祖先采样找到这个问题的近似答案——关于祖先采样是什么,可回顾第 2.5 节。要在我们的因子图中应用祖先采样,我们必须首先从父变量 JperfFperf 采样,然后计算子变量 Jwins 的值。

首先考虑对 Jill 的表现 Jperf采样。有一些标准的数值技术可用于生成服从指定均值和方差的高斯分布的随机数。如果我们从 $Gaussian(x; 15, 5^2)$ 生成五个样本并把它们画成直方图,就会得到图 3.7a 所示的结果。注意,我们已经把直方图中每个柱的高度除以样本总数(此处为 5),并把直方图分箱的宽度设为一。这确保了直方图下的总面积为一。如果我们把样本数增加到 50,如图 3.7b 所示,我们会看到直方图大致近似出高斯分布的钟形曲线。通过增加样本数,我们得到更精确的近似,如图 3.7c(500 个样本)和图 3.7d(5,000 个这样的样本)所示。

图 3.7a

(a) 5 个样本

图 3.7b

(b) 50 个样本

图 3.7c

(c) 500 个样本

图 3.7d

(d) 5,000 个样本

图 3.7:从图 3.4 所示的、均值为 15、标准差为 5 的高斯分布中抽取的样本的直方图。

我们看到,为了得到对高斯分布的良好近似,我们需要抽取相对大量的样本。因此,在使用祖先采样时,我们需要用很多样本才能得到相当准确的结果。这使得祖先采样在计算上非常低效,尽管它是一种简单直接的技术,为帮助理解一个模型或生成合成数据集提供了有用的途径。

在看过如何从单个高斯分布采样之后,我们现在可以考虑对图 3.6 中表示 Jill 与 Fred 单局《光环》游戏的完整图进行祖先采样。我们首先为 Jill 在这一具体对局中选择一个表现 Jperf(对应因子图上最顶层的变量节点),方法是从高斯分布中抽取一个值

$$p(\text{Jperf}) = Gaussian(\text{Jperf}; 15, 5^2). \tag{3.8}$$

独立地,我们为 Fred 选择一个表现值 Fperf(它也是一个顶层变量节点),方法是从高斯分布中抽取一个样本

$$p(\text{Fperf}) = Gaussian(\text{Fperf}; 12.5, 5^2). \tag{3.9}$$

然后我们用这些采样得到的值计算剩下的变量 JillWins 的值。这涉及比较两个表现值,如果 Jperf 大于 Fperf,则 JillWinstrue,否则为 false。如果我们多次重复这个采样过程,那么 JillWinstrue 的次数所占的比例就(近似地)给出了 Jill 赢得一局游戏的概率。我们求平均所用的样本数越大,这个近似就越准确。图 3.8 展示了我们两位玩家在 1,000 个样本上的表现散点图。

图 3.8

图 3.8:Jill 和 Fred 的表现样本,叠加在图 3.2 的示意图上。样本云在纵向上以 Jill 的技能 15 为中心,在横向上以 Fred 的技能 12.5 为中心。因此云的中心位于对角线上方,于是对应 Jill 获胜的样本多于对应 Fred 获胜的样本。

对于每一局游戏,我们通过按各自的高斯分布生成随机值来独立地选择每个玩家的表现。每一局游戏在散点图上显示为一个点。图中还画出了两个表现相等的对角线。落在这条线下方的点表示 Fred 获胜的对局,而落在线上方的点则是 Jill 获胜的对局。我们看到大多数点位于线上方,这正如我们所预期,因为 Jill 有更高的技能值。仅仅通过数点的数量,我们发现 Jill 有 63.1% 的时候获胜。

当然,这只是对 Jill 获胜概率的一个近似估计。我们可以利用高斯分布方程 (3.1) 在数学上求出精确结果,它告诉我们 Jill 是胜者的概率由下式给出

$$P(\text{Jperf} > \text{Fperf} \mid \text{Jskill}, \text{Fskill}) = CumGauss\left( \frac{\text{Jskill} - \text{Fskill}}{\sqrt{2}\,\text{perfSD}} \right). \tag{3.10}$$

这里 CumGauss 表示累积高斯函数(cumulative Gaussian function),如图 3.9 所示

图 3.9

图 3.9:蓝色曲线展示了一个均值为零、标准差为一的高斯分布。这条高斯曲线下直到点 $x$ 为止的面积被称为累积高斯分布,作为 $x$ 的函数由红色曲线表示。例如,在 $x=-1$ 处,阴影区域的面积取值为 0.16,如图所示。

对这个函数进行数值求值,我们发现 Jill 赢得该局游戏的概率为 63.8%,这接近我们通过祖先采样得到的 63.1% 的值。

我们前面提到过,衡量技能所用的标度本质上是任意的。如果我们给所有玩家的技能都加上一个固定的数,这将不改变获胜概率,因为由方程 (3.10) 可知,它们只依赖于技能值之差。同样地,如果我们把所有技能值都乘以某个固定的数,同时把参数 perfSD 也乘以同一个数,那么获胜概率同样不变。真正重要的只是相对于 perfSD 值来衡量的技能值之差。

我们现在已经构建了一个模型,它可以为两名技能已知的玩家预测一局游戏的结果。在下一节中,我们将看看如何扩展这个模型以朝相反方向进行:在给定一局或多局游戏结果的情况下预测玩家技能。

本页引入概念回顾

高斯分布(Gaussian distribution):一种关于连续变量概率密度的特定形式,具有许多有用的数学性质。它由两个参数支配——均值和标准差。高斯分布的数学定义由方程 (3.1) 给出。

均值(mean):一组值的平均。关于均值及相关概念的更详细讨论见专栏 3.1。

标准差(standard deviation):方差的平方根。

方差(variance):衡量一组数字围绕其平均值变动程度的量。方差及相关量在专栏 3.1 中讨论。

精度(precision):方差的倒数。

统计量(statistics):统计量是一组数据值的函数。例如,均值就是一个统计量,其值是一组值的平均。统计量对于紧凑地概括一个大型数据集很有用。

累积高斯函数(cumulative Gaussian function):累积高斯函数在某点 $x$ 处的值等于一个零均值、单位方差的高斯分布从负无穷到点 $x$ 为止的面积。由此定义可知,累积高斯函数的梯度由高斯分布给出。

自我评估 3.1

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

  1. 编写一个程序或创建一个电子表格,从均值为零、标准差为 1 的高斯分布中产生 10,000 个样本(大多数语言/电子表格都有内置函数或可用的库来从高斯分布采样)。计算这些样本中落在 -1 到 1 之间、-2 到 2 之间、以及 -3 到 3 之间的百分比。你应当会发现这些百分比接近图 3.4 说明文字中给出的那些值。
  2. 用上一题创建的样本构建一个直方图(就像图 3.7 中的那些),并验证它类似于一条钟形曲线。
  3. 参考专栏 3.1,计算你的样本的均值、标准差和方差。均值应接近零,标准差和方差都应接近 1(因为 $1^2=1$)。
  4. 从 Jill 表现的高斯先验(均值 15、标准差 5)中产生 10,000 个样本。然后用均值 12.5、标准差 5 为 Fred 的表现产生第二组样本。画一个像图 3.8 那样的散点图,其中每个点的 Y 坐标是第一组中的一个样本,X 坐标是第二组中相应的样本(把每组的第一个样本配对、每组的第二个样本配对,依此类推)。计算落在 X=Y 对角线上方的样本比例,并检查它是否接近图 3.8 中的值。探索当你改变标准差时这个比例会发生什么变化——例如,试着把两者都减小到 2 或都增大到 10。
  5. 使用 Infer.NET,创建 double 变量 YX,其先验分别为 Gaussian(15, 5²) 和 Gaussian(12.5, 5²),以匹配上一题。定义第三个随机变量 Ywins,等于 $\text{Y} > \text{X}$。计算关于 Ywins后验分布,并验证它接近上一题中位于对角线上方的样本比例。

参考文献

[Bishop, 2006] Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer.


下一节:推断玩家的技能