一阶马尔科夫模型可以描述为一个二元组( S, A ) ,S是状态的集合,而A是所有状态转移概率组成的一个n行n列的矩阵,其中每一个元素aij为从状态i转移到状态j的概率 。同有限状态自动机类似,状态转移关系也可以用状态转换图来表示。
对于马尔科夫模型,给定了观察序列,同时也就确定了状态转换序列。例如有关天气状况的观察序列。(晴晴晴阴阴晴云晴)则状态转换序列为(3, 3, 3, 1, 1, 3, 2, 3)。
如果把晴天称为状态3的输出,阴天称为状态1的输出,多云称为状态2的输出。根据观察到的输出序列就可以决定模型中的状态转换序列。(每个状态只有唯一的输出值)。
马尔科夫性质:随机过程中某一时刻的状态st,只与它前一时刻的状态st−1有关。
隐马尔科夫模型的状态被隐藏起来,无法直接观测,但是对应的存在一个可观测值ot,ot仅与状态值St有关,St外化表现为ot的概率称为输出概率,隐状态St之间转换成为转移概率。
转移概率矩阵描述了隐状态之间的转换概率,输出概率矩阵描述了不同隐状态输出可观测值的概率。
因此,HMM模型存在一个随时间不断改变的隐藏状态持续影响着系统的外在表现。
在坛子与小球问题中,如果给定一个观察序列(不同颜色的小球序列),不能直接确定状态转换序列(坛子的序列),因为状态转移过程被隐藏起来了,而坛子是可观测值,所以这类随机过程被称为隐马尔科夫过程。
隐马尔可夫模型λ 可以表示为一个五元组( S, V, A, B, π ),S是一组状态的集合。V是一组输出符号组成的集合。A是状态转移矩阵,N行N列。B是输出符号的概率分布。π是初始状态概率分布π=(πi)表示时刻1选择某个状态的概率。
隐马尔可夫过程是一个双重随机过程,其中一重随机过程不能直接观察到,通过状态转移概率矩阵描述。另一重随机过程输出可以观察的观察符号,这由输出概率来定义。
隐马尔科夫模型的三个问题:
给定HMM λ = ( A, B, π ) 给定观察序列O = ( o1 o2o3…oT)如何有效地计算出观察序列的概率,即P(O|λ )? (估算问题) (另一种语言模型)
给定HMM λ = ( A, B, π ) 给定观察序列O = ( o1 o2 o3…oT)如何寻找一个状态转换序列q = (q1 q2q3…qT),使得该状态转换序列最有可能产生上述观察序列?(解码问题)
在模型参数未知或不准确的情况下,如何根据观察序列O = ( o1 o2o3…oT)求得模型参数或调整模型参数,即如何确定一组模型参数,使得P(O|λ)最大?(学习问题 或 训练问题)
对隐马尔可夫模型而言,状态转换序列是隐藏的,一个观察序列可能由任何一种状态转换序列产生。因此要计
算一个观察序列的概率值,就必须考虑所有可能的状态转换序列。
理论上,可以通过穷举所有可能的状态转换序列的办法计算观察序列O的概率。实际上,这样做并不现实。
估算观察序列概率:理论上可以通过穷举所有可能的状态转换序列的办法计算观察序列O的概率。实际上并不现实。需要更有效的计算方法。
向前算法:计算初值后,依据转移矩阵和输出矩阵递推计算即可。
向后算法:逆向计算,已知t时刻状态i。
求解最佳状态转换序列
韦特比算法:依据动态规划原理,如果路径是最优的,那么路径中的部分路径也是最优的,所以分别计算每一步状态转换的最优路径,最后可以得到最优的状态转换序列。
参数学习:隐马尔科夫模型的第三个问题是如何根据观察序列O = ( o1 o2 o3 … oT )求得模型参数或调整模型参数,即如何确定一组模型参数使得P (O|λ )最大?隐马尔科夫模型的前两个问题均假设模型参数已知,第三个问题是模型参数未知,求最佳模型的问题,是三个问题中最为困难的问题。
有指导的学习:在模型(λ)未知的情况下,如果给定观察序列的同时, 也给定了状态转换序列,此时可以通过有指导的学习方法学习模型参数。
参数学习非常简单,在训练数据足够大的前提下,效果不错.。缺点,状态信息未知时无法使用。或者要由人工标注状态信息,代价高。在NLP中,在无指导学习效果不佳时,需要采用有指导学习。
无指导的学习:在模型(λ)未知的情况下,如果仅仅给定了观察序列,此时学习模型的方法被称做无指导的学习方法。
对于隐马尔科夫模型而言,采用无指导学习方法,没有解析方法。通常要首先给定一组不准确的参数,再通过反复迭代逐步求精的方式调整模型参数,最终使参数稳定在一个可以接受的精度。
利用无指导的学习方法估计隐马尔科夫模型参数时,并不能一定保证求得最优模型,一般能得到一个局部最优模型。
Baum-Welch Algorithm:-已知观测序列O=(o1,o2,…,oT),估计模型参数λ=(A,B,π)。使得在该模型下观测序列概率P(O|λ)最大。(EM算法)
EM算法:含有隐变量的概率模型参数的极大似然估计法,或极大后验概率估计法。
EM的思想非常简单,我们要求两个参数,这两个参数都需要彼此才能求出,那么我们先人为给定参数1一个值,通过这个值可以算出参数2,然后我们通过算出的参数2再来求出参数1,这个时候的参数1比我们之前的参数1要更加准确,如此循环下去,我们就能得到较为准确的两个参数(通俗解释)*。
隐马尔科夫模型的实现
浮点溢出问题:
对于韦特比算法,采用取对数的方式。
对于Baum-Welch算法,采用放大因子。
对于向前算法采用放大因子以及取对数的方式。