前向算法(Forward Algorithm)
前向算法是一种动态规划算法,用于在隐马尔可夫模型(HMM)中计算给定观测序列的概率。这是 HMM 的第一个核心问题,即:在模型参数已知的情况下,计算一个观测序列 O = { o 1 , o 2 , … , o T } O = \{o_1, o_2, \dots, o_T\} O={o1,o2,…,oT} 的概率 P ( O ∣ λ ) P(O \mid \lambda) P(O∣λ),其中 λ \lambda λ 表示 HMM 的参数。
问题描述
我们想知道,在一个隐马尔可夫模型中,产生观测序列 O O O 的概率 P ( O ) P(O) P(O) 是多少。这个概率可以通过将所有可能的隐状态路径 Q = { q 1 , q 2 , … , q T } Q = \{q_1, q_2, \dots, q_T\} Q={q1,q2,…,qT} 的联合概率求和得到:
P ( O ) = ∑ Q P ( O , Q ) P(O) = \sum_{Q} P(O, Q) P(O)=Q∑P(O,Q)
但直接计算所有可能的隐状态路径的联合概率是非常困难的,因为隐状态数量随着时间步数呈指数增长(对于 N N N 个状态,路径数为 N T N^T NT)。
前向算法的思想
前向算法通过动态规划避免了对所有隐状态路径的穷举计算,显著降低了复杂度。它通过递归地计算“前向概率”,一步步将问题分解到更小的子问题。
前向概率定义
定义前向概率
α
t
(
i
)
\alpha_t(i)
αt(i) 为:
α
t
(
i
)
=
P
(
O
1
,
O
2
,
…
,
O
t
,
S
t
=
s
i
∣
λ
)
\alpha_t(i) = P(O_1, O_2, \dots, O_t, S_t = s_i \mid \lambda)
αt(i)=P(O1,O2,…,Ot,St=si∣λ)
即,在时间
t
t
t 时,部分观测序列
O
1
,
O
2
,
…
,
O
t
O_1, O_2, \dots, O_t
O1,O2,…,Ot 以及隐状态为
S
t
=
s
i
S_t = s_i
St=si 的概率。
递推公式
前向算法的递推过程可以分为以下三步:
1. 初始化
在时间
t
=
1
t = 1
t=1,前向概率是:
α
1
(
i
)
=
π
i
⋅
b
i
(
o
1
)
,
∀
i
=
1
,
2
,
…
,
N
\alpha_1(i) = \pi_i \cdot b_i(o_1), \quad \forall i = 1, 2, \dots, N
α1(i)=πi⋅bi(o1),∀i=1,2,…,N
其中:
- π i \pi_i πi 是初始状态分布,表示隐状态为 s i s_i si 的初始概率。
- b i ( o 1 ) b_i(o_1) bi(o1) 是在隐状态 s i s_i si 下生成观测 o 1 o_1 o1 的概率。
2. 递推
对于
t
=
2
,
3
,
…
,
T
t = 2, 3, \dots, T
t=2,3,…,T,前向概率通过以下公式递归计算:
α
t
(
j
)
=
[
∑
i
=
1
N
α
t
−
1
(
i
)
⋅
a
i
j
]
⋅
b
j
(
o
t
)
,
∀
j
=
1
,
2
,
…
,
N
\alpha_t(j) = \left[ \sum_{i=1}^N \alpha_{t-1}(i) \cdot a_{ij} \right] \cdot b_j(o_t), \quad \forall j = 1, 2, \dots, N
αt(j)=[i=1∑Nαt−1(i)⋅aij]⋅bj(ot),∀j=1,2,…,N
其中:
- α t − 1 ( i ) \alpha_{t-1}(i) αt−1(i) 是时间 t − 1 t-1 t−1 时隐状态为 s i s_i si 的前向概率。
- a i j a_{ij} aij 是从隐状态 s i s_i si 转移到隐状态 s j s_j sj 的转移概率。
- b j ( o t ) b_j(o_t) bj(ot) 是在隐状态 s j s_j sj 下生成观测 o t o_t ot 的概率。
3. 终止
在时间
t
=
T
t = T
t=T(观测序列的最后一个时刻),总的观测序列概率为:
P
(
O
∣
λ
)
=
∑
i
=
1
N
α
T
(
i
)
P(O \mid \lambda) = \sum_{i=1}^N \alpha_T(i)
P(O∣λ)=i=1∑NαT(i)
即,将所有隐状态在最后一个时间步的前向概率相加。
算法流程
假设:
- N N N 是隐状态数量。
- T T T 是观测序列长度。
- 输入:HMM 参数 λ = ( π , A , B ) \lambda = (\pi, A, B) λ=(π,A,B) 和观测序列 O O O。
- 初始化:
α 1 ( i ) = π i ⋅ b i ( o 1 ) , ∀ i = 1 , 2 , … , N \alpha_1(i) = \pi_i \cdot b_i(o_1), \quad \forall i = 1, 2, \dots, N α1(i)=πi⋅bi(o1),∀i=1,2,…,N - 递推:
对 t = 2 , 3 , … , T t = 2, 3, \dots, T t=2,3,…,T:
α t ( j ) = [ ∑ i = 1 N α t − 1 ( i ) ⋅ a i j ] ⋅ b j ( o t ) \alpha_t(j) = \left[ \sum_{i=1}^N \alpha_{t-1}(i) \cdot a_{ij} \right] \cdot b_j(o_t) αt(j)=[i=1∑Nαt−1(i)⋅aij]⋅bj(ot) - 终止:
P ( O ∣ λ ) = ∑ i = 1 N α T ( i ) P(O \mid \lambda) = \sum_{i=1}^N \alpha_T(i) P(O∣λ)=i=1∑NαT(i) - 输出:观测序列的概率 P ( O ∣ λ ) P(O \mid \lambda) P(O∣λ)。
复杂度分析
- 时间复杂度: O ( N 2 ⋅ T ) O(N^2 \cdot T) O(N2⋅T),因为对于每个 t t t 和每个 j j j,我们需要对所有 i i i 求和。
- 空间复杂度: O ( N ⋅ T ) O(N \cdot T) O(N⋅T),存储每个时刻的前向概率。
相比于穷举所有隐状态路径(复杂度为 O ( N T ) O(N^T) O(NT)),前向算法大幅降低了计算复杂度。
应用场景
- 语音识别:评估一个观测序列(如音频信号)的生成概率,用于模式匹配。
- 自然语言处理:评估文本序列的可能性,例如词性标注中的概率计算。
- 生物信息学:分析基因序列,计算某个基因片段的出现概率。
总结
前向算法是 HMM 中的一个高效算法,用于计算给定观测序列的概率。它通过动态规划避免了对隐状态路径的穷举,使得问题在计算上变得可行。通过前向概率的递归计算,前向算法为许多实际问题的解决奠定了基础。