读者可以去我的github阅读一份可读性高的HMM用于NER识别的代码,欢迎点star,欢迎fork
一、HMM基本概念的介绍
以一个例子介绍HMM,可以避开抽象的定义:
例如:N个袋子,每个袋子中有M种不同颜色的球。一实验员根据某一概率分布选择一个袋子,然后根据袋子中不同颜色球的概率分布随机取出一个球,并报告该球的颜色。对局外人:可观察的过程是不同颜色球的序列,而袋子的序列是不可观察的。每只袋子对应HMM中的一个状态;球的颜色对应于HMM中状态的输出。
状态转移概率矩阵为,为实验员从一只袋子(状态) 转向另一只袋子(状态 ) 取球的概率。
从状态 观察到某一特定符号 的概率分布矩阵为:
其中,为实验员从第个袋子中取出第种颜色的球的概率。
为了方便,一般将HMM记为:
HMM的三个问题:
- 在给定模型 和观察序列的情况下,怎样快速计算概率?
- 在给定模型和观察序列的情况下,如何选择在一定意义下“最优”的状态序列,使得该状态序列“最好地解释”观察序列?
- 给定一个观察序列 ,如何根据最大似然估计来求模型的参数值?即如何调节模型的参数,使得最大?
二、 HMM第一个问题的求解
可以由如下式计算
其中
相当于对所有Q的可能性的求和。
遍历计算复杂度太高,利用动态规划降低复杂度。
如果可以高效地计算,就可以高效地求得
事实上有如下递推公式:
三、 HMM第二个问题的求解
问题二的本质是如何发现最优状态序列去最好地解释观察序列
一种解释是:状态序列中每个状态都单独地具有概率,对于每个时刻t,寻找使得
另一种解释:在给定模型 和观察序列的条件下求概率最大的状态序列:
Viterbi算法:动态规划最优状态序列
定义:Viterbi 变量是在时间时,模型沿着某一条路径到达,输出观察序列$O=O_1O_2 …O_t $的最大概率为:
递归算法:
解释一下这个式子:
模型沿着某一条路径到达,输出观察序列的最大概率为在t时刻到达状态中选取使此式概率最大的j,因此最大概率之间构成递推关系,我们可以用Viterbi算法去求解。
四、HMM第三个问题的求解:
参数学习
给定一个观察序列,如何根据最大似然估计来求模型的参数值?或者说如何调节模型的参数,使得 最大?即估计模型中的使得观察序列O的概率$p(O|\mu) $最大。
即通过观察序列去重建模型中的参数
如果产生观察序列 的状态 已知(即存在大量标注的样本),可以用最大似然估计来计算的参数:
各估计如下:
类似的:
其中,是模型输出符号集中地第k个符号。