https://zhuanlan.zhihu.com/p/63087935
[图片上传失败...(image-a8906b-1587025432526)]
<figcaption style="margin-top: 0.66667em; padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">开局一张图,内容全靠编</figcaption>

维特比算法作为HMM,CRF中的经典解码算法。
本文试图用简单的例子+图片来帮助理解该算法。
任务/问题是什么?
给定观察序列 [图片上传失败...(image-b17bc5-1587025432527)]
,每个观察点对应一个标注(或称为state) [图片上传失败...(image-676d8c-1587025432527)]
。
我们的任务是解码(decode)x 每个点上所对应的 y 是 y1 , y2 ,还是 y3。
如何解决?
naive:算出每种情况的概率,再取最大值;
[图片上传失败...(image-5538f6-1587025432527)]
复杂度为 [图片上传失败...(image-626996-1587025432527)]
,太大了。L为label(或称为state)的个数,N为输入的长度。我们需要维特比算法来简化。
为什么需要维特比算法?
维特比算法通过DP(动态规划)思想,在每个时间点+每个label上储存到该位置的最大概率。复杂度简化为: [图片上传失败...(image-7a1f8e-1587025432527)]
维特比算法需要什么?
假设我们已经有Transition matrix和Emission matrix
Transition matrix: [图片上传失败...(image-6be6eb-1587025432526)]
, e.g., [图片上传失败...(image-72c382-1587025432526)]
Emission matrix: [图片上传失败...(image-e4f474-1587025432526)]
, e.g., [图片上传失败...(image-aa4c73-1587025432526)]
外加初始每个state的概率 = [图片上传失败...(image-66da6e-1587025432526)]

T1: 用来保存每个时间点上,到每个state的最大概率; [图片上传失败...(image-44068c-1587025432526)]
T2:用来保存这个最大概率是从上一个时间点的哪个state过来的;
[图片上传失败...(image-514cd3-1587025432526)]

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

初始化完成

从时间点1到时间点2,
从上一时间点A 到 当前时间点A的概率乘以A观测到2的概率:[图片上传失败...(image-1211c4-1587025432526)]

同理从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]。

点个赞把~
网友评论