查看全课大纲(第 51 / 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 回传
隐含变量和概率模型:给看不见的原因建模
约 22 分钟
小象实战讲义 · 机器学习算法精讲
上一节立好了概率观——概率是对不确定性的度量,贝叶斯公式用证据更新信念。这一节开始搭建统计学习的工具箱:先把「学习」这个动作从函数拟合改写成概率估计,复习参数模型、极大似然、朴素贝叶斯这几件旧武器,然后引入本节的主角——隐含变量:那些与数据相关、却观察不到的「原因」。最后用讲师「特别喜欢」的三硬币问题,把隐含变量模型的全部要素装进一个最小的舞台。
💡 核心导读
- 从函数到概率:机器学习问题不再是找 ,而是估计 ——整个问题变成一个估计问题。
- 参数模型与极大似然:假设数据服从某种带参数的分布(如正态 ),用极大似然(连乘取 log、爬到等高线的顶点)估出参数。
- 隐含变量:观测不到的 与 相关时,——把对 的建模,转成对 与 的建模。
- 生成式模型的哲学:模型是我们对「数据为什么会产生」的一种假设和假想——先设想背后的机理,再用数据反估机理的参数。
- 三硬币问题:A 决定用 B 还是 C,但我们只看得到最终的正反面——一个「既简洁又清晰」的隐含变量完整样本。
从函数拟合到概率估计
先做一次全面的复习(讲师:有了前面这些知识,就可以讲概率方向的统计模型了)。
以前我们拿到训练数据 ,学的是函数关系:找一个 ,使得给定了 ,它得到 。
但在生成式模型(generative model)、也就是统计学习模型里,我们要学的事情换了:想知道给定 时,它等于 的概率有多大——估计 。以二分类为例,:
- 想算 ——给定 ,它等于 0 的概率是多大;
- 相应地,。
如果 不是 0、1,而是别的离散值,思路一样——都是去算概率的值。整个机器学习的问题,就变成了一种估计问题。
参数模型与极大似然
给定很多数据 的时候,我们经常做一个假设:数据服从某种分布——而这个分布,代表着这批数据最重要的特征。比如给定的一些数据,也许可以假设是通过一个正态分布生成的。于是经常要做的事情,就是估计这些正态分布的参数。这种「假设数据来自某个参数化分布」的方法,以前起过一个名字:参数模型(Parametric Model)。
我们观察到了很多数据,想知道参数 和 的估计等于多少——这时候就去求极大似然。给定 和 ,每个数据出现的概率可以由概率密度函数描述, 从 1 到 个数据,极大似然就是它们的连乘:
连乘不太好求,所以经常做的是 log 极大似然——把连乘变成连加:
这个 是关于 和 的函数( 都是给定的训练数据)。不断调整 和 ,就可以把它画成一片「地形」:以 、 为两个坐标轴画出等高线(contour)。我们想取它的极值——比如最高处那一点 ,就是最优的值:因为无论取到什么其他的 和 ,那一点肯定都比它低。通过极大似然,就能求出最好的参数估计(第 8 章《极大似然》做过完整推导,这里是它在分布参数上的直接复用)。
两件旧武器:朴素贝叶斯与条件独立
进入新模型前,再复习两件事。
朴素贝叶斯。做分类的时候,给定一个 ,想推断类别 (比如一类、二类的二分类),通过贝叶斯公式:
别忘了 是高维向量(),所以 还要按维度拆开连乘(维度用 表示,)。上下同除 之后正比于连乘形式——分母上的 当成归一化常数,直接忽略掉(第 5 章的老操作)。
条件独立。如果一个变量 的每一个维度都相互独立——记作 (,第 2 章「独立性」一节引入的记号)——那么它的联合概率就等于各维度的乘积:
任何两个特征之间都认为独立时,联合概率才能写成这种连乘的形式。这些全部是我们已经学过的东西——「大家如果忘记了,一定要复习一下」。
隐含变量:把看不见的原因加进模型
现在考虑一种更普遍的建模思路:X 与一个观察不到的 Z 相关。
想知道 的概率时,如果 跟一个观察不到的变量 有关系,可以把 的所有可能取值连加进去:
这就是边缘概率:想知道 、 的联合概率,再把这个联合概率沿着 的维度连加。几何直觉(讲师的板书):把 、 想成两个坐标轴——把 轴方向上的所有取值都叠加、压到 这条轴上,就变成了关于 的概率。
而 跟 之间有关系(图上画一个箭头)的时候,联合概率可以拆开,得到那个「大家一定要确定是正确的」形式:
- 是可以观察到的量, 是隐含变量、不能直接观察到;
- :知道 跟 之间的关系时,这个概率是可以求出来的;
- :可以假设 服从某种先验分布——比如正态分布、或者均匀分布。
这么变换的目的:当 能算出来、 又有假设时,对 的概率的估计就会更复杂、考虑到更多的情况——模型也就更有表达力。
掷硬币的例子:机理是一种假设
举个例子。 是掷硬币这么一个情况:随机变量,取值 (head,正面)或者 (tail,反面)。
最简单的看法: 就是关于正面反面的一个分布,正面 0.5、反面 0.5。但也可以假设一个隐含变量 ——也许掷硬币的结果,跟掷出来的高度相关。那么:
- 用 刻画高度和结果之间的关系;
- 再假设 服从某种分布——这种情况下,对 的估计可能会更准确一些。
对比一下两种做法。如果我们只有 这 次观测、不考虑任何隐含变量,那么 的估计就是频率:
( 里边有多少个 ,一数便知。)而如果知道跟高度有关,关键就看 能不能刻画出来——通过这个模型,也许会把 估计得更好。
这个例子想说的其实是:生活中很多复杂的现象,你怎么看它,取决于你怎么假设它。掷硬币可以认为就是 0.5、0.5 的随机;也可以认为跟高度有关、跟角度有关、跟其他什么情况有关。我们都是在假设和假想——假想你看到的这些数据背后发生的机理:
有了这个机理,知道了数据为什么会产生,回过头来,再用看到的数据去估计「使它产生的机制」的参数。这就是生成式模型(generative model):它实际上是我们在对事件的发生做一种假设。扔硬币的真实因素也许非常多、甚至永远不可知——但我们希望把模型建出来,假设这些数据为什么会出来。
掷硬币的分布:伯努利与二项式
接着问一个基础问题:掷一次硬币,(分成 、 两类)服从什么分布?——伯努利分布(Bernoulli distribution),一个离散的二值分布(binary distribution)。如果硬币的参数是 ,它可以写成:
正面反面是二值问题、不好计算,所以我们把它认作 0 或者 1(本质一样)。代进去验证一遍:
- :(任何数的 0 次幂都为 1),得到 ;
- :,得到 。
正好符合描述:等于 1 时概率为 ,等于 0 时概率为 。伯努利分布最重要的参数就是 ——它表示 (正面)的概率。(有的同学纠结为什么有的是 0 有的是 1——这是你自己定义的:可以让 是 1、也可以让 是 0,总之一个对应 、一个对应 ,不用纠结。)
如果每一次掷硬币是伯努利分布,那么掷了 次、想有 次正面(toss the coin times, heads),就是一个二项式分布: 里边取 次的组合,乘上 的 次幂、 的 次幂:
(讲师板书时先把指数写岔了、当场纠正——最终就是上面这个干净形式:正面 次、反面 次,组合数来自「 里边取 」。)
熟悉了这些,就可以考虑今天稍复杂的问题了。
三硬币问题:隐含变量的完整舞台
先把记号换一下:硬币的输出记作 ——,每个 ,代表掷了一连串硬币。单枚硬币的情形, 的估计我们是会的:
数一数 1 的个数、比上总数,就可以了。但现在的问题比这复杂得多。
假设有三枚硬币:
- 硬币 A,参数 ——它掷出正面的概率;
- 硬币 B,参数 ;
- 硬币 C,参数 。
三枚硬币掷出正面的概率都不一样(反面自然也不同)。想象一个很复杂的生成过程(process):每次想要一个结果,不是直接掷一枚硬币,而是——
- 先掷硬币 A;
- 如果 A 是正面(等于 1),就掷硬币 B,把 B 的结果(H 或 T)记下来(H 记作 1);
- 如果 A 是反面(等于 0),就掷硬币 C,把 C 的结果记下来。
不断重复这样的实验,就得到一长串 ——比如 这样的序列(课件页上写着一串:HTHHTTHHTHTHTTTHTHTTH……HT?)。但这里边的正面和反面,我们并不知道是哪枚硬币掷出来的。
假设给了这样一串数据,想知道下一个数据是正面还是反面的概率有多大——怎么估计?你会发现,这个系统远比想象的复杂:
- 如果只有一枚硬币,数一数 1 的个数、比上总数就行;
- 现在系统的生成过程有三个参数:由 A 决定掷 B 还是 C,再由 B 或 C 各自的 、 掷出结果——中间那一层(A 的正反面)看不见。
一个能帮你看清困难的假设实验(课件笔记的画法):如果我们知道每个结果来自哪枚硬币——把硬币 B 掷出的结果标成红色、硬币 C 的标成绿色——那问题立刻退化:红色的一堆数频率是 、绿色的一堆数频率是 、A 的正反面比例是 ,三个参数直接就估出来了。难就难在这一层看不见:A 的每次结果,正是这个问题的隐含变量。
讲师对它的评价:「这是一个我特别喜欢的、既简洁又清晰的问题。」通过它,我们就能了解怎么做隐含变量、怎么做概率模型——以及,通过一个什么样的算法去做这件事情。这正是下一节《EM 算法》要回答的问题。
📝 动手练一练
- 概念辨析:在统计学习的生成式模型视角下,学习的目标是什么?与之前学习的逻辑回归、SVM 等判别式方法的目标,根本区别在哪?
👉 点击查看参考答案
生成式模型:对数据的产生过程做假设——建模 这样的联合结构(朴素贝叶斯是完整范例),学得之后用贝叶斯公式反推 。它关心的是「数据是怎么被生成出来的」。
判别式方法:直接学从输入到输出的关系—— 的函数,或 的条件概率(逻辑回归),不关心数据本身的分布。
根本区别:生成式模型描述整个数据生成机制(并因此可以「生成」新样本),判别式方法只关注输入与输出之间的映射。
- 单硬币的极大似然:先解决「不含隐含变量」的版本——观测到 10 次投掷结果 (1 为正面)。用极大似然估计正面概率 ,并推导 MLE 的通用形式。
👉 点击查看参考答案
伯努利分布的似然函数:
对数似然:。令导数为零:
MLE 就是频率——正文里「数一数、比总数」的直觉,背后正是极大似然。代入数据:正面 6 次、总数 10,。代码验证:
import math
# 观测数据: 1 为正面
Y = [1, 0, 1, 1, 0, 1, 0, 0, 1, 1]
N = len(Y)
# 极大似然估计: 正面频率
theta_mle = sum(Y) / N
print(f"硬币正面朝上的概率的MLE估计值: {theta_mle:.2f}")
# 对数似然函数(含数值保护, 防止 log(0))
def log_likelihood(theta, data):
eps = 1e-10
theta = max(min(theta, 1 - eps), eps)
total = 0.0
for y in data:
total += y * math.log(theta) + (1 - y) * math.log(1 - theta)
return total
ll = log_likelihood(theta_mle, Y)
print(f"在 theta={theta_mle:.2f} 处的对数似然值: {ll:.4f}")
# 对照: 换一个稍差的参数值, 对数似然应当更低
theta_test = 0.5
ll_test = log_likelihood(theta_test, Y)
print(f"在 theta={theta_test:.2f} 处的对数似然值: {ll_test:.4f}")
print(f"MLE估计的对数似然更高吗? {ll > ll_test}")硬币正面朝上的概率的MLE估计值: 0.60
在 theta=0.60 处的对数似然值: -6.7301
在 theta=0.50 处的对数似然值: -6.9315
MLE估计的对数似然更高吗? True这正是正文等高线叙事的最小实例:只有 一个轴, 在 0.6 处到达顶点,0.5 处比它低。单硬币的顶点数一数就能找到;下一节的难题是——当顶点位置由 三个参数共同决定、而且中间还隔着看不见的硬币 A 时,怎么找。
本章小结
- 视角转换:统计学习把「找函数」改写成「估概率」—— 一到手,机器学习问题变成了估计问题。
- 旧武器三件:参数模型(数据服从某分布)+ 极大似然(连乘取 log、爬到等高线顶点)+ 朴素贝叶斯的正比形式( 归一化常数忽略)。
- 隐含变量:——把建模难度转移到「可求的 」与「可假设的 」上,换来更强的表达力。
- 生成式哲学:模型是对数据背后机理的一种假设——机理可能永远无法完全知道,但假设让我们能用数据反估机制的参数。
- 三硬币问题:A 决定 B 还是 C、结果可见而中间不可见——隐含变量问题的最小完整舞台,下一节《EM 算法》在此开演。
📋 行动清单
学完本节,你可以立即:
- 手推一遍伯努利 MLE:从 出发,推出 ,确认「频率估计 = 极大似然」。
- 复述三硬币的生成过程:向一个没学过统计学习的同学讲清「A 正面掷 B、A 反面掷 C、只看得到最终结果」——讲得清,隐含变量就懂了。
- 找一个身边的隐含变量:挑一个你熟悉的现象(成绩、气温、股价……),构思:哪个量是观测不到的 ? 和 大概长什么样?
- 预习下一节《EM 算法》:三硬币的 到底怎么估——下一节揭晓那套「既简洁又清晰」的解法。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。