1. 前言
前向算法和后向算法主要还是针对HMM三大问题之一的评估问题的计算,即给定模型参数,计算观察序列的概率。文章不介绍过多公式,主要看两个例子
复习一下HMM的三大要素(以海藻(可观测)和天气(隐状态)为例):
①初始概率向量:当前时刻天气的可能性,属于先验概率
②状态转移矩阵:从当前天气转移到下一个天气的可能性,比如P(雨天|晴天)即为晴天转移到雨天的概率
③混淆矩阵:当前天气为某种天气的时候,海藻状态为某种状态的可能性,比如P(干燥|晴天)即为晴天时候海藻干燥的概率
问题:给定HMM模型参数以及海藻的三天状态:干燥、湿润、湿透。
目的:求解海藻出现这三种状态的概率。
2. 穷举搜索直接计算
2.1 理论介绍
已知:给定HMM模型参数λ=(π,A,B),和观察序列
求解:观测序列O出现的概率P(O|I,λ)
方法:列举所有可能的状态,分别求解各个状态序列与观测序列的联合概率P(O,I | λ),最后求和就得到了P(O|λ)
具体过程:
①状态序列出现的概率是
②对于其中一种状态序列,观测序列的概率是
依据贝叶斯公式可以计算
③求和
2.2 实例推导
给定隐马尔可夫模型,也就是在模型参数(π,A,B)已知的情况下,我们想找到观察序列的概率。
最直接的方法是列举出每种可能的转移,如下图所示(借用英文文献中的那个例子):
图中展示了三天的海藻状态,第一列对应第一天海藻为dry时候三种可能的天气隐状态,第二列对应第二天海藻为damp时候三种可能的天气隐状态,第三列对应第三天海藻为soggy时候三种可能的天气隐状态;每个隐状态都有一个概率指向当前可能的海藻状态,由混淆矩阵给出;从第一天到第二天和第二天到第三天的天气隐状态之间都有转移概率,由转移概率矩阵给出。
计算观察序列概率的方法是找到所有的可能路径,因为每种海藻观察情况都有三种可能天气,所以共有33=27条路径,即27种不同的天气序列,然后将所有可能的观察序列的概率加和起来:
不适用于大的模型和较长的序列。可以利用概率的时间不变性减少问题的复杂性。
3.前向算法
3.1 理论推导
前向概率:给定隐马尔科夫模型λ,定义到时刻 t 部分观测序列为,状态的概率为前向概率:
说白了就是计算当给出模型参数的时候,计算一个观测序列和第 t 时刻为状态的联合概率,这是一个递推的过程,可以一层一层的计算,而不是像列举法,直接一条路径走到头,然后再计算下一条路径;最后能够通过加和递推得到P(O|λ)
已知:因马尔科夫模型λ和观测序列O
输出:观测序列概率P(O | λ )
方法:前向概率递推得到P(O,I | λ),加和得到P(O | λ)
具体过程:
① 初值,计算第一个时间点处于各隐状态的概率
等式右边表示最初第i个状态出现的概率,乘以在这个状态下,某个观测状态的概率。不懂没关系,待会看天气的实例解释。
② 递推
中括号意思就是当前层的所有N个隐状态与下一层的第i个状态的连接,里面的 α 是到时刻t部分观测序列为,且在 t 时刻处于状态 j 的概率(前向计算给出,第一层用的是过程①),a是 t 时刻第 j 个状态到 t+1 时刻第 i 个状态的转移情况(转移矩阵给出);中括号外面乘以的b是当前状态下,对应观测情况发生的概率,比如当前是晴天,那么晴天对应海藻湿润的概率是什么呢?就是b,由混淆矩阵给出。
③终止
其实就是求解在时刻t,所有状态的概率求和。
前向算法的高效在于:利用路径结构将前向概率递推到全局。在t=1时刻,计算每个状态与观测情况的联合概率;t=2...T的时候,计算状态与观测情况的联合概率时都用到了前一个时刻刚计算出来的联合概率。
穷举法时间复杂度:TNT
前向算法的时间复杂度:N2T其中T是指观察序列的长度,N是指隐藏状态数目。
【注】每次前向得到的均为隐状态和观测情况的联合概率,因而最后一步需要来一次加法。
3.2 实例分解
将上述三步推广到三天海藻观察和天气状态中:
(1)计算t=1时的局部概率
局部概率的计算公式:
αt ( j )= Pr( t=1时刻的海藻观察 | 隐藏状态 j ) x Pr( t=1 时刻每个隐状态可能发生的初始概率)
所以初始时刻状态 j 的局部概率依赖于此状态的初始概率及相应时刻我们所见的观察概率。
(2) 计算 t >1 时的局部概率
αt ( j )= Pr( t 时刻海藻的观察情况 | 隐藏状态 j ) x Pr( t 时刻状态到 t+1时刻状态的转移概率)
假设乘号左边项Pr( 观察情况 | 隐藏状态 )已经有了,需要考虑右边Pr( t 时刻所有指向 j 状态的路径)
计算到达某个状态的所有路径的概率。可以计算到达此状态的每条路径的概率并对它们求和。
计算α所需要的路径数目随着观察序列的增加而指数级递增。但是t-1时刻给出了所有到达此状态的前一路径概率。因此,我们可以通过t-1时刻的局部概率定义 t 时刻的局部概率。即:
我们计算的这个概率等于相应的观察概率 ( t+1时在状态 j 的观察概率)与该时刻到达此状态的概率总和(上一步每个局部概率的计算结果与相应的状态转移概率乘积后再相加)的乘积。假设式子中t=1,拿上图为例,第三列的中间节点代表的就是观察海藻处于某种状态时出现某种天气的概率即b,后面的加和项就是第二列三个节点的概率与对应转移到第三排中间结点概率的乘积的和。
(3)将第(2)步按照下表j(所有状态)加和起来即可
4. 后向算法
后向概率:给定隐马尔可夫模型,定义在时刻t状态为的条件下,从t+1时刻到T的部分观测序列为后向概率
用递推方法求后向概率,但是并非用简单的加法得到P(O|λ)
具体过程(参考李航《统计学习方法》):
输入:隐马尔可夫模型λ,观测序列O
输出:观测序列概率P(O|λ)
①初始化后向概率,最终时刻的所有状态规定
②对于t=T-1,T-2,...1递推计算,时刻 t 状态为条件下时刻t+1之后的观测序列为的后向概率,其实就是第t+1 时刻的N个状态到t 时刻状态的转移概率乘以t+1时刻每个隐状态对应的观察情况为o(t+1)的概率,再乘以状态j之后的观测序列的后向概率,此项能够递推得到
③计算一种加和,但是与前向算法的加和还不一样,它的含义是与步骤②一样的,只不过初始概率 π 代替了转移概率 a
5. 统一写法
《统计学习方法》中将前向算法和后向算法统一起来归纳了
6. 前向算法实例
6.1 海藻的实例
由马尔可夫模型MM可知:由一个状态转移至另一个状态中,存在着转移概率,并对这种转移概率可以依据其紧接的前一种状态推算出来,与该系统原始状态和此次转移前的马尔可夫过程无关。
隐马尔可夫模型(Hidden Markov models ,HMM)是马尔可夫链的一种,它的状态不能直接观察到,但能通过观测向量序列观察到,每个观测向量都是通过某些概率密度分布表现为各种状态,每一个观测向量是由一个具有相应概率密度分布的状态序列产生的。
假设连续观察三天的水藻湿度为(Dry,Damp,Soggy),求出该观察序列的概率。天气状态有三类(Sunny,Cloudy,Rainy),而且海藻湿度和天气有一定关系。
已知:
1> 隐藏状态:Sunny,Cloudy,Rainy
海藻湿度有四类:{Dry,Dryish,Damp,Soggy}
2> 观察状态序列:{Dry,Damp,Soggy}
3> 初始状态序列:Sunny(0.63),Cloudy(0.17),Rainy(0.20)
4> 状态转移矩阵
| Sunny | Cloudy | Rainy |
Sunny | 0.5 | 0.375 | 0.125 |
Cloudy | 0.25 | 0.125 | 0.625 |
Rainy | 0.25 | 0.375 | 0.375 |
Cloudy(昨天)→Sunny(今天)的概率是0.25
Sunny(昨天)→Rainy(今天)的概率是0.125
5> 混淆矩阵
| Dry | Dryish | Damp | Soggy |
Sunny | 0.6 | 0.2 | 0.15 | 0.05 |
Cloudy | 0.25 | 0.25 | 0.25 | 0.25 |
Rainy | 0.05 | 0.10 | 0.35 | 0.50 |
怎么计算观察序列的概率?
即统计P(observation|Sunny,Sunny, Sunny)+P(observation| Sunny, Sunny, Cloudy)+ P(observation| Sunny,Sunny,Rainy)+ P(observation| Sunny, Cloudy, Sunny) + P(observation| Sunny, Cloudy,Cloudy)+ P(observation| Sunny, Cloudy, Rainy) + …总共33种可能性。
实际由于马尔可夫模型,第二天的状况只取决于第一天,第三天的只取决于第二天,与第一天的天气没关系。
① 先求第一天的P(Day1-Sunny),P(Day1-Cloudy),P(Day1-Rainy),Day1的海藻湿度是Dry
P(Day1-Sunny) =0.63*0.6;
P(Day1-Cloudy)=0.17*0.25;
P(Day1-Rain)=0.20*0.05;
② 再求第二天的P(Day2-Sunny),P(Day2-Cloudy),P(Day2-Rainy), Day2的海藻湿度是Damp
P(Day2-Sunny)=(P(Day1-Sunny)*0.5 + P(Day1-Cloudy)*0.25 +P(Day1-Rainy)*0.25)* 0.15
P(Day2-Cloudy) =(P(Day1-Sunny)*0.375+ P(Day1-Cloudy)*0.125 + P(Day1-Rainy)*0.375) * 0.25
P(Day2-Rainy) =(P(Day1-Sunny)*0.125+P(Day1-Cloudy)*0.625 + P(Day1-Rainy)*0.375)* 0.35
同理继续求第三日的各天气概率,Day3的海藻湿度是soggy。
P(Day3-Suny)=(P(Day2-Sunny)*0.5 + P(Day2-Cloudy)*0.25 +P(Day2-Rainy)*0.25)* 0.05
P(Day3-Cloudy) =(P(Day2-Sunny)*0.375+ P(Day2-Cloudy)*0.125 + P(Day2-Rainy)*0.375) * 0.25
P(Day3-Rainy)=(P(Day2-Sunny)*0.125+ P(Day2-Cloudy)*0.625 + P(Day2-Rainy)*0.375)* 0.50
推出:
P(observationlist) =P(Day3-Sunny)+P(Day3-Cloudy)+P(Day3-Rainy) = 0.030319
6.2 盒中取球的实例
已知HMM模型参数:
转移概率矩阵A:
0.5 | 0.2 | 0.3 |
0.3 | 0.5 | 0.2 |
0.2 | 0.3 | 0.5 |
混淆矩阵B:
0.5 | 0.5 |
0.4 | 0.6 |
0.7 | 0.3 |
初始概率:
π=(0.2 , 0.4 , 0.4)
求解:三次取球颜色为(红、白、红)的概率P(O|λ)
提示:盒子相当于三种隐状态,两种颜色的球相当于观测情况,观测序列由(红、白、红)给出
(1)计算初值
(2)递推计算
(3)终止条件
7. 后向算法实例
关于后向算法,直接以6.2盒子(隐)和球(观测)的实例为例推导吧:
(1)初始化第三次取球为红球时候,即最终时刻所有状态的概率为1
式中下标为观测情况,括号为隐状态,比如第一个式子意思就是第一个隐状态对应的观测到红球的概率
(2)逆推迭代倒数第二次观察情况为白球的情况
第一个式子表示的是第二次观测,如果状态为1,那么第二、三次观测为(白、红)的联合概率分布,a是第二层隐状态(第一个盒子)转移到第三层隐状态(三个盒子)的转移概率,b表示第三层的三个隐状态观测到红球的概率,β(等式右边)表示已知模型参数和第三层隐状态,求第三次观测到红球的概率,其实第(1)步计算是1
第二个式子表示的是第二次观测,如果状态为2,那么第二、三次观测为(白、红)的联合概率分布,a是第二层隐状态(第二个盒子)转移到第三层隐状态(三个盒子)的转移概率,b表示第三层的三个隐状态观测到红球的概率,β(等式右边)表示已知模型参数和第三层隐状态,求第三次观测到红球的概率,其实第(1)步计算是1
同理推导第一层的情况
(3)计算加和
可以发现前向算法和后向算法的结果相同
【注】前向算法中计算结果舍去了一位,结果应该是0.035512