查看全课大纲(第 54 / 82 节)
- 1.函数与数据泛化
- 2.向量:从几何直觉到高维空间
- 3.矩阵与张量
- 4.特征值与特征向量:矩阵变换的不动方向
- 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
- 6.概率与统计:机器学习的数学基础
- 7.独立性与随机变量:贝叶斯公式与二项分布
- 8.期望、方差与协方差:随机变量的数字画像
- 9.联合概率:当一条轴不够用的时候
- 10.概率分布(一):从伯努利到伽马函数
- 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
- 12.机器学习的模型:找输入与输出的关系
- 13.机器学习的应用
- 14.过拟合
- 15.机器学习的分类
- 16.有监督学习:从房价预测说起
- 17.损失函数
- 18.梯度下降(上):更新规则与学习速率
- 19.梯度下降(2)
- 20.牛顿方法
- 21.KNN简介
- 22.距离测算
- 23.朴素贝叶斯
- 24.朴素贝叶斯的实际应用
- 25.信息熵:决策树构建的度量基础
- 26.信息增益与决策树的构建
- 27.ID3算法
- 28.决策树节点的划分
- 29.CART树
- 30.Bagging
- 31.Boosting:自适应提升算法
- 32.Gradient Boosting
- 33.线性模型:回归与分类的同一副骨架
- 34.最小二乘:把最优参数直接解出来
- 35.最小二乘法的几何与概率视角
- 36.极大似然:给最小二乘一个概率出身
- 37.逻辑回归(1):把线性模型接到分类上
- 38.逻辑回归(2):损失函数与多分类
- 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
- 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
- 41.优化方法(1):坐标下降与前向选择
- 42.优化方法(2):前向策略与最小角回归
- 43.拉格朗日乘子法(1):从无约束到等式约束
- 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
- 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
- 46.最大间隔:把分类问题变成优化问题
- 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
- 48.支持向量:边界上的少数派
- 49.SVM 计算过程:一笔到底算完,再走进核方法
- 50.贝叶斯公式:概率即信念
- 51.隐含变量和概率模型:给看不见的原因建模
- 52.EM 算法:期望与最大化的迭代
- 53.琴生不等式:EM 的数学钥匙
- 54.三个硬币问题:EM 的复盘与衔接
- 55.高斯混合模型:用隐变量解释双峰数据
- 56.隐马尔可夫模型
- 57.隐马尔可夫模型(2):前向算法与动态混合模型
- 58.隐马尔可夫模型在 NLP 中的运用
- 59.EM 算法:把「为什么收敛」推到底
- 60.HMM 在 NLP 中的运用:从分词到机器翻译
- 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
- 62.高维下的高斯模型
- 63.主题模型:从词袋到隐含主题
- 64.Dirichlet 分布(1)
- 65.Dirichlet 分布(2)
- 66.统计学习内容回顾
- 67.K-means 算法
- 68.PCA 降维
- 69.SVD 降维
- 70.从聚类到流形
- 71.局部线性嵌入
- 72.随机邻域嵌入:SNE 与 t-SNE
- 73.无参模型:让数据自己说话
- 74.高斯过程:函数空间里的正态分布
- 75.高斯过程(2):噪声、正则化与核的线性组合
- 76.神经网络简介:从感知器到自编码器
- 77.反向传播:把误差一层层传回去
- 78.卷积神经网络(CNN):让特征自己学出来
- 79.循环神经网络(RNN):给网络装上记忆
- 80.深度学习回顾:静态一类,动态一类
- 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
- 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传
三个硬币问题:EM 的复盘与衔接
约 23 分钟
小象实战讲义 · 机器学习算法精讲
第 12 章从贝叶斯一路走到琴生不等式——EM 的「怎么算」(上一章的 与数红绿)和「为什么对」(下界与单调性)都配齐了。这一节讲师把两次课的东西衔接起来:把三硬币这条线复盘一遍——这次带着一串具体的 11 次掷硬币记录,亲手数一遍红绿;顺带两处新的展开——参数本身的「层级」解读、把硬币换成骰子。开场定位(讲师原话):先把上次课的简单内容讲一下核心思路,之后把两次课的东西衔接一下。
💡 核心导读
- 复盘主线:极大似然 → 隐含变量 → 混合模型 → 软归属 → E/M 两步——每一环都对应上一章的某一节,这次串成一条线。
- 参数的新解读:把 写成条件概率形式,是默认参数本身也可以当一个随机变量——由更高层的东西所控制。
- 骰子扩展:分量分布从伯努利换成一般离散分布, 从 1 个参数变成 5 个——混合模型的一般化。
- 数数走查:11 次掷硬币、红 6 绿 5——已知颜色时 、、;未知颜色时按「份数」软计数。
- E/M 定义:E 步对每一个隐含状态做估计;M 步给定估计,求 的极大似然值。
参数也可以是随机的:两层模型的新解读
上次课讲统计学习里的概率模型,先确认了一件事:什么是极大似然(Maximum Likelihood)、怎么求。做法是构造一个有参数的模型 , 是整个概率模型的参数——比如正态分布, 就是均值和方差(或均值和标准差,都可以)。
写法上有两种。分号形式 是传统的概率分布写法: 只是参数。而写成条件概率 ,上一章(琴生不等式那节)只说了一句「两者一样,不用纠结」——这次讲师给了一层更深的解读:
写成条件概率的形式,实际上是默认这个参数本身也可以当一个随机变量——也就是说,参数也许是由其他更高层的东西所控制的。这样,我们就具备了一种数学工具,可以把目前自然界里比较复杂的关系刻画出来、描述出来。
三硬币正是这种两层结构的具象:硬币 A 以 的概率出现正面来决定掷 B 还是 C——A 的结果并没有直接被观察到(A 是隐含变量);A 正面时用硬币 B(以 出正面),A 反面时用硬币 C(以 出正面)。我们最终看到的只是一串 H/T(用 0/1 表示,H=1、T=0)。
注意数据是怎么生成的:所有观察到的结果,间接跟 A 有关系,直接由 B 或 C 生成。这跟以前一层的简单模型 ( 直接服从一个函数关系)不一样—— 分两层的时候,需要重新考虑和研究背后的道理。
把隐含变量 引进来( 掷 B、 掷 C;hidden variable / latent variable,12.2 学过的老朋友),对 做边缘化展开(推导见 12.2/12.3,此处直给):
先验 与 配上两个伯努利分布——所谓混合模型,就是两部分所占的比重合起来一定是 1:P 的部分是 0.3,Q 的部分就一定是 0.7。目标没有变:对这一串观测,求 的极大似然估计。
换成骰子会怎样:混合模型的一般化
隐含变量可以让模型变得更复杂。讲师给了一个扩展:如果我们掷的不是硬币,是骰子——A 仍然是个硬币(决定掷骰子 B 还是骰子 C),但骰子 B 得到 1、2、3、4、5、6 各面的概率不一样。
参数立刻变样了:
- 不是一个参数了,而是五个——六面各自的概率加起来必须是 1,所以自由参数只有五个;
- 同样变成一个五维的参数;
- 还是一维——它仍然是个硬币。
观测结果也不再是 0/1,而是 1~6 之间数字的排列。从这些排列去估计骰子的参数和 A 硬币的参数,「其实也是可以的,只是这个模型比我们想象的要复杂得多」。
板书上发生了一段有意思的自我纠正:讲师先把混合权重写成 ——「考虑到大概 6 种不同的情况」——话音刚落马上改口:「啊,Sorry,说错了,还是两种情况:掷的骰子一和骰子二,只是骰子的分布不是伯努利分布了,是其他的一个离散的分布。」
所以一般化的正确姿势是:分量的个数不变(还是两个),换掉的是分量的分布——伯努利可以换成任何离散分布、换成骰子;下一节换成高斯,就是高斯混合模型(GMM)。练一练第 2 题会把骰子版的 E 步、M 步完整写出来。
带着颜色数数:11 次掷硬币走查
现在把 EM 落到一串具体的数据上。讲师在黑板写下一串结果(特意先用 H/T 不用 0/1,让大家看清楚):
一共 11 次掷硬币。假设我们知道每次是 B 还是 C 掷的——红色代表硬币 B、绿色代表硬币 C(12.2 结尾埋过的思想实验):
- 红色占 6 次(一、二、三、四、五、六)——所以 最好的估计就是 6/11:红色占所有掷硬币次数的比例;
- 红色 6 次里,H 有 5 个(一、二、三、四、五)—— 的估计是 5/6:一旦掷了硬币 B,出现正面的概率;
- 绿色 5 次里,H 只有 1 个—— 的估计是 1/5。
「一旦知道颜色,估计 就非常容易」——完全数据的情形,参数估计就是三次数数。落成代码(板书的具体涂色位置不可考,讲义按口播计数——红 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 是绿色。这个百分比就是 ( 从 1 到 11),根据目前给定的 算出来(公式 12.3 已推导,直给):
分子是 B 占的份数,分母是全部可能性 。
「q 去哪了?」——看一眼公式,分子只见 和 ,好像 跟 没关系?讲师替大家问了这个问题,答案是:其实不是——分母的部分是含 的。 是被 一起重构出来的:给定目前的参数 ,就能算出每一个 。
有了 ,M 步照着「已知颜色」的样子数数——只是以前每次要么红要么绿、百分之百;现在每一个都是一个小数(份数):
- 的更新:把所有红色的部分加一起。每一小块的红色占比就是 —— 就是红色总份数,比上 ;
- 的更新:红色里 H 的份数。逐个走一遍(讲师的走查):第一个是 H,, 这一大部分得以保留;第二个是 T,,乘上 0「我们就不关心了」;第三个是 H,把 的 0.75 加上去…… 只有 0/1 两个值,所有等于 H 的那些 加一起,比上所有的红色——分子就是 ;
- 的更新:绿色是 ,绿色的一是 ,分母 。
# 没有颜色时: 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 (两者相等)读一遍输出,三件事:
- 软计数真的在「按份数数」:H 掷被记 0.7273 份红、T 掷被记 0.2222 份红——红色总份数 5.4747、红色的一 4.3636,正是 分式的分子分母;
- 第 2 轮就到不动点——上一节刚证过的结构性质:三硬币在二值观测上,M 步的恒等式把 钉在样本频率 6/11 上,一步到顶;
- 跟「已知颜色」对照:EM 给出的 与涂色数数出的 并不相同——但对二值观测,似然只看得见 这一个数,两组参数在似然上同样好。颜色(隐变量)藏在似然看不见的地方——这正是隐变量问题的本质,也是 EM 要用「估计」代替「知道」的原因。
两步的名字(讲师原话):E 步——对每一个隐含状态的估计;M 步(maximization)——给定了隐含状态的估计时,在这一步求 的极大似然值。合在一起,就是 EM 算法:通过三个硬币的形式,把 EM 算法怎么去做,完整走了一遍。
📝 动手练一练
- 概念的深化:上一章说分号形式 与条件形式 「一回事,不用纠结」;这一节讲师对条件形式给出了更深一层的解读——是什么?它把「参数」放到了什么位置上?
👉 点击查看参考答案
解读是:写成条件概率的形式,实际上是默认参数本身也可以当一个随机变量——参数也许是由其他更高层的东西所控制的。
分号形式里, 只是一个待估的常数(传统概率分布的参数);条件形式里, 被放到了「可以被讲概率」的位置上——它背后也许还有更高层的结构在控制。这样我们就具备了数学工具,可以把自然界里比较复杂的关系刻画出来。三硬币的「A 决定 B/C」正是两层结构的具象:观测(低层)由隐含的选择(高层)控制。这也呼应了 12.1 的贝叶斯视角——参数可以有先验、可以被当作随机变量来谈论。
- 骰子版的三硬币:把硬币 B、C 换成两枚六面骰子(各面概率不同),A 仍是硬币。①参数 变成什么样?②E 步的 公式怎么改?③M 步怎么「数」?
👉 点击查看参考答案
① 参数: 仍是一维(A 还是硬币); 变成六面概率的向量——六面加和必须是 1,所以自由参数是 5 个; 同样是五维。。
② E 步:把伯努利换成「六面离散分布」,记 为骰子 B 掷出第 面的概率:
「 去哪了」的答案不变:分母里含着 。
③ M 步:还是红绿数数——只是「红色的一」变成「红色的每一面」:
红色的第 面份数,比上红色总份数。分量的个数仍是两个(骰子一、骰子二)——不是六个,板书那次自我纠正纠正的就是这一点。
本章小结
- 复盘成一条线:极大似然(12.1 起)→ 隐含变量与边缘化(12.2)→ 与 M 步三公式(12.3)→ 下界与单调性(12.4)——本节用 11 次掷硬币把它们串起来亲手走了一遍。
- 参数的层级解读:条件形式 默认参数本身也可以是随机变量、由更高层控制——刻画复杂关系的数学工具。
- 一般化:分量个数不变、分布可换——伯努利 → 任意离散分布(骰子, 变 5 个自由参数)→ 高斯(下一节 GMM)。
- 数数的两种形态:知道颜色就是硬数数(、、);不知道就按份数软计数( 加权)——EM 是后者的循环。
- E/M 的名字:E 步对每一个隐含状态做估计;M 步给定估计求 的极大似然值。
📋 行动清单
学完本节,你可以立即:
- 手算硬数数:对着 11 次掷硬币记录,把 、、 每一个分子分母对应「哪种颜色的什么」。
- 改初始参数跑代码:把正文第二块代码的初始参数换几组,观察 的两个值怎么变、是否仍然两轮到不动点、 是否总等于 6/11。
- 完成骰子版练习:动手练一练第 2 题——把 E/M 公式按骰子改写一遍,体会「分布换了、数数没换」。
- 预习下一节《高斯混合模型》:把伯努利换成高斯、把掷硬币换成连续观测——红色的份数变成连续的责任度(responsibilities)。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第13章笔记:期望最大化(EM)算法