隐马尔可夫模型的计算

时间:2022-12-14 18:17:41

隐马尔可夫模型的计算

标签: 模式分类

@author lancelot-vim


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

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

  • aij=P(wj(t+1)|wi(t))
  • bjk=P(vk(t)|wj(t))

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

jaij=1kbjk=1

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

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

估值问题

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

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

由于已经假设可见符号的概率只依赖于这个时刻所处得隐状态,因此, P(VT|wTr)=t=1TP((v(t)|w(t)) ,也就是把 bjk 依次相乘,最终,我们可以得到:

P(VT)=r=1rmaxt=1TP(v(t)|w(t))P(w(t)|w(t1))

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

αi(t)=01iαi(t1)aijbjkv(t)t=0jt=0j=

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

HMM向前算法

  1. initialize t <- 0, aij,bjk,VT,αj(0)=1
  2. repeat t <- t+1
  3. aj(t) <- bjkv(t)t=1cαi(t1)aij
  4. until t = T
  5. return P(VT) <- 最终状态得 a0(T)
  6. end

算法示意图:

隐马尔可夫模型的计算

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


一个小例子
隐马尔可夫模型的计算

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

a=10.20.20.800.30.50.100.10.20.000.40.10.1

b=100000.30.10.500.40.10.200.10.70.100.20.10.2

计算观测序列为: V4={v1,v2,v2,v0} 的概率

如下图所示,假设在t=0时刻,系统的隐状态为 w1 ,每一步的可见符号为第一行, αi(t) 的数值在圆圈中已经表示出, aijbjk 按照步骤t=1到t=2已经标出
隐马尔可夫模型的计算


解码问题

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

HMM解码算法

  1. begin initialize Path <- {}, t = 0
  2. repeat t <- t + 1
  3. j <- 1
  4. repeat j <- j + 1
  5. αj(t) <- bjkv(t)i=1cαi(t1)aij
  6. until j == c
  7. j’ <- argmax αj(t)
  8. wj 添加到Path
  9. until t = T
  10. return Path
  11. end

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


学习问题

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

向前-向后算法

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

βi(t)=01jβj(t+1)aijbjkv(t+1)wi(t)w0t=Twi(t)=w0it=T

定义从状态 wi(t1) 转移到 wi(t) 的条件概率为 γij(t)

γij(t)=αi(t1)aijbjkβj(t)P(VT|θ)

  • 分子代表:产生 VT 中前t-1个状态和后t个状态时,从t-1状态由 wi(t1) 转换到 wj(t) 的概率
  • 分母代表: P(VT|θ) 是模型产生可见序列 VT 的概率
  • γij 代表:在模型产生 VT 序列时,状态 wi(t1) 转移到w(t)的概率

由此可得:
1. 在任意时刻,状态 wi 到状态 wj 的转换预计值为: t=1Tγij(t)
2. 在任意时刻,状态 wi 发生转换概率预计值为: t=1Tkγik(t)
3. 在任意时刻,状态 wi 到状态 wj 的转换后,观测值为 vk 的预计值为: i=1Tl,v(t)=vkγjl(t)
4. 在任意时刻,状态 wi 到状态 wj 的转换后,得到所有观测预计值为 i=1Tlγjl(t)

所以,得到 a^ijb^jk 为:

a^ij=t=1Tγij(t)t=1Tkγik(t)(1)b^jk=i=1Tl,v(t)=vkγjl(t)i=1Tlγjl(t)(2)

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

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

  1. begin initialize  aij,bjk ,训练样本 VT ,收敛判据 θ , z <- 0
  2. do z <- z + 1
  3. 通过a(z-1),b(z-1),由(1)计算 a^(z)
  4. 通过a(z-1),b(z-1),由(2)计算 b^(z)
  5. aij(z) <- a^ij(z1)
  6. bij(z) <- b^ij(z1)
  7. until max[ aij(z)aij(z1),bjk(z)bjk(z1) ]
  8. return aij <- aij(z) , bjk <- bjk(z)
  9. end