隐马尔科夫模型(HMM) 举例讲解

什么问题用HMM解决

现实生活中有这样一类随机现象,在已知如今状况的条件下,将来时刻的状况只与如今有关,而与遥远的过去并没有直接关系。算法

好比天气预测,若是咱们知道“晴天,多云,雨天”之间的转换几率,那么若是今天是晴天,咱们就能够推断出明天是各类天气的几率,接着后天的天气能够由明天的进行计算。这类问题能够用 Markov 模型来描述。数组

 
markov

进一步,若是咱们并不知道今天的天气属于什么情况,咱们只知道今明后三天的水藻的干燥湿润状态,由于水藻的状态和天气有关,咱们想要经过水藻来推测这三天的真正的天气会是什么,这个时候就用 Hidden Markov 模型来描述。学习

 
hmm

HMM 模型的本质是从观察的参数中获取隐含的参数信息,而且先后之间的特征会存在部分的依赖影响。spa

咱们从如何进行中文分词的角度来理解HMM

根据可观察状态的序列找到一个最可能的隐藏状态序列翻译

中文分词,就是给一个汉语句子做为输入,以“BEMS”组成的序列串做为输出,而后再进行切词,进而获得输入句子的划分。其中,B表明该字是词语中的起始字,M表明是词语中的中间字,E表明是词语中的结束字,S则表明是单字成词。code

例如:给个句子orm

小明硕士毕业于中国科学院计算所

获得BEMS组成的序列为递归

BEBEBMEBEBMEBES

由于句尾只多是E或者S,因此获得切词方式为it

BE/BE/BME/BE/BME/BE/S

进而获得中文句子的切词方式为io

小明/硕士/毕业于/中国/科学院/计算/所

这是个HMM问题,由于你想要获得的是每一个字的位置,可是看到的只是这些汉字,须要经过汉字来推出每一个字在词语中的位置,而且每一个字属于什么状态还和它以前的字有关。
此时,咱们须要根据可观察状态的序列找到一个最可能的隐藏状态序列。

五元组,三类问题,两个假设

五元组

经过上面的例子,咱们能够知道 HMM 有如下5个要素。

观测序列-O:小明硕士毕业于中国科学院计算所

状态序列-S:BEBEBMEBEBMEBES

初始状态几率向量-π:句子的第一个字属于{B,E,M,S}这四种状态的几率

 
 

状态转移几率矩阵-A:若是前一个字位置是B,那么后一个字位置为BEMS的几率各是多少

 
 

观测几率矩阵-B:在状态B的条件下,观察值为耀的几率,取对数后是-10.460

 
 

备注:示例数值是对几率值取对数以后的结果,为了将几率相乘的计算变成对数相加,其中-3.14e+100做为负无穷,也就是对应的几率值是0

三类问题

当经过五元组中某些已知条件来求未知时,就获得HMM的三类问题:

  • 似然度问题:参数(O,π,A,B)已知的状况下,求(π,A,B)下观测序列O出现的几率。(Forward-backward算法)
  • 解码问题:参数(O,π,A,B)已知的状况下,求解状态值序列S。(viterbi算法)
  • 学习问题:参数(O)已知的状况下,求解(π,A,B)。(Baum-Welch算法)

中文分词这个例子属于第二个问题,即解码问题。

咱们但愿找到 s_1,s_2,s_3,... 使 P (s_1,s_2,s_3,...|o_1,o_2,o_3....) 达到最大。
意思是,当咱们观测到语音信号 o_1,o_2,o_3,... 时,咱们要根据这组信号推测出发送的句子 s_1,s_2,s_3,....,显然,咱们应该在全部可能的句子中找最有可能性的一个。

两个假设

利用贝叶斯公式获得:

 
 

这里须要用到两个假设来进一步简化上述公式

 
 

有限历史性假设: si 只由 si-1 决定

 
 

独立输出假设:第 i 时刻的接收信号 oi 只由发送信号 si 决定

 
 

有了上面的假设,就能够利用算法 Viterbi 找出目标几率的最大值。

Viterbi算法

根据动态规划原理,最优路径具备这样的特性:若是最优路径从结点 i_{t}^* 到终点 i_{T}^,那么这两点之间的全部可能的部分路径必须是最优的。
依据这一原理,咱们只需从时刻 t=1 开始,递推地计算在时刻 t 状态为 i 的各条部分路径的最大几率,直至获得时刻 t=T 状态为 i 的各条路径的最大几率 P^
,最优路径的终结点 i_{T}^* 也同时获得。以后,为了找出最优路径的各个结点,从终结点 i_{T}^* 开始,由后向前逐步求得结点 i_{T-1}*...,i_{1},进而获得最优路径 I^=i_{1}*...,i_{T}*,这就是维特比算法.

举个栗子:

 
 

观测序列 O=(红,白,红),想要求状态序列S。

须要定义两个变量:

  • weight[3][3],行3是状态数(1,2,3),列3是观察值个数(红,白,红)。意思是,在时刻 t 状态为 i 的全部单个路径中的几率最大值。
  • path[3][3],意思是,在时刻 t 状态为 i 的全部单个路径中几率最大的那条路径,它的第 t-1 个结点是什么。好比 path[0][2]=1, 则表明 weight[0][2] 取到最大时,前一个时刻的状态是 1.

1.初始化

t=1 时的红,分别是在状态 1,2,3 的条件下观察得来的几率计算以下:

 
 

此时 path 的第一列全是 0.

2.递归

t=2 时的白,若是此时是在 1 的条件下观察得来的话,先计算此时状态最多是由前一时刻的哪一个状态转换而来的,取这个最大值,再乘以 1 条件下观测到 白 的几率,同时记录 path矩阵:以下图 weight[0][1]=0.028,此值来源于前一时刻状态是3,因此,

 
 
 
 

3.终止

在 t=3 时的最大几率 P^=0.0147,相应的最优路径的终点是 i_3^=3.

4.回溯

由最优路径的终点 3 开始,向前找到以前时刻的最优势:

  • 在 t=2 时,因 i_3^=3,状态 3 的最大几率 P=0.0147,来源于状态 3,因此 i_2^=3.

  • 在 t=1 时,因 i_2^=3,状态 3 的最大几率 P=0.042,来源于状态 3,因此 i_1^=3.

最后获得最优路径为 I*=(i_{1},i_{2}^,i_{3}^*)=(3,3,3)

用Viterbi算法求解中文分词问题

根据上面讲的 HMM 和 Viterbi,接下来对中文分词这个问题,构造五元组并用算法进行求解。

InitStatus:π

 
 

TransProbMatrix:A

 
 

EmitProbMatrix:B

 
 

Viterbi求解

通过这个算法后,会获得两个矩阵 weight 和 path:

二维数组 weight[4][15],4是状态数(0:B,1:E,2:M,3:S),15是输入句子的字数。好比 weight[0][2] 表明 状态B的条件下,出现'硕'这个字的可能性。

二维数组 path[4][15],4是状态数(0:B,1:E,2:M,3:S),15是输入句子的字数。好比 path[0][2] 表明 weight[0][2]取到最大时,前一个字的状态,好比 path[0][2] = 1, 则表明 weight[0][2]取到最大时,前一个字(也就是明)的状态是E。记录前一个字的状态是为了使用viterbi算法计算完整个 weight[4][15] 以后,能对输入句子从右向左地回溯回来,找出对应的状态序列。

 
 

先对 weight 进行初始化,

使用 InitStatus 和 EmitProbMatrix 对 weight 二维数组进行初始化。

由 EmitProbMatrix 能够得出

 
 

因此能够初始化 weight[i][0] 的值以下:

 
 

注意上式计算的时候是相加而不是相乘,由于以前取过对数的缘由。

而后遍历找到 weight 每项的最大值,同时记录了相应的 path

//遍历句子,下标i从1开始是由于刚才初始化的时候已经对0初始化结束了 for(size_t i = 1; i < 15; i++) { // 遍历可能的状态 for(size_t j = 0; j < 4; j++) { weight[j][i] = MIN_DOUBLE; path[j][i] = -1; //遍历前一个字可能的状态 for(size_t k = 0; k < 4; k++) { double tmp = weight[k][i-1] + _transProb[k][j] + _emitProb[j][sentence[i]]; if(tmp > weight[j][i]) // 找出最大的weight[j][i]值 { weight[j][i] = tmp; path[j][i] = k; } } } } 

如此遍历下来,weight[4][15]path[4][15] 就都计算完毕。

肯定边界条件和路径回溯

边界条件以下:

对于每一个句子,最后一个字的状态只多是 E 或者 S,不多是 M 或者 B。
因此在本文的例子中咱们只须要比较 weight[1(E)][14]weight[3(S)][14] 的大小便可。

在本例中:

weight[1][14] = -102.492;

weight[3][14] = -101.632;

因此 S > E,也就是对于路径回溯的起点是 path[3][14]

进行回溯,获得序列

SEBEMBEBEMBEBEB。

再进行倒序,获得

BEBEBMEBEBMEBES

接着进行切词获得

BE/BE/BME/BE/BME/BE/S

最终就找到了分词的方式

小明/硕士/毕业于/中国/科学院/计算/所

HMM还有哪些应用

HMM不仅用于中文分词,若是把 S 换成句子,O 换成语音信号,就变成了语音识别问题,若是把 S 换成中文,O 换成英文,就变成了翻译问题,若是把 S 换成文字,O 换成图像,就变成了文字识别问题,此外还有词性标注等等问题。

对于上述每种问题,只要知道了五元组中的三个参数矩阵,就能够应用 Viterbi 算法获得结果。

原文:https://www.jianshu.com/p/f140c3a44ab6

相关文章
相关标签/搜索