隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理,模式识别等领域得到广泛的应用。
HMM初探
什么样的问题需要HMM模型
使用HMM模型时我们的问题一般有这两个特征:
- 问题是基于序列的,比如时间序列,或者状态序列。
- 问题中有两类数据,一类序列数据是可以观测到的,即观测序列;而另一类数据是不能观察到的,即隐藏状态序列,简称状态序列。
有了这两个特征,那么这个问题一般可以用HMM模型来尝试解决。这样的问题在实际生活中是很多的。比如:我现在在打字写博客,我在键盘上敲出来的一系列字符就是观测序列,而我实际想写的一段话就是隐藏序列,输入法的任务就是从敲入的一系列字符尽可能的猜测我要写的一段话,并把最可能的词语放在最前面让我选择,这就可以看做一个HMM模型了。再举一个,我在和你说话,我发出的一串连续的声音就是观测序列,而我实际要表达的一段话就是状态序列,你大脑的任务,就是从这一串连续的声音中判断出我最可能要表达的话的内容。
HMM模型的定义
对于HMM模型,首先我们假设Q是所有可能的隐藏状态的集合,V是所有可能的观测状态的集合,即:
Q={q1,q2,...,qN},V={v1,v2,...vM}
其中,N是可能的隐藏状态数,M是所有的可能的观察状态数。
对于一个长度为T的序列,I对应的状态序列, O是对应的观察序列,即:
I={i1,i2,...,iT},O={o1,o2,...oT}
其中,任意一个隐藏状态it∈Q,任意一个观察状态ot∈V
HMM模型做了两个很重要的假设如下:
1) 齐次马尔科夫链假设。即任意时刻的隐藏状态只依赖于它前一个隐藏状态。当然这样假设有点极端,因为很多时候我们的某一个隐藏状态不仅仅只依赖于前一个隐藏状态,可能是前两个或者是前三个。但是这样假设的好处就是模型简单,便于求解。如果在时刻t的隐藏状态是it=qi,在时刻t+1的隐藏状态是it+1=qj, 则从时刻t到时刻t+1的HMM状态转移概率aij可以表示为:
aij=P(it+1=qj∣it=qi)
这样aij可以组成马尔科夫链的状态转移矩阵A:
A=[aij]N×N
2) 观测独立性假设。即任意时刻的观察状态只仅仅依赖于当前时刻的隐藏状态,这也是一个为了简化模型的假设。如果在时刻t的隐藏状态是it=qj, 而对应的观察状态为ot=vk, 则该时刻观察状态vk在隐藏状态qj下生成的概率为bj(k),满足:
bj(k)=P(ot=vk∣it=qj)
这样bj(k)可以组成观测状态生成的概率矩阵B:
B=[bj(k)]N×M
除此之外,我们需要一组在时刻t=1的隐藏状态概率分布Π:
Π=[π(i)]N其中π(i)=P(i1=qi)
一个HMM模型,可以由隐藏状态初始概率分布Π, 状态转移概率矩阵A和观测状态概率矩阵B决定。Π,A决定状态序列,B决定观测序列。因此,HMM模型可以由一个三元组λ表示如下:
λ=(A,B,Π)
一个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={红,白,红}
注意在这个过程中,观察者只能看到球的颜色序列,却不能看到球是从哪个盒子里取出的。
那么按照我们上一节HMM模型的定义,我们的观察集合是:
V={红,白},M=2
我们的状态集合是:
Q={盒子1,盒子2,盒子3},N=3
而观察序列和状态序列的长度为3.
初始状态分布为:
Π=(0.2,0.4,0.4)T
状态转移概率分布矩阵为:
A=⎝⎛0.50.30.20.20.50.30.30.20.5⎠⎞
观测状态概率矩阵为:
B=⎝⎛0.50.40.70.50.60.3⎠⎞
HMM观测序列的生成
从上一节的例子,我们也可以抽象出HMM观测序列生成的过程。
输入的是HMM的模型λ=(A,B,Π),观测序列的长度T
输出是观测序列O={o1,o2,...oT}
生成的过程如下:
1)根据初始状态概率分布Π生成隐藏状态i1
2) for t from 1 to T
a. 按照隐藏状态it的观测状态分布bit(k)生成观察状态ot
b. 按照隐藏状态it的状态转移概率分布ait产生隐藏状态it+1
所有的ot一起形成观测序列O={o1,o2,...oT}
HMM模型的三个基本问题
HMM模型一共有三个经典的问题需要解决:
1) 评估观察序列概率。即给定模型λ=(A,B,Π)和观测序列O={o1,o2,...oT},计算在模型λ下观测序列O出现的概率P(O∣λ)。这个问题是HMM模型三个问题中最简单的。
2)模型参数学习问题。即给定观测序列O={o1,o2,...oT},估计模型λ=(A,B,Π)的参数,使该模型下观测序列的条件概率P(O∣λ)最大。这个问题的求解需要用到基于EM算法的鲍姆-韦尔奇算法,这个问题是HMM模型三个问题中最复杂的。
3)预测问题,也称为解码问题。即给定模型λ=(A,B,Π)和观测序列O={o1,o2,...oT},求给定观测序列条件下,最可能出现的对应的状态序列,这个问题的求解需要用到基于动态规划的维特比算法,这个问题是HMM模型三个问题中复杂度居中的算法。
用前向算法求HMM观测序列的概率
回顾HMM问题一:求观测序列的概率
首先我们回顾下HMM模型的问题一。这个问题是这样的。我们已知HMM模型的参数λ=(A,B,Π)。其中A是隐藏状态转移概率的矩阵,B是观测状态生成概率的矩阵, Π是隐藏状态的初始概率分布。同时我们也已经得到了观测序列O={o1,o2,...oT},现在我们要求观测序列O在模型λ下出现的条件概率P(O∣λ)。
乍一看,这个问题很简单。因为我们知道所有的隐藏状态之间的转移概率和所有从隐藏状态到观测状态生成概率,那么我们是可以暴力求解的。
我们可以列举出所有可能出现的长度为T的隐藏序列I={i1,i2,...,iT},分布求出这些隐藏序列与观测序列O={o1,o2,...oT}的联合概率分布P(O,I∣λ),这样我们就可以很容易的求出边缘分布P(O∣λ)了。
具体暴力求解的方法是这样的:首先,任意一个隐藏序列I={i1,i2,...,iT}出现的概率是:
P(I∣λ)=πi1ai1i2ai2i3...aiT−1iT
对于固定的状态序列I={i1,i2,...,iT},我们要求的观察序列O={o1,o2,...oT}出现的概率是:
P(O∣I,λ)=bi1(o1)bi2(o2)...biT(oT)
则O和I联合出现的概率是:
P(O,I∣λ)=P(I∣λ)P(O∣I,λ)=πi1bi1(o1)ai1i2bi2(o2)...aiT−1iTbiT(oT)
然后求边缘概率分布,即可得到观测序列O在模型λ下出现的条件概率P(O∣λ):
P(O∣λ)=I∑P(O,I∣λ)=i1,i2,...iT∑πi1bi1(o1)ai1i2bi2(o2)...aiT−1iTbiT(oT)
虽然上述方法有效,但是如果我们的隐藏状态数N非常多的那就麻烦了,此时我们预测状态有NT种组合,算法的时间复杂度是O(TNT)阶的。因此对于一些隐藏状态数极少的模型,我们可以用暴力求解法来得到观测序列出现的概率,但是如果隐藏状态多,则上述算法太耗时,我们需要寻找其他简洁的算法。
前向后向算法就是来帮助我们在较低的时间复杂度情况下求解这个问题的。
用前向算法求HMM观测序列的概率
前向后向算法是前向算法和后向算法的统称,这两个算法都可以用来求HMM观测序列的概率。我们先来看看前向算法是如何求解这个问题的。
前向算法本质上属于动态规划的算法,也就是我们要通过找到局部状态递推的公式,这样一步步的从子问题的最优解拓展到整个问题的最优解。
在前向算法中,通过定义“前向概率”来定义动态规划的这个局部状态。什么是前向概率呢, 其实定义很简单:定义时刻t时隐藏状态为qi, 观测状态的序列为o1,o2,...ot的概率为前向概率。记为:
αt(i)=P(o1,o2,...ot,it=qi∣λ)
既然是动态规划,我们就要递推了,现在我们假设我们已经找到了在时刻tt时各个隐藏状态的前向概率,现在我们需要递推出时刻t+1时各个隐藏状态的前向概率。
从下图可以看出,我们可以基于时刻t时各个隐藏状态的前向概率,再乘以对应的状态转移概率,即αt(j)aji就是在时刻t观测到o1,o2,...ot,并且时刻t隐藏状态qj, 时刻t+1隐藏状态qi的概率。如果将想下面所有的线对应的概率求和,即j=1∑Nαt(j)aji就是在时刻t观测到o1,o2,...ot,并且时刻t+1隐藏状态qi的概率。继续一步,由于观测状态ot+1只依赖于t+1时刻隐藏状态qi, 这样[j=1∑Nαt(j)aji]bi(ot+1)就是在在时刻t+1观测到o1,o2,...ot,ot+1,并且时刻t+1隐藏状态qi的概率。而这个概率,恰恰就是时刻t+1对应的隐藏状态i的前向概率,这样我们得到了前向概率的递推关系式如下:
αt+1(i)=[j=1∑Nαt(j)aji]bi(ot+1)
我们的动态规划从时刻1开始,到时刻T结束,由于αT(i)表示在时刻T观测序列为o1,o2,...oT,并且时刻T隐藏状态qi的概率,我们只要将所有隐藏状态对应的概率相加,即i=1∑NαT(i)就得到了在时刻T观测序列为o1,o2,...oT的概率。
下面总结下前向算法。
输入:HMM模型λ=(A,B,Π),观测序列O=(o1,o2,...oT)
输出:观测序列概率P(O∣λ)
1) 计算时刻1的各个隐藏状态前向概率:
α1(i)=πibi(o1),i=1,2,...N
2) 递推时刻2,3,...T时刻的前向概率:
αt+1(i)=[j=1∑Nαt(j)aji]bi(ot+1),i=1,2,...N
3) 计算最终结果:
P(O∣λ)=i=1∑NαT(i)
从递推公式可以看出,我们的算法时间复杂度是O(TN2),比暴力解法的时间复杂度O(TNT)少了几个数量级。
HMM前向算法求解实例
这里我们用上面盒子与球的例子来显示前向概率的计算。
我们的观察集合是:
V={红,白},M=2
我们的状态集合是:
Q={盒子1,盒子2,盒子3},N=3
而观察序列和状态序列的长度为3.
初始状态分布为:
Π=(0.2,0.4,0.4)T
状态转移概率分布矩阵为:
A=⎝⎛0.50.30.20.20.50.30.30.20.5⎠⎞
观测状态概率矩阵为:
B=⎝⎛0.50.40.70.50.60.3⎠⎞
球的颜色的观测序列:
O={红,白,红}
按照前向算法。首先计算时刻1三个状态的前向概率:
时刻1是红色球,隐藏状态是盒子1的概率为:
α1(1)=π1b1(o1)=0.2×0.5=0.1
隐藏状态是盒子2的概率为:
α1(2)=π2b2(o1)=0.4×0.4=0.16
隐藏状态是盒子3的概率为:
α1(3)=π3b3(o1)=0.4×0.7=0.28
现在我们可以开始递推了,首先递推时刻2三个状态的前向概率:
时刻2是白色球,隐藏状态是盒子1的概率为:
α2(1)=[i=1∑3α1(i)ai1]b1(o2)=[0.1∗0.5+0.16∗0.3+0.28∗0.2]×0.5=0.077
隐藏状态是盒子2的概率为:
α2(2)=[i=1∑3α1(i)ai2]b2(o2)=[0.1∗0.2+0.16∗0.5+0.28∗0.3]×0.6=0.1104
隐藏状态是盒子3的概率为:
α2(3)=[i=1∑3α1(i)ai3]b3(o2)=[0.1∗0.3+0.16∗0.2+0.28∗0.5]×0.3=0.0606
继续递推,现在我们递推时刻3三个状态的前向概率:
时刻3是红色球,隐藏状态是盒子1的概率为:
α3(1)=[i=1∑3α2(i)ai1]b1(o3)=[0.077∗0.5+0.1104∗0.3+0.0606∗0.2]×0.5=0.04187
隐藏状态是盒子2的概率为:
α3(2)=[i=1∑3α2(i)ai2]b2(o3)=[0.077∗0.2+0.1104∗0.5+0.0606∗0.3]×0.4=0.03551
隐藏状态是盒子3的概率为:
α3(3)=[i=1∑3α3(i)ai3]b3(o3)=[0.077∗0.3+0.1104∗0.2+0.0606∗0.5]×0.7=0.05284
最终我们求出观测序列:O={红,白,红}的概率为:
P(O∣λ)=i=1∑3α3(i)=0.13022
用后向算法求HMM观测序列的概率
后向算法和前向算法非常类似,都是用的动态规划,唯一的区别是选择的局部状态不同,后向算法用的是“后向概率”,那么后向概率是如何定义的呢?
定义时刻t时隐藏状态为qi, 从时刻t+1到最后时刻T的观测状态的序列为ot+1,ot+2,...oT的概率为后向概率。记为:
βt(i)=P(ot+1,ot+2,...oT∣it=qi,λ)
后向概率的动态规划递推公式和前向概率是相反的。现在我们假设我们已经找到了在时刻t+1时各个隐藏状态的后向概率βt+1(j),现在我们需要递推出时刻t时各个隐藏状态的后向概率。如下图,我们可以计算出观测状态的序列为ot+2,ot+3,...oT,t时隐藏状态为qi, 时刻t+1隐藏状态为qj的概率为aijβt+1(j), 接着可以得到观测状态的序列为ot+1,ot+2,...oT,t时隐藏状态为qi, 时刻t+1隐藏状态为qj的概率为aijbj(ot+1)βt+1(j), 则把下面所有线对应的概率加起来,我们可以得到观测状态的序列为ot+1,ot+2,...oT,t时隐藏状态为qi的概率为j=1∑Naijbj(ot+1)βt+1(j),这个概率即为时刻t的后向概率。
这样我们得到了后向概率的递推关系式如下:
βt(i)=j=1∑Naijbj(ot+1)βt+1(j)
现在我们总结下后向算法的流程,注意下和前向算法的相同点和不同点:
输入:HMM模型λ=(A,B,Π),观测序列O=(o1,o2,...oT)
输出:观测序列概率P(O∣λ)
1) 初始化时刻T的各个隐藏状态后向概率:
βT(i)=1,i=1,2,...N
2) 递推时刻T−1,T−2,...1时刻的后向概率:
βt(i)=j=1∑Naijbj(ot+1)βt+1(j),i=1,2,...N
3) 计算最终结果:
P(O∣λ)=i=1∑Nπibi(o1)β1(i)
此时我们的算法时间复杂度仍然是O(TN2)。
HMM常用概率的计算
利用前向概率和后向概率,我们可以计算出HMM中单个状态和两个状态的概率公式。
1)给定模型λ和观测序列O,在时刻t处于状态qi的概率记为:
γt(i)=P(it=qi∣O,λ)=P(O∣λ)P(it=qi,O∣λ)
利用前向概率和后向概率的定义可知:
P(it=qi,O∣λ)=αt(i)βt(i)
于是我们得到:
γt(i)=j=1∑Nαt(j)βt(j)αt(i)βt(i)
2)给定模型λ和观测序列O,在时刻t处于状态qi,且时刻t+1处于状态qj的概率记为:
ξt(i,j)=P(it=qi,it+1=qj∣O,λ)=P(O∣λ)P(it=qi,it+1=qj,O∣λ)
而P(it=qi,it+1=qj,O∣λ)可以由前向后向概率来表示为:
P(it=qi,it+1=qj,O∣λ)=αt(i)aijbj(ot+1)βt+1(j)
从而最终我们得到ξt(i,j)的表达式如下:
ξt(i,j)=r=1∑Ns=1∑Nαt(r)arsbs(ot+1)βt+1(s)αt(i)aijbj(ot+1)βt+1(j)
3) 将γt(i)和ξt(i,j)在各个时刻t求和,可以得到:
在观测序列O下状态i出现的期望值t=1∑Tγt(i)
在观测序列O下由状态i转移的期望值t=1∑T−1γt(i)
在观测序列O下由状态i转移到状态j的期望值t=1∑T−1ξt(i,j)
上面这些常用的概率值在求解HMM模型参数的时候需要用到。.
鲍姆-韦尔奇算法求解HMM参数
HMM模型参数求解概述
HMM模型参数求解根据已知的条件可以分为两种情况。
第一种情况较为简单,就是我们已知D个长度为T的观测序列和对应的隐藏状态序列,即{(O1,I1),(O2,I2),...(OD,ID)}是已知的,此时我们可以很容易的用最大似然来求解模型参数。
假设样本从隐藏状态qi转移到qj的频率计数是Aij,那么状态转移矩阵求得为:
A=[aij],其中aij=s=1∑NAisAij
假设样本隐藏状态为qj且观测状态为vk的频率计数是Bjk,那么观测状态概率矩阵为:
B=[bj(k)],其中bj(k)=s=1∑MBjsBjk
假设所有样本中初始隐藏状态为qi的频率计数为C(i),那么初始概率分布为:
Π=π(i)=s=1∑NC(s)C(i)
可见第一种情况下求解模型还是很简单的。但是在很多时候,我们无法得到HMM样本观察序列对应的隐藏序列,只有D个长度为T的观测序列,即{(O1),(O2),...(OD)}是已知的,此时我们能不能求出合适的HMM模型参数呢?这就是我们的第二种情况,也是我们本文要讨论的重点。它的解法最常用的是鲍姆-韦尔奇算法,其实就是基于EM算法的求解,只不过鲍姆-韦尔奇算法出现的时代,EM算法还没有被抽象出来,所以我们本文还是说鲍姆-韦尔奇算法。
鲍姆-韦尔奇算法原理
鲍姆-韦尔奇算法原理既然使用的就是EM算法的原理,那么我们需要在E步求出联合分布P(O,I∣λ)基于条件概率P(I∣O,λ)的期望,其中λ为当前的模型参数,然后再M步最大化这个期望,得到更新的模型参数λ。接着不停的进行EM迭代,直到模型参数的值收敛为止。
首先来看看E步,当前模型参数为λ, 联合分布P(O,I∣λ)基于条件概率P(I∣O,λ)的期望表达式为:
L(λ,λ)=I∑P(I∣O,λ)logP(O,I∣λ)
在M步,我们极大化上式,然后得到更新后的模型参数如下:
λ=argλmaxI∑P(I∣O,λ)logP(O,I∣λ)
通过不断的E步和M步的迭代,直到λ收敛。下面我们来看看鲍姆-韦尔奇算法的推导过程。
鲍姆-韦尔奇算法的推导
我们的训练数据为{(O1,I1),(O2,I2),...(OD,ID)},其中任意一个观测序列Od={o1(d),o2(d),...oT(d)},其对应的未知的隐藏状态序列表示为:Id={i1(d),i2(d),...iT(d)}
首先看鲍姆-韦尔奇算法的E步,我们需要先计算联合分布P(O,I∣λ)的表达式如下:
P(O,I∣λ)=d=1∏Dπi1(d)bi1(d)(o1(d))ai1(d)i2(d)bi2(d)(o2(d))...aiT−1(d)iT(d)biT(d)(oT(d))
我们的E步得到的期望表达式为:
L(λ,λ)=I∑P(I∣O,λ)logP(O,I∣λ)
在M步我们要极大化上式。由于P(I∣O,λ)=P(I,O∣λ)/P(O∣λ),而P(O∣λ)是常数,因此我们要极大化的式子等价于:
λ=argλmaxI∑P(O,I∣λ)logP(O,I∣λ)
我们将上面P(O,I∣λ)的表达式带入我们的极大化式子,得到的表达式如下:
λ=argλmaxd=1∑DI∑P(O,I∣λ)(logπi1+t=1∑T−1logait,it+1+t=1∑Tlogbit(ot))
我们的隐藏模型参数λ=(A,B,Π),因此下面我们只需要对上式分别对A,B,Π求导即可得到我们更新的模型参数λ
首先我们看看对模型参数Π的求导。由于Π只在上式中括号里的第一部分出现,因此我们对于Π的极大化式子为:
πi=argπi1maxd=1∑DI∑P(O,I∣λ)logπi1=argπimaxd=1∑Di=1∑NP(O,i1(d)=i∣λ)logπi
由于πi还满足i=1∑Nπi=1,因此根据拉格朗日子乘法,我们得到πi要极大化的拉格朗日函数为:
argπimaxd=1∑Di=1∑NP(O,i1(d)=i∣λ)logπi+γ(i=1∑Nπi−1)
其中,γ为拉格朗日系数。上式对πi求偏导数并令结果为0, 我们得到:
d=1∑DP(O,i1(d)=i∣λ)+γπi=0
令i分别等于从1到N,从上式可以得到N个式子,对这N个式子求和可得:
d=1∑DP(O∣λ)+γ=0
从上两式消去γ,得到πi的表达式为:
πi=d=1∑DP(O∣λ)d=1∑DP(O,i1(d)=i∣λ)=DP(O∣λ)d=1∑DP(O,i1(d)=i∣λ)=Dd=1∑DP(i1(d)=i∣O,λ)=Dd=1∑DP(i1(d)=i∣O(d),λ)
利用前向概率的定义可得:
P(i1(d)=i∣O(d),λ)=γ1(d)(i)
因此最终我们在M步πi的迭代公式为:
πi=Dd=1∑Dγ1(d)(i)
现在我们来看看A的迭代公式求法。方法和Π的类似。由于A只在最大化函数式中括号里的第二部分出现,而这部分式子可以整理为:
d=1∑DI∑t=1∑T−1P(O,I∣λ)logait,it+1=d=1∑Di=1∑Nj=1∑Nt=1∑T−1P(O,it(d)=i,it+1(d)=j∣λ)logaij
由于aij还满足j=1∑Naij=1。和求解πiπi类似,我们可以用拉格朗日子乘法并对aij求导,并令结果为0,可以得到aij的迭代表达式为:
aij=d=1∑Dt=1∑T−1P(O(d),it(d)=i∣λ)d=1∑Dt=1∑T−1P(O(d),it(d)=i,it+1(d)=j∣λ)
利用前向概率的定义和的定义可得们在M步aij的迭代公式为:
aij=d=1∑Dt=1∑T−1γt(d)(i)d=1∑Dt=1∑T−1ξt(d)(i,j)
现在我们来看看B的迭代公式求法。方法和Π的类似。由于B只在最大化函数式中括号里的第三部分出现,而这部分式子可以整理为:
d=1∑DI∑t=1∑TP(O,I∣λ)logbit(ot)=d=1∑Dj=1∑Nt=1∑TP(O,it(d)=j∣λ)logbj(ot)
由于bj(ot)还满足k=1∑Mbj(ot=vk)=1。和求解πi类似,我们可以用拉格朗日子乘法并对bj(k)求导,并令结果为0,得到bj(k)的迭代表达式为:
bj(k)=d=1∑Dt=1∑TP(O,it(d)=j∣λ)d=1∑Dt=1∑TP(O,it(d)=j∣λ)I(ot(d)=vk)
其中I(ot(d)=vk)当且仅当ot(d)=vk时为1,否则为0. 利用前向概率的定义可得bj(ot)的最终表达式为:
bj(k)=d=1∑Dt=1∑Tγt(d)(j)d=1∑Dt=1,ot(d)=vk∑Tγt(d)(j)
有了πi,aij,bj(k)的迭代公式,我们就可以迭代求解HMM模型参数了。
鲍姆-韦尔奇算法流程总结
这里我们概括总结下鲍姆-韦尔奇算法的流程。
输入: D个观测序列样本{(O1),(O2),...(OD)}
输出:HMM模型参数
1)随机初始化所有的πi,aij,bj(k)
2) 对于每个样本d=1,2,...D,用前向后向算法计算γt(d)(i),ξt(d)(i,j),t=1,2...T
3) 更新模型参数:
πi=Dd=1∑Dγ1(d)(i)aij=d=1∑Dt=1∑T−1γt(d)(i)d=1∑Dt=1∑T−1ξt(d)(i,j)bj(k)=d=1∑Dt=1∑Tγt(d)(j)d=1∑Dt=1,ot(d)=vk∑Tγt(d)(j)
4) 如果πi,aij,bj(k)的值s已经收敛,则算法结束,否则回到第2)步继续迭代。
以上就是鲍姆-韦尔奇算法的整个过程。
维特比算法解码隐藏状态序列
接下来我们讨论HMM模型最后一个问题的求解,即给定模型和观测序列,求给定观测序列条件下,最可能出现的对应的隐藏状态序列。
HMM最可能隐藏状态序列求解概述
在HMM模型的解码问题中,给定模型λ=(A,B,Π)和观测序列O={o1,o2,...oT},求给定观测序列O条件下,最可能出现的对应的状态序列I∗={i1∗,i2∗,...iT∗},即P(I∗∣O)要最大化。
一个可能的近似解法是求出观测序列O在每个时刻t最可能的隐藏状态it∗然后得到一个近似的隐藏状态序列I∗={i1∗,i2∗,...iT∗}。要这样近似求解不难,利用前向后向算法评估观察序列概率的定义:在给定模型λ和观测序列O时,在时刻t处于状态qi的概率是γt(i),这个概率可以通过HMM的前向算法与后向算法计算。这样我们有:
it∗=arg1≤i≤Nmax[γt(i)],t=1,2,...T
近似算法很简单,但是却不能保证预测的状态序列是整体是最可能的状态序列,因为预测的状态序列中某些相邻的隐藏状态可能存在转移概率为0的情况。
而维特比算法可以将HMM的状态序列作为一个整体来考虑,避免近似算法的问题,下面我们来看看维特比算法进行HMM解码的方法。
维特比算法概述
维特比算法是一个通用的解码算法,是基于动态规划的求序列最短路径的方法。
既然是动态规划算法,那么就需要找到合适的局部状态,以及局部状态的递推公式。在HMM中,维特比算法定义了两个局部状态用于递推。
第一个局部状态是在时刻t隐藏状态为i所有可能的状态转移路径i1,i2,...it中的概率最大值。记为δt(i):
δt(i)=i1,i2,...it−1maxP(it=i,i1,i2,...it−1,ot,ot−1,...o1∣λ),i=1,2,...N
由δt(i)的定义可以得到δ的递推表达式:
KaTeX parse error: No such environment: align at position 8:
\begin{̲a̲l̲i̲g̲n̲}̲ \delta_{t+1}(i…
第二个局部状态由第一个局部状态递推得到。我们定义在时刻t隐藏状态为i的所有单个状态转移路径(i1,i2,...,it−1,i)中概率最大的转移路径中第t−1个节点的隐藏状态为Ψt(i),其递推表达式可以表示为:
Ψt(i)=arg1≤j≤Nmax[δt−1(j)aji]
有了这两个局部状态,我们就可以从时刻0一直递推到时刻T,然后利用Ψt(i)记录的前一个最可能的状态节点回溯,直到找到最优的隐藏状态序列。
维特比算法流程总结
现在我们来总结下维特比算法的流程:
输入:HMM模型λ=(A,B,Π),观测序列O=(o1,o2,...oT)
输出:最有可能的隐藏状态序列I∗={i1∗,i2∗,...iT∗}
1)初始化局部状态:
δ1(i)=πibi(o1),i=1,2...NΨ1(i)=0,i=1,2...N
2) 进行动态规划递推时刻t=2,3,...T时刻的局部状态:
δt(i)=1≤j≤Nmax[δt−1(j)aji]bi(0t),i=1,2...NΨt(i)=arg1≤j≤Nmax[δt−1(j)aji],i=1,2...N
3) 计算时刻T最大的δT(i),即为最可能隐藏状态序列出现的概率。计算时刻T最大的Ψt(i),即为时刻T最可能的隐藏状态。
P∗=1≤j≤NmaxδT(i)iT∗=arg1≤j≤Nmax[δT(i)]
4) 利用局部状态Ψ(i)开始回溯。对于t=T−1,T−2,...,1:
it∗=Ψt+1(it+1∗)
最终得到最有可能的隐藏状态序列I∗={i1∗,i2∗,...iT∗}
HMM维特比算法求解实例
下面我们仍然用盒子与球的例子来看看HMM维特比算法求解。
我们的观察集合是:
V={红,白},M=2
我们的状态集合是:
Q={盒子1,盒子2,盒子3},N=3
而观察序列和状态序列的长度为3.
初始状态分布为:
Π=(0.2,0.4,0.4)T
状态转移概率分布矩阵为:
A=⎝⎛0.50.30.20.20.50.30.30.20.5⎠⎞
观测状态概率矩阵为:
B=⎝⎛0.50.40.70.50.60.3⎠⎞
球的颜色的观测序列:
O={红,白,红}
按照维特比算法,首先需要得到三个隐藏状态在时刻1时对应的各自两个局部状态,此时观测状态为1:
δ1(1)=π1b1(o1)=0.2×0.5=0.1δ1(2)=π2b2(o1)=0.4×0.4=0.16δ1(3)=π3b3(o1)=0.4×0.7=0.28Ψ1(1)=Ψ1(2)=Ψ1(3)=0
现在开始递推三个隐藏状态在时刻2时对应的各自两个局部状态,此时观测状态为2:
δ2(1)=1≤j≤3max[δ1(j)aj1]b1(o2)=1≤j≤3max[0.1×0.5,0.16×0.3,0.28×0.2]×0.5=0.028Ψ2(1)=3δ2(2)=1≤j≤3max[δ1(j)aj2]b2(o2)=1≤j≤3max[0.1×0.2,0.16×0.5,0.28×0.3]×0.6=0.0504Ψ2(2)=3δ2(3)=1≤j≤3max[δ1(j)aj3]b3(o2)=1≤j≤3max[0.1×0.3,0.16×0.2,0.28×0.5]×0.3=0.042Ψ2(3)=3
继续递推三个隐藏状态在时刻3时对应的各自两个局部状态,此时观测状态为1:
δ3(1)=1≤j≤3max[δ2(j)aj1]b1(o3)=1≤j≤3max[0.028×0.5,0.0504×0.3,0.042×0.2]×0.5=0.00756Ψ3(1)=2δ3(2)=1≤j≤3max[δ2(j)aj2]b2(o3)=1≤j≤3max[0.028×0.2,0.0504×0.5,0.042×0.3]×0.4=0.01008Ψ3(2)=2δ3(3)=1≤j≤3max[δ2(j)aj3]b3(o3)=1≤j≤3max[0.028×0.3,0.0504×0.2,0.042×0.5]×0.7=0.0147Ψ3(3)=3
此时已经到最后的时刻,我们开始准备回溯。此时最大概率为δ3(3),从而得到i3∗=3
由于Ψ3(3)=3,所以i2∗=3, 而又由于Ψ2(3)=3,所以i1∗=3。从而得到最终的最可能的隐藏状态序列为:(3,3,3)