隐马尔可夫链模型简介及其Matlab工具箱应用
隐马尔可夫链模型(Hidden Markov Model,HHM)是一种用来描述含有未知参数的Markov过程的统计模型。HHM从20世纪60年代提出以来被广泛的运用在自然语言处理、语音识别、机器学习等众多领域。下面首先通过Markov模型引入HHM的定义,然后详细介绍了HHM中的评估、解码和学习三个基本问题以及解决三个问题的常用算法,最后介绍了Matlab中关于HHM工具箱的简单应用,并应用HHM进行了举例分析。
1 隐马尔科夫模型(HHM)
1.1 Markov 模型
马尔可夫模型(Markov Model)是一种统计模型,广泛应用在语音识别,词性自动标注,音字转换,概率文法等各个自然语言处理等应用领域。经过长期发展,尤其是在语音识别中的成功应用,使它成为一种通用的统计工具。
若当某随机过程在某时刻
所处的状态已知的条件下,过程在时刻
处的状态只与过程在
时刻的状态有关,而与过程在
以前所处的状态无关这种特性即称为马尔可夫性,亦称之为无后效性。
设I为随机过程的状态空间,如果对任意n个时刻有:
随机变量在已知条件
下的条件分布函数只与
而与
无关,即条件分布函数满足等式:
则称此随机过程为Markov过程,简称马氏过程。
马氏过程可根据其时间空间和状态空间的连续性将马氏过程分为四类,分别是离散时间集离散状态集马氏过程、离散时间集连续状态集马氏过程、连续时间集离散状态集马氏过程、连续时间集连续状态集马氏过程。其中离散时间集离散状态集马氏过程又称为马尔可夫链。
1.2 隐马尔可夫模型
隐马尔可夫模型并不是19世纪俄罗斯数学家Markov的发明,而是美国数学家鲍姆等人在20世纪六七十年代在一系列的论文中提出的一种马尔可夫链模型的扩展。
一个系统有N个状态,随着时间的推移,系统从某一个状态转移到另一状态,设
为时间
的状态,系统在时间
处于状态
的概率表示为:
,若该概率只与时间
的状态有关,而与
之前的状态无关,即满足马尔可夫性,则该系统构成一个离散的一阶马尔可夫链。
隐马尔可夫链模型是上述马尔可夫链模型的一个扩展:任一时刻t的状态是不可见的,因此作为观察者来说,不能通过观察到一个状态序列
来推测计算转移概率等模型参数。但是隐马尔可夫链模型在每一个时刻t都会有一个输出状态
的状态集合为
,且
有关且仅和
有关,这被称为独立输出假设。隐马尔可夫链模型是一个双重随机过程,其中可观察的状态的随机过程是隐蔽的状态转换过程的随机函数为一般随机过程,而不可观察的状态转移过程是马尔可夫链模型,因此该模型称为隐含的马尔可夫链模型。图1揭示了隐马尔可夫模型的隐含状态和输出状态关系。
图1 隐马尔可夫模型状态图
下面将用五元组即五组数据来简单表示隐马尔可夫模型。一个隐马尔可夫模型采用五元组可描述为:
其中:表示隐含状态的有限集合;
表示观察到的状态的有限集合;
表示隐含状态的状态转移概率矩阵;
表示隐含状态为时观察值为的概率分布矩阵,也被称为混淆矩阵;
表示初始时刻状态概率分布。
2 隐马尔可夫模型三个基本问题
在1.2中我们通过离散一阶马尔可夫链模型引出了隐马尔可夫模型的定义,下面将介绍隐马尔可夫模型中的三个基本问题。
三个假设:
假设1:马尔可夫性假设,状态构成一阶马尔可夫链
假设2:不动性假设,状态与时间无关 ,其中i,j为不相关任意时刻
假设3:输出独立性假设,输出仅与当前状态有关
基本问题一:评估问题。即给定模型,求某个观察序列产生的概率。
解决评估问题的算法有两种,分别是穷举算法和前向算法,穷举算法的算法复杂度远大于前向算法,所以一般采用前向算法求解。前向算法的基本思想是通过定义部分概率采用递归的思想有效的减少了计算复杂度。
基本问题二:解码问题。对于给定模型和观察值序列,求出可能性最大的隐藏状态序列。
在很多情况下,我们对隐藏状态更有兴趣,因为其包含了一些不能被直接观察到的有价值的信息。这就是HMM中的解码问题,求解解码问题的经典算法是维特比算法 (Viterbi Algorithm)。同样维特比算法也是采用递归的思想来降低计算复杂度的。
基本问题三:学习问题。对于给定一个观察序列,调整模型参数
,使得观察值出现的概率
最大,这个问题就是HMM中涉及的学习问题。
对于隐藏了马尔可夫链模型,我们往往不能直接得到,因此如何从观察序列中得出HMM模型参数是一个重要的问题。对于HMM中的学习问题,没有任何一种方法可以精确地找到一组最优的HMM参数使
最大,于是人们寻求使其局部最优的解决办法,这种近似方法就是前向后向算法,也称为鲍姆-韦尔奇算法。相比于前向算法与维特比算法,前向后向算法更加复杂。
3 HMM中的三个算法
对于HMM模型,其中最重要的问题就是解决三个基本问题,第二节中对三个基本问题进行了简单介绍,本节将首先介绍一个HHM模型的经典例子,并通过例子说明三个基本问题所涉及的三个算法。
3.1 HMM经典例子
假设一个人隐居在一个不能直接观察到天气情况的地方,当然这一点来讲这不一定非常合理,但是不妨碍我们通过假设来很好的说明这其中的蕴含的模型。但是据传言海藻的状态在某种概率上和天气的状态有一定的相关性。在这种情况下有两个状态集合,一个可以观察的海藻的状态集合和一个隐藏的观察不到的天气的状态集合。下面通过五元组来抽象这个例子中所包含的隐马尔可夫链模型。
隐含状态的有限集合N:N={sun,cloud,rain};
可观察状态的有限集合M:M={soggy,damp,dryish,dry};
假设状态转移概率矩阵A为:;
混淆概率矩阵B为:;
初始时刻状态概率分布为:。
则上述例子中的HMM表述为:。上述HMM用框图表示如图2所示。
图2 隐马尔可夫链模型框图
3.2 评估问题中的前向算法
评估问题是要根据已知的HMM来计算一个给定观察序列的概率。前向算法主要运用递归的思想来减少计算复杂度。下面就3.1中的描述的例子说明前向算法的计算过程。
若观察状态序列已知为:,设隐藏的状态序列表示为
,则产生该输出状态序列的概率为所有隐藏状态序列组合的概率之和,即
。
(1)部分概率
部分概率表示状态到达某个中间状态的概率。这个部分概率的值为到达该状态的所有路径的概率之和。如当t=2时,状态cloud的概率用如图所示的三条路径的概率之和表示。
图3 部分概率定义示意图
定义:表示在t时刻是j状态的概率,则:
。
通过计算到达某个状态的所有路径的概率和来计算到达某个中间状态的概率,如当t=2时cloud的概率用三条路径的概率之和来表示,如图4所示。
图4 t=2时部分概率计算示意图
这样最后一个观察状态的部分概率就表示了整个序列最后到达某个状态的所有可能的路径的概率和,在天气这个例子中,最后一列的部分概率是通过图5所示的路径计算得到。
图5 最后一列的部分概率计算路径
通过部分概率可以有效的降低计算所有隐藏状态序列的概率之和,这就是前向算法。
3.3 解码问题中的维特比算法
HMM中的另一个重要问题是解码问题,而解决解码问题的一个有效算法就是维特比算法。维特比算法是一种动态规划算法用于寻找最有可能产生观测事件序列。
首先我们用表示在t时刻到达状态i的所有可能的路径中概率最大的序列的概率,部分最优路径就是达到这个最大概率的路径,对于每一个时刻的每一个状态都有这样一个概率和部分最优路径。最后便可以通过计算末时刻的最大概率和最优路径来作为全局最大概率和全局最优路径。
当t=1时,;
当t>1时,可以用t-1时刻的最大概率来计算,计算t时刻的最大概率示意图如图6。公式为:
图6 最大概率计算示意图
若T为末时刻,则末时刻的最大概率为:
该最大概率的所经过的路径既是最大可能的状态转移序列。
3.4学习问题中的前向后向算法
前向后向算法首先对于 HMM 的参数进行一个初始的估计,但这个很可能是一个错误的猜测,然后通过对于给定的数据评估这些参数的有效性并减少它们所引起的误差来更新 HMM 参数,使得和给定的训练数据的误差变小,这其实是机器学习中的梯度下降的思想。
对于网格中的每一个状态,前向后向算法既计算到达此状态的“前向”概率,又计算生成此模型最终状态的“后向”概率,这些概率都可以通过递归进行高效计算。可以通过利用近似的 HMM 模型参数来提高这些中间概率从而进行调整,而这些调整又形成了前向后向算法迭代的基础。
另外,前向后向算法是 EM 算法的一个特例,它避免了 EM 算法的暴力计算,而采用动态规划思想来解决问题。下面给出前向后向算法的大致步骤。由于前向后向算法的难度复杂度均大于前面的前向算法和维特比算法,具体的步骤不做过多的分析。
前向后向算法:
第一步:随机的给,需满足概率条件,得到模型
,设
;
第二步:EM算法。
E步骤:由计算期望值
和
;
M步骤:用E步骤得到的期望值重新计算,得到模型
;
第三步:令,重复EM步骤,直到
收敛。
其中相关的公式有:
4 Matlab中HMM相关的函数的运用
4.1 Matlab中HMM相关的函数
Matlab统计工具箱中关于HMM的函数主要有:hmmgenerate、hmmestimate、hmmtrain、hmmviterbi、hmmdecode。
hmmgenerate用于从一个马尔可夫模型产生一个状态序列和输出序列。hmmestimate计算转移和输出的极大似然估计。hmmtrain用于从一个输出序列计算转移概率和输出概率的极大似然估计。hmmviterbi计算一个隐马尔可夫模型最可能的状态变化过程。hmmdecode计算一个给定输出序列的后验状态概率。
4.2 函数的具体用法
(1)hmmgenerate函数
函数引用格式1:[seq,states]= hmmgenerate(len,TRANS,EMIS);
参数说明:
输入参数:len表示观察序列和状态序列的长度,TRANS表示隐藏的Markov链的状态转移概率矩阵。EMIS表示混淆概率矩阵,EMIS(i,j)表示隐藏状态为i时观察到的输出状态为j的概率。
输出参数:seq表示观察到的输出序列,state表示隐藏的状态的转移序列。
应用举例:
函数引用格式2:
[seq,states]=hmmgenerate(len,TRANS,EMIS,’symbols’,{},’statenames’,{});
说明:symbols用于在其后的中括号内指定观察序列seq的状态名,statenames用于在其后的中括号内指定state的状态名。
(2)hmmestimate函数
函数引用格式:[TRANS,EMIS] = hmmestimate(seq,states)
参数说明:参数含义与hmmgenerate中的参数相同,只是本函数作用是通过观察的状态序列和及其对应的隐藏的状态序列计算HMM的转移概率矩阵TRANS和混淆概率矩阵EMIS。输入的观察序列可以是数字矩阵,也可以是状态字符矩阵。若要采用状态字符矩阵则引用格式如下:
[TRANS,EMIS] =hmmestimate(seq,states,’symbols’,{} ,’statenames’,{})
hmmestimate函数和hmmgenerate函数是一个互为相反的过程。
(3)hmmtrain函数
函数引用格式:[ESTTR,ESTEMIT] =hmmtrain(seq,TRGUESS,EMITGUESS)
函数作用:通过观察序列来估计HMM的TRANS和EMIS。
参数说明:
输入参数:seq是观察到的状态序列,TRGUESS表示在不知道隐藏状态序列的情况下对转移概率矩阵的猜测,EMITGUESS是对初始混淆矩阵的猜测。
输出参数:ESTTR表示估计的转移概率矩阵,ESTEMIT表示估计的混淆概率矩阵。
其他函数引用格式:除了上面的引用格式外,hmmtrain函数还可以有其他引用格式,如hmmtrain(seq,TRGUESS,EMITGUESS,'Algorithm',algorithm)可以指定训练的算法,默认为鲍姆韦尔奇算法。
(4)hmmviterbi函数
函数引用格式:STATES = hmmviterbi(seq,TRANS,EMIS)
函数作用:hmmviterbi函数采用维特比算法根据观察的状态序列、状态转移概率矩阵以及混淆概率矩阵计算出对应于观察状态序列的隐藏状态序列。
参数说明:参数与上述函数中的说明一致。
(5)hmmdecode函数
函数引用格式1:PSTATES =hmmdecode(seq,TRANS,EMIS)
函数作用:计算一个给定输出序列的后验状态概率。
参数说明:PSTATE表示观察序列为seq时的后验概率。
5 总结
隐马尔可夫模型是一种在自然语言处理、语音识别和机器学习等实际应用方面非常有效的方法。在介绍了Markov链模型基础上定义隐马尔可夫链,并详细介绍了隐马尔可夫链模型中三个基本问题涉及的三个算法,最后简单介绍了Matlab统计工具箱中几个HMM函数的运用,要深入理解HMM的理论和算法来说是很困难的一个问题,但是Matlab的相关函数为我们运用HMM模型求解实际模型带来了很大的方便。
在介绍HMM相关的三个重要算法的部分中,由于算法的复杂性存在很多没有说清楚的地方,但是Matlab提供了非常完整的函数可以供我们使用,在实际问题中可以直接使用Matlab函数编程解决实际问题而可以不用过多的去分析算法的实现过程。这也是本文的价值所在。
参考文献
[1]冯志伟.自然语言处理的历史与现状[J].中国外语.2008(01).
[2]陈波.中文统计自然语言处理隐马尔科夫模型的研究.
[3]冯志伟.当前自然语言处理发展的几个特点[J].暨南大学华文学院学报.2006(0]).