[关闭]
@lancelot-vim 2016-06-04T17:34:32.000000Z 字数 4110 阅读 1726

隐马尔可夫模型的计算

模式分类

@author lancelot-vim


约定一些新的术语,并且将重新整理记号系统。通常把隐马尔可夫模型图称为有限状态机(finite state machine, FSM),如果网络内部得转移都和概率相关,那么这样得网络叫做马尔可夫网络。这种网络是严格符合因果关系的,因为下一时刻状态的概率,之和上一时刻状态有关,如果只要选择好相应得合适得初始状态,每个特定得状态发生得概率都非0,那么这个马尔可夫模型就被成为"各态历经"的。最终状态或者吸收状态(final state or absorbing state)只系统一旦进入这个状态,就无法里还的情况(比如,则系统永远处于初始状态)

前文提到,用来表示隐状态之间得转移概率,用表示发出可见状态得概率:

我们要求在每一时刻都必须准备好转移到下一时刻,同时要发出一个可见的符号,这样有归一化条件:

定义了这些术语后,使得我们可以关注下列3个隐马尔可夫模型得核心问题:

  1. 估值问题:假设我们有一个HMM,其转移概率已知,计算这个模型某一特定观测序列得概率
  2. 解码问题:假设我们已有一个HMM,和一个观测序列,决定最有可能产生这个观测序列得隐形状态序列
  3. 学习问题:假设我们知道一个HMM的大致结构(隐形状态参数数量、可见参数数量)如何从观测中得到

估值问题

一个模型产生可见序列得概率为:
其中的r是每个特定长T的隐状态序列得下标:, 在c个不同隐状态下的情况下,为了计算这个特定可见状态序列得概率,我们必须考虑每一种可能得隐状态序列,计算它们各自产生可见状态序列的概率,然后进行相加,所以序列概率就是对应得转移概率和产生可见符号概率的乘积。

由于这里处理的是一阶马尔可夫过程,所以公式可以写为:,也就是序列中的转移概率依次相乘,在上式中,为最终的吸收概率,其产生的唯一得独特可见符号为,在语音识别中,往往代表一个空状态,或者没有发声音的状态,符号就表示静音

由于已经假设可见符号的概率只依赖于这个时刻所处得隐状态,因此,,也就是把依次相乘,最终,我们可以得到:

按照这个算法,时间复杂度为,假如c = 10, T = 20,可见,几乎是无法实现的,实际上有个可行得代替方案,递归计算,由于每一项只涉及到,我们定义:

其中表示t时刻的可见状态确定的转移概率, 因此,只需要对具有可见状态得索引k得项求和即可,表示我们的HMM在t时刻,位于隐状态,并且已经产生了可见序列的前t个符号的概率。

HMM向前算法

  1. initialize t <- 0,
  2. repeat t <- t+1
  3. <-
  4. until t = T
  5. return <- 最终状态得
  6. end

算法示意图:

HMM向前算法.png-163.3kB

这个算法的时间复杂度为,在实际应用中使用特别广泛


一个小例子
HMM例子.001.png-172.8kB

如图所示的HMM,他具有一个明确得吸收状态和唯一的独特空可见符号,转移矩阵如下:


计算观测序列为:的概率

如下图所示,假设在t=0时刻,系统的隐状态为,每一步的可见符号为第一行,的数值在圆圈中已经表示出,按照步骤t=1到t=2已经标出
HMM例子解答.001.png-188.3kB


解码问题

所谓解码问题,就是已知观测序列,求解最可能得隐状态序列得过程,算法如下:

HMM解码算法

  1. begin initialize Path <- {}, t = 0
  2. repeat t <- t + 1
  3. j <- 1
  4. repeat j <- j + 1
  5. <-
  6. until j == c
  7. j' <- argmax
  8. 添加到Path
  9. until t = T
  10. return Path
  11. end

解码算法是一个贪心的策略,每次选择当前概率最大的为最优策略,这个可能导致无法达到全局最优解,甚至可能会出现一些无法存在得错解。


学习问题

学习问题是根据观察值(或者说训练样本)确定转移概率,到目前为止,还没有能够根据训练样本确定最优参数集合的方法,但是,通过一种非常直接的方法,我们几乎总能得到一个足够令人满意的解答

向前-向后算法

我们定义为在t时刻位于状态,并且将产生t时刻之后的目标序列的概率(时间范围为t+1->T):

定义从状态转移到的条件概率为

由此可得:
1. 在任意时刻,状态到状态的转换预计值为:
2. 在任意时刻,状态发生转换概率预计值为:
3. 在任意时刻,状态到状态的转换后,观测值为的预计值为:
4. 在任意时刻,状态到状态的转换后,得到所有观测预计值为

所以,得到为:

有了这两个估计值,我们可以通过大量样本,是用以上公式对模型逐步更新,直到收敛为止,这就是著名的Baum-Welch算法:

Baum-Welch算法(向前向后算法)

  1. begin initialize ,训练样本,收敛判据, z <- 0
  2. do z <- z + 1
  3. 通过a(z-1),b(z-1),由(1)计算
  4. 通过a(z-1),b(z-1),由(2)计算
  5. <-
  6. <-
  7. until max[]
  8. return <- , <-
  9. end
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注