查看全课大纲(第 25 / 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.跨媒体信息检索与未来展望
从混合模型到隐马尔可夫模型
小象实战讲义 · 自然语言处理
在上一节中,我们学习了使用 n-gram 模型进行词性标注,但这种方法仅考虑了词性标签之间的序列关系,忽略了词语本身与词性之间的关联。为了同时建模词语序列和隐藏的词性状态序列,我们需要引入更强大的概率模型。本节我们将从基础的混合模型出发,逐步构建出隐马尔可夫模型(HMM),并理解其如何将词性标注问题形式化为一个寻找最可能隐藏状态序列的任务。
💡 核心导读
- 混合模型的局限:回顾硬币混合模型的例子,理解当数据来源是多个隐藏成分混合时,仅观察输出结果难以直接估计模型参数。
- 期望最大化(EM)算法思想:为解决混合模型参数估计问题,引入 EM 算法的核心思路——在存在隐变量的情况下,通过迭代的“期望”和“最大化”步骤逼近最优参数。
- 从静态到动态混合:将静态的混合模型扩展为动态版本,引入状态之间的马尔可夫转移,从而得到隐马尔可夫模型(HMM)的基本框架。
- HMM 的构成要素:明确 HMM 由三部分构成:初始状态概率、状态转移概率矩阵和发射概率矩阵。
- HMM 与词性标注的关联:将 HMM 中的隐藏状态对应为词性标签,观察输出对应为词语,从而将词性标注问题转化为 HMM 的解码问题。
混合模型与参数估计难题
在机器学习中,我们常遇到数据由多个潜在来源混合生成的情况。一个经典的例子是“硬币混合”问题。
假设我们有一个盒子,里面混合了两种硬币:A币和B币。A币掷出正面(H)的概率是 ,B币掷出正面的概率是 。我们不知道盒子里两种硬币的比例,设A币的比例为 ,则B币的比例为 。
实验过程如下:
- 随机从盒中取出一枚硬币(我们看不见是A还是B)。
- 掷这枚硬币,记录结果(H或T)。
- 将硬币放回,重复步骤1。
经过多次实验,我们得到一串观测序列,例如:H, T, T, H, T, ...。
先说明目标的边界:在“每轮只掷一次”的设定下,这串观测只能可靠地估计出边际正面率 ;三个参数 本身并不能被分开估计。下面的 EM 演示是在这一不可识别条件下展示 E/M 步怎么算,其参数输出只是似然等值曲线上的一点,不能读作估准了哪枚硬币。
如果只有一种硬币,问题很简单:正面概率 的极大似然估计就是正面次数除以总次数。但现在有了隐藏的硬币类型(隐变量),直接计算变得困难。因为对于每一次观测,我们不知道它来自哪个硬币,无法直接分别统计A币和B币的正面次数。
这种包含隐变量的模型称为混合模型。上述硬币混合模型是伯努利混合模型,每个成分是一个伯努利分布(参数为 或 )。
伯努利分布的概率质量函数为: 其中 代表正面, 代表反面。
对于混合模型,观测数据 的(边际)概率是各个成分概率的加权和:
我们的挑战在于,直接对这样的似然函数求最大值以估计 没有闭式解。
先划一条硬边界:上面这个”每轮只掷一次”的实验,本身不足以把三个参数分开。每次观测只给出一个 0/1,能观测到的唯一统计量是正面率
一个方程、三个未知数,解是一整条曲线:任何满足 πp + (1−π)q = r 的三元组,似然完全相同。经典的三硬币示例(Do & Batzoglou, 2008)因此改成”每轮取一枚硬币连掷 5 次(或 10 次),只记正面次数”——观测从单次伯努利变成二项分布,约束条件不再只有一个,参数才可识别。本节下面的代码为了把 E/M 步的公式看得最清楚,保留了”一次一掷”的最简设定,所以它的输出只是曲线上的一点,不能当作”估准了/估偏了”来读(具体见本节结果处的说明)。
期望最大化(EM)算法思想
为了解决混合模型的参数估计问题,我们引入期望最大化(Expectation-Maximization, EM)算法。其核心思想是一种迭代优化策略:
- E步(期望步):基于当前参数估计 ,为每个数据点计算其属于各个隐藏成分的后验概率(即“责任”)。
- M步(最大化步):将E步计算出的“责任”视为软分配权重,重新计算模型参数 ,使得加权后的似然函数最大化。
对于硬币混合例子:
- E步:对于第 次观测 ,计算它来自A币的后验概率: 其中 是隐变量,表示硬币类型。
- M步:利用 作为权重,更新参数:
- 更新 :
- 更新 :
- 更新 :
重复E步和M步,直到参数收敛。EM 保证每次迭代使观测对数似然(或证据下界)单调不减;参数序列是否收敛、极限是局部极大还是驻点,需要额外条件,实践中常多次初始化并比较似然。
# 硬币混合模型 EM 算法演示(简化版,固定迭代次数)
import numpy as np
# 生成模拟数据:真实参数 pi=0.6, p=0.8, q=0.3
np.random.seed(42)
true_pi, true_p, true_q = 0.6, 0.8, 0.3
N = 1000
# 生成硬币类型
z_true = np.random.binomial(1, true_pi, N) # 1 for coin A, 0 for coin B
# 生成观测结果
x = np.zeros(N, dtype=int)
for i in range(N):
if z_true[i] == 1:
x[i] = np.random.binomial(1, true_p)
else:
x[i] = np.random.binomial(1, true_q)
# EM 算法初始化参数
pi_est, p_est, q_est = 0.5, 0.6, 0.4 # 随机初始化
max_iter = 50
for iter in range(max_iter):
# E-step: 计算后验概率 gamma (属于硬币A的概率)
# 为避免数值下溢,计算对数概率
log_prob_A = np.log(pi_est) + x * np.log(p_est) + (1-x) * np.log(1-p_est)
log_prob_B = np.log(1-pi_est) + x * np.log(q_est) + (1-x) * np.log(1-q_est)
# 使用 log-sum-exp 技巧归一化
max_log = np.maximum(log_prob_A, log_prob_B)
exp_A = np.exp(log_prob_A - max_log)
exp_B = np.exp(log_prob_B - max_log)
gamma = exp_A / (exp_A + exp_B)
# M-step: 更新参数
pi_est = np.mean(gamma)
p_est = np.sum(gamma * x) / (np.sum(gamma) + 1e-10) # 加小量防除零
q_est = np.sum((1 - gamma) * x) / (np.sum(1 - gamma) + 1e-10)
# 计算当前似然值(可选,用于监控)
# likelihood = np.sum(np.log(pi_est * p_est**x * (1-p_est)**(1-x) + (1-pi_est) * q_est**x * (1-q_est)**(1-x)))
print(f"演示生成参数: pi={true_pi:.3f}, p={true_p:.3f}, q={true_q:.3f}")
print(f"EM 演示输出(等值曲线上一点): pi={pi_est:.3f}, p={p_est:.3f}, q={q_est:.3f}")演示生成参数: pi=0.600, p=0.800, q=0.300
EM 演示输出(等值曲线上一点): pi=0.522, p=0.699, q=0.508这组数字该怎么读:演示输出与生成参数差得很远,但这不代表算法失败。样本正面率约 0.522×0.699 + 0.478×0.508 ≈ 0.608,与生成参数下应有的 0.6×0.8 + 0.4×0.3 = 0.6 相当接近——模型对数据的拟合是对的,错位的是参数本身:三个参数在这份数据上不可识别,EM 只是停在了曲线上离初始化近的那一点。想验证这一点很简单:把生成参数换成 (0.5, 0.7, 0.5),它的正面率也是 0.6,与本组估计的正面率一样,似然也几乎一样——两组参数在数据眼里没有区别。
要得到可识别、可比较的估计(也就是教材里常见的 π=0.6, p=0.8, q=0.3 那种漂亮结果),必须改成每轮连掷多次的设定。这是本节的认知要点,比记住三个更新公式更重要:EM 能最大化似然,但最大不出数据里没有的信息。
从静态混合到动态混合:引入马尔可夫性
上述混合模型是静态的:每次实验独立,上次掷币结果不影响下次取到哪种硬币。现在,我们引入动态性,让隐状态(硬币类型)形成一个序列,并且序列中相邻状态之间存在依赖关系。这就是马尔可夫链。
考虑一个天气系统的马尔可夫链,状态为 {晴天(S), 雨天(R)}。状态转移矩阵 定义了从当前状态转移到下一状态的概率: 例如, 表示如果今天是晴天,明天下雨的概率是0.3。
在马尔可夫链中,我们能直接观察到状态序列(例如,我们每天都能看到天气)。但如果状态是隐藏的,我们只能观察到与状态相关的另一些输出,模型就变成了隐马尔可夫模型(HMM)。
继续天气的例子:假设一个人根据天气决定每天的活动 {散步(W), 打扫(C)}。在晴天,他散步的概率是0.9,打扫的概率是0.1;在雨天,他散步的概率是0.3,打扫的概率是0.7。这个概率关系称为发射概率(Emission Probability),用矩阵 表示:
现在,我们观察到的是一连串的活动序列(例如:W, W, C, W, C, C, ...),而背后的天气状态序列是隐藏的。这就是一个 HMM。
隐马尔可夫模型(HMM)的形式化定义
一个 HMM 由以下五元组定义 :
- 状态集合 ,例如 {S, R},对应词性标注中的标签集(如 {NN, VB, …})。
- 观测集合 ,例如 {W, C},对应词性标注中的词汇表。
- 初始状态概率分布 ,其中 ,表示序列开始时处于状态 的概率。
- 状态转移概率矩阵 ,其中 ,表示从状态 转移到 的概率。
- 发射概率矩阵 ,其中 ,表示在状态 下观测到符号 的概率。
HMM 生成观测序列 的过程如下:
- 根据初始分布 选择初始状态 。
- 设 。
- 根据发射概率 生成观测 。
- 如果 ,终止;否则根据转移概率 选择下一个状态 。
- 令 ,返回步骤3。
这样恰好发射 次观测,与联合概率公式中 个发射因子一一对应。
对于词性标注,状态 是词性标签,观测 是词语。HMM 假设:
- 马尔可夫性:当前词性只依赖于前一个词性(一阶马尔可夫,对应 bigram)。
- 输出独立性:当前观测到的词语只依赖于当前的词性。
HMM 与高斯混合模型(GMM)的类比
混合模型不仅可以由离散分布(如伯努利)构成,也可以由连续分布构成,例如高斯混合模型(GMM)。在GMM中,每个隐藏成分是一个高斯分布 。
将静态的 GMM 动态化,就得到了连续观测的 HMM(虽然词性标注中观测是离散的词语,但理解这个类比有助于把握HMM的本质)。
假设我们有三个高斯分布(对应三个隐藏状态)。在静态混合中,每个数据点独立地从一个随机选择的高斯中采样。在动态混合(HMM)中,我们有一个状态序列,状态间按转移矩阵 跳转。在每个时间点 ,我们根据当前状态 对应的高斯分布 采样得到一个观测值 。这样生成的观测序列 就同时体现了状态间的转移规律和每个状态的输出特性。
状态序列(隐藏): G0 -> G1 -> G2 -> G0 -> ...
| | | |
观测序列(可见): x1 ~ x2 ~ x3 ~ x4 ~
N(μ0) N(μ1) N(μ2) N(μ0)HMM 用于词性标注
现在,我们将 HMM 正式应用到词性标注任务上。给定一个词语序列 ,我们的目标是找到最可能的词性标签序列 。
根据 HMM 的生成假设,联合概率为:
其中:
- 是初始概率 。
- 是转移概率 。
- 是发射概率 。
因此,词性标注问题转化为:寻找使 最大的标签序列 :
求解这个最优路径问题,可以使用高效的维特比(Viterbi)算法,它是一种动态规划算法。我们将在下一节详细讲解 Viterbi 算法以及如何从标注语料中估计 HMM 的参数()。
📝 动手练一练
- 概念辨析:混合模型(如GMM)和隐马尔可夫模型(HMM)的核心区别是什么?是什么假设的引入导致了这种区别?
👉 点击查看参考答案
核心区别在于数据点之间的独立性假设。
- 混合模型(如GMM)假设所有观测数据点是独立同分布(i.i.d.) 的。每个数据点独立地从混合成分中生成,数据点之间没有顺序或依赖关系。它建模的是数据的静态分布。
- 隐马尔可夫模型(HMM) 假设观测数据点之间存在顺序,并且这种顺序是由一个隐藏的状态序列驱动的。状态序列自身具有马尔可夫性(当前状态只依赖于前一个状态),而每个观测值依赖于当前状态。因此,HMM 建模的是序列数据,是混合模型的动态扩展。
引入的关键假设是状态序列的马尔可夫性以及状态与观测序列的对应关系。这使得 HMM 能够捕捉序列中相邻隐藏状态之间的转移规律,从而适用于词性标注、语音识别等序列标注任务。
参数计算:考虑一个极简的 HMM,用于标注句子“I fish”。状态集(词性)为 {PRP(代词), VB(动词), NN(名词)}。已知以下概率(均为虚构值):
- 初始概率:P(PRP)=0.6, P(VB)=0.3, P(NN)=0.1
- 转移概率:
- P(VB | PRP)=0.7, P(NN | PRP)=0.2, P(PRP | PRP)=0.1
- P(PRP | VB)=0.1, P(NN | VB)=0.8, P(VB | VB)=0.1
- P(PRP | NN)=0.3, P(VB | NN)=0.3, P(NN | NN)=0.4
- 发射概率:
- P(“I” | PRP)=0.9, P(“fish” | PRP)=0.1
- P(“I” | VB)=0.0, P(“fish” | VB)=0.8
- P(“I” | NN)=0.0, P(“fish” | NN)=0.9
请手算词性序列为
(PRP, VB)和(PRP, NN)时,分别生成观测序列("I", "fish")的联合概率 。哪个序列的概率更高?
👉 点击查看参考答案
根据公式
对于序列 T1 = (PRP, VB):
对于序列 T2 = (PRP, NN):
比较可知,。因此,在这个简单的模型下,(PRP, VB) 序列的概率更高,模型更倾向于将“fish”标注为动词(VB)。这符合“I fish”通常理解为“我钓鱼”的直觉。当然,真实的 HMM 参数是从大规模语料中估计得到的。
本章小结
本节我们从基础的混合模型出发,逐步构建了隐马尔可夫模型的理论框架。我们首先看到了当数据中存在隐变量时,参数估计的复杂性,并引入了 EM 算法作为解决方案的思想。然后,通过为静态混合模型加入状态间的马尔可夫转移,我们得到了能够建模序列数据的 HMM。HMM 通过隐藏的状态序列来驱动观测序列的生成,非常适合于词性标注这类任务——将词性作为隐藏状态,词语作为观测。最后,我们形式化地定义了 HMM 的五元组,并将其与词性标注问题对应起来,明确了下一步的学习目标:如何估计 HMM 的参数以及如何解码出最可能的状态序列。
📋 行动清单
- 理解混合模型(如硬币例子)中隐变量带来的参数估计挑战。
- 掌握 EM 算法“E步计算后验,M步更新参数”的核心迭代思想。
- 能够清晰阐述静态混合模型与 HMM 的本质区别在于是否引入了状态序列的马尔可夫性。
- 熟记 HMM 的五元组定义 及其在词性标注中的具体对应。
- 能够根据给定的简单 HMM 参数,手算特定词性序列生成给定词语序列的联合概率。
—— 小象教研组