维特比(Viterbi)算法

article/2025/10/3 23:21:15

维特比算法 (Viterbi algorithm) 是机器学习中应用非常广泛的动态规划算法,在求解隐马尔科夫、条件随机场的预测以及seq2seq模型概率计算等问题中均用到了该算法。实际上,维特比算法不仅是很多自然语言处理的解码算法,也是现代数字通信中使用最频繁的算法。在介绍维特比算法之前,先回顾一下隐马尔科夫模型,进而介绍维特比算法的计算步骤。

以下为一个简单的隐马尔科夫模型,如下图所示:

                                                     
其中x = (x1, x2, ..., xN) 为隐状态序列,y = (y1, y2, ..., yN) 为观测序列,要求的预测问题为:

                                   
依据马尔科夫假设,上式等价于:

                                                          

在隐马尔科夫链中,任意时刻t下状态的值有多个,以拼音转汉字为例,输入拼音为“yike”可能有的值为一棵,一刻或者是一颗等待,用符号xij表示状态xi的第j个可能值,将状态序列按值展开,就得到了一个篱笆网了,这也就是维特比算法求解最优路径的图结构:

                                                        
隐马尔科夫的预测问题就是要求图中的一条路径,使得该路径对应的概率值最大。 对应上图来讲,假设每个时刻x可能取的值为3,如果直接求的话,有3^N的组合数,底数3为篱笆网络宽度,指数N为篱笆网络的长度,计算量非常大。维特比利用动态规划的思想来求解概率最大路径(可理解为求图最短路径),使得复杂度正比于序列长度,复杂度为O(N⋅D⋅D), N为长度,D为宽度,从而很好地解决了问题的求解。

维特比算法的基础可以概括为下面三点(来源于吴军:数学之美): 

1、如果概率最大的路径经过篱笆网络的某点,则从开始点到该点的子路径也一定是从开始到该点路径中概率最大的。 

2、假定第i时刻有k个状态,从开始到i时刻的k个状态有k条最短路径,而最终的最短路径必然经过其中的一条。 

3、根据上述性质,在计算第i+1状态的最短路径时,只需要考虑从开始到当前的k个状态值的最短路径和当前状态值到第i+1状态值的最短路径即可,如求t=3时的最短路径,等于求t=2时的所有状态结点x2i的最短路径加上t=2到t=3的各节点的最短路径。

为了纪录中间变量,引入两个变量sigma和phi,定义t时刻状态为i的所有单个路径 (i1, i2, ..., it) 中最大概率值(最短路径)为(前文小修已经有介绍隐马尔科夫相关的概念,如果不清楚可以看一下前面的详解隐马尔可夫模型 (HMM) ):

                  

其中it表示最短路径,Ot表示观测符号,lamda表示模型参数,根据上式可以得出变量sigma的递推公式:

                                                               

其中i = 1, 2, ..., N; t = 1, 2, ... , T-1,定义在时刻t状态为i的所有单个路径 (i1, i2, ..., it, i) 中概率最大的路径的第t-1个结点为:

                                                                  

根据上面的两个定义下面给出维特比算法具体内容:

输入为模型和观测状态分别为:

                                                                      

输出为求出最优路径:

                                                                                          

步骤为:(1) 初始化各参数:

                                                                     

(2) 根据上式进行递推,对t=2, 3, ..., T

                                                         

(3) 最后计算终止状态:

                                                                            

最优路径的回溯,对t=T-1, T-2,..., 1

                                                                                    

最后求得最优路径:

                                                                                       

以上就是维特比算法的主要过程和内容,下面介绍一个个例子。在自然语言处理技术中的seq2seq模型中,如下图所示:

                                  

其实seq2seq模型的核心就是:

                                                           

其中e和f就是相应的输出和输入序列,在进行解码的时候,如果词袋中的个数为V个,那么那么输出长度为N的序列,则需要的总共搜索V^N次,如果N的个数非常之大,这样的搜索非常耗时间,那么这个时候使用维特比算法就会大大的降低搜索的时间。这里假设词袋中只有a和b,而且它们之间的转变概率为:

                                

在这时使用维特比算法,其主要的思想为:

                                             

其中s(v,n) 表示的是以v结尾的最大概率的序列的概率,t(i, j, n)为第n-1步从i跳到第n步的j的概率。根据算法可以得到:

                                 

                                  

因此最终输出的序列为bba,

在这里最后说一点就是,其实对于seq2seq有相应的算法对整个序列的输出进行搜索计算 (beam search算法),其思想和维特比算法非常相似,这里不做介绍,下次有机会给大家介绍。

参考书目:

[1] 统计学习方法,李航
--------------------- 
作者:lovive 
来源:CSDN 
原文:https://blog.csdn.net/gzmfxy/article/details/78712878 
版权声明:本文为博主原创文章,转载请附上博文链接!

 


http://chatgpt.dhexx.cn/article/sNZgbCFm.shtml

相关文章

小白给小白详解维特比算法(一)

小白给小白详解维特比算法(一) 小白给小白详解维特比算法一 篱笆网络Lattice的最短路径问题 这个问题长什么样子这个问题难在哪里简化成这个模样你总能回答了吧下一步我们该干什么 别倒立了我们再从头想一下这个问题 我们是怎么走过来的来我们从A开始走这…

viterbi算法

维特比算法(Viterbi Algorithm) 标签(空格分隔): 未分类 维特比算法(Viterbi Algorithm) viterbi算法用于寻找最可能的隐藏状态序列(Finding most probable sequence of hidden states) 对于…

维特比算法

1. 概述 维特比算法是安德鲁.维特比(Andrew Viterbi)于1967年为解决通信领域中的解码问题而提出的,它同样广泛用于解决自然语言处理中的解码问题,隐马尔可夫模型的解码是其中典型的代表。无论是通信中的解码问题还是自然语言处理中的解码问题&#xff0c…

维特比算法(Viterbi algorithm)

一、维特比算法(Viterbi)原理以及简单实现 维特比算法(Viterbi algorithm)是一种动态规划算法。它用于寻找最有可能产生观测事件序列的维特比路径——隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中。 维特比算法实际是用动…

机器学习:维特比算法(Viterbi Algorithm)

一、维特比算法(Viterbi Algorithm)讲解方式01:篱笆网络(Lattice)的最短路径问题 已知下图的篱笆网络,每个节点之间的数字表示相邻节点之间的距离,举个例子来说,如果我走&#xff0…

字符串匹配原理及实现(C++版)

字符串匹配原理及实现(C版) 1. 字符串匹配概念2. BF2.1 原理2.2 代码实现 3. KMP3.1 原理3.2 代码实现 4. BM4.1 坏字符4.2 好后缀4.3 代码实现 1. 字符串匹配概念 在查找操作中,我们用到很重要的概念就是字符串匹配,所谓字符串匹…

C++之单字符串匹配问题

有很多算法可以解决单模式匹配问题。而根据在文本中搜索模式串方式的不同,我们可以将单模式匹配算法分为以下几种: 基于前缀搜索方法:在搜索窗口内从前向后(沿着文本的正向)逐个读入文本字符,搜索窗口中文…

字符串——字符串匹配

文章目录 字符串匹配一、基本概念字符串匹配问题符号和术语后缀重叠引理 二、朴素字符串匹配算法三、Rabin-Karp算法(字符串Hash算法)进制Hash质数Hash 四、利用有限自动机进行字符串匹配有限自动机字符串匹配自动机计算状态转移函数代码 五、Knuth-Morris-Pratt算法模式的前缀…

朴素字符串匹配

描述 字符串匹配问题的形式定义: 文本(Text)是一个长度为 n 的字符串:T;模式(Pattern)是一个长度为 m 且 m≤n 的字符串:P; T 和 P 中的元素都属于有限的字母表 Σ 表; 有效位移 (Valid Shift): 如果 0≤ s ≤n-m,并且 T[s1…sm] P[1…m]&#xff0c…

算法之字符串匹配一

目录 前言: BF算法: RK算法 总结: 参考资料 前言: 字符串匹配指的是一个短点的字符串与一个长点的字符串进行匹配,并确认短的字符串是否在长的字符串中存在。匹配算法有很多,本文介绍两种简单、容易…

字符串匹配算法(C语言实现)

目录 文章目录 前言 一、BF算法 二、KMP算法 1.算法介绍 2.算法思路 3.整体代码实现 总结 前言 字符串匹配算法又称模式匹配算法,该算法的目的是为了子串从主串中寻找是否有与其匹配的部分, 其可分为BF暴力检索、RK哈希检索、KMP、BM等等,本…

shell字符串匹配

一、简介 Bash Shell提供了很多字符串和文件处理的命令。如awk、expr、grep、sed等命令,还有文件的排序、合并和分割等一系列的操作命令。grep、sed和awk内容比较多故单独列出,本文只涉及字符串的处理和部分文本处理命令。 二、字符串处理 1、expr命令…

golang字符串匹配算法

简介 字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为模式串)。在 Golang 中,可以使用最常见的字符串匹配算法之一:Knuth-Morris-Pratt(KMP)算法,它的时间复杂度为 O(nm…

【数据结构】字符串匹配(暴力匹配)

原理解析: 字符串匹配方法,创建两个字符串结构,主 串和子串比较。 主串字符 a 和 子串字符 c 不匹配,主串的指针向下移动,移动到上一次开始比较的下一个位置。 子串指向开始的位置。 主串字符 b 和 子串字符 c 不匹配…

字符串匹配算法比较

字符串匹配(string match)是在实际工程中经常会碰到的问题,通常其输入是原字符串(String)和子串(又称模式,Pattern)组成,输出为子串在原字符串中的首次出现的位置。通常精确的字符串搜索算法包括暴力搜索(Brute force)…

子串查找(字符串匹配)

子串查询 首先,我们来定义两个概念,主串和模式串。我们在字符串 A 中查找字符串 B,则 A 就是主串,B 就是模式串。我们把主串的长度记为 n,模式串长度记为 m。由于是在主串中查找模式串,因此,主串…

字符串匹配算法综述

字符串匹配算法综述 字符串匹配算法综述:BF、RK、KMP、BM、Sunday 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目。此算法通常输入为原字符串(string)和子串(pattern&…

字符串匹配算法详解

希望看到文章的你们,能够在今年的研究生考试中超常发挥。 愿你们都能考上自己心仪的学校,为你们的备考生涯划上一个完美的句号。做为你们的师兄有几句话想对你们说,希望这些话能对你们有一些帮助。 马上就要考试了,不要再继续啃难…

字符串匹配算法

字符串匹配就是在主串A中查找模式串B,例如在主串abababc中查找模式串abc是否存在,记主串A的长度为n,模式串B的长度为m,n>m。 BF算法 BF(Brute Force)算法,又叫暴力匹配算法或者朴素匹配算法,思路很简单…

字符串(字符串匹配)

一、字符串匹配问题、基础 1、假设文本是一个长度为n的数组T,而模式是长度为m的数组P,我们希望在文本T中寻找模式P 如果P出现在T中的第s个位置,那么我们称其有效偏移为s,在其他不匹配的位置称为无效偏移 2、如果字符串w是字符串…