@lancelot-vim
2016-06-05T01:34:32.000000Z
字数 4110
阅读 1829
模式分类
@author lancelot-vim
约定一些新的术语,并且将重新整理记号系统。通常把隐马尔可夫模型图称为有限状态机(finite state machine, FSM),如果网络内部得转移都和概率相关,那么这样得网络叫做马尔可夫网络。这种网络是严格符合因果关系的,因为下一时刻状态的概率,之和上一时刻状态有关,如果只要选择好相应得合适得初始状态,每个特定得状态发生得概率都非0,那么这个马尔可夫模型就被成为"各态历经"的。最终状态或者吸收状态(final state or absorbing state)只系统一旦进入这个状态,就无法里还的情况(比如,则系统永远处于初始状态)
前文提到,用来表示隐状态之间得转移概率,用表示发出可见状态得概率:
我们要求在每一时刻都必须准备好转移到下一时刻,同时要发出一个可见的符号,这样有归一化条件:
定义了这些术语后,使得我们可以关注下列3个隐马尔可夫模型得核心问题:
- 估值问题:假设我们有一个HMM,其转移概率和已知,计算这个模型某一特定观测序列得概率
- 解码问题:假设我们已有一个HMM,和一个观测序列,决定最有可能产生这个观测序列得隐形状态序列
- 学习问题:假设我们知道一个HMM的大致结构(隐形状态参数数量、可见参数数量)如何从观测中得到
一个模型产生可见序列得概率为:
其中的r是每个特定长T的隐状态序列得下标:, 在c个不同隐状态下的情况下,为了计算这个特定可见状态序列得概率,我们必须考虑每一种可能得隐状态序列,计算它们各自产生可见状态序列的概率,然后进行相加,所以序列概率就是对应得转移概率和产生可见符号概率的乘积。
由于这里处理的是一阶马尔可夫过程,所以公式可以写为:,也就是序列中的转移概率依次相乘,在上式中,为最终的吸收概率,其产生的唯一得独特可见符号为,在语音识别中,往往代表一个空状态,或者没有发声音的状态,符号就表示静音
由于已经假设可见符号的概率只依赖于这个时刻所处得隐状态,因此,,也就是把依次相乘,最终,我们可以得到:
按照这个算法,时间复杂度为,假如c = 10, T = 20,可见,几乎是无法实现的,实际上有个可行得代替方案,递归计算,由于每一项只涉及到,我们定义:
其中表示t时刻的可见状态确定的转移概率, 因此,只需要对具有可见状态得索引k得项求和即可,表示我们的HMM在t时刻,位于隐状态,并且已经产生了可见序列的前t个符号的概率。
HMM向前算法
- initialize t <- 0,
- repeat t <- t+1
- <-
- until t = T
- return <- 最终状态得
- end
这个算法的时间复杂度为,在实际应用中使用特别广泛
一个小例子
如图所示的HMM,他具有一个明确得吸收状态和唯一的独特空可见符号,转移矩阵如下:
计算观测序列为:的概率
如下图所示,假设在t=0时刻,系统的隐状态为,每一步的可见符号为第一行,的数值在圆圈中已经表示出,按照步骤t=1到t=2已经标出
所谓解码问题,就是已知观测序列,求解最可能得隐状态序列得过程,算法如下:
HMM解码算法
- begin initialize Path <- {}, t = 0
- repeat t <- t + 1
- j <- 1
- repeat j <- j + 1
- <-
- until j == c
- j' <- argmax
- 将添加到Path
- until t = T
- return Path
- end
解码算法是一个贪心的策略,每次选择当前概率最大的为最优策略,这个可能导致无法达到全局最优解,甚至可能会出现一些无法存在得错解。
学习问题是根据观察值(或者说训练样本)确定转移概率,到目前为止,还没有能够根据训练样本确定最优参数集合的方法,但是,通过一种非常直接的方法,我们几乎总能得到一个足够令人满意的解答
我们定义为在t时刻位于状态,并且将产生t时刻之后的目标序列的概率(时间范围为t+1->T):
定义从状态转移到的条件概率为
由此可得:
1. 在任意时刻,状态到状态的转换预计值为:
2. 在任意时刻,状态发生转换概率预计值为:
3. 在任意时刻,状态到状态的转换后,观测值为的预计值为:
4. 在任意时刻,状态到状态的转换后,得到所有观测预计值为
所以,得到为:
有了这两个估计值,我们可以通过大量样本,是用以上公式对模型逐步更新,直到收敛为止,这就是著名的Baum-Welch算法:
Baum-Welch算法(向前向后算法)
- begin initialize ,训练样本,收敛判据, z <- 0
- do z <- z + 1
- 通过a(z-1),b(z-1),由(1)计算
- 通过a(z-1),b(z-1),由(2)计算
- <-
- <-
- until max[]
- return <- , <-
- end