隐马尔科夫知识点(HMM)总结

对有监督机器学习算法熟悉的朋友知道,我们监督学习研究的对象往往满足独立同分布(i.i.d)条件,也即样本点与样本点之间 不存在依赖关系。但现实当中,独立同分布的假设往往不成立,比如说,英语句子当中的字符、股票交易各个时间点的状态等等。对于这一类数据,我们可以使用马尔可夫模型解决相关问题。当然,现阶段再各种应用上马尔可夫模型都有可以被RNN取代,但是仍然有其可以发挥作用的场景。下面我就对隐马尔可夫的知识点做一下总结。

1. 隐马尔可夫链

为了解马尔可夫链,有兴趣的话可以先简单回顾一下马尔可夫链,不过这不是必须的。

一个隐马尔可夫模型可以生成不可观测的状态随机序列(可以理解为一系列的随机变量),我们称其为状态序列;但是我们了解这些状态通过什么途径呢?各个状态会单独生成一个可观测的观测量。每个状态生成一个观测,由此产生的序列,我们称之为观测序列

我们设 Q 是所有可能的状态的集合,V 是所有可能的观测集合:

假设隐马尔可夫链的长度为T,那么,如果 I 是状态序列、O是观测序列,有:

A是状态转移矩阵(代表各个状态相互转化的概率):

其中,

a_{ij}是在时刻 t 处于状态 q_{i} 的条件下在 t + 1 时刻转移到状态q_{j}的概率,容易得出,矩阵的每一行求和都为1。

B是观测矩阵(代表某状态产生某观测的概率):

其中,

表示在t时刻处于状态q_{j}的情况下,观测到v_{k}的概率。

除此之外,要完全描述一个HMM模型,还需要一个初始状态:

其中,

是时刻 t = 1时, 状态为 q_{i} 的概率。

A, B, \pi 并称为隐马尔可夫的三要素

隐马尔可夫链自身有特定的假设,首先,其任一时刻的状态只依赖于前一个时刻的状态(齐次马尔可夫性假设)

再者,任意时刻的观测值仅依赖于当前状态(观测独立性假设)

以上两个特点在解决隐马尔可夫的 3 个基本问题将会用到。

HMM的三个基本问题

(1)概率计算问题:给定HMM模型 \lambda = (A, B, \pi) 和观测序列 O = (o_{1},o_{2}, ..., o_{T}),计算该参数情况下,观测序列O出现的概率 P(O|\lambda)

  (2) 学习问题:已知观测序列O = (o_{1},o_{2}, ..., o_{T}),估计模型参数\lambda = (A, B, \pi)

  (3) 预测问题:也称作解码问题(decoding),已知\lambda = (A, B, \pi)O = (o_{1},o_{2}, ..., o_{T}),求最大可能的状态序列                                 I = (i_{1},i_{2}, ..., i_{T})

下面我们分别讨论这3个问题的解决方法。

2. 概率计算算法

如果我们知道了HMM的模型,那么得到某一个观测序列的概率是多少呢?即已知\lambda = (A, B, \pi)O = (o_{1},o_{2}, ..., o_{T})计算P(O|\lambda),首先我们知道可以通过一个比较直接但非常低效的方法解决:

对于所有可能的状态序列 I,有:

但是,所有可能的状态序列 I累加起来计算量太大,所以这个算法不实用(时间复杂度O(TN^T))。下面我们介绍另外两种方法。

(1) 前向算法

输入: 隐马尔可夫模型参数\lambda,观测序列 O

输出:观测序列概率P(O|\lambda)

定义前向概率:

1) 初始值

2) 递推 对 t = 1,2,...,T-1

3) 终止

下面对算法做一下解释,事实上该算法更像是一个动态规划算法,因为\alpha_t(i)可以以归纳递推的方式得到

由HMM的齐次性

\alpha_t(i) &= P(o_1,o_2,...o_t, i_t=q_i) \\ &= P(o_{t} | o_1,o_2,...o_{t-1}, i_t=q_i) \cdot P(o_1,o_2,...o_{t-1}, i_t=q_i) \\ &= P(o_t|i_t=q_i) \cdot P(o_1,o_2,...o_{t-1}, i_t=q_i) \\ &= b_i(o_t)\sum_{j=1}^N P(o_1,o_2,...o_{t-1}, i_t=q_i, i_{t-1}=q_j)

再由HMM观测独立性

\alpha_t(i) = b_i(o_t)\sum_{j=1}^N P(i_t=q_i|o_1,o_2,...o_{t-1}, i_{t-1}=q_j) \cdot \\ P(o_1,o_2,...o_{t-1}, i_{t-1}=q_j) \\ &= b_i(o_t)\sum_{j=1}^N P(i_t=q_i|i_{t-1}=q_j)P(o_1,o_2,...o_{t-1}, i_{t-1}=q_j) \\ &= b_i(o_t)\sum_{j=1}^N P(i_t=q_i|i_{t-1}=q_j)P(o_1,o_2,...o_{t-1}, i_{t-1}=q_j) \\ &= b_i(o_t) \sum_{j=1}^N a_{ji} \alpha_{t-1}(j)

由以上可以知道,由归纳法我们可以从\alpha_1(i)(所有可能i)开始,一直前向计算出\alpha_t(i)b_i(o_t) 和  \alpha_{ji} 都是已知的,容易得到,计算 \alpha_1(i)...\alpha_t(i) 的时间复杂度是O(N^2 t)

(1) 后向算法

类似于前向算法,我们还可以定义后向算法。我们定义后向概率

后向算法如下:

1)  

2) 对于 t = T-1, T-2, ... , 1

3)

(3)一些概率的计算

后面的章节将会使用到一些概率,我们在次列出。

1. 给定模型 \lambda和观测O,在时刻t处于状态q_i的概率,记为:

\gamma _t(i) = P(i_t=q_i|O,\lambda)

我们知道

\alpha_t(i)\beta_t(i) = \frac{P(o_1,o_2,...,o_T,i_t=q_i)}{P(o_{t+1},o_{t+2},...,o_T|o_1,o_2,...,o_t,i_t=q_i)} \cdot \\ P(o_{t+1},o_{t+2},...,o_T|o_1,o_2,...,o_t,i_t=q_i) \\ =P(o_1,o_2,...,o_T,i_t=q_i) \\ = P(O,i_t=q_i)

所以有

\gamma_t(i)= \frac{\alpha_t(i)\beta_t(i)}{P(O|\lambda)} \\ = \frac{\alpha_t(i)\beta_t(i)}{\sum_{j=1}^N \alpha_t(j)\beta_t(j)}

2. 给定模型 \lambda和观测O,在时刻t处于状态q_i且在时刻t+1处于状态q_j的概率,记为:

\xi_t(i,j)=P(i_t=q_i, i_{t+1}=q_j|O,\lambda)

因为

3. 学习算法

现实中,我们往往是掌握着数据,要通过数据来反推HMM的参数。话句话说,我们的任务是已知观测序列O = (o_{1},o_{2}, ..., o_{T}),估计模型参数\lambda = (A, B, \pi)

Baum-Welch算法

我们知道光有观测序列O = (o_{1},o_{2}, ..., o_{T})的话,是无法使用有监督的方式估计参数,因为状态变量是隐变量,所以这里我们使用无监督的EM算法来实现

设观测数据为O = (o_{1},o_{2}, ..., o_{T}),隐藏状态为I = (i_{1},i_{2}, ..., i_{T}),完全数据为 (O,I) = (o_1,o_2,...,o_T,i_1,i_2,...,i_T),完全数据的对数似然函数是logP(O,I|\lambda)。其算法步骤如下:

(1) 初始化

对 n = 0,选取a_{ij}^{(0)},b_j(k)^{(0)},\pi_i^{(0)},得到模型\lambda^{(0)}=(A^{(0)},B^{(0)},\pi^{(0)})

(2) 递推. 对 n = 1,2,...

(3) 终止。得到模型参数\lambda^{(n+1)}=(A^{(n+1)},B^{(n+1)},\pi^{(n+1)})

4. 预测算法

我这里介绍一种非常重要的算法——维特比算法

已知\lambda = (A, B, \pi)O = (o_{1},o_{2}, ..., o_{T}),求最大可能的状态序列I = (i_{1},i_{2}, ..., i_{T}),容易看出这是一个搜索优化问题,搜索空间为所有状态变量组合。

输入:O = (o_{1},o_{2}, ..., o_{T})

输出:计算 I^{\star } = argmax_{I} P(I|O)

如果按找穷举搜索的方法,我们能够以时间复杂度O(N^t)得出结果。但这样太慢了,接下来我们使用动态规划的方法来简化搜索。首先,我们对原始问题做一下变换

I^{\star } = argmax_{I} P(I|O) \\ = argmax_{I} P(I|O) \cdot P(O) \\ = argmax_{I} P(I,O)

以及引入结论

\max_{a,b} f(a) \cdot g(a,b) \\ = \max_{a}(\max_bf(a) \cdot g(a,b)) \\ = \max_{a}(f(a) \cdot \max_{b}g(a,b))

我们假设\mu_k(i_k) = \max_{i_1,...,i_{k-1}}P(i_1,...,i_{k-1},i_k=i_k,o_1,...,o_k) 表示HMM在第k步状态为i_k时,P(i_1,...,i_{k-1},i_k=i_k,o_1,...,o_k)的最大化概率。那么,由HMM的两个性质以及上述引理,我们容易得出状态方程

\mu_k(i_k) \\ = \max_{i_1,...,i_{k-1}}P(i_1,...,i_{k-1},i_k=i_k,o_1,...,o_k) \\ = \max_{i_1,...,i_{k-1}}[P(o_k|i_k=i_k)P(i_k=i_k|i_{k-1})P(i_1,...,i_{k-1},o_1,...,o_{k-1})] \\ = \max_{i_{k-1}}[P(o_k|i_k=i_k)P(i_k=i_k|i_{k-1})\max_{i_1,...,i_{k-2}}P(i_1,...,i_{k-1},o_1,...,o_{k-1})] \\ = \max_{i_{k-1}}[P(o_k|i_k=i_k)P(i_k=i_k|i_{k-1})\mu_{k-1}(i_{k-1})]

另外,我们定义\mu_1(j) = P(i_1=j,o_1)。这样P(o_k|i_k=i_k), P(i_k=i_k|i_{k-1})都是已知的,我们可以依次求取任意得\mu_k(j)。也因此,我们可以求取原始问题序列I^*中最后一步第T步状态:

i_T = argmax_{i_T} \mu_T(i_{T})

以及最大概率

\max_{i_T}\mu_T(i_T)

最后一步的状态已经得出,那么之前的状态怎么得到呢?这要用到HMM状态网络的一个性质:如果I^* = (i_{1},i_{2}, ..., i_{T})是原始我问题的最优解,那么I_{sub}^* = (i_{1},i_{2}, ..., i_{T-1})是原始问题子问题(序列长度由T变为T-1,且最终状态固定为i_{T-1})的最优解(该性质的证明目前在网上还没有找到)。T-1步如果有k个状态,我们可以求出每一个状态对应的子问题最优概率,而对于每个状态通过状态转移概率矩阵,我们都可以得到其到达i_T(已知)的概率。进而,我们也已得到这k个状态对应的整体最优解。我们取其中的最大值即可。之后只要一直向前回溯就可以得到整个状态序列。

个人见解,HMM做预测的维特比算法和原始维特比算法(见吴军博士的《数学之美》)还是有区别的,原始维特比算是是纯粹意义上的图算法,而这里因为概率计算的缘故,算法看上去也复杂一些。

参考文献:

[1] 统计学习原理

[2] https://www.youtube.com/watch?v=RwwfUICZLsA

[3] 数学之美

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值