概率
概率是衡量一个事件发生的可能性,在深度学习模型算法中占有很重要的作用。
基本概率论
假设我们掷骰子,想知道看到1的几率有多大,而不是看到另一个数字。 如果骰子是公平的,那么所有六个结果 { 1 , . . . , 6 } \{1, ... ,6\} {1,...,6} 都有相同的可能发生, 因此我们可以说发生的概率为 1 6 \frac{1}{6} 61 。
然而现实生活中,对于我们从工厂收到的真实骰子,我们需要检查它是否有瑕疵。 检查骰子的唯一方法是多次投掷并记录结果。 对于每个骰子,我们将观察到 { 1 , . . . , 6 } \{1, ... ,6\} {1,...,6}中的一个值。 对于每个值,一种自然的方法是将它出现的次数除以投掷的总次数, 即此事件(event)概率的估计值。 大数定律(law of large numbers) 告诉我们: 随着投掷次数的增加,这个估计值会越来越接近真实的潜在概率。 让我们用代码试一试!
首先,我们导入必要的软件包。
import torch #引入torch包
from torch.distributions import multinomial #引入多项分布函数
import matplotlib.pyplot as plt #引入绘图工具包
在统计学中,我们把从概率分布中抽取样本的过程称为 抽样(sampling)。 笼统来说,可以把 分布(distribution) 看作是对事件的概率分配, 稍后我们将给出的更正式定义。 将概率分配给一些离散选择的分布称为多项分布(multinomial distribution)。
为了抽取一个样本,即掷骰子,我们只需传入一个概率向量。 输出是另一个相同长度的向量:它在索引 i i i 处的值是采样结果中 i i i 出现的次数。
fair_probs = torch.ones([6])/6 #定义1-6个数值概率分布,概率均一致为 0.1667
fair_probs
tensor([0.1667, 0.1667, 0.1667, 0.1667, 0.1667, 0.1667])
multinomial.Multinomial(1, fair_probs).sample() #随机采样一个样本
tensor([0., 0., 1., 0., 0., 0.])
在估计一个骰子的公平性时,我们希望从同一分布中生成多个样本。 如果用Python的for循环来完成这个任务,速度会慢得惊人。 因此我们使用深度学习框架的函数同时抽取多个样本,得到我们想要的任意形状的独立样本数组。
multinomial.Multinomial(10, fair_probs).sample() #随机采样10个样本
tensor([0., 1., 1., 3., 1., 4.])
现在我们知道如何对骰子进行采样,我们可以模拟10000次投掷。 然后,我们可以统计10000次投掷后,每个数字被投中了多少次。 具体来说,我们计算相对频率,以作为真实概率的估计。
samples = multinomial.Multinomial(10000, fair_probs).sample() #随机采样10000个样本
samples/10000 #输出它们的各自的概率
tensor([0.1697, 0.1662, 0.1662, 0.1646, 0.1698, 0.1635])
因为我们是从一个公平的骰子中生成的数据,我们知道每个结果都有真实的概率 1 6 \frac{1}{6} 61 , 大约是 0.1667 0.1667 0.1667,所以上面输出的估计值看起来不错。
我们也可以看到这些概率如何随着时间的推移收敛到真实概率。 让我们进行500组实验,每组抽取10个样本。
counts = multinomial.Multinomial(10, fair_probs).sample((500,)) #进行500组实验,每次实验10个样本
cum_counts = counts.cumsum(dim=0) #对每列进行累计求和
estimates = cum_counts / cum_counts.sum(dim=1, keepdims=True) #求出所有行的估计概率,位置越靠后,估计的准确度越高
for i in range(6):
plt.plot(estimates[:, i].numpy(),
label=("P(die=" + str(i + 1) + ")")) #绘图,画出6条曲线的走向
plt.axhline(y=0.167, color='black', linestyle='dashed') #设置概率的结果线所在
plt.gca().set_xlabel('Groups of experiments')
plt.gca().set_ylabel('Estimated probability')
plt.legend()
<matplotlib.legend.Legend at 0x18dd59b04a8>
每条实线对应于骰子的6个值中的一个,并给出骰子在每组实验后出现值的估计概率。
当我们通过更多的实验获得更多的数据时,这6条实体曲线向真实概率收敛。
概率论公理
在处理骰子掷出时,我们将集合 S = { 1 , . . . , 6 } S = \{1, ... ,6\} S={1,...,6} 称为样本空间(sample space) 或结果空间(outcome space), 其中每个元素都是结果(outcome)。 事件(event)是一组给定样本空间的随机结果。 例如,“看到 5 5 5 ”( { 5 } \{5\} {5})和“看到奇数”( { 1 , 3 , 5 } \{1,3,5\} {1,3,5} )都是掷出骰子的有效事件。 注意,如果一个随机实验的结果在 A A A 中,则事件 A A A 已经发生。 也就是说,如果投掷出 3 3 3 点,因为 3 ∈ { 1 , 3 , 5 } 3 \in \{1,3,5\} 3∈{1,3,5} ,我们可以说,“看到奇数”的事件发生了。
概率(probability)可以被认为是将集合映射到真实值的函数。 在给定的样本空间 S S S 中,事件 A A A 的概率, 表示为 P ( A ) P(A) P(A) ,满足以下属性:
-
对于任意事件 A A A,其概率从不会是负数,即 P ( A ) > = 0 P(A) >= 0 P(A)>=0;
-
整个样本空间的概率为 1 1 1 ,即 P ( S ) = 1 P(S) = 1 P(S)=1;
-
对于互斥(mutually exclusive)事件(对于所有$ i \neq j$都有 $A_i \bigcap A_j = \emptyset $ )的任意一个可数序列 A 1 , A 2 , . . . A_1, A_2, ... A1,A2,... ,序列中任意一个事件发生的概率等于它们各自发生的概率之和,即 P ( ⋃ i = 1 ∞ A i ) = ∑ i = 1 ∞ P ( A i ) P(\bigcup\limits_{i=1}^{\infty}A_i) = \sum\limits_{i=1}^{\infty}P(A_i) P(i=1⋃∞Ai)=i=1∑∞P(Ai) 。
以上也是概率论的公理,由科尔莫戈罗夫于1933年提出。 有了这个公理系统,我们可以避免任何关于随机性的哲学争论; 相反,我们可以用数学语言严格地推理。 例如,假设事件 A i A_i Ai 为整个样本空间, 且当所有 i > 1 i > 1 i>1 时的 A i = ∅ A_i = \emptyset Ai=∅ , 那么我们可以证明 P ( ∅ ) = 0 P(\emptyset) = 0 P(∅)=0 ,即不可能发生事件的概率是 0 0 0 。