学习隐马尔科夫模型建议先阅读《写给小白看的马尔科夫链(Markov Chain)最佳入门教程》,我们知道隐马尔科夫模型中的状态序列其实就是马尔科夫链。
隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型,它在语言识别,自然语言处理,模式识别等领域应用广泛。随着目前深度学习的崛起,尤其是RNN,LSTM等神经网络序列模型的火热,HMM的地位有所下降。但是作为一个经典的模型,学习HMM的模型和对应算法,对我们解决问题建模的能力提高以及算法思路的拓展还是很好的。本文将介绍HMM模型的基础,旨在读完对HMM有初步的认识和理解。
1. 什么样的问题需要HMM模型
首先我们来看看什么样的问题解决可以用HMM模型。使用HMM模型时我们的问题一般有这两个特征:
1)我们的问题是基于序列的,比如时间序列,或者状态序列。
2)我们的问题中有两类数据,一类序列数据是可以观测到的,即观测序列;而另一类数据是不能观察到的,即隐藏状态序列,简称状态序列。
有了这两个特征,那么这个问题一般就可以用HMM模型来尝试解决。这样的问题在实际生活中是很多的。比如:我现在在打字写博客,我在键盘上敲出来的一系列字符就是观测序列,而我实际想写的一段话就是隐藏序列,输入法的任务就是从敲入的一系列字符尽可能的猜测我要写的一段话,并把最可能的词语放在最前面让我选择,这就可以看做一个HMM模型了;再举一个,我在和你说话,我发出的一串连续的声音就是观测序列,而我实际要表达的一段话就是状态序列,你大脑的任务,就是从这一串连续的声音中判断出我最可能要表达的话的内容。
从这些例子中,我们可以发现,HMM模型可以无处不在。下面我们用精确的数学符号来表述我们的HMM模型。
2. HMM模型的定义
对于HMM模型,首先我们假设𝑄是所有可能的隐藏状态的集合,𝑉是所有可能的观测状态的集合,即:
Q
=
{
q
1
,
q
2
,
.
.
.
,
q
N
}
,
V
=
{
v
1
,
v
2
,
.
.
.
,
v
M
}
Q=\left\{ {}q_{1},q_{2},...,q_{N}\right\} ,V=\left\{ v_{1},v_{2,}...,v_{M}\right\}
Q={q1,q2,...,qN},V={v1,v2,...,vM}
其中,𝑁是可能的隐藏状态数,𝑀是所有的可能的观察状态数。
对于一个长度为𝑇的序列,𝐼对应的状态序列, 𝑂是对应的观察序列,即:
I
=
{
i
1
,
i
2
,
.
.
.
,
i
T
}
,
O
=
{
o
1
,
o
2
.
.
.
,
o
T
}
I=\left\{ {}i_{1},i_{2},...,i_{T}\right\} ,O=\left\{ o_{1},o_{2}...,o_{T}\right\}
I={i1,i2,...,iT},O={o1,o2...,oT}
其中,任意一个隐藏状态𝑖𝑡∈𝑄,任意一个观察状态 O t ∈ V O_{t}\in V Ot∈V
HMM模型做了两个很重要的假设如下:
1) 齐次马尔科夫链假设。即任意时刻的隐藏状态只依赖于它前一个隐藏状态。当然这样假设有点极端,因为很多时候我们的某一个隐藏状态不仅仅只依赖于前一个隐藏状态,可能是前两个或者是前三个。但是这样假设的好处就是模型简单,便于求解。如果在时刻𝑡的隐藏状态是
i
t
=
q
i
i_{t}=q_{i}
it=qi,在时刻𝑡+1的隐藏状态是
i
t
+
1
=
q
j
i_{t+1}=q_{j}
it+1=qj, 则从时刻𝑡到时刻𝑡+1的HMM状态转移概率
a
i
j
a_{ij}
aij可以表示为:
a
i
j
=
p
(
i
t
+
1
=
q
j
∣
i
t
=
q
t
)
a_{ij}=p\left( i_{t+1}=q_{j}\mid i_{t}=q_{t}\right)
aij=p(it+1=qj∣it=qt)
这样𝑎𝑖𝑗可以组成马尔科夫链的状态转移矩阵𝐴: A = [ a i j ] N × N A=\left[ a_{ij}\right]_{N\times N} A=[aij]N×N
2) 观测独立性假设。即任意时刻的观察状态只仅仅依赖于当前时刻的隐藏状态,这也是一个为了简化模型的假设。如果在时刻𝑡的隐藏状态是
i
t
=
q
j
i_{t}=q_{j}
it=qj, 而对应的观察状态为
O
t
=
V
k
O_{t}=V_{k}
Ot=Vk, 则该时刻观察状态
V
k
V_{k}
Vk在隐藏状态
Q
j
Q_{j}
Qj下生成的概率为
b
j
(
k
)
b_{j}\left( k\right)
bj(k),满足:
b
j
(
k
)
=
P
(
o
t
=
v
k
∣
i
t
=
q
j
)
b_{j}\left( k\right) =P\left( o_{t}=v_{k}\mid i_{t}=q_{j}\right)
bj(k)=P(ot=vk∣it=qj)
这样𝑏𝑗(𝑘)可以组成观测状态生成的概率矩阵𝐵:
B
=
[
b
j
(
k
)
]
N
×
M
B=\left[ b_{j}\left( k\right) \right]_{N\times M}
B=[bj(k)]N×M
除此之外,我们需要一组在时刻𝑡=1的隐藏状态概率分布 Π \Pi Π: Π = [ π ( i ) ] N 其中π ( i ) = P ( i 1 = q i ) \Pi =\left[ \text{π} \left( i\right) \right]_{N} \ \text{其中} \text{π} \left( i\right) =P\left( i_{1}=q_{i}\right) Π=[π(i)]N 其中π(i)=P(i1=qi)
一个HMM模型,可以由隐藏状态初始概率分布 Π \Pi Π, 状态转移概率矩阵 A A A和观测状态概率矩阵 B B B决定。 Π \Pi Π, A A A决定状态序列, B B B决定观测序列。因此,HMM模型可以由一个三元组𝜆表示如下: λ = ( A , B , Π ) \lambda =\left( A,B,\Pi \right) λ=(A,B,Π)
3.一个HMM模型实例
下面我们用一个简单的实例来描述上面抽象出的HMM模型。这是一个盒子与球的模型。
假设我们有3个盒子,每个盒子里都有红色和白色两种球,这三个盒子里球的数量分别是:
盒子 | 1 | 2 | 3 |
---|---|---|---|
红球数 | 5 | 4 | 7 |
白球数 | 5 | 6 | 3 |
按照下面的方法从盒子里抽球,开始的时候,从第一个盒子抽球的概率是0.2,从第二个盒子抽球的概率是0.4,从第三个盒子抽球的概率是0.4。以这个概率抽一次球后,将球放回。然后从当前盒子转移到下一个盒子进行抽球。规则是:如果当前抽球的盒子是第一个盒子,则以0.5的概率仍然留在第一个盒子继续抽球,以0.2的概率去第二个盒子抽球,以0.3的概率去第三个盒子抽球。如果当前抽球的盒子是第二个盒子,则以0.5的概率仍然留在第二个盒子继续抽球,以0.3的概率去第一个盒子抽球,以0.2的概率去第三个盒子抽球。如果当前抽球的盒子是第三个盒子,则以0.5的概率仍然留在第三个盒子继续抽球,以0.2的概率去第一个盒子抽球,以0.3的概率去第二个盒子抽球。如此下去,直到重复三次,得到一个球的颜色的观测序列: O = { 红,白,红 } O=\left\{ \text{红,白,红} \right\} O={红,白,红}
注意在这个过程中,观察者只能看到球的颜色序列,却不能看到球是从哪个盒子里取出的。
那么按照我们上一节HMM模型的定义,我们的观察集合是:
V
=
{
红,白
}
,
M
=
2
V=\left\{ \text{红,白} \right\} ,M=2
V={红,白},M=2
我们的状态集合是:
Q
=
{
盒子1,盒子2,盒子3
}
,
N
=
3
Q=\left\{ \text{盒子1,盒子2,盒子3} \right\} ,N=3
Q={盒子1,盒子2,盒子3},N=3
而观察序列和状态序列的长度为3.
初始状态分布为:
Π
=
(
0.2
,
0.4
,
0.4
)
T
\Pi =\left( 0.2,0.4,0.4\right)^{T}
Π=(0.2,0.4,0.4)T
状态转移概率分布矩阵为:
A
=
(
0.5
0.2
0.3
0.3
0.5
0.2
0.2
0.3
0.5
)
A=\begin{pmatrix}0.5&0.2&0.3\\ 0.3&0.5&0.2\\ 0.2&0.3&0.5\end{pmatrix}
A=⎝⎛0.50.30.20.20.50.30.30.20.5⎠⎞
观测状态概率矩阵为:
B
=
(
0.5
0.5
0.4
0.6
0.7
0.3
)
B=\begin{pmatrix}0.5&0.5\\ 0.4&0.6\\ 0.7&0.3\end{pmatrix}
B=⎝⎛0.50.40.70.50.60.3⎠⎞
4. HMM观测序列的生成
从上一节的例子,我们也可以抽象出HMM观测序列生成的过程。
输入的是HMM的模型
λ
=
(
A
,
B
,
Π
)
\lambda =\left( A,B,\Pi \right)
λ=(A,B,Π),观测序列的长度𝑇
输出是观测序列
O
=
{
o
1
,
o
2
,
.
.
.
,
o
T
}
O=\left\{ {}o_{1},o_{2},...,o_{T}\right\}
O={o1,o2,...,oT}
生成的过程如下:
- 根据初始状态概率分布Π生成隐藏状态𝑖1
- for t from 1 to T
- 按照隐藏状态𝑖𝑡的观测状态分布 b i t ( k ) b_{i_{t}}\left( k\right) bit(k)生成观察状态 o t o_{t} ot
- 按照隐藏状态𝑖𝑡的状态转移概率分布 a i t i t + 1 a_{i_{t}\ i_{t+1}} ait it+1产生隐藏状态 i t + 1 i_{t+1} it+1
所有的 o t o_{t} ot一起形成观测序列 O = { o 1 , o 2 , . . . , o T } O=\left\{ {}o_{1},o_{2},...,o_{T}\right\} O={o1,o2,...,oT}
5. HMM模型的三个基本问题
HMM模型一共有三个经典的问题需要解决:
-
评估观察序列概率。即给定模型𝜆=(𝐴,𝐵,Π)和观测序列 O = { o 1 , o 2 , . . . , o T } O=\left\{ {}o_{1},o_{2},...,o_{T}\right\} O={o1,o2,...,oT},计算在模型𝜆下观测序列𝑂出现的概率𝑃(𝑂|𝜆)。这个问题的求解需要用到前向后向算法,是HMM模型三个问题中最简单的。
-
模型参数学习问题。即给定观测序列 O = { o 1 , o 2 , . . . , o T } O=\left\{ {}o_{1},o_{2},...,o_{T}\right\} O={o1,o2,...,oT},估计模型𝜆=(𝐴,𝐵,Π)的参数,使该模型下观测序列的条件概率𝑃(𝑂|𝜆)最大。这个问题的求解需要用到基于EM算法的鲍姆-韦尔奇算法,这个问题是HMM模型三个问题中最复杂的。
-
预测问题,也称为解码问题。即给定模型𝜆=(𝐴,𝐵,Π)和观测序列 O = { o 1 , o 2 , . . . , o T } O=\left\{ {}o_{1},o_{2},...,o_{T}\right\} O={o1,o2,...,oT},求给定观测序列条件下,最可能出现的对应的状态序列,这个问题的求解需要用到基于动态规划的维特比算法。这个问题是HMM模型三个问题中复杂度居中的算法。