查看全课大纲(第 54 / 82 节)
  1. 1.函数与数据泛化
  2. 2.向量:从几何直觉到高维空间
  3. 3.矩阵与张量
  4. 4.特征值与特征向量:矩阵变换的不动方向
  5. 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
  6. 6.概率与统计:机器学习的数学基础
  7. 7.独立性与随机变量:贝叶斯公式与二项分布
  8. 8.期望、方差与协方差:随机变量的数字画像
  9. 9.联合概率:当一条轴不够用的时候
  10. 10.概率分布(一):从伯努利到伽马函数
  11. 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
  12. 12.机器学习的模型:找输入与输出的关系
  13. 13.机器学习的应用
  14. 14.过拟合
  15. 15.机器学习的分类
  16. 16.有监督学习:从房价预测说起
  17. 17.损失函数
  18. 18.梯度下降(上):更新规则与学习速率
  19. 19.梯度下降(2)
  20. 20.牛顿方法
  21. 21.KNN简介
  22. 22.距离测算
  23. 23.朴素贝叶斯
  24. 24.朴素贝叶斯的实际应用
  25. 25.信息熵:决策树构建的度量基础
  26. 26.信息增益与决策树的构建
  27. 27.ID3算法
  28. 28.决策树节点的划分
  29. 29.CART树
  30. 30.Bagging
  31. 31.Boosting:自适应提升算法
  32. 32.Gradient Boosting
  33. 33.线性模型:回归与分类的同一副骨架
  34. 34.最小二乘:把最优参数直接解出来
  35. 35.最小二乘法的几何与概率视角
  36. 36.极大似然:给最小二乘一个概率出身
  37. 37.逻辑回归(1):把线性模型接到分类上
  38. 38.逻辑回归(2):损失函数与多分类
  39. 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
  40. 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
  41. 41.优化方法(1):坐标下降与前向选择
  42. 42.优化方法(2):前向策略与最小角回归
  43. 43.拉格朗日乘子法(1):从无约束到等式约束
  44. 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
  45. 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
  46. 46.最大间隔:把分类问题变成优化问题
  47. 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
  48. 48.支持向量:边界上的少数派
  49. 49.SVM 计算过程:一笔到底算完,再走进核方法
  50. 50.贝叶斯公式:概率即信念
  51. 51.隐含变量和概率模型:给看不见的原因建模
  52. 52.EM 算法:期望与最大化的迭代
  53. 53.琴生不等式:EM 的数学钥匙
  54. 54.三个硬币问题:EM 的复盘与衔接
  55. 55.高斯混合模型:用隐变量解释双峰数据
  56. 56.隐马尔可夫模型
  57. 57.隐马尔可夫模型(2):前向算法与动态混合模型
  58. 58.隐马尔可夫模型在 NLP 中的运用
  59. 59.EM 算法:把「为什么收敛」推到底
  60. 60.HMM 在 NLP 中的运用:从分词到机器翻译
  61. 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
  62. 62.高维下的高斯模型
  63. 63.主题模型:从词袋到隐含主题
  64. 64.Dirichlet 分布(1)
  65. 65.Dirichlet 分布(2)
  66. 66.统计学习内容回顾
  67. 67.K-means 算法
  68. 68.PCA 降维
  69. 69.SVD 降维
  70. 70.从聚类到流形
  71. 71.局部线性嵌入
  72. 72.随机邻域嵌入:SNE 与 t-SNE
  73. 73.无参模型:让数据自己说话
  74. 74.高斯过程:函数空间里的正态分布
  75. 75.高斯过程(2):噪声、正则化与核的线性组合
  76. 76.神经网络简介:从感知器到自编码器
  77. 77.反向传播:把误差一层层传回去
  78. 78.卷积神经网络(CNN):让特征自己学出来
  79. 79.循环神经网络(RNN):给网络装上记忆
  80. 80.深度学习回顾:静态一类,动态一类
  81. 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
  82. 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传

三个硬币问题:EM 的复盘与衔接

约 23 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 机器学习算法精讲

第 12 章从贝叶斯一路走到琴生不等式——EM 的「怎么算」(上一章的 μ\mu 与数红绿)和「为什么对」(下界与单调性)都配齐了。这一节讲师把两次课的东西衔接起来:把三硬币这条线复盘一遍——这次带着一串具体的 11 次掷硬币记录,亲手数一遍红绿;顺带两处新的展开——参数本身的「层级」解读、把硬币换成骰子。开场定位(讲师原话):先把上次课的简单内容讲一下核心思路,之后把两次课的东西衔接一下。

💡 核心导读

  • 复盘主线:极大似然 → 隐含变量 zz → 混合模型 → μ\mu 软归属 → E/M 两步——每一环都对应上一章的某一节,这次串成一条线。
  • 参数的新解读:把 P(Y∣θ)P(Y|\theta) 写成条件概率形式,是默认参数本身也可以当一个随机变量——由更高层的东西所控制。
  • 骰子扩展:分量分布从伯努利换成一般离散分布,pp 从 1 个参数变成 5 个——混合模型的一般化。
  • 数数走查:11 次掷硬币、红 6 绿 5——已知颜色时 π^=6/11\hat{\pi} = 6/11、p^=5/6\hat{p} = 5/6、q^=1/5\hat{q} = 1/5;未知颜色时按「份数」软计数。
  • E/M 定义:E 步对每一个隐含状态做估计;M 步给定估计,求 π,p,q\pi, p, q 的极大似然值。

参数也可以是随机的:两层模型的新解读

上次课讲统计学习里的概率模型,先确认了一件事:什么是极大似然(Maximum Likelihood)、怎么求。做法是构造一个有参数的模型 P(Y∣θ)P(Y|\theta),θ\theta 是整个概率模型的参数——比如正态分布,θ\theta 就是均值和方差(或均值和标准差,都可以)。

写法上有两种。分号形式 P(Y;θ)P(Y;\theta) 是传统的概率分布写法:θ\theta 只是参数。而写成条件概率 P(Y∣θ)P(Y|\theta),上一章(琴生不等式那节)只说了一句「两者一样,不用纠结」——这次讲师给了一层更深的解读:

写成条件概率的形式,实际上是默认这个参数本身也可以当一个随机变量——也就是说,参数也许是由其他更高层的东西所控制的。这样,我们就具备了一种数学工具,可以把目前自然界里比较复杂的关系刻画出来、描述出来。

三硬币正是这种两层结构的具象:硬币 A 以 π\pi 的概率出现正面来决定掷 B 还是 C——A 的结果并没有直接被观察到(A 是隐含变量);A 正面时用硬币 B(以 pp 出正面),A 反面时用硬币 C(以 qq 出正面)。我们最终看到的只是一串 H/T(用 0/1 表示,H=1、T=0)。

注意数据是怎么生成的:所有观察到的结果,间接跟 A 有关系,直接由 B 或 C 生成。这跟以前一层的简单模型 P(Y∣θ)P(Y|\theta)(YY 直接服从一个函数关系)不一样——θ\theta 分两层的时候,需要重新考虑和研究背后的道理。

把隐含变量 zz 引进来(z=1z=1 掷 B、z=0z=0 掷 C;hidden variable / latent variable,12.2 学过的老朋友),对 zz 做边缘化展开(推导见 12.2/12.3,此处直给):

P(y∣θ)=π⋅py(1−p)1−y+(1−π)⋅qy(1−q)1−yP(y|\theta) = \pi \cdot p^{y}(1-p)^{1-y} + (1-\pi) \cdot q^{y}(1-q)^{1-y}

先验 π\pi 与 1−π1-\pi 配上两个伯努利分布——所谓混合模型,就是两部分所占的比重合起来一定是 1:P 的部分是 0.3,Q 的部分就一定是 0.7。目标没有变:对这一串观测,求 θ\theta 的极大似然估计。

换成骰子会怎样:混合模型的一般化

隐含变量可以让模型变得更复杂。讲师给了一个扩展:如果我们掷的不是硬币,是骰子——A 仍然是个硬币(决定掷骰子 B 还是骰子 C),但骰子 B 得到 1、2、3、4、5、6 各面的概率不一样。

参数立刻变样了:

  • pp 不是一个参数了,而是五个——六面各自的概率加起来必须是 1,所以自由参数只有五个;
  • qq 同样变成一个五维的参数;
  • AA 还是一维——它仍然是个硬币。

观测结果也不再是 0/1,而是 1~6 之间数字的排列。从这些排列去估计骰子的参数和 A 硬币的参数,「其实也是可以的,只是这个模型比我们想象的要复杂得多」。

板书上发生了一段有意思的自我纠正:讲师先把混合权重写成 α1,α2,…,α6\alpha_1, \alpha_2, \dots, \alpha_6——「考虑到大概 6 种不同的情况」——话音刚落马上改口:「啊,Sorry,说错了,还是两种情况:掷的骰子一和骰子二,只是骰子的分布不是伯努利分布了,是其他的一个离散的分布。」

所以一般化的正确姿势是:分量的个数不变(还是两个),换掉的是分量的分布——伯努利可以换成任何离散分布、换成骰子;下一节换成高斯,就是高斯混合模型(GMM)。练一练第 2 题会把骰子版的 E 步、M 步完整写出来。

带着颜色数数:11 次掷硬币走查

现在把 EM 落到一串具体的数据上。讲师在黑板写下一串结果(特意先用 H/T 不用 0/1,让大家看清楚):

H T H H T T H H T T H\mathrm{H\ T\ H\ H\ T\ T\ H\ H\ T\ T\ H}

一共 11 次掷硬币。假设我们知道每次是 B 还是 C 掷的——红色代表硬币 B、绿色代表硬币 C(12.2 结尾埋过的思想实验):

  • 红色占 6 次(一、二、三、四、五、六)——所以 π\pi 最好的估计就是 6/11:红色占所有掷硬币次数的比例;
  • 红色 6 次里,H 有 5 个(一、二、三、四、五)——pp 的估计是 5/6:一旦掷了硬币 B,出现正面的概率;
  • 绿色 5 次里,H 只有 1 个——qq 的估计是 1/5。

「一旦知道颜色,估计 θ\theta 就非常容易」——完全数据的情形,参数估计就是三次数数。落成代码(板书的具体涂色位置不可考,讲义按口播计数——红 6 掷 5 正 1 反、绿 5 掷 1 正 4 反——排定一种):

# 讲师口播的 11 次掷硬币记录: H T H H T T H H T T H
seq = "HTHHTTHHTTH"     # 观测(H=正面, T=反面)
color = "RRRRGGRRGGG"   # 涂色(R=红=硬币B, G=绿=硬币C)

red_h = sum(1 for s, c in zip(seq, color) if c == "R" and s == "H")
red_t = sum(1 for s, c in zip(seq, color) if c == "R" and s == "T")
grn_h = sum(1 for s, c in zip(seq, color) if c == "G" and s == "H")
grn_t = sum(1 for s, c in zip(seq, color) if c == "G" and s == "T")
n = len(seq)

pi_hat = (red_h + red_t) / n          # 红色占比
p_hat = red_h / (red_h + red_t)       # 红色里 H 的比例
q_hat = grn_h / (grn_h + grn_t)       # 绿色里 H 的比例

print(f"序列: {seq}")
print(f"涂色: {color}   (R=红=B, G=绿=C)")
print(f"红色 {red_h + red_t} 掷: {red_h} 正 {red_t} 反; 绿色 {grn_h + grn_t} 掷: {grn_h} 正 {grn_t} 反")
print(f"pi_hat = 红色占比     = {red_h + red_t}/{n} = {pi_hat:.4f}")
print(f"p_hat = 红色中H的比例 = {red_h}/{red_h + red_t} = {p_hat:.4f}")
print(f"q_hat = 绿色中H的比例 = {grn_h}/{grn_h + grn_t} = {q_hat:.4f}")
序列: HTHHTTHHTTH
涂色: RRRRGGRRGGG   (R=红=B, G=绿=C)
红色 6 掷: 5 正 1 反; 绿色 5 掷: 1 正 4 反
pi_hat = 红色占比     = 6/11 = 0.5455
p_hat = 红色中H的比例 = 5/6 = 0.8333
q_hat = 绿色中H的比例 = 1/5 = 0.2000

没有颜色:按份数软计数

问题是我们并没有颜色。那就对每一次掷币的结果产生一个估计——它不再「只属于红色或只属于绿色」,而是一个百分比。讲师举了一个数:0.75——某一次掷出的结果,有 3/4 的概率是红色掷出来的,有 1/4 是绿色。这个百分比就是 μj\mu_j(jj 从 1 到 11),根据目前给定的 π,p,q\pi, p, q 算出来(公式 12.3 已推导,直给):

μj=π⋅pyj(1−p)1−yjπ⋅pyj(1−p)1−yj+(1−π)⋅qyj(1−q)1−yj\mu_j = \frac{\pi \cdot p^{y_j}(1-p)^{1-y_j}}{\pi \cdot p^{y_j}(1-p)^{1-y_j} + (1-\pi) \cdot q^{y_j}(1-q)^{1-y_j}}

分子是 B 占的份数,分母是全部可能性 P(y∣θ)P(y|\theta)。

「q 去哪了?」——看一眼公式,分子只见 π\pi 和 pp,好像 μj\mu_j 跟 qq 没关系?讲师替大家问了这个问题,答案是:其实不是——分母的部分是含 qq 的。μj\mu_j 是被 π,p,q\pi, p, q 一起重构出来的:给定目前的参数 θ\theta,就能算出每一个 μ\mu。

有了 μ\mu,M 步照着「已知颜色」的样子数数——只是以前每次要么红要么绿、百分之百;现在每一个都是一个小数(份数):

  • π\pi 的更新:把所有红色的部分加一起。每一小块的红色占比就是 μj\mu_j——μ1+μ2+⋯+μN\mu_1 + \mu_2 + \dots + \mu_N 就是红色总份数,比上 NN;
  • pp 的更新:红色里 H 的份数。逐个走一遍(讲师的走查):第一个是 H,y1=1y_1 = 1,μ1\mu_1 这一大部分得以保留;第二个是 T,y2=0y_2 = 0,乘上 0「我们就不关心了」;第三个是 H,把 μ3\mu_3 的 0.75 加上去……yjy_j 只有 0/1 两个值,所有等于 H 的那些 μ\mu 加一起,比上所有的红色——分子就是 ∑jμjyj\sum_j \mu_j y_j;
  • qq 的更新:绿色是 1−μj1 - \mu_j,绿色的一是 (1−μj)yj(1-\mu_j) y_j,分母 ∑j(1−μj)\sum_j (1-\mu_j)。
# 没有颜色时: EM 用"份数"数红绿
seq = "HTHHTTHHTTH"
obs = [1 if s == "H" else 0 for s in seq]   # H=1, T=0
n = len(obs)

def e_step(obs, pi, p, q):
    """E 步: 对每一次掷币估计红色份数 mu_j"""
    mu = []
    for y in obs:
        red_part = pi * p**y * (1 - p)**(1 - y)        # B 占的份数(分子)
        grn_part = (1 - pi) * q**y * (1 - q)**(1 - y)  # C 占的份数(分母的另一半)
        mu.append(red_part / (red_part + grn_part))    # 分母里含着 q
    return mu

def m_step(obs, mu):
    """M 步: 把红色份数当已知, 重新数红绿"""
    red_total = sum(mu)                                # 红色总份数
    red_h = sum(m * y for m, y in zip(mu, obs))        # 红色的"一"(y=0 乘 0 约掉)
    grn_total = n - red_total                          # 绿色总份数
    grn_h = sum((1 - m) * y for m, y in zip(mu, obs))  # 绿色的"一"
    return red_total / n, red_h / red_total, grn_h / grn_total

pi, p, q = 0.5, 0.8, 0.3
print(f"观测({n} 次, 其中 H {sum(obs)} 个): {obs}")
print(f"初始参数: pi={pi}, p={p}, q={q}")
print()

for it in range(1, 4):
    mu = e_step(obs, pi, p, q)     # E 步: 估计每一步的红色份数
    pi_new, p_new, q_new = m_step(obs, mu)
    print(f"第 {it} 轮 E 步: mu(H 掷) = {mu[0]:.4f}, mu(T 掷) = {mu[1]:.4f}")
    print(f"        软计数: 红色总份数 = {sum(mu):.4f}, 红色的一 = {sum(m*y for m, y in zip(mu, obs)):.4f}")
    print(f"第 {it} 轮 M 步: pi={pi_new:.4f}, p={p_new:.4f}, q={q_new:.4f}")
    converged = max(abs(pi_new - pi), abs(p_new - p), abs(q_new - q)) < 1e-9
    pi, p, q = pi_new, p_new, q_new
    if converged:
        print("  (参数不再变化 —— 到达不动点)")
        break

print()
print(f"验证: pi*p + (1-pi)*q = {pi:.4f}*{p:.4f} + {1-pi:.4f}*{q:.4f} = {pi*p + (1-pi)*q:.4f}")
print(f"      序列中 H 的频率 = {sum(obs)}/{n} = {sum(obs)/n:.4f}   (两者相等)")
观测(11 次, 其中 H 6 个): [1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1]
初始参数: pi=0.5, p=0.8, q=0.3

第 1 轮 E 步: mu(H 掷) = 0.7273, mu(T 掷) = 0.2222
        软计数: 红色总份数 = 5.4747, 红色的一 = 4.3636
第 1 轮 M 步: pi=0.4977, p=0.7970, q=0.2962
第 2 轮 E 步: mu(H 掷) = 0.7273, mu(T 掷) = 0.2222
        软计数: 红色总份数 = 5.4747, 红色的一 = 4.3636
第 2 轮 M 步: pi=0.4977, p=0.7970, q=0.2962
  (参数不再变化 —— 到达不动点)

验证: pi*p + (1-pi)*q = 0.4977*0.7970 + 0.5023*0.2962 = 0.5455
      序列中 H 的频率 = 6/11 = 0.5455   (两者相等)

读一遍输出,三件事:

  1. 软计数真的在「按份数数」:H 掷被记 0.7273 份红、T 掷被记 0.2222 份红——红色总份数 5.4747、红色的一 4.3636,正是 pp 分式的分子分母;
  2. 第 2 轮就到不动点——上一节刚证过的结构性质:三硬币在二值观测上,M 步的恒等式把 πp+(1−π)q\pi p + (1-\pi)q 钉在样本频率 6/11 上,一步到顶;
  3. 跟「已知颜色」对照:EM 给出的 (0.4977,0.7970,0.2962)(0.4977, 0.7970, 0.2962) 与涂色数数出的 (6/11,5/6,1/5)(6/11, 5/6, 1/5) 并不相同——但对二值观测,似然只看得见 πp+(1−π)q\pi p + (1-\pi)q 这一个数,两组参数在似然上同样好。颜色(隐变量)藏在似然看不见的地方——这正是隐变量问题的本质,也是 EM 要用「估计」代替「知道」的原因。

两步的名字(讲师原话):E 步——对每一个隐含状态的估计;M 步(maximization)——给定了隐含状态的估计时,在这一步求 π,p,q\pi, p, q 的极大似然值。合在一起,就是 EM 算法:通过三个硬币的形式,把 EM 算法怎么去做,完整走了一遍。

📝 动手练一练

  1. 概念的深化:上一章说分号形式 P(Y;θ)P(Y;\theta) 与条件形式 P(Y∣θ)P(Y|\theta)「一回事,不用纠结」;这一节讲师对条件形式给出了更深一层的解读——是什么?它把「参数」放到了什么位置上?
👉 点击查看参考答案

解读是:写成条件概率的形式,实际上是默认参数本身也可以当一个随机变量——参数也许是由其他更高层的东西所控制的。

分号形式里,θ\theta 只是一个待估的常数(传统概率分布的参数);条件形式里,θ\theta 被放到了「可以被讲概率」的位置上——它背后也许还有更高层的结构在控制。这样我们就具备了数学工具,可以把自然界里比较复杂的关系刻画出来。三硬币的「A 决定 B/C」正是两层结构的具象:观测(低层)由隐含的选择(高层)控制。这也呼应了 12.1 的贝叶斯视角——参数可以有先验、可以被当作随机变量来谈论。

  1. 骰子版的三硬币:把硬币 B、C 换成两枚六面骰子(各面概率不同),A 仍是硬币。①参数 θ\theta 变成什么样?②E 步的 μj\mu_j 公式怎么改?③M 步怎么「数」?
👉 点击查看参考答案

① 参数:π\pi 仍是一维(A 还是硬币);pp 变成六面概率的向量——六面加和必须是 1,所以自由参数是 5 个;qq 同样是五维。θ=(π,p1,…,p5,q1,…,q5)\theta = (\pi, p_1, \dots, p_5, q_1, \dots, q_5)。

② E 步:把伯努利换成「六面离散分布」,记 PB(k)P_B(k) 为骰子 B 掷出第 kk 面的概率:

μj=π⋅PB(xj)π⋅PB(xj)+(1−π)⋅PC(xj)\mu_j = \frac{\pi \cdot P_B(x_j)}{\pi \cdot P_B(x_j) + (1-\pi) \cdot P_C(x_j)}

「qq 去哪了」的答案不变:分母里含着 PCP_C。

③ M 步:还是红绿数数——只是「红色的一」变成「红色的每一面」:

π^=1N∑j=1NμjP^B(k)=∑jμj⋅1[xj=k]∑jμjP^C(k)=∑j(1−μj)⋅1[xj=k]∑j(1−μj)\hat{\pi} = \frac{1}{N}\sum_{j=1}^{N} \mu_j \qquad \hat{P}_B(k) = \frac{\sum_j \mu_j \cdot \mathbb{1}[x_j = k]}{\sum_j \mu_j} \qquad \hat{P}_C(k) = \frac{\sum_j (1-\mu_j) \cdot \mathbb{1}[x_j = k]}{\sum_j (1-\mu_j)}

红色的第 kk 面份数,比上红色总份数。分量的个数仍是两个(骰子一、骰子二)——不是六个,板书那次自我纠正纠正的就是这一点。

本章小结

  • 复盘成一条线:极大似然(12.1 起)→ 隐含变量与边缘化(12.2)→ μ\mu 与 M 步三公式(12.3)→ 下界与单调性(12.4)——本节用 11 次掷硬币把它们串起来亲手走了一遍。
  • 参数的层级解读:条件形式 P(Y∣θ)P(Y|\theta) 默认参数本身也可以是随机变量、由更高层控制——刻画复杂关系的数学工具。
  • 一般化:分量个数不变、分布可换——伯努利 → 任意离散分布(骰子,pp 变 5 个自由参数)→ 高斯(下一节 GMM)。
  • 数数的两种形态:知道颜色就是硬数数(6/116/11、5/65/6、1/51/5);不知道就按份数软计数(μj\mu_j 加权)——EM 是后者的循环。
  • E/M 的名字:E 步对每一个隐含状态做估计;M 步给定估计求 π,p,q\pi, p, q 的极大似然值。

📋 行动清单

学完本节,你可以立即:

  • 手算硬数数:对着 11 次掷硬币记录,把 π^=6/11\hat{\pi} = 6/11、p^=5/6\hat{p} = 5/6、q^=1/5\hat{q} = 1/5 每一个分子分母对应「哪种颜色的什么」。
  • 改初始参数跑代码:把正文第二块代码的初始参数换几组,观察 μ\mu 的两个值怎么变、是否仍然两轮到不动点、πp+(1−π)q\pi p + (1-\pi)q 是否总等于 6/11。
  • 完成骰子版练习:动手练一练第 2 题——把 E/M 公式按骰子改写一遍,体会「分布换了、数数没换」。
  • 预习下一节《高斯混合模型》:把伯努利换成高斯、把掷硬币换成连续观测——红色的份数变成连续的责任度(responsibilities)。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第13章笔记:期望最大化(EM)算法
    下载