查看全课大纲(第 24 / 69 节)
- 1.NLP 的研究领域、应用与学习路径
- 2.自然语言的基本术语
- 3.信息论基础:信息熵与交叉熵
- 4.语言的进化与语义变迁
- 5.主观概率、客观概率与条件概率
- 6.贝叶斯原理与推理
- 7.随机变量:二项式、期望方差与联合概率
- 8.常见概率分布
- 9.辛普森悖论与贝叶斯解题实例
- 10.语言模型:语言概率与词袋模型
- 11.n-gram 语言模型(二元 / 三元 / N-Gram)
- 12.语言模型评价:交叉熵、困惑度与插值
- 13.朴素贝叶斯文本分类:垃圾邮件
- 14.拼写检查
- 15.中文分词:构词法、最大匹配、最优路径与 Jieba
- 16.词表示问题与语义相似度
- 17.TF-IDF 权重处理
- 18.One-Hot 表达与词表示的局限
- 19.Word2Vec 核心思想
- 20.Word2Vec 训练过程
- 21.Skip-gram 模型详解
- 22.词性标注任务与标注方法(规则 + N-Gram)
- 23.EM 算法与混合模型
- 24.高斯混合模型 GMM
- 25.从混合模型到隐马尔可夫模型
- 26.隐马尔可夫模型(HMM)推导与维特比解码
- 27.线性链条件随机场 CRF
- 28.贝叶斯网络与图模型
- 29.隐马尔可夫链与 HMM 推导
- 30.PLSA 主题模型
- 31.LSI 与 SVD 向量表达
- 32.LDA 与狄利克雷分布
- 33.主题模型实验复现(困惑度 / 分类 / 相似度 / 延展)
- 34.上下文无关文法(CFG)与句法分析
- 35.概率上下文无关文法 PCFG
- 36.统计机器翻译:词对齐与翻译模型
- 37.统计机器翻译中的对齐模型与参数估计
- 38.从统计机器翻译到神经机器翻译
- 39.神经元与反向传播速览(指向深度学习课)
- 40.CNN 原理及其在 NLP 中的应用
- 41.循环神经网络的基本原理与 Elman / Jordan 网络
- 42.LSTM:长短期记忆网络的核心思想与分步实现
- 43.Encoder-Decoder 框架
- 44.Seq2Seq 与早期注意力机制
- 45.注意力机制的背景与动机
- 46.注意力模型实现原理与匹配函数
- 47.记忆网络:组成与计算
- 48.注意力机制的应用与历史延展
- 49.Transformer 结构:Encoder-Decoder 栈与 Self-Attention
- 50.Multi-Head Attention、FFNN 与位置编码
- 51.层归一化、损失函数与 Universal Transformer 延展
- 52.预训练范式:从 ELMo 到 BERT
- 53.BERT 与掩码语言模型
- 54.BERT 下游任务微调与 GLUE 口径
- 55.GPT 与自回归语言建模
- 56.GPT-1 到 GPT-4 的演进
- 57.指令微调与 RLHF
- 58.分词器:BPE、WordPiece 与中文词表
- 59.上下文窗口与长文本处理
- 60.能力边界、成本与适用场景
- 61.文本分类实战:从朴素贝叶斯到逻辑回归
- 62.命名实体识别实战
- 63.文本生成与摘要实战
- 64.语义检索与向量库实战
- 65.RAG 知识库问答
- 66.NLP 评估指标:BLEU / ROUGE / BERTScore 与人工评估
- 67.幻觉与事实性问题
- 68.文本与知识结合(知识图谱压缩)
- 69.跨媒体信息检索与未来展望
高斯混合模型 GMM
小象实战讲义 · 自然语言处理
在上一节中,我们通过混合伯努利模型(三硬币问题)深入理解了期望最大化(EM)算法的运作机制。本节我们将探讨一个更复杂、应用更广泛的模型——高斯混合模型(GMM)。GMM是处理连续数据聚类的强大工具,也是理解更复杂概率图模型(如隐马尔可夫模型)的重要基石。掌握GMM,你将能够从一堆看似无结构的连续观测数据(如身高、收入、传感器读数)中,识别出潜在的、不同类别的分布模式。
💡 核心导读
- 从离散到连续:将混合模型的思路从硬币的“正面/反面”扩展到连续变量的“正态分布”,理解混合系数与分布参数的关系。
- GMM的数学形式:掌握混合高斯模型的概率密度函数,理解其如何由多个高斯分布加权求和构成。
- 参数空间的复杂性:对比伯努利混合与高斯混合的参数数量,直观感受高维参数空间给优化带来的挑战。
- EM算法的通用性:理解EM算法框架如何应用于GMM,推导其E步和M步的核心公式(作为思考练习)。
- 模型扩展与应用:了解如何将两个分量的GMM扩展到K个分量,并思考其在无监督聚类和密度估计中的应用。
从混合伯努利到混合高斯
在混合伯努利模型中,我们假设数据来自两个不同的伯努利分布(例如,两枚不同的硬币)。每个伯努利分布仅由一个参数(正面概率 p 或 q)定义。现在,我们考虑数据是连续值的情况。
一个经典的例子是身高测量。假设在一个房间里,我们测量了所有人的身高,得到了一个数据集。我们观察到身高的分布可能呈现双峰形态,这暗示着数据可能来自两个不同的群体,例如男性和女性。每个群体的身高都近似服从一个高斯(正态)分布,但具有不同的均值(平均身高)和方差(身高的离散程度)。
我们的目标是:在不知道任何人身性别标签(即隐含变量)的情况下,仅凭身高数据 X,估计出以下参数:
- 男性群体的身高分布参数:均值
μ1和方差σ1²。 - 女性群体的身高分布参数:均值
μ2和方差σ2²。 - 混合系数
π:即房间里男性(或女性)所占的比例。
这个模型就是高斯混合模型。
高斯混合模型的数学表述
让我们形式化地定义这个模型。我们用隐含变量 Z 来表示数据点所属的组分(Component)。对于两分量GMM,Z 可以取两个值(例如,Z=1 表示男性,Z=2 表示女性)。Z 的先验分布是一个伯努利分布,由混合系数 π 控制: P(Z=1) = π, P(Z=2) = 1 - π。
给定隐含变量 Z,观测数据 X(身高)的条件分布是一个高斯分布:
- 如果
Z=1,则X | Z=1 ~ N(μ1, σ1²) - 如果
Z=2,则X | Z=2 ~ N(μ2, σ2²)
这里,N(μ, σ²) 表示均值为 μ、方差为 σ² 的高斯分布,其概率密度函数为: p(x | μ, σ²) = (1 / √(2πσ²)) * exp(-(x-μ)²/(2σ²))。
我们的观测数据 X 的边缘分布,即我们实际看到的分布,是这两个高斯分布的加权和: p(x | θ) = π * N(x | μ1, σ1²) + (1 - π) * N(x | μ2, σ2²) 其中,模型参数集合 θ = {π, μ1, σ1², μ2, σ2²}。
与混合伯努利模型类似,我们也可以引入隐含变量 Z,通过联合分布 p(x, z) 再对 z 求和(积分)来得到相同的结果: p(x | θ) = Σ_{z∈{1,2}} p(z) * p(x | z, θ) = π * N(x | μ1, σ1²) + (1-π) * N(x | μ2, σ2²)。
参数空间与优化挑战
对比混合伯努利模型(参数:π, p, q,共3个)和高斯混合模型(参数:π, μ1, σ1², μ2, σ2²,共5个),我们可以发现GMM的参数空间更大。
这种复杂性的增加意味着优化难度的显著上升。在混合伯努利模型中,我们可以在一个三维的单位立方体 [0,1]³ 中相对容易地搜索极大似然解。然而,对于GMM,我们需要在一个五维(对于K个分量则是更高维)的空间中进行搜索。μ 可以取任意实数值,σ² 必须为正实数,π 在0到1之间。这个搜索空间不仅巨大,而且目标函数(对数似然)可能存在多个局部极值。
这正是EM算法大显身手的地方。EM算法通过迭代执行以下两步,提供了一种在存在隐含变量时进行参数估计的稳定方法:
- E步(期望步):基于当前参数估计
θ^(t),计算每个数据点x_i属于每个高斯分量的“责任”(Responsibility)γ(z_{ik}),即后验概率P(Z_i=k | x_i, θ^(t))。 - M步(最大化步):基于E步计算出的“责任”,更新模型参数
θ^(t+1),以最大化完全数据的对数似然函数的期望。
对于GMM,M步的更新公式具有直观的解析形式:
- 新的混合系数
π_k^(new)等于所有数据点属于第k个分量的“责任”的平均值。 - 新的均值
μ_k^(new)等于所有数据点的加权平均,权重就是其属于第k个分量的“责任”。 - 新的方差
σ_k²^(new)等于以新均值为中心、以“责任”为权重的加权方差。
# 以下代码块演示了如何使用纯Python和numpy(模拟)一个简化版的两分量GMM参数估计思想。
# 注意:这是一个高度简化的示意,用于展示参数更新逻辑,并非完整的、鲁棒的EM实现。
# 真实场景推荐使用成熟的科学计算库(如scikit-learn的GaussianMixture)。
import numpy as np
# 设置随机种子保证示例可复现
np.random.seed(42)
# 1. 生成模拟数据:假设真实情况是π=0.6,两个高斯分量
# 分量1: μ1=165, σ1=5 (模拟女性身高,单位:cm)
# 分量2: μ2=178, σ2=6 (模拟男性身高)
true_pi = 0.6
true_mu1, true_sigma1 = 165, 5
true_mu2, true_sigma2 = 178, 6
n_samples = 300
# 根据真实混合系数生成隐含变量z
z_true = np.random.binomial(1, true_pi, n_samples) # 1对应分量1,0对应分量2
n1 = z_true.sum()
n2 = n_samples - n1
# 根据z生成观测数据x
x = np.zeros(n_samples)
x[z_true == 1] = np.random.normal(true_mu1, true_sigma1, n1)
x[z_true == 0] = np.random.normal(true_mu2, true_sigma2, n2)
print(f"生成数据: 共{n_samples}个样本,其中分量1(模拟女性){n1}个,分量2(模拟男性){n2}个")
print(f"前10个样本的身高数据 (cm): {x[:10].round(2)}")
print(f"前10个样本的真实标签 (1:女, 0:男): {z_true[:10]}")生成数据: 共300个样本,其中分量1(模拟女性)177个,分量2(模拟男性)123个
前10个样本的身高数据 (cm): [165.23 181.09 182.27 161.74 175.72 168.17 154.87 171.25 168.8 185.67]
前10个样本的真实标签 (1:女, 0:男): [1 0 0 1 1 1 1 0 0 0]
# —— 重新构建上文用到的微型数据(本节各代码块相互独立,可单独运行)
import numpy as np
np.random.seed(42)
true_pi = 0.6
true_mu1, true_sigma1 = 165, 5
true_mu2, true_sigma2 = 178, 6
n_samples = 300
z_true = np.random.binomial(1, true_pi, n_samples) # 1对应分量1,0对应分量2
n1 = int(z_true.sum())
n2 = n_samples - n1
x = np.zeros(n_samples)
x[z_true == 1] = np.random.normal(true_mu1, true_sigma1, n1)
x[z_true == 0] = np.random.normal(true_mu2, true_sigma2, n2)
# 2. 模拟一轮"已知责任(后验概率)"情况下的M步更新
# 假设我们通过某种方式(比如上一轮E步)得到了每个样本属于两个分量的"责任" gamma1, gamma2
# 这里为了演示,我们使用一个简单的规则:如果身高<172,则更可能来自分量1,否则更可能来自分量2。
# 这只是一个人为的、不精确的示例,并非真实的E步输出。
gamma1 = np.where(x < 172, 0.8, 0.2) # 样本属于分量1的责任
gamma2 = 1 - gamma1 # 样本属于分量2的责任
# M步:根据责任更新参数
N1_soft = gamma1.sum() # 分量1的"软计数"
N2_soft = gamma2.sum() # 分量2的"软计数"
pi_new = N1_soft / n_samples # 更新混合系数
mu1_new = np.sum(gamma1 * x) / N1_soft # 更新分量1均值
mu2_new = np.sum(gamma2 * x) / N2_soft # 更新分量2均值
sigma1_sq_new = np.sum(gamma1 * (x - mu1_new)**2) / N1_soft # 更新分量1方差
sigma2_sq_new = np.sum(gamma2 * (x - mu2_new)**2) / N2_soft # 更新分量2方差
print("=== 模拟一轮M步更新结果 ===")
print(f"更新的混合系数 π (分量1比例): {pi_new:.4f}")
print(f"更新的分量1参数: μ1 = {mu1_new:.2f}, σ1² = {sigma1_sq_new:.2f}")
print(f"更新的分量2参数: μ2 = {mu2_new:.2f}, σ2² = {sigma2_sq_new:.2f}")
print("\n(对比真实参数)")
print(f"真实混合系数 π: {true_pi:.4f}")
print(f"真实分量1参数: μ1 = {true_mu1:.2f}, σ1² = {true_sigma1**2:.2f}")
print(f"真实分量2参数: μ2 = {true_mu2:.2f}, σ2² = {true_sigma2**2:.2f}")=== 模拟一轮M步更新结果 ===
更新的混合系数 π (分量1比例): 0.5720
更新的分量1参数: μ1 = 166.81, σ1² = 40.23
更新的分量2参数: μ2 = 174.78, σ2² = 62.93
(对比真实参数)
真实混合系数 π: 0.6000
真实分量1参数: μ1 = 165.00, σ1² = 25.00
真实分量2参数: μ2 = 178.00, σ2² = 36.00扩展到K个分量与模型应用
高斯混合模型不限于两个分量。我们可以将其推广到K个高斯分布的混合: p(x | θ) = Σ_{k=1}^{K} π_k * N(x | μ_k, σ_k²) 其中,混合系数 π_k 满足 Σ_{k=1}^{K} π_k = 1 且 π_k ≥ 0。
例如,在一个包含多种族人口的班级中,身高分布可能由更多的高斯分量混合而成(如亚裔男性、白人女性等)。K的选择是一个模型选择问题,可以通过信息准则(如AIC、BIC)或交叉验证来确定。
GMM的核心应用是无监督聚类和密度估计。
- 聚类:每个高斯分量可以看作一个“簇”。E步计算出的“责任”
γ(z_{ik})给出了数据点i属于簇k的软分配概率。取概率最大的簇即可得到硬聚类结果。 - 密度估计:GMM为整个数据空间提供了一个平滑的概率密度函数,能够拟合复杂的多模态分布,这比单一的高斯分布更灵活。
# GMM与K-Means的关系(概念性说明)
# K-Means可以看作是GMM的一个特例,当满足以下条件时:
# 1. 每个高斯分量的协方差矩阵为 εI (ε -> 0),即方差无限小,分布收缩到一个点。
# 2. EM算法中的E步退化为硬分配(将点分配给最近的中心点)。
# 因此,GMM是K-Means的"软化"或概率化推广,能提供更丰富的数据结构信息。📝 动手练一练
概念辨析:混合伯努利模型与高斯混合模型在“混合”这一核心思想上有何共同点?它们最主要的区别是什么,这种区别导致了参数估计上怎样的不同挑战?
公式推导思考题:对于两分量GMM,其完全数据的对数似然函数为:
L_c(θ) = Σ_{i=1}^{N} [z_i1 * (log π + log N(x_i | μ1, σ1²)) + z_i2 * (log (1-π) + log N(x_i | μ2, σ2²))]其中z_ik是指示变量(1表示样本i属于分量k)。 在E步,我们需要计算z_ik的期望E[z_ik | x_i, θ^(old)],即后验概率γ(z_{ik})。 请尝试推导:在已知当前参数θ^(old) = {π^(old), μ1^(old), σ1²^(old), μ2^(old), σ2²^(old)}的情况下,如何计算γ(z_{i1})?(提示:应用贝叶斯定理)
👉 点击查看参考答案
共同点与区别:
- 共同点:两者都假设观测数据来自多个不同的概率分布(组分),并通过一个混合系数(权重)将这些分布线性组合起来,以描述更复杂的总体分布。它们都引入了隐含变量来表示数据点所属的组分。
- 主要区别:混合伯努利模型中的基础分布是离散的伯努利分布(描述如硬币正反面的二值事件),而高斯混合模型中的基础分布是连续的高斯分布(描述如身高、体重的连续值)。伯努利分布仅由一个参数(成功概率)定义,而高斯分布由两个参数(均值和方差)定义。
- 挑战:这种区别使得GMM的参数空间维度更高(每个分量多一个参数),且参数的定义域更复杂(均值在实数域,方差在正实数域)。对数似然函数可能非凸,存在多个局部极大值,使得直接优化(如梯度下降)更容易陷入局部最优,也更凸显了EM算法这种迭代优化框架的价值。
E步推导: 根据贝叶斯定理,样本
i属于分量1的后验概率为:γ(z_{i1}) = P(Z_i=1 | x_i, θ^(old)) = [P(Z_i=1) * p(x_i | Z_i=1, θ^(old))] / p(x_i | θ^(old))其中:P(Z_i=1) = π^(old)p(x_i | Z_i=1, θ^(old)) = N(x_i | μ1^(old), σ1²^(old))p(x_i | θ^(old)) = π^(old) * N(x_i | μ1^(old), σ1²^(old)) + (1-π^(old)) * N(x_i | μ2^(old), σ2²^(old))因此,γ(z_{i1}) = [π^(old) * N(x_i | μ1^(old), σ1²^(old))] / [π^(old) * N(x_i | μ1^(old), σ1²^(old)) + (1-π^(old)) * N(x_i | μ2^(old), σ2²^(old))]同理,γ(z_{i2}) = 1 - γ(z_{i1})。 这个γ(z_{ik})就是E步需要计算的“责任”,它衡量了在当前参数下,观测数据x_i由第k个高斯分量生成的可能性。
本章小结
本节我们将混合模型的思想从离散数据推广到了连续数据,系统学习了高斯混合模型(GMM)。GMM通过将多个高斯分布进行加权求和,能够灵活地拟合复杂的、多模态的连续数据分布。我们明确了GMM的概率图模型表示、其数学形式以及相较于混合伯努利模型在参数空间和优化复杂度上的提升。虽然我们没有展开完整的EM算法迭代公式推导,但明确了其应用于GMM的E步(计算责任)和M步(更新分布参数与混合系数)的核心思想。GMM是无监督聚类和密度估计的重要工具,也是通往更复杂序列模型(如隐马尔可夫模型)的关键一步。
📋 行动清单
- 理解高斯混合模型
p(x) = Σ π_k N(x | μ_k, σ_k²)的构成,能说出每个参数的意义。 - 对比混合伯努利与混合高斯的异同,能解释为何GMM的参数估计更复杂。
- 根据提供的提示,尝试独立完成GMM的E步后验概率公式推导,并理解“责任”
γ(z_{ik})的概念。 - (进阶)思考如何将两分量GMM的EM算法推导过程,推广到K个分量的情况。
—— 小象教研组