机器学习_5.隐马尔可夫模型的典型问题和算法

三个典型问题

1.已知模型参数,计算某一给定可观察状态序列的概率

已经有一个特定的隐马尔科夫模型 λ 和一个可观察状态序列集。我们也许想知道在所有可能的隐藏状态序列下,给定的可观察状态序列的概率。当给定如下一个隐藏状态序列:

  那么在 HMM 和这个隐藏状态序列的条件下,可观察状态序列的概率为:

  而隐藏状态序列在 HMM 条件下的概率为:

  因此,隐藏状态序列和可观察状态序列的联合概率为:

  那么所有可能的隐藏状态序列上,可观察状态序列的概率为:

计算此类问题,即计算在某个特定的 HMM 下一个可观察状态序列的概率下最可能的模型,通常使用前向算法。

我们可以使用以下策略:

1.穷举搜索

效率低

2.使用递归来降低复杂度

不断利用“t+1时刻的计算依靠t时刻状态”的思想进行递归计算。

公式推导

所有的部分概率的计算公式为

               

使用前向算法在给定的一个 HMM 下计算某个可观察序列的概率。前向算法主要采用的是递归的思想,利用之前的计算结果。。

2.根据可见状态链寻找最可能的隐式状态链

1.穷举

2.维特比算法 (Viterbi Algorithm)

在给定了一个可观察序列和HMM的情况下,我们可以考虑递归的来寻找最可能的隐藏序列。我们可以先定义一个部分概率 δ,即到达某个中间状态的概率。接下来我们将讨论如何计算 t=1 和 t=n (n>1) 的部分概率。

  注意这里的部分概率和前向算法中的部分概率是不一样的,这里的部分概率表示的是在t时刻最可能到达某个状态的一条路径的概率,而不是所有概率之和

  1) 部分概率和部分最优路径

  考虑下面这个图以及可观察序列 (dry, damp, soggy) 的一阶转移

  对于每一个中间状态和终止状态 (t=3) 都有一个最可能的路径。比如说,在 t=3 时刻的三个状态都有一个如下的最可能的路径:

  我们可以称这些路径为部分最优路径。这些部分最优路径都有一个概率,也就是部分概率 δ。和前向算法中的部分概率不一样,这里的概率只是一个最可能路径的概率,而不是所有路径的概率和。

  我们可以用 δ(i, t) 来表示在t时刻,到状态i的所有可能的序列(路径)中概率最大的序列的概率,部分最优路径就是达到这个最大概率的路径,对于每一个时刻的每一个状态都有这样一个概率和部分最优路径。

  最后,我们通过计算 t=T 时刻的每一个状态的最大概率和部分最优路径,选择其中概率最大的状态和它的部分最优路径来得到全局的最优路径。

  2) 计算 t=1 时刻的部分概率

  当 t=1 时刻的时候,到达某个状态最大可能的路径还不存在,但是我们可以直接使用在 t=1 时刻某个状态的概率和这个状态到可观察序列 k1 的转移概率:

  3) 计算 t>1 时刻的部分概率

  接下来我们可以根据 t-1 时刻的部分概率来求 t 时刻的部分概率

  我们可以计算所有到状态 X 的路径的概率,找到其中最可能的路径,也就是局部最优路径。注意到这里,到达X的路径必然会经过 t-1 时刻的 A、B 和 C,所以我们可以利用之前的结果。达到X的最可能的路径就是下面三个之一:

  (状态序列),. . .,A,X (状态序列),. . .,B,X (状态序列),. . .,C,X

  我们需要做的就是找到以 AX、BX 和 CX 结尾的路径中概率最大的那个。

  根据一阶马尔科夫的假设,一个状态的发生之和之前的一个状态有关系,所以X在某个序列的最后发生的概率只依赖于其之前的一个状态:

Pr (到达A的最优路径) . Pr (X | A) . Pr (观察状态 | X)

  有个了这个公式,我们就可以利用t-1时刻的结果和状态转移矩阵和混淆矩阵的数据:

  将上面这个表达式推广一下,就可以得到 t 时刻可观察状态为 kt 的第 i 个状态的最大部分概率的计算公式:

  其中 aji 表示从状态 j 转移到状态 i 的概率,bikt 表示状态i被观察成 kt 的概率。

  4) 后向指针

  考虑下图

  在每一个中间状态和结束状态都有一个部分最优概率 δ(i, t)。但是我们的目的是找到最可能的隐藏状态序列,所以我们需要一个方法去记住部分最优路径的每一个节点。

  考虑到要计算 t 时刻的部分概率,我们只需要知道 t-1 时刻的部分概率,所以我们只需要记录那个导致了 t 时刻最大部分概率的的状态,也就是说,在任意时刻,系统都必须处在一个能在下一时刻产生最大部分概率的状态。如下图所示:

  我们可以利用一个后向指针 φ 来记录导致某个状态最大局部概率的前一个状态,即

  这里 argmax 表示能最大化后面公式的j值,同样可以发现这个公式和 t-1 时刻的部分概率和转移概率有关,因为后向指针只是为了找到“我从哪里来”,这个问题和可观察状态没有关系,所以这里不需要再乘上混淆矩阵因子。全局的行为如下图所示:

  5) 优点

  使用 viterbi 算法对一个可观察状态进行解码有两个重要的优点:

  a) 通过使用递归来减少复杂度,这点和之前的前向算法是一样的

  b) 可以根据可观察序列找到最优的隐藏序列,这个的计算公式是:

其中 

  这里就是一个从左往右翻译的过程,通过前面的翻译结果得到后面的结果,起始点是初始向量 π。

  3. 补充

  但在序列某个地方有噪声干扰的时候,某些方法可能会和正确答案相差的较远。但是 Viterbi 算法会查看整个序列来决定最可能的终止状态,然后通过后向指针来找到之前的状态,这对忽略孤立的噪声非常有用。

  Viterbi 算法提供了一个根据可观察序列计算隐藏序列的很高效的方法,它利用递归来降低计算复杂度,并且使用之前全部的序列来做判断,可以很好的容忍噪声。

  在计算的过程中,这个算法计算每一个时刻每一个状态的部分概率,并且使用一个后向指针来记录达到当前状态的最大可能的上一个状态。最后,最可能的终止状态就是隐藏序列的最后一个状态,然后通过后向指针来查找整个序列的全部状态。

3.序列集来找到一个最有可能的 HMM

在很多实际的情况下,HMM 不能被直接的判断,这就变成了一个学习问题,因为对于给定的可观察状态序列 O 来说,没有任何一种方法可以精确地找到一组最优的 HMM 参数 λ 使 P(O | λ) 最大,于是人们寻求使其局部最优的解决办法,而前向后向算法(也称为Baum-Welch算法)就成了 HMM 学习问题的一个近似的解决方法。

  前向后向算法首先对于 HMM 的参数进行一个初始的估计,但这个很可能是一个错误的猜测,然后通过对于给定的数据评估这些参数的的有效性并减少它们所引起的错误来更新 HMM 参数,使得和给定的训练数据的误差变小,这其实是机器学习中的梯度下降的思想。

  对于网格中的每一个状态,前向后向算法既计算到达此状态的“前向”概率,又计算生成此模型最终状态的“后向”概率,这些概率都可以通过前面的介绍利用递归进行高效计算。可以通过利用近似的 HMM 模型参数来提高这些中间概率从而进行调整,而这些调整又形成了前向后向算法迭代的基础。

  另外,前向后向算法是 EM 算法的一个特例,它避免了 EM 算法的暴力计算,而采用动态规划思想来解决问题,Jelinek 在其书《Statistical Methods for Speech Recognition》中对前向后向算法与 EM 算法的关系进行了详细描述,有兴趣的读者可以参考这本书。

  类似于上面讲到的前向算法,我们也可以定义后向变量 βt(i) 来计算给定当前隐藏状态 i 时,部分观察序列 ot+1,ot+2,…,oT的概率,即:

  与前向算法类似,我们也可以通过迭代算法有效计算 βt(i),计算公式如下:

  其中

  进一步我们可以发现

  因此

  下面开始介绍前向后向算法

  首先我们需要定义两个辅助变量,这两个变量可以用前文介绍过的前向变量和后向变量进行定义。

  第一个变量定义为 t 时状态 i 和 t+1 时状态 j 的概率,即

  该变量在网格中所代表的关系如下图所示:

  

  该等式等价于

  利用前向变量和后向变量,上式可以表示为

  第二个变量定义为后验概率,也就是在给定观察状态序列和 HMM 的情况下,t 时状态 i 的概率,即

  利用前向变量和后向变量,上式可以表示为

  因此,下式为在任意时刻状态 i 的期望,也就是从状态 i 转移到观察状态 o 的期望

  同样,下式也就是从状态 i 转移到状态 j 的期望

  我们可以发现定义的这两个变量之间的关系为

  下面介绍前向后向算法的参数学习过程,在学习的过程中,不断更新 HMM 的参数,从而使得 P(O | λ) 最大。我们假设初始的 HMM 参数为  λ={ π, A, B },首先计算前向变量 α 和后向变量 β,再根据刚刚介绍的公式计算期望 ξ 和 ζ,最后,根据下面的3个重估计公式更新 HMM 参数。

  如果我们定义当前的 HMM 模型为 λ={ π,A,B },那么可以利用该模型计算上面三个式子的右端;我们再定义重新估计的 HMM 模型为,那么上面三个式子的左端就是重估的 HMM 模型参数。Baum 及他的同事在70年代证明了,因此如果我们迭代地计算上面三个式子,由此不断地重新估计 HMM 的参数,那么在多次迭代后可以得到 HMM 模型的一个最大似然估计。不过需要注意的是,前向后向算法所得的这个最大似然估计是一个局部最优解。

参考:https://blog.csdn.net/likelet/article/details/7056068

猜你喜欢

转载自blog.csdn.net/qq_37865996/article/details/84136259