前言-- 废话
在这么多篇的基础后,终于可以开始我一开始想学习的东西这里,也就是HMM,Hidden Markov Models,基于前三篇的内容,可以理解和学习这一篇的内容。
PGM(Probabilistic Graphical Models)系列--1.基础
PGM(Probabilistic Graphical Models)系列--2. 贝叶斯网络
PGM(Probabilistic Graphical Models)系列--3. 马尔科夫模型
过渡到HMM
在学习过程中,其实我是十分的confused的,因为传统的HMM和MRF不太一样,跟贝叶斯网络也不太一样,很难说是其中任何一个的直接衍生物。更像是二者的结合物?
例如
一个常规的HMM即说的是,隐含层的
y
会产生变化,我们观测到的
x
随着
y
的变化而变化,但我们只能看到表现层
x
的变化。这里我们直观上看,这是一个贝叶斯网络。
但实际上,又是一个MRF,为什么呢?
重点在于,y
的变化是指发生在y
的几种可能性之间。
若引用wiki 的一张图来阐释。
每一次的Y以及导致的X之间的关系,应该由上图来进行阐释。
如:
Y1 = Healthy -->X1 = Cold
这样到了第二天,可能Y1继续产生了变化,当然也有可能没有变化。(这其中都带有一个所谓的概率转移矩阵(类似于CPDs))。
其中由于概率转移矩阵的双向能力,所以也类似于CRF的感觉。
用下面一个图来展示各种图模型的关系。
感谢知乎上的这个问题
那么我们还是把它当做一个独立的模型先去理解。
HMM
定义:每个状态的转移只依赖于之前的 n 个状态,这个过程被称为1个 n 阶的模型,其中 n 是影响转移状态的数目。最简单的马尔科夫过程就是一阶过程,每一个状态的转移只依赖于其之前的那一个状态。
(也就是上上图所表示的,y的概率只与其前后的有关。)
概率转移矩阵(Transition Probability Matrix):由于一个特征有多个状态,即假设Y有N个状态,则概率转移矩阵就为一个N^2的矩阵。(主要说的是隐含层)
混淆矩阵 (confusion matrix):由隐含层的特征多个状态与观察层的特征多个状态的关联,由于观察到的是有限的,所以隐含层的单个状态对应的观察层多个状态的概率之和为1。
这样一个马尔科夫过程就建立起来,即一个具有时间序列的贝叶斯网络。
解释一下:
第一个即只与前后的相关,所以其它都条件独立,可以约去
第二个即前后的转移概率不以时间改变而改变
第三个即观察层的概率只与隐含层的相关
那么由上面的这些总结可知。由于HMM的假设十分的简单,那么我们其实可以用一个五元的参数来表达一个特定的HMM。
即{N, M, π,A,B}
N为隐含的状态数
M为观察的状态数
π为初始的状态概率
A为转移矩阵
B诶混淆矩阵
λ 可以代表π,A,B
的集合
用HMM解决的三大类问题
若已经有λ和M,N,若在所有可能的隐藏状态序列下,给定的可观察状态序列的概率(前向算法)
直观的去思考,大概分为以下求解步骤。
假设给定一个隐藏序列,通过混淆矩阵,求出概率。
通过只与前后相关的马尔科夫假设,求出隐含状态层的概率
对所有的隐含层求解以上两步,并累加,可得出给定的一个观察序列的概率
当然,算法上怎么解决当序列长时穷举产生的巨大的复杂度的问题,请看后面算法部分。
根据可观察状态的序列找到一个最可能的隐藏状态序列
在已知一个HMM下,这也是一个比较符合现实情况的问题,我们记录下了观察到的序列,求解可能性最大的隐藏状态的序列。
同样的,
如果用穷举的方法,同样可以算出以上的最大值,穷举所有隐藏序列,计算隐藏序列的转移概率,计算隐藏序列到观察序列的概率。
根据观察到的序列集来找到一个最有可能的 HMM。
除去上述的情况外,现实情况中更加有可能的是不知道HMM的各个参数,只能先进行ML中的学习。由于给定的可观察状态序列 O 来说,没有任何一种方法可以精确地找到一组最优的 HMM 参数 λ 使 P(O | λ) 最大。所以人们使用前向后向算法(也称为Baum-Welch算法)近似的求解HMM。
HMM中求解问题使用到的算法
前向算法(Forward -Backward Algorithm)
由于上面说到的大多数的计算方法都是穷举去计算所有的时间序列下的所有情况,这样就会随着时间序列的增加而指数级的增长算法的复杂度。这显然对计算机是一个十分大的负担,为了加快速度和减少计算机资源的使用。
我们利用概率不随时间的变化而变化的特性来降低开销
前向算法是为了解决在所有可能的隐藏序列下,给定的可观察状态序列的概率。
那么用 αt(j) 来表示在 t 时刻是隐含状态 j 的概率,αt(j)=Pr(观察状态 | 隐含状态 j ) x Pr(t 时刻到达隐含状态 j 的所有路径)。
对于这么个隐含层,观察序列为最下面的dry,damp,soggy。这个可以作为t=2时的概率。由于各个时间点均为各自独立,所以我们可以递归的沿着时间链去独立计算每一个时间点下各个状态的概率。
- t=1时,即初始概率表π乘以观测序列第一个状态到各自隐含状态的混淆矩阵中的值
-
t>1时,即t-1的时间点的各个状态的值即包含了 Pr(t 时刻到达隐含状态 j 的所有路径),所以我们只需要计算Pr(观察状态 | 隐含状态 j )。大大的节省了时间。
算到了最后一个时间点时,所有状态的概率之和即结果。
维特比(Viterbi) 算法
这个算法比较广泛的使用在自然语言处理中的词性标注。句子中的单词是可以观察到的,词性是隐藏的状态。通过根据语句的上下文找到一句话中的单词序列的最有可能的隐藏状态序列,我们就可以得到一个单词的词性(可能性最大)
这个算法本身与前向算法是十分类似的,也是利用了概率不随时间变化而变化,通过逐步递归的方法减少计算量。其中最大的不同就是在t时刻最可能到达某个状态的一条路径的概率,而不是所有概率之和。
用 δ(i, t) 来表示在t时刻,到隐含状态i的所有可能的序列(路径)中概率最大的序列的概率。
- t = 1时,由于不存在t = 0的前置状态,所以直接用即初始概率表π乘以观测序列第一个状态到各自隐含状态的混淆矩阵中的值。
- t > 1时,我们就要使用t-1时的值,求解从t-1各个状态到t时特定状态时的概率,从中选出最大的值,再加上与混淆矩阵的计算,则可以得到当前的 δ(i, t)。
- 总结可知
,即aji 表示从状态 j 转移到状态 i 的概率,bikt 表示状态i被观察成 kt 的概率,乘上t-1时为j的概率,整体的最大值。即得到 t 时刻可观察状态为 kt 的第 i 个状态的最大部分概率。
确定终点后,反过来往前回溯,确定前一个最佳的点。从而确定一个隐藏状态的时间序列。
Baum-Welch Algorithm
大概的思路是类似于EM算法的,通过初始化一个参数,并多次的评估参数的有效性去更新它的参数,从而逐步的渐进最有可能的参数。而且由于是一个最大似然估计,所以得到的是一个局部最优解。那么实际上是怎么操作呢?
先定义一个后向变量,作为β,即当前状态下后面特定观察序列的概率,同样的,可以用递归的方法去计算,所以得到一个类似于前向算法的值。最后综合前后向变量,可以得到一个特定观察序列的概率。
- 先定义两个辅助变量。
a. 定义为 t 时状态 i 和 t+1 时状态 j 的概率, 用前后的时刻的i,j来定义。通过代入前后向变量可以展开为
b. 后验概率 同样的,代入前后向变量可以展开为
那么如果我们一开始初始化一个HMM模型的参数λ,可以利用以上参数去计算上面三个式子的右侧。再定义重新估计后HMM模型为
所以我们就可以迭代的去计算上述三个式子直到差值收敛到一定的程度。
后序
由于HMM的强大,使得HMM至今还在语音语义识别领域发挥着重要的作用,但是由于HMM的假设过于简单,从而也导致了大家产生了扩展HMM的需求。也就产生了N-1阶的HMM,若N=2,即我们这里说的HMM,一般用到的N=3,更高阶的模型用到的就很少了,由于每一阶的扩展都是在指数级上的复杂度的提高
但由于自然语言的特性,上下文之间的联系绝对不仅仅是几个词之间的联系可以说得通的。有一些甚至需要联系前后的好几个段落才能够说明白一个词的语义,所以对于一些长距离的词性依赖,是很难解决的。这时就需要别的统计模型进行解读。
参考
http://www.52nlp.cn/hmm-learn-best-practices-five-forward-algorithm-3
[转载]转:隐马尔科夫模型HMM攻略
http://blog.csdn.net/xueyingxue001/article/details/52396494
数学之美 吴军