最近感觉学习深度学习不能一直只注重代码,而不注重对于算法的理解,决定补一补深度学习相关的算法内容。
隐马尔可夫模型是可用于标注问题的统计学习模型,描述的是由隐藏的马尔可夫链随机生成观测序列的过程。
一、隐马尔可夫模型的基本概念
它是一个关于时序的概率模型,过程是:隐藏的马尔可夫链随机生成不可观测的状态随机序列,称为状态序列->每个状态生成一个观测,组成观测序列。
注意!序列的每一个位置又可以看作是一个时刻。
隐马尔可夫模型有三个重要的过程组件:初始概率分布、状态转移概率分布、观测概率分布。
下面是需要记住的常用参数:
Q={q1,q2,……,qN},V={v1,v2,……,vM},Q和V分别是所有可能的状态的集合和所有可能观测的集合。记住是所有!长度为N和M.
设I为长度为T的状态序列,O是对应的观测序列。I和O在后面经常提到,大家要记住他们分别是状态序列和观测序列。记住,这不是所有,而是一组,长度为T
I=(i1,i2,……,iT),O=(o1,o2,……,oT)
我们先讲状态转移概率分布:
A是状态转移矩阵,N*N就是N行N列的意思,因为有N个状态。
aij意思就是从状态i到状态j转移的概率,意思是在时刻t处于状态qi的条件下在时刻t+1转移到qj的概率。N*N个aij构成A。
然后是观测概率矩阵:
bj(k)是在t时刻处于状态qj条件下生成观测vk的概率。
这是时刻t=1处于状态qi的概率。 也就是每个状态作为初始状态的概率。
鉴于马尔可夫模型由这三个参数来调节,所以我们将这三个参数用拉么大表示
马尔可夫有两个基本假设
1.齐次马尔可夫性假设:马尔可夫链任意时刻的状态只与前一时刻的状态有关,与哪个时刻无关,与其他的状态和观测也无关。
2.观测独立性假设:马尔可夫任一时刻的观测只与当前时刻的状态有关,和其他时刻的状态与观测无关。
下面说一个马尔可夫的小栗子:
有没有发现在这个例子里,状态和观测分别是什么?我们可以直接观察到抽取的结果,即颜色序列,但是我们无法观察到他们是从哪个盒子里面抽取到的,所以说,状态就是盒子,颜色就是观测。
这样就很容易写出上面提到的很多参量了,比如:
Q={盒子1,盒子2,盒子3,盒子4},N=4
V={红,白},M=2
观测了五次,很容易得出,T=5
由于是随机选取盒子,初始状态下每个盒子被选取的概率是一样的,所以,初始概率分布也可以很容易得出:
然后状态转移概率分布:
这个根据题意也很容易得出吧~
这个是观测概率分布就更简单了,回想一下,啥是观测概率分布?是已经在这个状态下了的情况下,各个观测出现的概率,比如第一行0.5,0.5,就是已经选择了第一个盒子的情况下,抽到白色和红色的概率。由于题目显示盒子1中两个颜色的球的个数是一样的,所以出现的概率也是一样的。同理可得下面各行。
有必要说一下观测序列的生成过程:
假设我们输入一组模型参数
观测序列长度为T,
那么我们要输出的就是观测序列O={o1,o2,o3,……,oT}
首先我们就会根据初始状态分布得到状态i1,有了i1就能根据B得到o1,根据定义,每个状态生成一个观测组成观测序列,所以我们下一步需要得到i2状态,具体方法是通过A,也就是aij状态转移概率分布来产生状态i2,然后又可以得到o2,循环往复,一直到得到T个观测序列。记得,观测序列是每个状态得到一个观测组成的。什么叫一个观测?就是取各个可能观测结果的概率!!比如上面那个例题:
0.5 0.5就是状态1(盒子1)对于可能的观测结果(白色?红色?)的各个概率!
然后就是隐马尔可夫模型的3个基本的问题应用类型:
1.概率计算问题:给定拉么大,观测序列O=(o1,o2,……,oT),计算P(O|拉么大)
2.学习问题:
3.预测问题:
下面挨个进行讲解:首先看一下概率计算问题。
二.三大应用:
一、概率计算算法:
1.直接计算法:
最直接的方法就是直接计算喽~通过列举所有可能长度为T的状态序列求各个状态序列I与观测序列O=(o1,o2,……,oT)的联合概率P(O,I|拉么大),然后对所有可能的状态序列求和得到P(O|拉么大)
P(O,I|拉么大)怎么求呢?很明显,它的意思是某个状态序列出现某个观测序列的概率,首先应该知道这个状态序列出现的概率P(I|拉么大),然后乘以该状态下某观测序列的概率P(O|I,拉么大)吧!
然后是P(O|I,拉么大)
至于他们的公式为什么是这个,不用我一一解释吧,挺容易懂的,就比如这个P(O|I,拉么大),每个观测序列o1,o2……他们都是由i1,i2……状态的到的,而bi1(o1)、bi2(o2)……就是i1,i2……状态下,o1,o2……产生的概率,乘起来就完事了。
最后,别忘了,可能的状态序列有很多,每一种都有可能产生这个观测序列O,记得加起来。
2.前向算法与后向算法结合
前向概率
首先定义一下什么是前向概率:定义从开始到t时刻部分观测序列o1,o2,……,ot且状态为qi的概率为前向概率。
然后开始算法的讲解:
输入:隐马尔可夫模型拉么大,观测序列O
输出:观测序列概率P(O|拉么大)
步骤:
1.初始化前向概率,
2.递归
上面计算的只是初始时刻的前向概率,从前向概率的定义来看,如果t>1那么就是一个递归的概率,我们来计算一下。
怎么解读上面这个公式呢?我们想向以下,在t+1时刻,此时状态为i,那么之前的时刻状态可不一定是i,在t+1时刻都将转化为i状态,所以方括号里面就是其他所有状态在t时的前向概率乘以状态转移概率(即从j转化为i的概率),从而得到了t时刻在任何状态下观测到o1……ot并在t+1时刻转化为i状态的概率,可看下图加深理解
这时状态已经是i了,乘以(t+1时刻,i状态下,生成观测序列o1……ot+1的概率)就得到了某个状态下得到输入的观测序列O的概率。
3.求和
别忘了状态可不止一个哦,还要对所有状态求和
刚才我们上面得到的就是下面这个图里的表示
即在模型拉么大条件下,状态为i并得到o1……ot的概率,下面对N个状态进行求和就完事了。
下面放个例题,然后大家可以自己看一下加深理解。
后向概率
你想啊,刚才我们的前向概率是啥?是t时刻i状态下观测结果为o1……ot的概率,那么是不是应该有一个t时刻i状态下,观测结果为ot+1到oT的概率?正好一前一后。所以:
后向概率是时刻t状态qi的条件下,从t+1到T的部分观测序列为ot+1到oT的概率。
然后开始算法的讲解:
输入:隐马尔科夫模型辣么大,观测序列O
输出:观测序列概率P(O|辣么大)
步骤:(我就不写太多文字描述了,和之前的前向概率是一个思想)
1.
这里是一个规定,规定对于最终时刻的所有状态qi规定后向概率等于1。(想想也是,最后一个时刻了,后面已经没有可以观测的了)
2.
这个就是后向概率喽~看公式里面说的,从初始的i状态转向状态j产生观测为ot+1再乘以j状态下,t+1时刻下ot+1……oT的概率。
其实这个公式反着看更容易理解。t时刻的后向概率就等于t+1时刻的后向概率*(t+1时刻i状态转化为其他状态并生成观测ot+1的概率)
3.
β1(i)是观测o2……oT,所以,需要π1和bi(o1)来生成o1,当然由于初始状态有好多,自然需要求和。
下面再讲一些概率与期望值的计算:
利用前后向概率可以得到关于单个状态和两个状态概率的计算公式
首先看单个状态的:
上面的公式不难理解吧应该。
然后是多状态的:
如果公式不太好理解,可以把分母乘过去。其实也挺好理解的,就好比P(A|B)=P(AB)/P(B)。
这都很好理解了。
二、学习算法:
根据训练数据是包含观测序列和对应的状态序列还是只有观测序列可以分别由监督学习与无监督学习来实现。
我们首先介绍监督学习:
监督学习:
假设:训练数据包含S个长度相同的观测序列和对应状态序列{(O1,I1),(O2,I2),……,(Os,Is)},那么可以用极大似然估计法来估计隐马尔可夫模型的参数。
1.对于转移概率aij的估计
设样本中时刻t处于状态i时刻t+1转移到状态j的频数为Aij,那么状态转移概率aij的估计是:
同理
2.观测概率bj(k)的估计:
设样本状态为j并观测为k的频数是Bjk,那么状态为j观测为k的概率bj(k)的估计是:
同理
3.初始状态概率πi的估计πi帽为S个样本中初始状态为qi的概率
无监督学习算法——Baum-Welch算法(EM算法)
这一部分的算法推导过程我不打算详细描述了,我是按照李航的统计学习方法里面讲的,大家有兴趣的 可以自己看一下这里算法推导的过程。只列出 推导之后的操作步骤:
二、预测算法:
下面是隐马尔可夫模型的两种预测算法:近似算法,维特比算法。
1.近似算法:思想是在每个时刻t选择在该时刻最有可能出现的状态i,从而确定整个状态序列。
给定隐马尔可夫模型辣么大和观测序列O,在时刻t处于状态qi的概率是:
从而在每一时刻t最有可能的状态i是
优点是计算简单,缺点是不能保证预测的状态序列整体是最有可能的状态序列,因为预测的状态序列有可能包含实际不发生的部分,比如转移概率为0的相邻状态。尽管如此,他依然是有用的。
2.维特比算法
其是用动态规划来求解预测问题,就是用动态规划求概率最大的路径(最优路径),每条路径对应一个状态序列。
根据动态规划的原理,要想整条道路最优,局部道路也要是最优的。所以我们要从时刻t=1开始递归的计算在时间t状态为i的各条部分路径的最大概率,一直到t=T。t=T时的最大概率即为最优路径的概率p,终结点iT也同时得到,只有为了找出最优路径的各个节点,从终结点iT开始从后向前逐步求得节点iT-1,……i1,得到最优路径。
首先导入两个变量,定在时刻t状态为i的所有单个路径(i1,i2……iT)中概率最大值为
由此可以得到下一步的递归公式
arg max就是使右边的式子达到最大的时候自变量的取值,也就是说j的取值。
下面就是维特比算法的过程步骤:
下面通过一个例子来说明维特比算法。
解:
(1)初始化。首先计算在t=1时,对应每一个状态i,i=1,2,3,求状态i观测o1为红色的概率,
带入矩阵中的数据我们可以得到下面的结果:
这三个数是怎么得出来的?
0.1是B矩阵中的第一列第一行的数0.5(即b1(o1))*π矩阵中的第一个数0.2(即π1)。
同理:
0.16=B矩阵中的第一列第二行的0.4(即b2(o1))*π矩阵中的第二个数0.4(即π2)。
0.28=b3(o1)*π3=0.28
上面就求出了t=1时刻得到红色的概率。
(2)再依次求t=2时白球的概率,t=3时红球的概率。
用上面这个公式可以求出t=2和t=3的情况,然后对每个状态记录概率最大路径的前一个状态j
(3)最后求出最优路径的概率以及终点: