向前和向后算法与维特比算法有什么区别?


Answers:


65

首先有一些背景知识,也许可以使事情变得更清晰。

在谈论HMM(隐马尔可夫模型)时,通常要考虑3个问题:

  1. 评价问题

    • 评估问题回答了这个问题:特定模型产生特定符号序列的概率是多少?
    • 为了进行评估,我们使用两种算法:前向算法后向算法(不要将它们与前向后向算法混淆)。
  2. 解码问题

    • 解码问题回答了这个问题:给定一个符号序列(您的观察结果)和一个模型,产生该序列的状态序列最可能是什么。
    • 对于解码,我们使用Viterbi算法
  3. 培训问题

    • 训练问题回答了这个问题:给定一个模型结构和一组序列,找到最适合数据的模型。
    • 对于此问题,我们可以使用以下三种算法:
      1. MLE(最大似然估计)
      2. 维特比训练(不要与维特比解码混淆)
      3. Baum Welch =前向后向算法

综上所述,当在一组序列上训练模型时,可以使用Viterbi算法来解决解码问题,并使用Baum Welch / Forward-backward。


Baum Welch的工作方式如下。

对于序列训练集中的每个序列。

  1. 使用前向算法计算前向概率
  2. 使用向后算法计算向后概率
  3. 计算当前序列对模型转换的贡献,计算当前序列对模型发射概率的贡献。
  4. 计算新的模型参数(起始概率,过渡概率,发射概率)
  5. 计算模型的新对数似然
  6. 当对数可能性的变化小于给定阈值或经过最大迭代次数时,停止。

如果您需要有关维特比解码方程的完整描述,并且训练算法让我知道,我可以为您指明正确的方向。


24

向前-向后给出每种状态的边际概率,维特比给出最可能的状态序列的概率。例如,如果您的HMM任务是预测每天的晴天和阴雨天气,则“前进后退”将告诉您每天“晴天”的可能性,维特比会给出最可能的晴天/阴天的顺序,此序列的概率。


15

我发现{2}中的以下两张幻灯片非常适合将HMM使用的所有其他典型算法放在前向和后向算法和Viterbi算法中:

在此处输入图片说明

在此处输入图片说明

笔记:

  • x是观察到的发射,是HMM的参数。π
  • 路径=排放序列
  • 解码=推论
  • 学习=训练=参数估计
  • 一些论文(例如,{1})声称Baum-Welch与前进-后退算法相同,但我同意Masterfool和Wikipedia:Baum-Welch是一种使用前进-后退算法的期望最大化算法。这两个插图也将Baum-Welch与向前-向后算法区分开。

参考文献:


12

莫拉特的答案在某一点上是错误的:Baum-Welch是一种Expectation-Maximization算法,用于训练HMM的参数。它在每次迭代过程中使用前向-后向算法。前向-后退算法实际上只是前向和后向算法的组合:一个向前通过,一个向后通过。向前-向后算法本身并不用于训练HMM的参数,而仅用于平滑:计算状态序列的边际似然。

https://zh.wikipedia.org/wiki/Forward%E2%80%93backward_algorithm

https://zh.wikipedia.org/wiki/鲍姆(Baum)%E2%80%93Welch_algorithm


2

@Yaroslav Bulatov有一个准确的答案。我将添加一个示例,以说明前进后退算法与维特比算法之间的区别。

假设我们有一个HMM(来自Wikipedia HMM页面)。注意,已经给出了模型,因此这里没有学习数据的任务。

在此处输入图片说明


假设我们的数据是长度为4的序列。(Walk, Shop, Walk, Clean)。两种算法会给出不同的结果。

  • 前向后退算法将给出每个隐藏状态概率。这是一个例子。注意,表中的每一列总计为。1

在此处输入图片说明

  • Viterbi算法将给出最可能的隐藏状态序列。这是一个例子。注意,也有与此隐藏状态序列相关联的概率。该序列具有最大概率。在所有其他序列上(例如,从序列从全部到全部)。24=16SunnyRainy

在此处输入图片说明


这是R演示的一些代码

library(HMM)
# in education setting,
# hidden state: Rainy and Sunny
# observation: Walk, Shop, Clean

# state transition
P <- as.matrix(rbind(c(0.7,0.3),
                     c(0.4,0.6)))

# emission prob
R <- as.matrix(rbind(c(0.1, 0.4, 0.5),
                     c(0.6,0.3, 0.1)))


hmm = initHMM(States=c("Rainy","Sunny"),
              Symbols=c("Walk","Shop", "Clean"),
              startProbs=c(0.6,0.4),
              transProbs=P,
              emissionProbs=R)
hmm


obs=c("Walk","Shop","Walk", "Clean")
print(posterior(hmm,obs))
print(viterbi(hmm, obs))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.