zoukankan      html  css  js  c++  java
  • 机器学习算法总结(七)——隐马尔科夫模型(前向后向算法、鲍姆-韦尔奇算法、维特比算法)

      概率图模型是一类用图来表达变量相关关系的概率模型。它以图为表示工具,最常见的是用一个结点表示一个或一组随机变量,结点之间的变表是变量间的概率相关关系。根据边的性质不同,可以将概率图模型分为两类:一类是使用有向无环图表示变量间的依赖关系,称为有向图模型或贝叶斯网;另一类是使用无向图表示变量间的相关关系,称为无向图模型或马尔科夫网。

      隐马尔科夫模型(简称HMM)是结构最简单的动态贝叶斯网,是一种著名的有向图模型,主要用于时间序数据建模,在语音识别,自然语言处理,生物信息,模式识别中有着广泛的应用,虽说随着RNN和LSTM的崛起,HMM的地位有所下降,但很多时候依然是处理序列问题的好用的算法。

    1、隐马尔科夫模型

      隐马尔科夫模型的图结构如下

      

      从上图中主要有两个信息:一是观测变量xi 仅仅与与之对应的状态变量yi 有关;二是当前的状态变量yi 仅仅与它的前一个状态变量yi-1 有关。

      隐马尔科夫模型是由初始概率分布,状态转移概率分布,以及观测概率分布确定的。设Q是所有可能的状态的集合,V是所有可能的观测的集合(注意:这里的状态集合和观测集合中的个数和序列的长度T是不一样的,每个时间端的状态和观测值都是依照概率生成的,也就意味着在一个序列里面会存在状态和观测值相同的情况)。具体集合表达式如下,其中N是可能的状态数,M是可能的观测数:

      

      假设此时存在一个长度为T的序列,I为其状态序列,O为其观测序列(在HMM模型中每个序列都会包含状态序列和观测序列),序列的表达式如下:

      

      在这里我们引入三组参数来描述我们的模型:

      状态转移概率矩阵,,状态转移概率矩阵A的表达式如下(矩阵的维度和状态集合的个数是一样的

      

      其中aij 描述的是在t 时刻从状态qi 转移到t+1 时刻的状态qj 的概率,其条件概率表达式如下

      

      观测概率矩阵,观测概率矩阵B的表达式如下(矩阵的行数和状态集合的个数相等,列数和观测集合的个数相等

      

      其中bj(k) 描述的是在t 时刻处于状态qj 的条件下生成观测值vk 的概率(在某一时刻下,从状态输出观测值的可能性有k种),其表达式如下

      

      初始状态概率,初始状态概率π 的表达式如下(整个模型的入口是从确定状态i1 开始的,因此需要初始化该值

       

       

      其中πi 就是在t = 1 时刻处于状态qi 的概率

      给出了上述三个参数之后,隐马尔科夫模型λ 就可以用它们来表示

      

      在隐马尔科夫模型中作出了两个假设来简化模型:

      1)齐次马尔科夫性假设,即假设隐藏的马尔科夫链在任意时刻t 的状态只和前一时刻状态有关,与其他时刻的状态无关(而在深度模型中都会假设和前面多个时刻的状态有关,如LSTM;或者和之前的所有状态相关,如RNN。事实上很多应用场景中都不止是和前一个状态相关),这也就简化了模型的复杂度,因此我们可以获得如下的表达式

      

      2)观测独立性假设,即假设任意时刻的观测只依赖于该时刻的马尔科夫链的状态,与其他观测和状态无关,因此可以获得如下表达式

      

      结合上面两个假设,我们可以将我们的模型中所有变量的联合概率分布给出,这就是所谓的 “马尔科夫链”

      

      当确定了模型的三个参数后,我们可以按照如下规则生成观测值序列

      输入的是HMM的模型λ=(ABπ),观测序列的长度T

      输出是观测序列O={o1o2..oT}

      生成的过程如下:

      1)根据初始状态概率分布π,生成隐藏状态i1

         2) 令 t = 1

      3)按照隐藏状态i的观测状态分布生成观察状态ot

      4)按照隐藏状态i的状态转移概率分布产生隐藏状态it+1

         5)令t = t + 1;如果t  < T,则转至第3 步,否则终止。所有的ot 一起形成观测序列O={o1o2...oT}

      隐马尔科夫模型的三个基本问题

      1) 评估观察序列概率。即给定模型λ (AB, π)和观测序列O={o1o2,..oT},计算在模型λ下观测序列O出现的概率P(O|λ)。这个问题的求解需要用到基于动态规划的前向后向算法

      2)模型参数学习问题。即给定观测序列O={o1o2,..oT},估计模型λ=(AB π)的参数,使该模型下观测序列的条件概率P(O|λ)最大。这个问题的求解需要用到基于EM算法的鲍姆-韦尔奇算法

      3)预测问题,也称为解码问题。即给定模型λ=(ABπ)和观测序列O={o1o2,..oT},求给定观测序列条件下,最可能出现的对应的状态序列,这个问题的求解需要用到基于动态规划的维特比算法

    2、前向后向算法

      首先来回顾我们前面提出的隐马尔科夫模型的三个基本问题中的第一个问题 — 评估观察序列概率。即给定模型λ (AB, π)和观测序列O={o1o2,..oT},计算在模型λ下观测序列O出现的概率P(O|λ)。在知道模型参数和观测序列的情况下,我们只需要列出所有可能的状态序列,然后求每个状态序列下的得到观察序列O的概率,再将这些概率相加起来就是我们最终要求的概率。然而类似这种穷举法的时间复杂度是非常高的,假定状态集Q的个数是N,序列长度是T,则可以列举出的状态序列的个数为NT,时间复杂度就是O(TNT)。

      我们来看下这种穷举法的具体数学过程,先列举出所有可能的状态序列,每个状态序列发生的概率表达式如下

      

      对于固定的状态序列,观测序列O的概率表达式如下

      

      对所有可能的状态序列和观测序列的联合概率求和,就得到我们问题的解,具体表达式如下

      

      由于上述方法的时间复杂度过高,因此在这里我们引入前向后向算法 — 一种动态规划算法。首先介绍前向算法,我们引入前向概率的概念,其表达式为

      

      αt(i) 表示在t 时刻,观测序列为o1,o2,...,ot,状态为qi 的概率。假设序列的长度为T,则我们要计算的观测序列的概率为

      

      这个算法的核心是采用递归的形式,凡是递归的形式都可以用归纳法来描述,现在我们来归纳我们的结果

      当t = 1,此时的子序列长度为1:

      P(o1|λ) = π1b1(o1) + π2b2(o1) + ...... + πNbN(o1),在这里 bi(o1) 表示从状态qi 输出o1 的概率

          = α1(1) + α1(2) + ...... + α1(N) 

      当t = 2,此时的子序列长度为2:

      P(o1o2|λ) = P(o1o2, i2 = q1|λ)  + P(o1o2, i2 = q2|λ)  + ...... + P(o1o2, i2 = qN|λ) ,注意:这里变化的只有状态值

      在这里P(o1o2, i2 = q1|λ) = α1(1) a11 b1(o2) + α1(2) a21 b1(o2) + ...... + α1(N) aN1 b1(o2) = α2(1),注意:这里变化的是t = 1 时刻的状态值,因为当前的结果是序列是t = 1 和t = 2时刻的联合序列,因此依赖与t = 1时刻的输入值,而在这里的α1(1) 是在之前已经计算好的,因此可以较少当前的计算量(这是一种动态规划思想,先求解子问题,然后记住子问题的结果去一步一步的求解至整个问题)

      结合上面两个式子 可以将 P(o1o2|λ) = α2(1) + α2(2) + ...... + α2(N)

      依次递归下去,当t = t + 1时,式子可以表示为

      P(o1o2.....ot+1|λ) = αt+1(1) + αt+1(2) + ...... + αt+1(N)

      其中αt+1(i) = αt(1) a1i bi(ot+1) + αt(2) a2i bi(ot+1) + ...... + αt(N) aNi bi(ot+1)

      这就是我们整个前向算法的过程,引入了前向概率,每个子序列的概率都可以用当前时刻的前向概率来表示,保存当前的前向概率,作为计算下一时刻前向概率的输入值(在这里可以极大的减少计算时间复杂度),利用前向算法计算的时间复杂度是O(N2T)。

      前向算法具体的流程如下:

      1)求得初值

      

      2)递归,当t = t + 1时刻

      

      3)t = T 时刻时,终止递归

      

      后向算法,后向算法是从后往前推,这里和前向算法正好相反,但核心思想是一样的,我们首先定义后向概率,其表达式如下

      

      描述的是在时刻t 状态为qi 的条件下,从t+1 到T 的部分观测序列的概率,具体归纳过程不再赘述,算法具体流程如下

      1)求得初值

      

      2)递归,在t 时刻时

      

      3)t = 1时,终止递归

      

      在HMM模型中可以利用前向概率和后向概率得到关于单个状态和两个状态的概率公式:

      1)给定模型λ和观测序列O,在t 时刻的状态qi 的概率可以表达为

      

      引入前向、后向概率,表达式可以表示为

      

        (对于该表达式事实上也可以扩展到前后组合算法去求观测序列的概率上,利用前向算法从t = 1开始,后向算法从t = T开始

      

      2)给定模型λ和观测序列O,在t 时刻的状态qi 且t+1 时刻的状态为qj 的概率可以表达为

      

      引入前向概率和后向概率

      

      在这里

      

      

      结合上面的两种概率,可以得到一些有用的期望:

      1)在观测序列O下状态i出现的期望值

      

      2)在观测序列O下由状态i转移的期望值

      

      3)在观测序列O下由状态i 转移到状态j 的期望值

      

    3、鲍姆-韦尔奇算法

      假定给出的训练数据是已经标记好了状态序列的数据,训练数据是包含S个长度相等的观测序列和对应的状态序列{(O1, I1), (O2, I2), (OS, IS)},那么可以直接估计隐马尔科夫模型的参数,具体估计如下:

      1)状态转移概率αij 的估计

      

      Aij 表示样本中时刻t 处于状态i,时刻t+1 处于状态j 的频数(这种状态转移的样本数除以总的样本数)

      2)观测概率bj(k) 的估计,Bjk的理解和上面一样

      

      3)初始状态概率πi 的估计为S个样本中初始状态为qi 的概率

      上面这种求解方式是在给定了状态序列的情况下生效的,然而在显示中观测序列容易获得,但标定状态序列却并非易事,因此在这里求解模型参数的时候我们采用无监督学习来求解。假定只知道观测序列的前提下,利用极大似然估计来求解参数,然而此时含有隐变量状态序列Q,自然而然就想到了EM算法(基本都是用于无监督学习中)。具体算法推导有点复杂,直接给出算法执行流程:

      输入:观测数据O = (o1, o2, ..., oT)

      输出:隐马尔科夫模型参数

      1)初始化模型参数

      

      2)迭代求解

      

      

      3)迭代终止,模型参数收敛,得到模型参数

      

    4、维特比算法

      维特比算法是一种预测算法,在给定了模型参数λ和观测序列O的前提下去预测最可能出现的状态序列。关于隐马尔科夫模型预测的算法除了维特比算法之外,还有一种近似算法。

      近似算法:近似算法的核心思想是在每个时刻t选择在该时刻最有可能出现的状态it*,从而得到一个近似状态序列。这种算法的优点是算法简单易理解,缺点是每次都是求解局部最优(贪心原则),不能保证全局最优。具体算法流程如下:

      给定模型λ和观测序列O,在t 时刻的状态qi 的概率为(在前向后向算法中有推导):

      

      在每一时刻t 最有可能的状态it* 是

      

      这样就可以得到近似的状态序列

      

      维特比算法和前向后向算法一样,也是利用动态规划来解隐马尔科夫的预测问题。在前向后向算法中是对t 时刻转移到t+1 时刻的所有可能的状态相加,因为是求边缘概率 P(O|π);而在维特比算法中是对t 时刻转移到t+1 时刻的状态求最大概率,即求最大的P(O, S|π)(注意:在这里求t 时刻的最大值也是和t - 1的时刻相关联的。无关的化只是贪心法)。

      首先定义两个变量δ和Ψ。定义在时刻t 状态为i 的所有单个路径中概率最大值(这里事实上就是前向算法中的前向概率的最大值

      

      由定义可得变量δ的递推公式

      

      定义在时刻t 状态为i 的所有单个路径中概率最大的路径的第i -1 个节点(在这里和前一时刻关联起来)

      

      维特比算法的具体过程如下:

      1)初始化

      

      2)递归

      

      3)终止

      

      4)最优路径回溯,求得最优路径

      

      既然是递归的形式,我们用归纳的方法展开去理解算法的整个过程

      当 t = 1时,此时需要考虑的子序列只有一个观测值

      P(i1 = qi,o| λ) = πibi(o1) = α1(i) = δ1(i) ,初始化时和我们的前向概率是一样的,但之后的有所不一样

      维特比算法:P(o1 | λ) = max(δ1(i))   和前向算法不同的第一个地方

      前向算法:P(o1|λ) = α1(1) + α1(2) + ...... + α1(N) 

      当t = 2,此时的子序列长度为2:

      前向算法:α2(i) = α1(1) a1i bi(o2) + α1(2) a2i bi(o2) + ...... + α1(N) aNi bi(o2)

      维特比算法:δ2(i) = max(α1(j) aji ) bi(o2),j = 1, 2..., N,和前向算法不同的第二个地方,也是维特比算法的核心

      当 t = t + 1时:

      前向算法:P(o1o2.....ot+1|λ) = αt+1(1) + αt+1(2) + ...... + αt+1(N),其中αt+1(i) = αt(1) a1i bi(ot+1) + αt(2) a2i bi(ot+1) + ...... + αt(N) aNi bi(ot+1)

      维特比算法:P(o1o2.....ot+1|λ) = max( δt+1(i) ),其中δt+1(i) = max( δt+1(j) aji  ) bi(ot+1)

      然而维特比算法不是求概率,而上述的过程最终的结果只是获得了最大概率,但是最大概率下的状态序列就是我们要获得的序列。当获得最大概率后我们可以获得当前的状态,也就是iT(根据最后一步max时选择的状态来确定),然后从该节点一步一步的回溯到t = 1时刻,在这个回溯过程中我们需要保存一个能让我们找到之前所选择的节点的值,这就是我们的变量ψ的作用,我们来理解下

      

      在ψt(i) 中有两个变量,i 和j,j 是我们要计算出的当前状态,但这里还有一个变量i,而i 就是t +1 时刻的状态,确定了i 的状态,再回过头来就很好确定j 的值(这里的i 的值是在我们找到了最大概率的状态序列的T时刻的状态之后回溯的值,只有这样确定的i 的值猜能确保我们的状态序列是全局最优的)。  

  • 相关阅读:
    git
    fragment
    Builder模式
    代码混淆
    android studio快捷键
    小知识点
    angular组件使用
    英语摘要2019-6-4
    英语笔记2019-4-3
    搭建Eureka注册中心时遇到的问题
  • 原文地址:https://www.cnblogs.com/jiangxinyang/p/9279711.html
Copyright © 2011-2022 走看看