hmm 求隐藏序列_隐马尔可夫(HMM)的解码问题+维特比算法

3033dc04096194433cb078079f3f80d5.png

写在前面:最近做了很多命名实体识别方面的工作,在实体识别中最经典的方法就是BiLSTM+CRF,CRF得解码问题中就用到了维特比算法,所以想把维特比算法介绍一下。很多人介绍维特比算法时都以HMM为例(我也不例外),我觉得也许是因为HMM相对来说比较简单,容易理解吧。但得说明一点是,维特比算法在很多解码问题中都可以使用(例如seq2seq中的beam search算法其实是维特比算法的另一种形式),不单单是HMM。

感谢@lintongmao的指正, 这里做下修改。先前我在文中这样说道(

seq2seq中的beam search算法其实是维特比算法的另一种形式)。这么说确实有点问题,因为从本质上来说,维特比是一种全局最优的思想,而beam search采用贪心策略,不能保证全局最优。

再说下既然维特比算法可以用来求概率最大的路径,那按理来说是可以用在seq2seq的解码问题上的,只不过这个时候,算法的时间复杂度是

,
是字典大小,
是序列长度。看以看出当
很大时,算法的时间复杂度比较大,不是很适合。(做过OJ的就知道,那种n很大的题,你写个时间复杂度为
的算法,就只能通过一部分测试用例。这时候就需要一种时间复杂度为
或者
的算法。

1 HMM的解码问题

这里假设读者已经了解HMM以及其解码问题。

定义:HMM的解码问题就是给定一个观测序列

,找到最有可能(例如最能够解释观测序列,等等)的隐藏状态序列
,即我们需要计算

对于这个问题,我们很自然会想到一种方法,即:

  1. 我们枚举出所有可能的
  2. 然后计算出 每个
  3. 最后选择概率最大的那个即可(最大似然估计)

那怎么计算

呢?

=

但是这个方法时间复杂度太大 , 复杂度为

,其中N=max(每一列中状态的个数),T表示序列长度。所以不能这么算。

caae8c4815b669549c912e297e06f79c.png
图1.1 词性标注

对应到图1.1中,观测序列为(the boat snak),我们需要求解的序列是每个单词对应的词性序列(DET NONE VERB)。这里面每一时刻t对应的隐藏状态(即词性)数N均为3,图中序列长度T也3。Start 和 End 没有实际词性,起到标志作用。

我看到维特比算法第一印象就是这怎么跟动态规划经典题型:机器人走方格这么相似。事实也是如此

2 维特比算法

Viterbi intuition:We want to compute the joint probability of the observation sequence together with the best state sequence

由贝叶斯理论:

下面这些公式中

对应
,我有点懒,用图代替吧。

对于长度为

的序列,可以有:

f76972d369d287107396aa042a7daf87.png

由马尔可夫性质:

54cd0f67345c12a8aab56eca39d8e145.png

由独立观测假设:

4146fc890b0173bb39bf8e93a5b4c9db.png

下面这个公式比较重要:

所以

=

最终我们解码就是对上面这个式子使用维特比算法

最终最优隐藏状态序列

12432d965d94538aa166041d9fd9861b.png
图1.2 式中各参数介绍

3 维特比算法具体介绍

维特比算法中涉及到两个矩阵(这也是动态规划算法会涉及到的,说矩阵可能不太准确,但我就这么叫吧,可以认为就是一块内存,用来记录以前计算过的信息)

T1: 用来保存每个时间点上,

的最大值

T2:用来保存最大值对应的隐藏状态

维特比算法主要涉及forward computation 和 backtrace两个过程

下面的具体过程来自 Yuanche.Sh:图解Viterbi维特比算法 ,作者用心画了图,大家可以给点赞。

侵权立删!

维特比算法需要什么?

假设我们已经有Transition matrix和Emission matrix

Transition matrix:

, e.g.,

Emission matrix:

, e.g.,

外加初始每个state的概率 =

d98f7350c05d257b4e50dd6c42d9845c.png

T1: 用来保存每个时间点上,到每个state的最大概率;

T2:用来保存这个最大概率是从上一个时间点的哪个state过来的;

ef410a39b8a6f107e263a08c36fe3d68.png

初始化:初始概率 x 发射概率

1fbb495abce35e0b61742db97d405a17.png

初始化完成

18ab963023cc65d15e25b142442865e1.png

从时间点1到时间点2,

从上一时间点A 到 当前时间点A的概率乘以A观测到2的概率:

632b1cb653b1fbee995ccb73f66b3b20.png

同理从B到A

18ac6e4eb478912ae27bc935a24caa5a.png

同理从C到A

2c334752cb3dcc1042e027ac323f5767.png

求得最大值并保存到T1,T2

839d1a85b8e2224658df4e98ed6c7631.png

同理求A到B

ee5389bab79177ea5d256cfb39d19a46.png

同理求B到B

5ff0ab0ba539e44e427e0d36caa765fc.png

同理求C到B

d4c3d8f112e33f089b7b5e5c671fc3af.png

求得最大值并保存

1c40d02380e6704c0e3db2880fd58f87.png

同理求得A,B,C到C

896400de4ffe29c55af4526f50cb9b45.png

求得最大值并保存

aefc43d965384baa8874de0dd1c21756.png

同理求得时间点2到时间点3,ABC到A的最大值并保存。

c062d6f4ceb7ef872919bcb293057bfd.png

同理求的ABC到B,最大值并保存。

1c07527611c620efc4cbfde7025211dd.png

同理求的ABC到C的最大值并保存。

6d151169e8305fe7d6e8b84c4be0d10e.png

在最后时间点上,求argmax可得A为最大,放入解码path中。

be63bbe74390c790da37b4cc92526bd5.png

通过T2可得A是从C过来的,将C放入解码path中。

cb3f5d4d4375d2eb6f24a5374e52c9ff.png

通过T2可得,C是从A过来的,将A放入解码path中。最后反转可得最终解码path为[A,C,A]。

9b64d95fdf0738057c5adc64c3f90659.png

现在看来维特比算法就是在计算下式:并将计算结果存在T1中,而T2中保存这个最大概率是从上一个时间点的哪个state过来的。

6e6786bdf8037b2e302c5a0c9811a6cf.png

70939b8f741ae3d5f5326f773e5850ac.png

这里将自己看过的几篇讲解维特比算法的博文和用到的参考文献附在这一节,大家可以参考一下。

Yuanche.Sh:图解Viterbi维特比算法​zhuanlan.zhihu.com
6ea271c9c242e969b9b5ba697e40a550.png
https://blog.csdn.net/qq_16234613/article/details/82835641​blog.csdn.net 田甜:HMM+Viterbi(维特比算法)+最短路径分析​zhuanlan.zhihu.com
27b58d5cbd0048000694b605121cb299.png
https://web.stanford.edu/~jurafsky/slp3/A.pdf​web.stanford.edu http://cecas.clemson.edu/~ahoover/ece854/refs/Ramos-Intro-HMM.pdf​cecas.clemson.edu

写在最后:以上全是个人理解,肯定会有不正确或者不准确之处,大家看出来可以评论指正,我看到就会修改过来。

看到这篇文章的小伙伴,如果觉得对你有用,就为我点个赞吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值