写在前面:最近做了很多命名实体识别方面的工作,在实体识别中最经典的方法就是BiLSTM+CRF,CRF得解码问题中就用到了维特比算法,所以想把维特比算法介绍一下。很多人介绍维特比算法时都以HMM为例(我也不例外),我觉得也许是因为HMM相对来说比较简单,容易理解吧。但得说明一点是,维特比算法在很多解码问题中都可以使用(例如seq2seq中的beam search算法其实是维特比算法的另一种形式),不单单是HMM。
感谢@lintongmao的指正, 这里做下修改。先前我在文中这样说道(
再说下既然维特比算法可以用来求概率最大的路径,那按理来说是可以用在seq2seq的解码问题上的,只不过这个时候,算法的时间复杂度是
1 HMM的解码问题
这里假设读者已经了解HMM以及其解码问题。
定义:HMM的解码问题就是给定一个观测序列
对于这个问题,我们很自然会想到一种方法,即:
- 我们枚举出所有可能的
- 然后计算出 每个
- 最后选择概率最大的那个即可(最大似然估计)
那怎么计算
但是这个方法时间复杂度太大 , 复杂度为
对应到图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
由贝叶斯理论:
下面这些公式中
对于长度为
由马尔可夫性质:
由独立观测假设:
下面这个公式比较重要:
所以
最终我们解码就是对上面这个式子使用维特比算法
最终最优隐藏状态序列
3 维特比算法具体介绍
维特比算法中涉及到两个矩阵(这也是动态规划算法会涉及到的,说矩阵可能不太准确,但我就这么叫吧,可以认为就是一块内存,用来记录以前计算过的信息)
T1: 用来保存每个时间点上,
T2:用来保存最大值对应的隐藏状态
维特比算法主要涉及forward computation 和 backtrace两个过程
下面的具体过程来自 Yuanche.Sh:图解Viterbi维特比算法 ,作者用心画了图,大家可以给点赞。
侵权立删!
维特比算法需要什么?
假设我们已经有Transition matrix和Emission matrix
Transition matrix:
Emission matrix:
外加初始每个state的概率 =
T1: 用来保存每个时间点上,到每个state的最大概率;
T2:用来保存这个最大概率是从上一个时间点的哪个state过来的;
初始化:初始概率 x 发射概率
初始化完成
从时间点1到时间点2,
从上一时间点A 到 当前时间点A的概率乘以A观测到2的概率:
同理从B到A
同理从C到A
求得最大值并保存到T1,T2
同理求A到B
同理求B到B
同理求C到B
求得最大值并保存
同理求得A,B,C到C
求得最大值并保存
同理求得时间点2到时间点3,ABC到A的最大值并保存。
同理求的ABC到B,最大值并保存。
同理求的ABC到C的最大值并保存。
在最后时间点上,求argmax可得A为最大,放入解码path中。
通过T2可得A是从C过来的,将C放入解码path中。
通过T2可得,C是从A过来的,将A放入解码path中。最后反转可得最终解码path为[A,C,A]。
现在看来维特比算法就是在计算下式:并将计算结果存在T1中,而T2中保存这个最大概率是从上一个时间点的哪个state过来的。
这里将自己看过的几篇讲解维特比算法的博文和用到的参考文献附在这一节,大家可以参考一下。
Yuanche.Sh:图解Viterbi维特比算法zhuanlan.zhihu.com写在最后:以上全是个人理解,肯定会有不正确或者不准确之处,大家看出来可以评论指正,我看到就会修改过来。
看到这篇文章的小伙伴,如果觉得对你有用,就为我点个赞吧!