好的西门~我们来详细讲解「前向算法(Forward Algorithm) 」在 隐马尔可夫模型(HMM) 中求概率的用法。
📘 前向算法(Forward Algorithm)求概率
✅ 一句话总结
前向算法 是用于计算给定观测序列出现的概率 的动态规划方法,关键思想是:逐步累积前面所有可能路径的概率和。
🔶 一、问题背景
我们在 HMM(隐马尔可夫模型) 中有:
-
状态序列(隐藏):Q={q1,q2,...,qT}Q = \{q_1, q_2, \dots, q_T\}
-
观测序列(可见):O={o1,o2,...,oT}O = \{o_1, o_2, \dots, o_T\}
-
初始概率:πi=P(q1=Si)\pi_i = P(q_1 = S_i)
-
状态转移概率:aij=P(qt+1=Sj∣qt=Si)a_{ij} = P(q_{t+1} = S_j | q_t = S_i)
-
观测概率(发射概率):bj(ot)=P(ot∣qt=Sj)b_j(o_t) = P(o_t | q_t = S_j)
🔶 二、目标
我们想要求:
P(O∣λ)P(O | \lambda)
即:在模型参数 λ\lambda(包含 π,A,B\pi, A, B)已知的情况下,观测序列 OO 出现的总概率。
🔶 三、前向概率定义
令:
αt(i)=P(o1,o2,...,ot,qt=Si∣λ)\alpha_t(i) = P(o_1, o_2, \dots, o_t, q_t = S_i | \lambda)
即:在时间 tt 时处于状态 SiS_i,且前 tt 个观测为 o1,...,oto_1, \dots, o_t 的联合概率
🔶 四、算法步骤(动态规划)
🟡 第一步:初始化(t=1)
α1(i)=πi⋅bi(o1)\alpha_1(i) = \pi_i \cdot b_i(o_1)
表示初始时就处于状态 SiS_i,并发出观测 o1o_1 的概率。
🟡 第二步:递推(t=2 到 T)
αt(j)=∑i=1Nαt−1(i)⋅aij⋅bj(ot)\alpha_t(j) = \sum_{i=1}^N \alpha_{t-1}(i) \cdot a_{ij} \cdot b_j(o_t)
含义:
-
从前一步所有状态 SiS_i 转移到当前状态 SjS_j 的所有路径的概率总和,
-
再乘上当前状态发出当前观测 oto_t 的概率。
🟡 第三步:终止
P(O∣λ)=∑i=1NαT(i)P(O|\lambda) = \sum_{i=1}^N \alpha_T(i)
所有在最后时刻可能处于的状态的前向概率的总和,就是观测序列的总概率。
✅ 示例(小模型)
假设有两个状态 S1,S2S_1, S_2,一个观测序列 O={o1,o2}O = \{o_1, o_2\},我们就能通过上面的步骤,用表格或代码,快速算出 P(O∣λ)P(O|\lambda)。
🧠 为什么用前向算法而不是枚举路径?
因为枚举所有隐藏状态路径的组合是 指数级别 O(NT)O(N^T) 的计算复杂度。
而前向算法的动态规划方式将复杂度降为 O(N2T)O(N^2 T),效率高得多。
📌 总结公式
步骤 | 公式 | 含义 |
---|---|---|
初始化 | α1(i)=πibi(o1)\alpha_1(i) = \pi_i b_i(o_1) | 初始时刻 |
递推 | αt(j)=∑iαt−1(i)aijbj(ot)\alpha_t(j) = \sum_i \alpha_{t-1}(i) a_{ij} b_j(o_t) | 当前步依赖前一步 |
终止 | P(O)=∑iαT(i)P(O) = \sum_i \alpha_T(i) | 最终概率和 |
如果你想要:
✅ 图示解释
✅ Python 实现
✅ 和后向算法/EM算法联合讲解
✅ 应用于语音识别、信息抽取
我可以继续扩展~要不要演示下一个例子?