查看全课大纲(第 7 / 69 节)
  1. 1.NLP 的研究领域、应用与学习路径
  2. 2.自然语言的基本术语
  3. 3.信息论基础:信息熵与交叉熵
  4. 4.语言的进化与语义变迁
  5. 5.主观概率、客观概率与条件概率
  6. 6.贝叶斯原理与推理
  7. 7.随机变量:二项式、期望方差与联合概率
  8. 8.常见概率分布
  9. 9.辛普森悖论与贝叶斯解题实例
  10. 10.语言模型:语言概率与词袋模型
  11. 11.n-gram 语言模型(二元 / 三元 / N-Gram)
  12. 12.语言模型评价:交叉熵、困惑度与插值
  13. 13.朴素贝叶斯文本分类:垃圾邮件
  14. 14.拼写检查
  15. 15.中文分词:构词法、最大匹配、最优路径与 Jieba
  16. 16.词表示问题与语义相似度
  17. 17.TF-IDF 权重处理
  18. 18.One-Hot 表达与词表示的局限
  19. 19.Word2Vec 核心思想
  20. 20.Word2Vec 训练过程
  21. 21.Skip-gram 模型详解
  22. 22.词性标注任务与标注方法(规则 + N-Gram)
  23. 23.EM 算法与混合模型
  24. 24.高斯混合模型 GMM
  25. 25.从混合模型到隐马尔可夫模型
  26. 26.隐马尔可夫模型(HMM)推导与维特比解码
  27. 27.线性链条件随机场 CRF
  28. 28.贝叶斯网络与图模型
  29. 29.隐马尔可夫链与 HMM 推导
  30. 30.PLSA 主题模型
  31. 31.LSI 与 SVD 向量表达
  32. 32.LDA 与狄利克雷分布
  33. 33.主题模型实验复现(困惑度 / 分类 / 相似度 / 延展)
  34. 34.上下文无关文法(CFG)与句法分析
  35. 35.概率上下文无关文法 PCFG
  36. 36.统计机器翻译:词对齐与翻译模型
  37. 37.统计机器翻译中的对齐模型与参数估计
  38. 38.从统计机器翻译到神经机器翻译
  39. 39.神经元与反向传播速览(指向深度学习课)
  40. 40.CNN 原理及其在 NLP 中的应用
  41. 41.循环神经网络的基本原理与 Elman / Jordan 网络
  42. 42.LSTM:长短期记忆网络的核心思想与分步实现
  43. 43.Encoder-Decoder 框架
  44. 44.Seq2Seq 与早期注意力机制
  45. 45.注意力机制的背景与动机
  46. 46.注意力模型实现原理与匹配函数
  47. 47.记忆网络:组成与计算
  48. 48.注意力机制的应用与历史延展
  49. 49.Transformer 结构:Encoder-Decoder 栈与 Self-Attention
  50. 50.Multi-Head Attention、FFNN 与位置编码
  51. 51.层归一化、损失函数与 Universal Transformer 延展
  52. 52.预训练范式:从 ELMo 到 BERT
  53. 53.BERT 与掩码语言模型
  54. 54.BERT 下游任务微调与 GLUE 口径
  55. 55.GPT 与自回归语言建模
  56. 56.GPT-1 到 GPT-4 的演进
  57. 57.指令微调与 RLHF
  58. 58.分词器:BPE、WordPiece 与中文词表
  59. 59.上下文窗口与长文本处理
  60. 60.能力边界、成本与适用场景
  61. 61.文本分类实战:从朴素贝叶斯到逻辑回归
  62. 62.命名实体识别实战
  63. 63.文本生成与摘要实战
  64. 64.语义检索与向量库实战
  65. 65.RAG 知识库问答
  66. 66.NLP 评估指标:BLEU / ROUGE / BERTScore 与人工评估
  67. 67.幻觉与事实性问题
  68. 68.文本与知识结合(知识图谱压缩)
  69. 69.跨媒体信息检索与未来展望

随机变量:二项式、期望方差与联合概率

小象实战讲义 · 自然语言处理

本节是《概率与统计基础》的核心内容,我们将从随机变量的基本概念出发,深入理解二项式分布及其与伯努利分布的关系,并掌握描述分布特性的两个关键参数——期望与方差。最后,我们将探讨多个随机变量之间的关系,引入联合概率与协方差的概念。这些知识是后续学习语言模型、主题模型等NLP核心技术的数学基石。

💡 核心导读

  • 随机变量:将不确定性事件的结果映射为数值的函数,是概率论描述世界的基本语言。
  • 二项式分布:描述n次独立伯努利试验中成功次数的概率分布,是理解语言模型中n-gram计数的基础。
  • 期望与方差:分别刻画了随机变量取值的“中心位置”和“离散程度”,是评估模型性能的重要指标。
  • 联合概率与协方差:联合概率描述多个随机变量同时取值的概率;协方差衡量两个随机变量的线性共变,且零协方差不能推出独立。

随机变量:从确定到不确定

在传统数学中,变量(如 x, y)通常代表一个确定的值,例如一个人的身高是1.78米。随机变量则不同,它代表一个不确定的值,其取值由概率分布决定。

定义:随机变量是一个函数,它将样本空间(所有可能结果的集合)中的每一个结果映射到一个实数。

例如,用随机变量 X 表示一个人的性别,我们可以定义:

  • X = 1 表示男性,概率 P(X=1) = 0.6
  • X = 0 表示女性,概率 P(X=0) = 0.4

这里,X 可以取不同的值,但取哪个值是不确定的,由概率 0.6 和 0.4 决定。所有可能取值及其对应概率的集合,就构成了该随机变量的概率分布。

二项式分布:从掷硬币到人生选择

二项式分布是自然语言处理中最常用的离散概率分布之一,尤其在统计语言模型中频繁出现。

伯努利分布:单次试验

考虑最简单的随机试验:掷一枚硬币。假设掷出正面的概率为 p,反面的概率为 1-p。我们用随机变量 X 表示单次掷硬币的结果:

  • X = 1 表示正面(成功)
  • X = 0 表示反面(失败)

其概率分布为: P(X = x) = p^x * (1-p)^{1-x}, 其中 x ∈ {0, 1}

验证一下:

  • 当 x=1, P(X=1) = p^1 * (1-p)^{0} = p
  • 当 x=0, P(X=0) = p^0 * (1-p)^{1} = 1-p

这个分布称为伯努利分布,它是二项式分布的基本单元。

二项式分布:多次独立试验

现在,我们进行 n 次独立的掷硬币试验(即每次试验都是伯努利分布,且相互独立)。我们关心的是:在这 n 次试验中,出现 k 次正面的概率是多少?

随机变量 Y 表示 n 次试验中成功的次数(即正面朝上的次数)。Y 服从参数为 (n, p) 的二项式分布,记作 Y ~ Binomial(n, p)。

其概率质量函数为: P(Y = k) = C(n, k) * p^k * (1-p)^{n-k}, 其中 k = 0, 1, 2, ..., n

这里 C(n, k) 是组合数,计算公式为 n! / (k! * (n-k)!),它代表了在 n 次试验的所有可能序列中,恰好有 k 次成功的序列有多少种。

import math

def binomial_pmf(n, k, p):
    """
    计算二项式分布 Binomial(n, p) 在 k 处的概率质量函数值。
    参数:
        n: 试验总次数
        k: 成功次数
        p: 单次试验成功的概率
    返回:
        P(Y = k)
    """
    # 计算组合数 C(n, k) = n! / (k! * (n-k)!)
    comb = math.comb(n, k)  # Python 3.8+
    # 计算概率
    prob = comb * (p ** k) * ((1 - p) ** (n - k))
    return prob

# 示例:掷一枚均匀硬币10次,恰好出现5次正面的概率
n = 10
k = 5
p = 0.5
prob_5_heads = binomial_pmf(n, k, p)
print(f"P(10次掷币,5次正面) = {prob_5_heads:.4f}")

# 打印k从0到10的所有概率
print("\n二项式分布 Binomial(10, 0.5) 的全部概率:")
for k_val in range(n + 1):
    prob = binomial_pmf(n, k_val, p)
    print(f"  P(Y={k_val:2d}) = {prob:.6f}")
P(10次掷币,5次正面) = 0.2461

二项式分布 Binomial(10, 0.5) 的全部概率:
  P(Y= 0) = 0.000977
  P(Y= 1) = 0.009766
  P(Y= 2) = 0.043945
  P(Y= 3) = 0.117188
  P(Y= 4) = 0.205078
  P(Y= 5) = 0.246094
  P(Y= 6) = 0.205078
  P(Y= 7) = 0.117188
  P(Y= 8) = 0.043945
  P(Y= 9) = 0.009766
  P(Y=10) = 0.000977

可视化理解:高尔顿板与杨辉三角

二项式分布有一个经典的物理模型——高尔顿板。小球从顶部落下,每碰到一个钉子,都以概率 p 向左、概率 1-p 向右落下。经过多层钉子后,小球落到底部各个槽中的数量分布就近似于二项式分布。

当 p=0.5 时,这个分布是对称的,其形状系数(组合数 C(n, k))正好是杨辉三角(也称帕斯卡三角)的第 n 行。

二项式系数 C(n, k) 也正是 (a+b)^n 二项式展开后的系数。例如: (a+b)^4 = a^4 + 4a^3b + 6a^2b^2 + 4ab^3 + b^4 系数 1, 4, 6, 4, 1 就是杨辉三角的第4行,也对应着 n=4 时,二项式分布 P(Y=k) 中的组合数部分。

从二项式到正态分布:一个关于人生的启示

一个重要的极限定理是:当试验次数 n 很大时,二项式分布 Binomial(n, p) 会趋近于正态分布 N(μ=np, σ^2=np(1-p))。正态分布在自然界和社会现象中无处不在。

这给我们一个有趣的启示:人生的轨迹可以看作一系列选择(伯努利试验)的叠加。每个选择可能正确(成功)或错误(失败)。绝大多数人一生中会做对很多选择,也会做错很多选择,这些选择相互叠加、修正,最终使得大多数人的成就分布在“普通人”的区间内,即正态分布的中间部分。极少数人可能连续做对关键选择(分布右尾),或连续做错选择(分布左尾)。因此,不必过分纠结于某一次选择的得失,长期、持续做出“正确概率”较高的选择,才是决定最终位置的关键。这种大量微小独立因素叠加导致正态分布的现象,也是中心极限定理的一个体现。

期望与方差:描述分布的特征

知道了完整的概率分布,我们还需要几个关键的数字特征来概括它,最重要的就是期望和方差。

数学期望:加权平均值

数学期望(简称期望)是随机变量所有可能取值的加权平均,权重就是对应的概率。它代表了随机变量取值的“中心”或“平均”位置。

对于离散随机变量 X,其期望 E[X] 定义为: E[X] = Σ_{所有x} [ x * P(X=x) ]

def expectation_and_variance(values, probabilities):
    """
    计算离散随机变量的期望和方差。
    参数:
        values: 取值列表 [x1, x2, ...]
        probabilities: 对应概率列表 [p1, p2, ...]
    返回:
        (期望, 方差)
    """
    # 计算期望 E[X] = Σ x * p(x)
    exp = sum(v * p for v, p in zip(values, probabilities))
    
    # 计算方差 Var(X) = E[(X - E[X])^2] = Σ (x - E[X])^2 * p(x)
    var = sum(((v - exp) ** 2) * p for v, p in zip(values, probabilities))
    
    return exp, var

# 示例:计算一个简单离散分布的期望和方差
# 随机变量X取值:1, 2, 3,对应概率:0.2, 0.5, 0.3
X_values = [1, 2, 3]
X_probs = [0.2, 0.5, 0.3]

exp_X, var_X = expectation_and_variance(X_values, X_probs)
print(f"随机变量X的分布: 取值{list(zip(X_values, X_probs))}")
print(f"期望 E[X] = {exp_X:.4f}")
print(f"方差 Var(X) = {var_X:.4f}")
随机变量X的分布: 取值[(1, 0.2), (2, 0.5), (3, 0.3)]
期望 E[X] = 2.1000
方差 Var(X) = 0.4900

方差与标准差:离散程度的度量

方差衡量的是随机变量取值相对于其期望的离散程度。定义为: Var(X) = E[ (X - E[X])^2 ]

简单理解:方差是所有可能取值到期望点的“距离的平方”的加权平均。方差越大,说明数据点越分散;方差越小,说明数据点越集中在期望附近。

标准差是方差的算术平方根,σ = sqrt(Var(X))。标准差与原始数据有相同的量纲,更便于解释。

对于二项式分布 Binomial(n, p),其期望和方差有简洁的公式:

  • 期望 E[Y] = n * p
  • 方差 Var(Y) = n * p * (1-p)

# —— 重新构建上文用到的微型数据(本节各代码块相互独立,可单独运行)
import math
def binomial_pmf(n, k, p):
    """
    计算二项式分布 Binomial(n, p) 在 k 处的概率质量函数值。
    参数:
        n: 试验总次数
        k: 成功次数
        p: 单次试验成功的概率
    返回:
        P(Y = k)
    """
    # 计算组合数 C(n, k) = n! / (k! * (n-k)!)
    comb = math.comb(n, k)  # Python 3.8+
    # 计算概率
    prob = comb * (p ** k) * ((1 - p) ** (n - k))
    return prob
n = 10
k = 5
p = 0.5
prob_5_heads = binomial_pmf(n, k, p)
def expectation_and_variance(values, probabilities):
    """
    计算离散随机变量的期望和方差。
    参数:
        values: 取值列表 [x1, x2, ...]
        probabilities: 对应概率列表 [p1, p2, ...]
    返回:
        (期望, 方差)
    """
    # 计算期望 E[X] = Σ x * p(x)
    exp = sum(v * p for v, p in zip(values, probabilities))
    
    # 计算方差 Var(X) = E[(X - E[X])^2] = Σ (x - E[X])^2 * p(x)
    var = sum(((v - exp) ** 2) * p for v, p in zip(values, probabilities))
    
    return exp, var
X_values = [1, 2, 3]
X_probs = [0.2, 0.5, 0.3]
exp_X, var_X = expectation_and_variance(X_values, X_probs)

# 验证二项式分布的期望和方差公式
n = 10
p = 0.3
# 方法1:根据定义,通过所有可能取值计算
values = list(range(n + 1))  # k from 0 to n
probs = [binomial_pmf(n, k, p) for k in values]
exp_calc, var_calc = expectation_and_variance(values, probs)

# 方法2:使用公式
exp_formula = n * p
var_formula = n * p * (1 - p)

print(f"二项式分布 Binomial(n={n}, p={p})")
print(f"根据定义计算:期望 = {exp_calc:.4f}, 方差 = {var_calc:.4f}")
print(f"使用公式计算:期望 = {exp_formula:.4f}, 方差 = {var_formula:.4f}")
print(f"两者是否一致?期望: {abs(exp_calc - exp_formula) < 1e-9}, 方差: {abs(var_calc - var_formula) < 1e-9}")
二项式分布 Binomial(n=10, p=0.3)
根据定义计算:期望 = 3.0000, 方差 = 2.1000
使用公式计算:期望 = 3.0000, 方差 = 2.1000
两者是否一致?期望: True, 方差: True

联合概率与协方差:变量之间的关系

现实世界中的变量很少完全独立。在NLP中,词语的出现、句子的结构都涉及多个随机变量之间的复杂关系。

联合概率与边缘概率

对于两个离散随机变量 X 和 Y,联合概率 P(X=x, Y=y) 表示 X 取值为 x 且 Y 取值为 y 同时发生的概率。

联合概率可以按条件概率分解:

  • P(X=x, Y=y) = P(X=x) P(Y=y | X=x) = P(Y=y) P(X=x | Y=y)
  • 其中条件概率 P(Y=y | X=x) = P(X=x, Y=y) / P(X=x)(要求 P(X=x) > 0)。

当 X 与 Y 独立时,条件概率退化为边缘概率,联合概率才可写成两个边缘概率的乘积:P(X=x, Y=y) = P(X=x) P(Y=y)。

从联合概率分布中,我们可以通过对另一个变量求和来得到单个变量的分布,这称为边缘概率:

  • P(X=x) = Σ_{所有y} P(X=x, Y=y)
  • P(Y=y) = Σ_{所有x} P(X=x, Y=y)

这类似于在二维平面上有一个概率质量分布,边缘概率就是向X轴或Y轴做“投影”得到的分布。

协方差:衡量线性相关

协方差用于衡量两个随机变量之间的线性相关关系。

定义:Cov(X, Y) = E[ (X - E[X]) * (Y - E[Y]) ]

展开后常用公式:Cov(X, Y) = E[XY] - E[X]E[Y]

协方差的意义:

  • Cov(X, Y) > 0:正相关。X 增大时,Y 也倾向于增大。
  • Cov(X, Y) < 0:负相关。X 增大时,Y 倾向于减小。
  • Cov(X, Y) = 0:不相关(但未必独立!)。X 和 Y 之间没有线性关系。
def covariance(values_x, probs_x, values_y, probs_y, joint_prob_func):
    """
    计算两个离散随机变量X和Y的协方差。
    参数:
        values_x: X的取值列表
        probs_x: X的边缘概率列表
        values_y: Y的取值列表
        probs_y: Y的边缘概率列表
        joint_prob_func: 函数 joint_prob_func(x, y) 返回 P(X=x, Y=y)
    返回:
        协方差 Cov(X, Y)
    """
    # 计算 E[X], E[Y]
    exp_x = sum(vx * px for vx, px in zip(values_x, probs_x))
    exp_y = sum(vy * py for vy, py in zip(values_y, probs_y))
    
    # 计算 E[XY] = Σ Σ x*y * P(X=x, Y=y)
    exp_xy = 0.0
    for i, vx in enumerate(values_x):
        for j, vy in enumerate(values_y):
            exp_xy += vx * vy * joint_prob_func(vx, vy)
    
    # Cov(X,Y) = E[XY] - E[X]E[Y]
    cov_xy = exp_xy - (exp_x * exp_y)
    return cov_xy

# 示例:一个简单的二维离散分布
# X取值: 0, 1
# Y取值: 0, 1
# 联合概率分布 P(X,Y) 如下表定义
def joint_prob_example(x, y):
    """示例的联合概率函数 P(X=x, Y=y)"""
    # 定义一个简单的分布
    if x == 0 and y == 0:
        return 0.2
    elif x == 0 and y == 1:
        return 0.3
    elif x == 1 and y == 0:
        return 0.1
    elif x == 1 and y == 1:
        return 0.4
    else:
        return 0.0

# X和Y的边缘分布(可通过联合分布求和得到)
X_vals = [0, 1]
# P(X=0) = P(0,0)+P(0,1)=0.2+0.3=0.5
# P(X=1) = P(1,0)+P(1,1)=0.1+0.4=0.5
X_probs = [0.5, 0.5]

Y_vals = [0, 1]
# P(Y=0) = P(0,0)+P(1,0)=0.2+0.1=0.3
# P(Y=1) = P(0,1)+P(1,1)=0.3+0.4=0.7
Y_probs = [0.3, 0.7]

# 计算协方差
cov_xy = covariance(X_vals, X_probs, Y_vals, Y_probs, joint_prob_example)
print(f"协方差 Cov(X, Y) = {cov_xy:.4f}")
print("\n解读:")
if cov_xy > 0:
    print("  Cov > 0,X与Y正相关。")
elif cov_xy < 0:
    print("  Cov < 0,X与Y负相关。")
else:
    print("  Cov = 0,X与Y线性不相关。")
协方差 Cov(X, Y) = 0.0500

解读:
  Cov > 0,X与Y正相关。

重要辨析:不相关 vs 独立

两个随机变量 X 和 Y 独立意味着:P(X=x, Y=y) = P(X=x) * P(Y=y) 对所有 x, y 成立。

如果 X 和 Y 独立,则 Cov(X, Y) = 0。但反过来不成立! 协方差为0只表明没有线性关系,但变量之间可能存在其他非线性关系(例如 Y = X^2,且 X 对称分布时,协方差为0,但显然不独立)。

因此,在NLP中,当我们用协方差或相关系数分析词语共现时:协方差或相关系数非零,可以判定变量不独立;等于0只能说明没有线性相关,不能据此推出独立。

📝 动手练一练

  1. 概念辨析:假设随机变量 X 和 Y 的协方差 Cov(X, Y) = 0。以下哪个结论是一定正确的? A) X 和 Y 是独立的。 B) X 和 Y 之间没有线性关系。 C) X 的变化不会引起 Y 的任何变化。 D) E[XY] = E[X]E[Y]。
👉 点击查看参考答案

答案:B 和 D 一定正确。

  • A 错误:协方差为0只能推出没有线性关系,但不能推出独立。存在非线性关系时,协方差也可以为0(例如 Y = X^2 且 E[X]=0 的情况)。
  • B 正确:协方差度量的正是线性相关关系,协方差为0意味着没有线性关系。
  • C 错误:没有线性关系不代表完全没有关系,可能存在曲线关系或其他复杂依赖。
  • D 正确:根据协方差公式 Cov(X,Y) = E[XY] - E[X]E[Y],协方差为0直接推出 E[XY] = E[X]E[Y]。
  1. 手算练习:考虑二项式分布 Binomial(n=4, p=0.6)。 a) 计算成功次数 k=2 的概率 P(Y=2)。 b) 计算该分布的期望 E[Y] 和方差 Var(Y)(先尝试用公式,再用定义验证)。
👉 点击查看参考答案

a) 计算 P(Y=2) 公式:P(Y=k) = C(n, k) * p^k * (1-p)^{n-k}

  • n=4, k=2, p=0.6, 1-p=0.4
  • 组合数 C(4,2) = 4!/(2!2!) = (4*3)/(2*1) = 6
  • P(Y=2) = 6 * (0.6)^2 * (0.4)^{2} = 6 * 0.36 * 0.16 = 6 * 0.0576 = 0.3456

b) 计算期望和方差

  • 使用公式:
    • 期望 E[Y] = n*p = 4 * 0.6 = 2.4
    • 方差 Var(Y) = n*p*(1-p) = 4 * 0.6 * 0.4 = 0.96
  • 使用定义验证: 我们需要计算 E[Y] = Σ k * P(Y=k) 和 Var(Y) = Σ (k - E[Y])^2 * P(Y=k)。 先列出所有概率:
    • P(Y=0) = C(4,0)*0.6^0*0.4^4 = 1*1*0.0256 = 0.0256
    • P(Y=1) = C(4,1)*0.6^1*0.4^3 = 4*0.6*0.064 = 0.1536
    • P(Y=2) = 0.3456 (已算)
    • P(Y=3) = C(4,3)*0.6^3*0.4^1 = 4*0.216*0.4 = 0.3456
    • P(Y=4) = C(4,4)*0.6^4*0.4^0 = 1*0.1296*1 = 0.1296 检查概率和:0.0256+0.1536+0.3456+0.3456+0.1296 = 1.0,正确。
    • 期望 E[Y] = 0*0.0256 + 1*0.1536 + 2*0.3456 + 3*0.3456 + 4*0.1296 = 0 + 0.1536 + 0.6912 + 1.0368 + 0.5184 = 2.4
    • 方差 Var(Y) = (0-2.4)^2*0.0256 + (1-2.4)^2*0.1536 + (2-2.4)^2*0.3456 + (3-2.4)^2*0.3456 + (4-2.4)^2*0.1296 = 5.76*0.0256 + 1.96*0.1536 + 0.16*0.3456 + 0.36*0.3456 + 2.56*0.1296 = 0.147456 + 0.301056 + 0.055296 + 0.124416 + 0.331776 = 0.96 验证结果与公式一致。

本章小结

本节我们建立了概率论中描述不确定性的核心框架——随机变量及其分布。二项式分布作为多次独立伯努利试验的模型,是理解后续统计语言模型的基础。期望和方差为我们提供了刻画分布核心特征的简洁工具。最后,通过联合概率和协方差,我们开始探索多个随机变量之间复杂的关系网络,这是迈向真实世界NLP问题建模的关键一步。

📋 行动清单

  • 理解随机变量:能清晰区分普通变量(确定值)与随机变量(概率分布)。
  • 掌握二项式分布:能写出其概率质量函数,并解释参数 n 和 p 的意义。能计算其期望和方差。
  • 运用期望与方差:给定一个简单离散分布,能手动计算其期望和方差。
  • 辨析协方差:理解协方差为0意味着“无线性关系”,但不一定“独立”。

—— 小象教研组