2.6. 概率论与数理统计
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 SageMaker Studio Lab 中打开 Notebook

不管怎样,机器学习全都与不确定性有关。在监督学习中,我们希望根据已知(特征)来预测未知(目标)。根据我们的目标,我们可能会尝试预测目标的最可能值。或者,我们可能会预测与目标期望距离最小的值。有时我们不仅希望预测一个特定的值,而且希望量化我们的不确定性。例如,给定一些描述患者的特征,我们可能想知道他们在明年心脏病发作的可能性。在无监督学习中,我们常常关心不确定性。为了确定一组测量值是否异常,了解在一个感兴趣的群体中观察到这些值的可能性会有所帮助。此外,在强化学习中,我们希望开发能够在各种环境中智能行动的智能体。这需要推理环境可能会如何变化,以及在响应每个可用行动时可能会遇到什么样的奖励。

概率论是研究不确定性的数学领域。给定某个过程的概率模型,我们可以推断各种事件的可能性。使用概率来描述可重复事件(如抛硬币)的频率是相当没有争议的。事实上,频率学派学者坚持一种只适用于这类可重复事件的概率解释。相比之下,贝叶斯学派学者更广泛地使用概率语言来形式化不确定性下的推理。贝叶斯概率有两个独特的特点:(i)为不可重复事件赋予置信度,例如,大坝坍塌的概率是多少?;以及(ii)主观性。虽然贝叶斯概率为人们如何根据新证据更新信念提供了明确的规则,但它允许不同的人以不同的先验信念开始。统计学帮助我们进行逆向推理,从数据的收集和组织开始,反向推断出我们可以对生成数据的过程得出什么样的推论。每当我们分析一个数据集,寻找我们希望可能表征更广泛人群的模式时,我们都在运用统计思维。许多课程、专业、论文、职业、部门、公司和机构都致力于概率和统计学的研究。虽然本节只触及皮毛,但我们将为您提供开始构建模型所需的基础。

%matplotlib inline
import random
import torch
from torch.distributions.multinomial import Multinomial
from d2l import torch as d2l
%matplotlib inline
import random
from mxnet import np, npx
from mxnet.numpy.random import multinomial
from d2l import mxnet as d2l

npx.set_np()
%matplotlib inline
import random
import jax
import numpy as np
from jax import numpy as jnp
from d2l import jax as d2l
No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)
%matplotlib inline
import random
import tensorflow as tf
from tensorflow_probability import distributions as tfd
from d2l import tensorflow as d2l

2.6.1. 一个简单的例子:抛硬币

想象一下,我们计划抛一枚硬币,并希望量化我们看到正面(与反面相比)的可能性。如果硬币是公平的,那么两种结果(正面和反面)的可能性是相等的。此外,如果我们计划抛硬币\(n\)次,那么我们期望看到的正面比例应该与期望的反面比例完全匹配。一种直观的理解方式是通过对称性:对于每个有\(n_\textrm{h}\)次正面和\(n_\textrm{t} = (n - n_\textrm{h})\)次反面的可能结果,都有一个同样可能的结果,即有\(n_\textrm{t}\)次正面和\(n_\textrm{h}\)次反面。请注意,这只有在平均情况下,我们期望看到\(1/2\)的抛掷结果是正面,\(1/2\)是反面时才可能。当然,如果你用\(n=1000000\)次抛掷进行多次实验,你可能永远不会看到一次\(n_\textrm{h} = n_\textrm{t}\)完全相等的情况。

形式上,数量\(1/2\)被称为概率,这里它捕捉了任何一次抛掷出现正面的确定性。概率为我们关心的结果,即事件,赋予一个介于\(0\)\(1\)之间的分数。这里我们关心的事件是\(\textrm{heads}\)(正面),我们用\(P(\textrm{heads})\)表示相应的概率。概率为\(1\)表示绝对确定(想象一枚两面都是正面的特技硬币),概率为\(0\)表示不可能(例如,如果两面都是反面)。频率\(n_\textrm{h}/n\)\(n_\textrm{t}/n\)不是概率,而是统计量。概率是数据生成过程底层的理论量。在这里,概率\(1/2\)是硬币本身的属性。相比之下,统计量是根据观测数据计算出的经验量。我们对概率量和统计量的兴趣是密不可分的。我们经常设计特殊的统计量,称为估计量,给定一个数据集,它会产生模型参数(如概率)的估计值。此外,当这些估计量满足一个叫做一致性的好性质时,我们的估计值会收敛到相应的概率。反过来,这些推断出的概率告诉我们未来可能遇到的来自同一群体的数据的可能统计特性。

假设我们偶然发现了一枚我们不知道其真实\(P(\textrm{heads})\)的硬币。为了用统计方法研究这个量,我们需要(i)收集一些数据;以及(ii)设计一个估计量。这里的数据采集很简单;我们可以多次抛掷硬币并记录所有结果。形式上,从某个潜在的随机过程中抽取实现称为采样。正如你可能猜到的,一个自然的估计量是观察到的正面次数与总抛掷次数的比率。

现在,假设这枚硬币实际上是公平的,即\(P(\textrm{heads}) = 0.5\)。为了模拟公平硬币的抛掷,我们可以调用任何随机数生成器。有一些简单的方法可以抽取概率为\(0.5\)的事件样本。例如,Python的random.random会产生区间\([0,1]\)中的数字,其中位于任何子区间\([a, b] \subset [0,1]\)的概率等于\(b-a\)。因此,我们可以通过测试返回的浮点数是否大于0.5来以各0.5的概率得到01

num_tosses = 100
heads = sum([random.random() > 0.5 for _ in range(num_tosses)])
tails = num_tosses - heads
print("heads, tails: ", [heads, tails])
heads, tails:  [44, 56]
num_tosses = 100
heads = sum([random.random() > 0.5 for _ in range(num_tosses)])
tails = num_tosses - heads
print("heads, tails: ", [heads, tails])
heads, tails:  [48, 52]
num_tosses = 100
heads = sum([random.random() > 0.5 for _ in range(num_tosses)])
tails = num_tosses - heads
print("heads, tails: ", [heads, tails])
heads, tails:  [52, 48]
num_tosses = 100
heads = sum([random.random() > 0.5 for _ in range(num_tosses)])
tails = num_tosses - heads
print("heads, tails: ", [heads, tails])
heads, tails:  [45, 55]

更一般地,我们可以通过调用多项分布函数来模拟从任何具有有限数量可能结果的变量(如抛硬币或掷骰子)中进行多次抽取,将第一个参数设置为抽取次数,第二个参数设置为与每个可能结果相关的概率列表。为了模拟公平硬币的十次抛掷,我们分配概率向量[0.5, 0.5],将索引0解释为正面,索引1解释为反面。该函数返回一个长度等于可能结果数量(这里是2)的向量,其中第一个分量告诉我们正面出现的次数,第二个分量告诉我们反面出现的次数。

fair_probs = torch.tensor([0.5, 0.5])
Multinomial(100, fair_probs).sample()
tensor([50., 50.])
fair_probs = [0.5, 0.5]
multinomial(100, fair_probs)
[22:11:28] ../src/storage/storage.cc:196: Using Pooled (Naive) StorageManager for CPU
array([46, 54], dtype=int64)
fair_probs = [0.5, 0.5]
# jax.random does not have multinomial distribution implemented
np.random.multinomial(100, fair_probs)
array([44, 56])
fair_probs = tf.ones(2) / 2
tfd.Multinomial(100, fair_probs).sample()
WARNING:tensorflow:From /home/ci/.local/lib/python3.10/site-packages/tensorflow_probability/python/internal/batched_rejection_sampler.py:102: calling while_loop_v2 (from tensorflow.python.ops.control_flow_ops) with back_prop=False is deprecated and will be removed in a future version.
Instructions for updating:
back_prop=False is deprecated. Consider using tf.stop_gradient instead.
Instead of:
results = tf.while_loop(c, b, vars, back_prop=False)
Use:
results = tf.nest.map_structure(tf.stop_gradient, tf.while_loop(c, b, vars))
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([49., 51.], dtype=float32)>

每次运行这个抽样过程,你都会得到一个新的随机值,它可能与之前的结果不同。除以抛掷次数,就得到了我们数据中每个结果的频率。注意,这些频率,就像它们试图估计的概率一样,总和为\(1\)

Multinomial(100, fair_probs).sample() / 100
tensor([0.4800, 0.5200])
multinomial(100, fair_probs) / 100
array([0.53, 0.47])
np.random.multinomial(100, fair_probs) / 100
array([0.5, 0.5])
tfd.Multinomial(100, fair_probs).sample() / 100
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([0.59, 0.41], dtype=float32)>

在这里,尽管我们模拟的硬币是公平的(我们自己设置了概率[0.5, 0.5]),但正面和反面的计数可能不完全相同。这是因为我们只抽取了相对较少数量的样本。如果我们不是自己实现模拟,而只看到结果,我们怎么知道硬币是否稍微不公平,或者与\(1/2\)的可能偏差只是小样本量的产物?让我们看看当我们模拟10,000次抛掷时会发生什么。

counts = Multinomial(10000, fair_probs).sample()
counts / 10000
tensor([0.4966, 0.5034])
counts = multinomial(10000, fair_probs).astype(np.float32)
counts / 10000
array([0.4952, 0.5048])
counts = np.random.multinomial(10000, fair_probs).astype(np.float32)
counts / 10000
array([0.5007, 0.4993], dtype=float32)
counts = tfd.Multinomial(10000, fair_probs).sample()
counts / 10000
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([0.5019, 0.4981], dtype=float32)>

总的来说,对于重复事件(如抛硬币)的平均值,随着重复次数的增加,我们的估计值保证会收敛到真实的潜在概率。这种现象的数学表述被称为大数定律,而中心极限定理告诉我们,在许多情况下,随着样本量\(n\)的增加,这些误差应该以\((1/\sqrt{n})\)的速率下降。让我们通过研究当抛掷次数从1增加到10,000时我们的估计如何演变来获得更多直觉。

counts = Multinomial(1, fair_probs).sample((10000,))
cum_counts = counts.cumsum(dim=0)
estimates = cum_counts / cum_counts.sum(dim=1, keepdims=True)
estimates = estimates.numpy()

d2l.set_figsize((4.5, 3.5))
d2l.plt.plot(estimates[:, 0], label=("P(coin=heads)"))
d2l.plt.plot(estimates[:, 1], label=("P(coin=tails)"))
d2l.plt.axhline(y=0.5, color='black', linestyle='dashed')
d2l.plt.gca().set_xlabel('Samples')
d2l.plt.gca().set_ylabel('Estimated probability')
d2l.plt.legend();
../_images/output_probability_245b7d_78_0.svg
counts = multinomial(1, fair_probs, size=10000)
cum_counts = counts.astype(np.float32).cumsum(axis=0)
estimates = cum_counts / cum_counts.sum(axis=1, keepdims=True)

d2l.set_figsize((4.5, 3.5))
d2l.plt.plot(estimates[:, 0], label=("P(coin=heads)"))
d2l.plt.plot(estimates[:, 1], label=("P(coin=tails)"))
d2l.plt.axhline(y=0.5, color='black', linestyle='dashed')
d2l.plt.gca().set_xlabel('Samples')
d2l.plt.gca().set_ylabel('Estimated probability')
d2l.plt.legend();
../_images/output_probability_245b7d_81_0.svg
counts = np.random.multinomial(1, fair_probs, size=10000).astype(np.float32)
cum_counts = counts.cumsum(axis=0)
estimates = cum_counts / cum_counts.sum(axis=1, keepdims=True)

d2l.set_figsize((4.5, 3.5))
d2l.plt.plot(estimates[:, 0], label=("P(coin=heads)"))
d2l.plt.plot(estimates[:, 1], label=("P(coin=tails)"))
d2l.plt.axhline(y=0.5, color='black', linestyle='dashed')
d2l.plt.gca().set_xlabel('Samples')
d2l.plt.gca().set_ylabel('Estimated probability')
d2l.plt.legend();
../_images/output_probability_245b7d_84_0.svg
counts = tfd.Multinomial(1, fair_probs).sample(10000)
cum_counts = tf.cumsum(counts, axis=0)
estimates = cum_counts / tf.reduce_sum(cum_counts, axis=1, keepdims=True)
estimates = estimates.numpy()

d2l.set_figsize((4.5, 3.5))
d2l.plt.plot(estimates[:, 0], label=("P(coin=heads)"))
d2l.plt.plot(estimates[:, 1], label=("P(coin=tails)"))
d2l.plt.axhline(y=0.5, color='black', linestyle='dashed')
d2l.plt.gca().set_xlabel('Samples')
d2l.plt.gca().set_ylabel('Estimated probability')
d2l.plt.legend();
../_images/output_probability_245b7d_87_0.svg

每条实线对应硬币的两个值之一,并给出了每组实验后我们估计的硬币出现该值的概率。黑色虚线给出了真实的潜在概率。随着我们通过进行更多实验获得更多数据,曲线会向真实概率收敛。你可能已经开始看到一些困扰统计学家的更高级问题的形状了:这种收敛发生得有多快?如果我们已经测试了许多在同一家工厂生产的硬币,我们如何整合这些信息?

2.6.2. 更形式化的处理

我们已经取得了很大的进展:提出了一个概率模型,生成了合成数据,运行了一个统计估计器,经验性地评估了收敛性,并报告了误差度量(检查偏差)。然而,要走得更远,我们需要更精确。

在处理随机性时,我们用\(\mathcal{S}\)表示可能结果的集合,并称之为样本空间结果空间。这里,每个元素都是一个独特的可能结果。在抛一枚硬币的情况下,\(\mathcal{S} = \{\textrm{正面}, \textrm{反面}\}\)。对于一个骰子,\(\mathcal{S} = \{1, 2, 3, 4, 5, 6\}\)。当抛两枚硬币时,可能的结果是\(\{(\textrm{正面}, \textrm{正面}), (\textrm{正面}, \textrm{反面}), (\textrm{反面}, \textrm{正面}), (\textrm{反面}, \textrm{反面})\}\)事件是样本空间的子集。例如,事件“第一次抛硬币出现正面”对应于集合\(\{(\textrm{正面}, \textrm{正面}), (\textrm{正面}, \textrm{反面})\}\)。每当一个随机实验的结果\(z\)满足\(z \in \mathcal{A}\)时,事件\(\mathcal{A}\)就发生了。对于掷一个骰子,我们可以定义事件“看到\(5\)”(\(\mathcal{A} = \{5\}\))和“看到一个奇数”(\(\mathcal{B} = \{1, 3, 5\}\))。在这种情况下,如果骰子掷出\(5\),我们会说\(\mathcal{A}\)\(\mathcal{B}\)都发生了。另一方面,如果\(z = 3\),那么\(\mathcal{A}\)没有发生,但\(\mathcal{B}\)发生了。

一个概率函数将事件映射到实数值\({P: \mathcal{A} \subseteq \mathcal{S} \rightarrow [0,1]}\)。在给定的样本空间\(\mathcal{S}\)中,一个事件\(\mathcal{A}\)的概率,表示为\(P(\mathcal{A})\),具有以下性质

  • 任何事件\(\mathcal{A}\)的概率是一个非负实数,即\(P(\mathcal{A}) \geq 0\)

  • 整个样本空间的概率是\(1\),即\(P(\mathcal{S}) = 1\)

  • 对于任何可数的互斥事件序列\(\mathcal{A}_1, \mathcal{A}_2, \ldots\)(即对于所有\(i \neq j\)\(\mathcal{A}_i \cap \mathcal{A}_j = \emptyset\)),它们中任何一个发生的概率等于它们各自概率的总和,即\(P(\bigcup_{i=1}^{\infty} \mathcal{A}_i) = \sum_{i=1}^{\infty} P(\mathcal{A}_i)\)

这些由Kolmogorov(1933提出的概率论公理,可以迅速推导出一系列重要的结论。例如,可以立即得出,任何事件\(\mathcal{A}\)其补集\(\mathcal{A}'\)发生的概率为1(因为\(\mathcal{A} \cup \mathcal{A}' = \mathcal{S}\))。我们还可以证明\(P(\emptyset) = 0\),因为\(1 = P(\mathcal{S} \cup \mathcal{S}') = P(\mathcal{S} \cup \emptyset) = P(\mathcal{S}) + P(\emptyset) = 1 + P(\emptyset)\)。因此,任何事件\(\mathcal{A}\)其补集\(\mathcal{A}'\)同时发生的概率为\(P(\mathcal{A} \cap \mathcal{A}') = 0\)。非正式地说,这告诉我们不可能的事件发生的概率为零。

2.6.3. 随机变量

当我们谈论像掷骰子出现奇数或第一次抛硬币出现正面这样的事件时,我们实际上是在引用随机变量的概念。形式上,随机变量是从底层样本空间到一组(可能很多)值的映射。你可能会好奇,随机变量与样本空间有什么不同,因为两者都是结果的集合。重要的是,随机变量可以比原始样本空间粗糙得多。即使底层样本空间是无限的,例如\(0\)\(1\)之间的线段上的点,我们也可以定义一个二元随机变量,如“大于0.5”。此外,多个随机变量可以共享同一个底层样本空间。例如,“我的家庭警报是否响起”和“我的房子是否被盗”都是共享一个底层样本空间的二元随机变量。因此,知道一个随机变量所取的值可以告诉我们关于另一个随机变量可能取的值的一些信息。知道警报响了,我们可能会怀疑房子很可能被盗了。

随机变量所取的每个值都对应于底层样本空间的一个子集。因此,随机变量\(X\)取值\(v\)的事件,表示为\(X=v\),是一个事件\(P(X=v)\)表示其概率。有时这种表示法会显得笨拙,当上下文清晰时,我们可以滥用表示法。例如,我们可能使用\(P(X)\)来泛指\(X\)分布,即告诉我们\(X\)取任何给定值的概率的函数。其他时候,我们写出像\(P(X,Y) = P(X) P(Y)\)这样的表达式,作为对随机变量\(X\)\(Y\)可以取的所有值都成立的陈述的简写,即对于所有\(i,j\),都成立\(P(X=i \textrm{ and } Y=j) = P(X=i)P(Y=j)\)。还有些时候,当随机变量从上下文中清晰可知时,我们通过写\(P(v)\)来滥用表示法。由于概率论中的事件是样本空间中结果的集合,我们可以为一个随机变量指定一个取值范围。例如,\(P(1 \leq X \leq 3)\)表示事件\(\{1 \leq X \leq 3\}\)的概率。

请注意,离散随机变量(如抛硬币或掷骰子)与连续随机变量(如从人群中随机抽样的人的体重和身高)之间存在细微差别。在这种情况下,我们很少真正关心某人的确切身高。此外,如果我们进行足够精确的测量,我们会发现地球上没有两个人有完全相同的身高。事实上,通过足够精细的测量,你醒来时和睡觉时的身高也不会相同。询问某人身高恰好是1.801392782910287192米的概率几乎没有意义。相反,我们通常更关心能否说出某人的身高是否落在某个给定的区间内,比如说1.79米到1.81米之间。在这些情况下,我们使用概率密度。身高恰好是1.80米的概率为零,但密度不为零。为了计算分配给一个区间的概率,我们必须对该区间上的密度进行积分

2.6.4. 多个随机变量

你可能已经注意到,我们甚至无法在上一节中不涉及多个随机变量之间的相互作用(回想一下\(P(X,Y) = P(X) P(Y)\))。大部分机器学习都与这种关系有关。在这里,样本空间将是我们感兴趣的人群,比如与企业交易的客户、互联网上的照片或生物学家已知的蛋白质。每个随机变量将代表不同属性的(未知)值。每当我们从人群中抽样一个个体时,我们就会观察到每个随机变量的一次实现。因为随机变量所取的值对应于样本空间中可能重叠、部分重叠或完全不相交的子集,所以知道一个随机变量所取的值可能会让我们更新对另一个随机变量可能取值的信念。如果一个病人走进医院,我们观察到他们呼吸困难并且失去了嗅觉,那么我们相信他们比没有呼吸困难和嗅觉完全正常的人更有可能感染COVID-19。

当处理多个随机变量时,我们可以为变量可以共同取值的每种组合构建事件。为每种组合(例如\(A=a\)\(B=b\))分配概率的概率函数称为联合概率函数,它简单地返回分配给样本空间相应子集交集的概率。随机变量\(A\)\(B\)分别取值\(a\)\(b\)的事件的联合概率表示为\(P(A = a, B = b)\),其中逗号表示“和”。请注意,对于任何值\(a\)\(b\),都遵循

(2.6.1)\[P(A=a, B=b) \leq P(A=a) \textrm{ and } P(A=a, B=b) \leq P(B = b),\]

因为要让\(A=a\)\(B=b\)发生,\(A=a\)必须发生并且\(B=b\)也必须发生。有趣的是,联合概率告诉我们从概率意义上可以知道的关于这些随机变量的一切,并且可以用来推导许多其他有用的量,包括恢复单个分布\(P(A)\)\(P(B)\)。为了恢复\(P(A=a)\),我们只需对随机变量\(B\)可以取的所有值\(v\),将\(P(A=a, B=v)\)相加:\(P(A=a) = \sum_v P(A=a, B=v)\)

比率\(\frac{P(A=a, B=b)}{P(A=a)} \leq 1\)被证明是极其重要的。它被称为条件概率,并用符号“\(\mid\)”表示

(2.6.2)\[P(B=b \mid A=a) = P(A=a,B=b)/P(A=a).\]

它告诉我们,一旦我们以事件\(A=a\)发生为条件,与事件\(B=b\)相关的新概率。我们可以将这个条件概率看作是只关注与\(A=a\)相关的样本空间子集,然后重新归一化,使得所有概率总和为1。条件概率实际上就是普通概率,因此只要我们对所有项都以相同的事件为条件,从而将注意力限制在相同的样本空间上,它们就遵循所有的公理。例如,对于不相交的事件\(\mathcal{B}\)\(\mathcal{B}'\),我们有\(P(\mathcal{B} \cup \mathcal{B}' \mid A = a) = P(\mathcal{B} \mid A = a) + P(\mathcal{B}' \mid A = a)\)

利用条件概率的定义,我们可以推导出著名的结果,称为贝叶斯定理。根据构造,我们有\(P(A, B) = P(B\mid A) P(A)\)\(P(A, B) = P(A\mid B) P(B)\)。将两个方程结合起来得到\(P(B\mid A) P(A) = P(A\mid B) P(B)\),因此

(2.6.3)\[P(A \mid B) = \frac{P(B\mid A) P(A)}{P(B)}.\]

这个简单的方程有着深远的意义,因为它允许我们颠倒条件作用的顺序。如果我们知道如何估计\(P(B\mid A)\)\(P(A)\)\(P(B)\),那么我们就可以估计\(P(A\mid B)\)。我们常常发现直接估计一项比另一项更容易,而贝叶斯定理在这里可以派上用场。例如,如果我们知道某种疾病的症状流行率,以及疾病和症状各自的总体流行率,我们就可以根据某人的症状来确定他们患有该疾病的可能性。在某些情况下,我们可能无法直接获得\(P(B)\),例如症状的流行率。在这种情况下,一个简化版的贝叶斯定理就很有用

(2.6.4)\[P(A \mid B) \propto P(B \mid A) P(A).\]

因为我们知道\(P(A \mid B)\)必须归一化为\(1\),即\(\sum_a P(A=a \mid B) = 1\),我们可以用它来计算

(2.6.5)\[P(A \mid B) = \frac{P(B \mid A) P(A)}{\sum_a P(B \mid A=a) P(A = a)}.\]

在贝叶斯统计中,我们认为观察者对可用假设的合理性有一些(主观的)先验信念,这些信念被编码在先验\(P(H)\)中,还有一个似然函数,它表示对于该类别中的每个假设,观察到任何收集到的证据值的可能性有多大\(P(E \mid H)\)。然后,贝叶斯定理被解释为告诉我们如何根据可用的证据\(E\)来更新初始的先验\(P(H)\),以产生后验信念\(P(H \mid E) = \frac{P(E \mid H) P(H)}{P(E)}\)。非正式地说,这可以表述为“后验等于先验乘以似然,除以证据”。现在,因为证据\(P(E)\)对所有假设都是相同的,我们可以简单地在假设上进行归一化。

注意\(\sum_a P(A=a \mid B) = 1\)也允许我们对随机变量进行边缘化。也就是说,我们可以从联合分布(如\(P(A, B)\))中去掉变量。毕竟,我们有

(2.6.6)\[\sum_a P(B \mid A=a) P(A=a) = \sum_a P(B, A=a) = P(B).\]

独立性是另一个非常重要的概念,它构成了统计学中许多重要思想的支柱。简而言之,如果对\(A\)的值进行条件化不会导致与\(B\)相关的概率分布发生任何变化,反之亦然,那么这两个变量就是独立的。更正式地说,独立性,表示为\(A \perp B\),要求\(P(A \mid B) = P(A)\),因此\(P(A,B) = P(A \mid B) P(B) = P(A) P(B)\)。独立性通常是一个适当的假设。例如,如果随机变量\(A\)代表抛一枚公平硬币的结果,随机变量\(B\)代表抛另一枚硬币的结果,那么知道\(A\)是否是正面不应该影响\(B\)是正面的概率。

当我们的数据从某个底层分布中连续抽取时,独立性尤其有用(这使我们能够做出强有力的统计结论),或者当我们的数据中各种变量之间存在独立性时,这使我们能够使用编码这种独立性结构的更简单的模型。另一方面,估计随机变量之间的依赖关系通常是学习的目标。我们关心估计给定症状下患病的概率,正是因为我们相信疾病和症状是独立的。

请注意,因为条件概率是真正的概率,所以独立和依赖的概念也适用于它们。两个随机变量\(A\)\(B\)在给定第三个变量\(C\)的情况下是条件独立的,当且仅当\(P(A, B \mid C) = P(A \mid C)P(B \mid C)\)。有趣的是,两个变量通常可能是独立的,但在以第三个变量为条件时变得依赖。这通常发生在两个随机变量\(A\)\(B\)是某个第三个变量\(C\)的原因时。例如,在普通人群中,骨折和肺癌可能是独立的,但如果我们以住院为条件,我们可能会发现骨折与肺癌呈负相关。这是因为骨折解释了某人为什么在医院,从而降低了他们因患有肺癌而住院的概率。

反之,两个相互依赖的随机变量在以第三个变量为条件时可以变得独立。这通常发生在两个原本不相关的事件有共同原因时。在小学生中,鞋码和阅读水平高度相关,但如果我们以年龄为条件,这种相关性就会消失。

2.6.5. 一个例子

让我们来检验一下我们的技能。假设一位医生对一名患者进行HIV测试。这个测试相当准确,如果患者健康但报告为患病,即健康患者在1%的情况下测试呈阳性,则失败概率为1%。此外,如果患者确实患有HIV,它从不失误。我们用\(D_1 \in \{0, 1\}\)表示诊断结果(\(0\)为阴性,\(1\)为阳性),用\(H \in \{0, 1\}\)表示HIV状态。

条件概率

\(H=1\)

\(H=0\)

\(P(D_1 = 1 \mid H)\)

1

0.01

\(P(D_1 = 0 \mid H)\)

0

0.99

请注意,列总和均为1(但行总和不是),因为它们是条件概率。让我们计算如果测试结果呈阳性,患者患有HIV的概率,即\(P(H = 1 \mid D_1 = 1)\)。直觉上,这将取决于疾病的普遍程度,因为它会影响假警报的数量。假设人群中该疾病相当罕见,例如\(P(H=1) = 0.0015\)。要应用贝叶斯定理,我们需要应用边缘化来确定

(2.6.7)\[\begin{split}\begin{aligned} P(D_1 = 1) =& P(D_1=1, H=0) + P(D_1=1, H=1) \\ =& P(D_1=1 \mid H=0) P(H=0) + P(D_1=1 \mid H=1) P(H=1) \\ =& 0.011485. \end{aligned}\end{split}\]

这引导我们得到

(2.6.8)\[P(H = 1 \mid D_1 = 1) = \frac{P(D_1=1 \mid H=1) P(H=1)}{P(D_1=1)} = 0.1306.\]

换句话说,尽管测试相当准确,患者实际患有HIV的几率只有13.06%。正如我们所见,概率可能是违反直觉的。患者在收到如此可怕的消息后应该怎么做?很可能,患者会要求医生进行另一次测试以获得明确的结果。第二次测试具有不同的特性,并且不如第一次好。

条件概率

\(H=1\)

\(H=0\)

\(P(D_2 = 1 \mid H)\)

0.98

0.03

\(P(D_2 = 0 \mid H)\)

0.02

0.97

不幸的是,第二次测试结果也是阳性。让我们通过假设条件独立性来计算调用贝叶斯定理所需的相关概率:

(2.6.9)\[\begin{split}\begin{aligned} P(D_1 = 1, D_2 = 1 \mid H = 0) & = P(D_1 = 1 \mid H = 0) P(D_2 = 1 \mid H = 0) =& 0.0003, \\ P(D_1 = 1, D_2 = 1 \mid H = 1) & = P(D_1 = 1 \mid H = 1) P(D_2 = 1 \mid H = 1) =& 0.98. \end{aligned}\end{split}\]

现在我们可以应用边缘化来获得两次测试都呈阳性的概率

(2.6.10)\[\begin{split}\begin{aligned} &P(D_1 = 1, D_2 = 1)\\ &= P(D_1 = 1, D_2 = 1, H = 0) + P(D_1 = 1, D_2 = 1, H = 1) \\ &= P(D_1 = 1, D_2 = 1 \mid H = 0)P(H=0) + P(D_1 = 1, D_2 = 1 \mid H = 1)P(H=1)\\ &= 0.00176955. \end{aligned}\end{split}\]

最后,在两次测试均为阳性的情况下,患者患有HIV的概率是

(2.6.11)\[P(H = 1 \mid D_1 = 1, D_2 = 1) = \frac{P(D_1 = 1, D_2 = 1 \mid H=1) P(H=1)}{P(D_1 = 1, D_2 = 1)} = 0.8307.\]

也就是说,第二次测试让我们获得了更高的置信度,表明情况并非一切都好。尽管第二次测试的准确性远不如第一次,但它仍然显著地改善了我们的估计。假设两次测试相互条件独立,对于我们能够生成更准确的估计至关重要。考虑一个极端情况,我们进行两次相同的测试。在这种情况下,我们期望两次结果相同,因此再次进行相同的测试不会获得任何额外的见解。敏锐的读者可能已经注意到,诊断的行为就像一个隐藏在视线中的分类器,当我们获得更多特征(测试结果)时,我们判断患者是否健康的能力会增加。

2.6.6. 期望

通常,做决策不仅需要看分配给单个事件的概率,还需要将它们组合成有用的聚合,以便为我们提供指导。例如,当随机变量取连续标量值时,我们常常关心知道平均期望得到什么值。这个量在形式上称为期望。如果我们在进行投资,我们关心的第一个量可能是我们期望的回报,这是对所有可能结果进行平均(并按适当的概率加权)的结果。例如,假设有50%的概率投资会完全失败,有40%的概率会提供2\(\times\)的回报,有10%的概率会提供10\(\times\)的回报。为了计算期望回报,我们将所有回报相加,每个回报乘以其发生的概率。这得到的期望是\(0.5 \cdot 0 + 0.4 \cdot 2 + 0.1 \cdot 10 = 1.8\)。因此,期望回报是1.8\(\times\)

一般而言,随机变量\(X\)期望(或平均值)定义为

(2.6.12)\[E[X] = E_{x \sim P}[x] = \sum_{x} x P(X = x).\]

同样,对于密度,我们得到\(E[X] = \int x \;dp(x)\)。有时我们对\(x\)的某个函数的期望值感兴趣。我们可以这样计算这些期望:

(2.6.13)\[E_{x \sim P}[f(x)] = \sum_x f(x) P(x) \textrm{ and } E_{x \sim P}[f(x)] = \int f(x) p(x) \;dx\]

分别用于离散概率和密度。回到上面的投资例子,\(f\)可能是与回报相关的效用(幸福感)。行为经济学家早就注意到,人们对亏钱感到的不悦要大于相对于基线赚一美元所获得的效用。此外,金钱的价值往往是次线性的。拥有10万美元与零美元的区别可能在于能否支付房租、吃得好、享受优质医疗保健,而不是遭受无家可归的痛苦。另一方面,拥有20万美元与10万美元所带来的收益则不那么显著。这样的推理引出了“金钱的效用是对数的”这句老话。

如果与完全损失相关的效用是\(-1\),而与\(1\)\(2\)\(10\)的回报相关的效用分别是\(1\)\(2\)\(4\),那么投资的期望幸福感将是\(0.5 \cdot (-1) + 0.4 \cdot 2 + 0.1 \cdot 4 = 0.7\)(期望效用损失30%)。如果这确实是你的效用函数,你最好把钱存在银行。

对于财务决策,我们可能还想衡量一项投资的风险有多大。在这里,我们不仅关心期望值,还关心实际值相对于这个值的变动程度。注意,我们不能只取实际值和期望值之间差异的期望。这是因为差异的期望是期望的差异,即\(E[X - E[X]] = E[X] - E[E[X]] = 0\)。但是,我们可以看这个差异的任何非负函数的期望。随机变量的方差是通过看平方差异的期望值来计算的:

(2.6.14)\[\textrm{Var}[X] = E\left[(X - E[X])^2\right] = E[X^2] - E[X]^2.\]

这里的等式通过展开\((X - E[X])^2 = X^2 - 2 X E[X] + E[X]^2\)并对每一项取期望而得。方差的平方根是另一个有用的量,称为标准差。虽然这和方差传达了相同的信息(任何一个都可以从另一个计算出来),但标准差有一个很好的特性,即它用与随机变量所代表的原始量相同的单位表示。

最后,随机变量的函数的方差定义类似:

(2.6.15)\[\textrm{Var}_{x \sim P}[f(x)] = E_{x \sim P}[f^2(x)] - E_{x \sim P}[f(x)]^2.\]

回到我们的投资例子,我们现在可以计算投资的方差。它由\(0.5 \cdot 0 + 0.4 \cdot 2^2 + 0.1 \cdot 10^2 - 1.8^2 = 8.36\)给出。无论从哪个方面看,这都是一项有风险的投资。注意,根据数学惯例,均值和方差通常用\(\mu\)\(\sigma^2\)表示。当我们用它来参数化高斯分布时,情况尤其如此。

就像我们为标量随机变量引入期望和方差一样,我们也可以为向量值随机变量这样做。期望很简单,因为我们可以逐元素应用它们。例如,\(\boldsymbol{\mu} \stackrel{\textrm{def}}{=} E_{\mathbf{x} \sim P}[\mathbf{x}]\)的坐标为\(\mu_i = E_{\mathbf{x} \sim P}[x_i]\)协方差更复杂。我们通过取随机变量与其均值之差的外积的期望来定义它们:

(2.6.16)\[\boldsymbol{\Sigma} \stackrel{\textrm{def}}{=} \textrm{Cov}_{\mathbf{x} \sim P}[\mathbf{x}] = E_{\mathbf{x} \sim P}\left[(\mathbf{x} - \boldsymbol{\mu}) (\mathbf{x} - \boldsymbol{\mu})^\top\right].\]

这个矩阵\(\boldsymbol{\Sigma}\)被称为协方差矩阵。一个简单的方法来看它的效果是考虑一个与\(\mathbf{x}\)大小相同的向量\(\mathbf{v}\)。可以得出:

(2.6.17)\[\mathbf{v}^\top \boldsymbol{\Sigma} \mathbf{v} = E_{\mathbf{x} \sim P}\left[\mathbf{v}^\top(\mathbf{x} - \boldsymbol{\mu}) (\mathbf{x} - \boldsymbol{\mu})^\top \mathbf{v}\right] = \textrm{Var}_{x \sim P}[\mathbf{v}^\top \mathbf{x}].\]

因此,\(\boldsymbol{\Sigma}\)允许我们通过简单的矩阵乘法计算\(\mathbf{x}\)的任何线性函数的方差。非对角元素告诉我们坐标之间的相关性有多大:值为0表示没有相关性,而较大的正值表示它们的相关性更强。

2.6.7. 讨论

在机器学习中,有很多事情是不确定的!我们可能不确定给定输入的标签值。我们可能不确定参数的估计值。我们甚至可能不确定部署时到达的数据是否与训练数据来自同一分布。

通过偶然不确定性,我们指的是问题固有的不确定性,是由于未被观测变量解释的真正随机性造成的。通过认知不确定性,我们指的是模型参数的不确定性,这种不确定性我们希望通过收集更多数据来减少。我们可能对硬币出现正面的概率有认知不确定性,但即使我们知道了这个概率,我们仍然对未来任何一次抛掷的结果有偶然不确定性。无论我们观察某人抛公平硬币多久,我们对下一次抛掷结果是正面的确定性永远不会超过或低于50%。这些术语来自机械建模,(参见例如Der Kiureghian 和 Ditlevsen (2009)关于不确定性量化这方面的回顾)。然而,值得注意的是,这些术语在语言上有些滥用。认知一词指任何与知识有关的事物,因此,在哲学意义上,所有不确定性都是认知的。

我们看到,从某个未知概率分布中抽样数据可以为我们提供信息,这些信息可用于估计数据生成分布的参数。也就是说,实现这一点的速率可能相当慢。在我们的抛硬币例子(以及许多其他例子)中,我们设计的估计器收敛速度不会超过\(1/\sqrt{n}\),其中\(n\)是样本量(例如,抛掷次数)。这意味着,从10个观测值增加到1000个(通常是一个非常可行的任务),我们会看到不确定性减少十倍,而接下来的1000个观测值帮助相对较小,只提供了1.41倍的减少。这是机器学习的一个持续特征:虽然通常有容易的收益,但要取得进一步的进展,需要非常大量的数据,并且通常伴随着巨大的计算量。关于这一事实在大型语言模型中的经验性回顾,请参见Revels et al. (2016)

我们还加强了统计建模的语言和工具。在这个过程中,我们学习了条件概率和统计学中最重要的方程之一——贝叶斯定理。它是一个有效的工具,通过似然项\(P(B \mid A)\)来解耦数据传达的信息,该似然项处理观测值\(B\)与参数选择\(A\)的匹配程度,以及一个先验概率\(P(A)\),它决定了特定选择\(A\)在最初的合理性。特别是,我们看到了如何应用这个规则来为诊断分配概率,基于测试的有效性疾病本身的流行率(即我们的先验)。

最后,我们介绍了一组关于特定概率分布影响的非平凡问题,即期望和方差。虽然一个概率分布除了线性和二次期望之外还有很多其他的,但这两者已经提供了关于分布可能行为的大量知识。例如,切比雪夫不等式表明\(P(|X - \mu| \geq k \sigma) \leq 1/k^2\),其中\(\mu\)是期望,\(\sigma^2\)是分布的方差,\(k > 1\)是我们选择的置信参数。它告诉我们,从一个分布中抽取的样本至少有50%的概率位于以期望为中心的\([-\sqrt{2} \sigma, \sqrt{2} \sigma]\)区间内。

2.6.8. 练习

  1. 给出一个例子,说明观察更多数据可以将关于结果的不确定性降低到任意低的水平。

  2. 给出一个例子,说明观察更多数据只会将不确定性降低到某一点,然后不再减少。解释为什么会这样,以及你期望这一点出现在哪里。

  3. 我们经验性地证明了抛硬币的均值收敛。计算在抽取\(n\)个样本后,我们看到正面的概率估计的方差。

    1. 方差如何随观测次数的变化而变化?

    2. 使用切比雪夫不等式来界定与期望的偏差。

    3. 它与中心极限定理有何关系?

  4. 假设我们从一个均值为零、方差为一的概率分布中抽取\(m\)个样本\(x_i\)。计算平均值\(z_m \stackrel{\textrm{def}}{=} m^{-1} \sum_{i=1}^m x_i\)。我们能否对每个\(z_m\)独立应用切比雪夫不等式?为什么不能?

  5. 给定两个事件的概率\(P(\mathcal{A})\)\(P(\mathcal{B})\),计算\(P(\mathcal{A} \cup \mathcal{B})\)\(P(\mathcal{A} \cap \mathcal{B})\)的上下界。提示:使用文氏图来表示这种情况。

  6. 假设我们有一个随机变量序列,比如\(A\)\(B\)\(C\),其中\(B\)只依赖于\(A\)\(C\)只依赖于\(B\),你能简化联合概率\(P(A, B, C)\)吗?提示:这是一个马尔可夫链

  7. 第 2.6.5 节中,假设两次测试的结果不是独立的。特别地,假设每次测试单独的假阳性率为10%,假阴性率为1%。也就是说,假设\(P(D =1 \mid H=0) = 0.1\)\(P(D = 0 \mid H=1) = 0.01\)。此外,假设对于\(H = 1\)(感染者),测试结果是条件独立的,即\(P(D_1, D_2 \mid H=1) = P(D_1 \mid H=1) P(D_2 \mid H=1)\),但对于健康患者,结果通过\(P(D_1 = D_2 = 1 \mid H=0) = 0.02\)耦合。

    1. 根据你目前拥有的信息,在给定\(H=0\)的情况下,计算\(D_1\)\(D_2\)的联合概率表。

    2. 推导在一次测试结果为阳性后,患者患病(\(H=1\))的概率。你可以假设与之前相同的基线概率\(P(H=1) = 0.0015\)

    3. 推导在两次测试结果均为阳性后,患者患病(\(H=1\))的概率。

  8. 假设你是一家投资银行的资产经理,你可以选择投资股票\(s_i\)。你的投资组合权重\(\alpha_i\)需要加起来等于\(1\)。这些股票有平均回报\(\boldsymbol{\mu} = E_{\mathbf{s} \sim P}[\mathbf{s}]\)和协方差\(\boldsymbol{\Sigma} = \textrm{Cov}_{\mathbf{s} \sim P}[\mathbf{s}]\)

    1. 计算给定投资组合\(\boldsymbol{\alpha}\)的期望回报。

    2. 如果你想最大化投资组合的回报,你应该如何选择你的投资?

    3. 计算投资组合的方差

    4. 制定一个优化问题,即在将方差限制在上限的同时最大化回报。这就是诺贝尔奖获奖的马科维茨投资组合(Mangram, 2013)。要解决它,你需要一个二次规划求解器,这远远超出了本书的范围。