Viterbi-Algorithm

维特比算法是一个特殊但应用最广的动态规划算法。利用动态规划,可以解决任何一个图中的最短路径问题。而维特比算法是针对一个特殊的图-篱笆网了(Lattice)的有向图最短路径问题而提出来的。它之所以重要,是因为凡是使用隐马尔科夫模型描述的问题都可以用它解码,包括当前的数字通信、语音识别、机器翻译、拼音转汉字、分词等。

背景

假定用户(盲打时)输入的拼音时 y 1 , y 2 , ⋯ , y N y_1,y_2,\cdots ,y_N y1​,y2​,⋯,yN​,对应的汉字是 x 1 , x 2 , ⋯ , x N x_1,x_2,\cdots,x_N x1​,x2​,⋯,xN​(虽然真正的输入法产品都是以词作为输入单位的,为了便于说明问题及简单起见,以字为单位来解释维特比算法),那么根据当前介绍的工具:
x 1 , x 2 , . . . , x N = arg ⁡ max ⁡ x ∈ P P ( x 1 , x 2 , ⋯ , x N ∣ y 1 , y 2 , ⋯ , y N ) = arg ⁡ max ⁡ x ∈ X ∏ i = 1 N P ( y i ∣ x i ) P ( x i ∣ x i − 1 ) (1) x_1,x_2,...,x_N=\arg\max\limits_{x∈P}P(x_1,x_2,\cdots,x_N|y_1,y_2,\cdots,y_N)=\arg\max\limits_{x∈X}\prod^N_{i=1}P(y_i|x_i)P(x_i|x_{i-1}) \tag{1} x1​,x2​,...,xN​=argx∈Pmax​P(x1​,x2​,⋯,xN​∣y1​,y2​,⋯,yN​)=argx∈Xmax​i=1∏N​P(yi​∣xi​)P(xi​∣xi−1​)(1)
输入的可见序列为 y 1 , y 2 , ⋯ , y N y_1,y_2,\cdots ,y_N y1​,y2​,⋯,yN​,而产生他们的隐含序列是 x 1 , x 2 , ⋯ , x N x_1,x_2,\cdots,x_N x1​,x2​,⋯,xN​。可以用下图描述这样一个过程:

这是一个相对简单的隐马尔科夫链,没用状态跳跃,也没有自环。 P ( x i ∣ x i − 1 ) P(x_i|x_{i−1}) P(xi​∣xi−1​)是状态之间的转移概率, P ( y i ∣ x i ) P(y_i|x_i) P(yi​∣xi​)是每个状态的产生概率。现在,这个马尔科夫链的每个状态的输出是固定,但是每个状态的值可以变化。比如输出读音”zhong”的字可以是”中”、”种“等多个字。我们不妨抽象一点,用符号 x i j x_{ij} xij​表示状态 x i x_i xi​的第 j j j个可能的值。如果把每个状态按照不同的值展开,就得到下面这个篱笆网络(Lattice)

在上图中,每个状态有3个或4个值,当然时间中它们可以有任意个值。

那么从第一个状态到最后一个状态的任何一条路径(Path)都可能产生我们观察到的输出序列Y。当然这些路径的可能性不一样,而我们要做的就是找到最可能的这条路径,并不是很难。但麻烦的是这样的路径组合数非常多,会让序列状态数的增长呈指数式增长。汉语中每个无声调的拼音对应13个左右的国标汉字,假定句子长为10个字,那么这个组合数为 1 3 10 ∼ 5 × 1 0 14 13^{10} \sim 5 × 10^{14} 1310∼5×1014,这个计算量就相当的大了。因此,需要一个最好能和状态数目成正比的算法,而这个算法在1967年首次提出,即维特比算法。

维特比算法基础

维特比利用动态规划的思想来求解概率最大路径(可理解为求图最短路径),使得复杂度正比于序列长度,复杂度为 O ( N ⋅ D 2 ) O(N\cdot D^2) O(N⋅D2),N为长度,D为宽度,从而很好地解决了问题的求解。

维特比算法的基础可以概括为下面三点:

  1. 如果概率最大的路径P(或者说是最短路径)经过某个点,比如下图中的 x 22 x_{22} x22​,那么这条路径上从起始点S到 x 22 x_{22} x22​的这一段路径Q,一定是S到 x 22 x_{22} x22​之间的最短路径。否则,用S到 x 22 x_{22} x22​的最短路径R代替Q,便构成了一条比P更短的路径,这就和之前的假设矛盾了。
  2. 从S到E路径必定经过第i时刻的某个状态,假定第i时刻有k个状态,那么如果记录了从S到i个状态的所有k个节点(所有时刻的所有状态)的最短路径,最终的最短路径必经过其中的一条。这样,在任何时刻,只要考虑非常有限条候选路径即可。
  3. 结合以上两点,假定当我们从状态i进入到i+1时,从S到i上各个节点的最短路径已经找到,并且记录到这些节点上,那么在计算出从起点S到第i+1状态的某个结点的最短路径时,只要考虑从S到前一个状态i所有的k个节点的最短路径,以及从这k个节点到 x i + 1 , j x_{i+1},j xi+1​,j的距离即可。

为了记录中间变量,引入变量 δ \delta δ和 ψ \psi ψ。定义t时刻到状态为i的所有结点最大概率值(最短路径):
δ t ( i ) = max ⁡ P ( i t = i , i t − 1 , ⋯ , i 1 , o t , ⋯ , o 1 ∣ λ ) , i = 1 , 2 , ⋯ , N \delta_t{(i)} = \max P(i_t=i,i_{t-1},\cdots,i_1,o_t,\cdots,o_1|\lambda),\ \ i=1,2,\cdots,N δt​(i)=maxP(it​=i,it−1​,⋯,i1​,ot​,⋯,o1​∣λ),  i=1,2,⋯,N
其中, i t i_t it​表示最短路径, o t o_t ot​表示观测符号, λ \lambda λ表示模型参数。依据上式可以得出变量 δ \delta δ的递推式:
δ t + 1 ( i ) = m a x [ δ t ( j ) ⋅ a j i ] ⋅ b i ( o t + 1 ) , i = 1 , 2 , ⋯ , N ; t = 1 , 2 , ⋯ , T − 1 \delta_{t+1}(i)=max[\delta_t(j)\cdot a_{ji}]\cdot b_i(o_{t+1}), \ \ i=1,2,\cdots,N;t=1,2,\cdots,T-1 δt+1​(i)=max[δt​(j)⋅aji​]⋅bi​(ot+1​),  i=1,2,⋯,N;t=1,2,⋯,T−1
表示t时刻处于状态 j j j,t+1时刻转移到状态 i i i 且观测到符号 o t + 1 o_{t+1} ot+1​的最大概率。

定义 ψ t ( i ) \psi_t(i) ψt​(i) 为时刻t到状态为i的概率最大路径的前一个时刻经过的结点,即它保存了最短路径所经过的结点:
ψ t ( i ) = arg ⁡ max ⁡ 1 ≤ j ≤ N [ δ t − 1 ( j ) ⋅ a j i ] \psi_t(i) = \arg\max\limits_{1\le j\le N}[\delta_{t-1}(j)\cdot a_{ji}] ψt​(i)=arg1≤j≤Nmax​[δt−1​(j)⋅aji​]
可以看到,其实 ψ \psi ψ的值就是我们之前算的 δ \delta δ的前一项max的值所对应的状态!

举例

这里给出一个盒子和球的例子,跟我们之前在HMM中所讲的例子是一样的。

Viterbi-Algorithm(维特比算法)相关推荐

  1. HMM——维特比算法(Viterbi algorithm)

    1. 前言 维特比算法针对HMM第三个问题,即解码或者预测问题,寻找最可能的隐藏状态序列: 对于一个特殊的隐马尔可夫模型(HMM)及一个相应的观察序列,找到生成此序列最可能的隐藏状态序列. 也就是说给 ...

  2. 语音识别学习日志 2019-7-17 语音识别基础知识准备6 {维特比算法(Viterbi Algorithm)}

    HMM 维特比算法(Viterbi Algorithm)详细解释参考:http://www.52nlp.cn/hmm-learn-best-practices-six-viterbi-algorith ...

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

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

  4. 维特比算法(Viterbi algorithm) 的理解

    维特比算法实际是动态规划解隐马尔科夫模型预测问题,用动态规划求概率最大路径,这时一条路径就是一个状态序列. 根据动态规划原理,最优路径在时刻t,如果最优路径 通过节点Node_t_k, 那么这一路径从 ...

  5. 隐马尔可夫模型HMM+维特比算法(Viterbi Algorithm)进行词性标注代码实现(自然语言处理课程第二次作业)

    文章目录 一.理论描述 二.算法描述 三.详例描述 具体过程 分析题目 数据预处理 转移概率矩阵: 发射概率矩阵: HMM+维特比算法进行词性标注 开始进行词性标注: The: bear: is: o ...

  6. 维特比算法Viterbi Algorithm

     1.简介 维特比算法是一个特殊但应用最广的动态规划算法,它是针对篱笆网络的有向图(Lattice)的最短路径问题而提出的.凡是使用隐含马尔可夫模型描述的问题都可以用维特比算法来解码,包括今天的数 ...

  7. 简述维特比算法(Viterbi Algorithm)

    维特比算法是一个特殊但应用最广的动态规划算法.利用动态规划,可以解决任何一个图中的最短路径问题.而维特比算法是针对一个特殊的图--篱笆网络(Lattice)的有向图最短路径的问题而提出的.它之所以重要 ...

  8. 维特比算法(viterbi)原理以及简单实现

    维特比算法 看一下维基百科的解释,维特比算法(Viterbi algorithm)是一种动态规划算法.它用于寻找最有可能产生观测事件序列的维特比路径--隐含状态序列,特别是在马尔可夫信息源上下文和隐马 ...

  9. 【10.1算法理论部分(4)预测问题(近似算法和维特比算法)】Hidden Markov Algorithm——李航《统计学习方法》公式推导

    10.4预测算法(解决Decoding: S ^ = a r g m a x S P ( S ∣ O , λ ) \hat{S} = argmax_{S}P(S|O,\lambda) S^=argma ...

  10. 维特比算法(Viterbi)

    维特比算法 (Viterbi algorithm) 是机器学习中应用非常广泛的动态规划算法,在求解隐马尔科夫.条件随机场的预测以及seq2seq模型概率计算等问题中均用到了该算法.实际上,维特比算法不 ...

最新文章

  1. SQL DBHelp.cs 操作数据库的底层类
  2. thymeleaf文档_springboot中Thymeleaf和Freemarker模板引擎的区别
  3. bash ps1变量_在 Linux 中打扮你的冬季 Bash 提示符
  4. 第二大数 滑动窗口 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛
  5. svn 提交到远程仓库_聊聊如何从SVN迁移源码到Git仓库
  6. 51Nod 1179 最大的最大公约数
  7. 在Windows上面安装多个Memcached
  8. 7.3图的遍历(广度优先)-理论
  9. 数据仓库etl编程_莱牛教育:浅谈大数据ETL大数据工程师所需具备的能力
  10. Xendesktop 5.0与view 4.5对比的看法
  11. excel减法函数_电子表格减法公式
  12. 第五讲 中外数学名题趣题欣赏与解析
  13. python自带idle_使用自带的IDLE
  14. NDK Caused by: java.lang.UnsatisfiedLinkError:
  15. linux启用dcb步骤,Linux内核DCB子系统
  16. 第一次sql注入的教训与思考
  17. 【小程序】视图与逻辑
  18. SQL基础培训13-索引和优化
  19. 第三方ZXing库zxing-android-embedded使用及自定义
  20. 齐二TK6916/20/26/32系列数控落地铣镗床简介4

热门文章

  1. GitHub 上很火的 7 个项目--架构思想精华
  2. 开除AI伦理学家,谷歌如何从“不作恶”到“不宽容”?
  3. 面向无人驾驶 “云端大脑” 可用性的云原生实践
  4. Swift 编程语言教程(官方文档)
  5. 英特尔David Tuhy:英特尔®傲腾技术成功的原因
  6. 从程序员的角度分析微信小程序(编程语言:用到什么学什么)
  7. 【微信小程序】横向/纵向布局(98/100)
  8. Linux openmp教程,OpenMP中文教程
  9. 程序员为什么不单干、接私活、自己开公司
  10. 【生成模型】浅析玻尔兹曼机的原理和实践