隐马尔可夫模型(Hidden Markov Model)

隐马尔可夫模型(Hidden Markov Model, HMM)是一个重要的机器学习模型。直观地说,它可以解决一类这样的问题:有某样事物存在一定的状态,但我们无法得知某个时刻(或位置)它所处在的状态,但是我们有一个参照事物,我们知道这个参照事物在某个时刻(或位置)的状态并认为参照事物的状态和原事物的状态存在联系,那么我们可以使用机器学习来推测原事物最有可能在一个时刻(或位置)处在什么样的状态。也就是说,这是一个基于概率统计的模型。

举一个直观的例子吧。比如你要预测某市连续\(n\)天内的天气是冷还是热,但是你不知道这个城市的气温,你只知道某市某天冰淇淋的总销量,那么我们可以训练隐马尔可夫模型来用上述数据推测城市的某天的天气最有可能是冷还是热。这里,我们要预测的事物是天气,有 {冷,热} 两个状态,参照事物是冰淇淋销量,有\(\{1, 2, …\}\)等若干种有限的状态,要预测的结果是\(t\)时刻最有可能的天气状态。

下面我们给出隐马尔可夫模型的严格数学定义。

一、马尔可夫链 (Markov Chain)

要介绍隐马尔可夫模型,必须先介绍马尔可夫链的基本概念。不严格地说,马尔可夫链是一个描述随机过程的数学模型。随机过程是指一个事物有一组状态,会随着时间的流逝按照一定概率随机变化的一个过程。马尔可夫链有两个重要假设,一是在\(t\)时刻事物状态变化的概率只与\(t\)时刻本身事物的状态有关,不与\(t-1\)时刻及之前的事物状态有关,二是从\(i\)状态改变到\(j\)状态的概率只与\(i\)与\(j\)状态本身有关,与时间\(t\)的值无关。这些假设可以大大简化我们对这个随机过程的研究,而且依然可以解释现实世界中的很多现象。

比如说,假如一个呼叫中心要接听电话,有两个状态:{没电话,有电话}。没电话时,下一秒有电话来的概率为\(p\),没电话来的概率为\(1-p\);正在打电话时,电话接着打的概率为\(q\),电话挂断的概率为\(1-q\)。这就构成了一个最简单的具有两个状态的以秒为离散时间单位的马尔可夫链。

下面我们给出马尔可夫链的一个严格数学定义。

考察一个离散时间的随机过程\(X_n\),这个\(X_n\)在一组有限状态集合\(S=\{1, 2,…, N \}\)上取值,那么对每个时刻\(t\),如果\(X_1=i_1, …, X_{t-1}=i_{t-1},X_t=i, \mbox{ and } i_1, i_2,…,i_{t-1},i\in S\),我们定义\(t+1\)时刻\(X_{t+1}=j\)的概率

\[P_{ij}=P\{X_{t+1}|X_t=i, X_{t-1}=i_{t-1},…,X_1=i_1\}
\]

我们假设\(P_{ij}=P\{X_{t+1}|X_t=i\}\)。满足这个条件,就称此随机过程满足马尔可夫性。

我们再假设在任意\(t\)时刻,任意状态\(i\)到状态\(j\)的变化概率\(P_{ij}=p(i, j)\)(与\(t\)无关),\(p\)是\(S\times S \rightarrow [0,1]\)的函数。满足这个条件,就称此随机过程满足时齐马尔可夫性。

于是我们可以将\(p(i, j)\)写成一个\(N \times N\)矩阵\(A=\{a_{ij}\}\),\(a_{ij}=p(i,j)\)。这个矩阵就是马尔可夫链的转移概率矩阵。

给定初始概率分布\(\phi(i)=P\{X_0=i\}\),那么就能得到任意一个具体的状态转移链的发生概率

\[P\{X_0=i_0,X_2=i_2,...,X_n=i_n\}=\phi(i_0)p(i_0,i_1)p(i_1,i_2)...p(i_{n-1},i_n)
\]

我们还可以证明,\(n\)步转移概率\(p_n(i,j)\)就是矩阵\(A^n\)在\((i,j)\)位置上的元素,即\(P\{X_{n+1}=j|X_n=i\}=A^n_{ij}.\)

我们用一个图模型就能描述马尔可夫链。令所有的状态\(S=\{1,2,…, {N }\}\)为顶点集合,转移概率矩阵\(A\)描述图上的边,再定义特殊的开始状态和结束状态\(q_0,q_F\),矩阵第\(0\)行表示初始概率分布和初始的边即可。在之后的讨论中,我们将频繁地用图来描述马尔可夫链。

二、隐马尔可夫模型(HMM)

隐马尔科夫模型(HMM)是马尔可夫链的一个拓展。一个HMM含有如下元素:

  1. 一组内部状态序列\(Q=q_1q_2,…,q_T\),\(q_i\in S=\{1, 2, .., N\}\),\(S\)是状态集合,有\(N\)种状态。
  2. 一个\(N\times N\)状态转移概率矩阵\(A=\{a_{ij}\}\). \(a_{ij}\)表示从状态\(i\)转移到状态\(j\)的概率。
  3. 一组对这个状态的外部观察序列\(O=o_1o_2…o_T\), 每个观察从集合\(V=\{v_1,v_2,…,v_V\}\)中取值。
  4. 一个描述产生某样观察的可能性的序列\(B=b_i(o_t)\),表示\(t\)时刻对状态\(i\)观察到\(o_t\)的概率。
  5. 特殊的开始状态\(q_0\)和结束状态\(q_F\),用\(a_{01}a_{02}…a_{0n}\)表示初始状态到某个状态的概率分布,\(a_{1F}a_{2F}…a_{nF}\)表示某个状态转移到结束状态的概率分布。

对HMM而言之前谈的马尔可夫链的两个假设依然是必要的。

对于一个HMM,有三个根本性的问题需要解决:

  1. Likelihood:给定一个HMM的\(A\)和\(B\),\(\lambda=(A,B)\)和观察序列\(O\),判断观察到这个\(O\)的概率\(P(O|\lambda )\)。

  2. Decoding:给定一个HMM的\(A\)和\(B\),\(\lambda=(A,B)\)和观察到的序列\(O\),判断最有可能的内部状态序列\(Q\)。

  3. Learning:给定观察序列\(O\)和状态集合\(S\),学习HMM的参数\(A\)和\(B\)。

之后将会分别讨论解决这三个问题的算法,第三个会用到前两个的重要结论。

三、The Forward Algorithm

第一个问题的解决方案被称为Forward Algorithm,是一种动态规划算法。其思想是从时刻1开始计算一个时刻的所有状态下这个观察序列产出的概率,计算到时刻\(T\)并将所有状态的概率求和就得到了我们的结果。

定义$\alpha_t(j) \(为\)t\(时刻产生给定观察序列\)o_1o_2…o_t\(,且内部状态为\)j$的概率。也就是

\[\alpha_t(j)=P\{o_1,o_2,...,o_t,q_t=j|\lambda\}
\]

我们发现这个问题\(\alpha_t(j)\)只与\(t-1\)时刻的状态有关,因为如果我们知道了\(t-1\)时刻产生观察序列\(o_1o_2…o_{t-1}\)并且处于状态\(i\)的概率,那么下一时刻处在状态\(j\)的概率就是之前处在状态\(i\)的概率乘以从状态\(i\)转移到状态\(j\)的概率再乘以产生观察\(o_t\)的概率,再将所有的状态$求和即可。

所以有如下递推式

\[\alpha_t(j)=\sum_{i=1}^{N}\alpha_{t-1}(i)a_{ij}b_j(o_t)
\]

初始状态

\[\alpha_1(j)=a_{0j}b_j(o_1), 1\le j\le N
\]

最后结果

\[P(O|\lambda)=\sum_{i=1}^N\alpha_T(i)a_{iF}
\]

这就是动态规划算法的递推式。

四、The Viterbi Algorithm

第二个问题的解决方法和第一个问题非常相似,都是动态规划算法。

类似地,定义\(v_t(j)\)表示前\(t\)时刻观察到了\(o_1o_2…o_t\)序列并且经过了最有可能的状态序列\(q_0q_1…q_{t-1}\),并且在\(t\)时刻处在状态\(j\)的概率,也就是说

\[v_t(j)=\max_{q_0,q_1,...,q_t-1}P\{q_0,q_1,...,q_{t-1},o_1,o_2,...,o_t,q_t=j|\lambda\}
\]

那么有如下递推方程

\[v_t(j)=\max_{i=1}^{N}v_{t-1}(i)a_{ij}b_j(o_t)
\]

初始状态

\[v_{1j}=a_{0j}b_j(o_1),1\le j\le N
\]

最终的最大概率

\[P=\max_{i=1}^{N}v_T(i)a_{iF}
\]

递推过程中设置标记数组记录每一步选择了哪个\(i\)就能在递推完后恢复出整个路径。

五、HMM训练:The Forward-Backward Algorithm

回顾一下要解决的问题:给定观察序列\(O\)和状态集合\(S\),学习HMM的参数\(A\)和\(B\)。如果我们学习到了这些参数,给定新的观察序列我们就能评估出最有可能的内部状态序列。

这个算法的得出过程比较复杂,需要一些数学推导。

我们先考虑马尔可夫链的情况。这个时候观察序列\(O\)直接与内部状态序列\(Q\)一一对应,那么我们可以直接估计其转移概率矩阵。其中从状态\(i\)转移到状态\(j\)的概率\(a_{ij}\),就是从状态\(i\)转移到状态\(j\)的次数,除以从状态\(i\)转移到某个状态的总次数,也就是

\[a_{ij}=\frac{C(i\rightarrow j)}{\sum_{q\in Q}C(i\rightarrow q)}
\]

但是对于HMM,我们不能从观察序列直接估计内部状态序列的概率。因此,算法的思路是先估计一个\(A\)和\(B\),然后不断重新估计…直到收敛,以完成参数的训练。而对概率的估计需要用到前向概率\(\alpha_t(i)\)和后向概率\(\beta_t(i)\)(Forward and backward probabilities)。其中

\[\alpha_t(i)=P\{o_1,o_2,...,o_t,q_t=i|\lambda\}\\
\beta_t(i)=P\{o_{t+1},o_{t+2},...,o_T|q_t=i,\lambda\}
\]

\(\alpha_t(i)\)就是第一个算法里的\(\alpha_t(i)\),\(\beta_t(i)\)与之相似,但注意有所不同,如此定义是为了其从后向前推导的计算过程与第一个算法类似,也就是

\[\beta_T(i)=a_{iF}, 1 \le i \le N\\
\beta_t(i)=\sum_{j=1}^{N}a_{ij}b_j(o_{t+1})\beta_{t+1}(j), 1\le i\le N,1\le t < T
\]

那么,要怎么估计\(a_{ij}\)呢?令记号\(\hat{a}_{ij}\)表示对\(a_{ij}\)的估计值,那么

\[\hat a_{ij}=\frac{从状态i到状态j的期望转移次数}{从状态i转走的期望转移次数}
\]

令\(\xi_t\)为时刻\(t\)为状态\(i\),时刻\(t+1\)时为状态\(j\)的概率,即\(\xi_t(i,j)=P\{q_t=i,q_{t+1}=j|O,\lambda\}\).

这个东西不太好求,但是由于概率论公式

\[P\{X|Y,Z\}=\frac{P\{X,Y|Z\}}{P\{Y|Z\}}
\]

所以

\[\begin{align}
\xi_t(i,j)&=\frac{P\{q_t=i,q_{t+1}=j,O|\lambda\}}{P\{O|\lambda\}}\\
&=\frac{\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}{P\{O|\lambda\}}
\end{align}
\]

分母就是之前动态规划算法的结果,分子则是用两个动态规划算法的递推矩阵里的值计算。

那么

\[\hat a_{ij}=\frac{\sum_{t=1}^{T-1}\xi_t(i,j)}{\sum_{t=1}^{T-1}\sum_{k=1}^{N}\xi_t(i,k)}
\]

所以说只要给定了一个\(B\)的估计值,\(B=\{b_j(o_t)\}\),我们就能估计一个\(A=\{a_{ij}\}\).

之后我们有了一个\(A\),我们还需要一个方法来估计\(B\)。对\(B\)中的每个元素,在状态\(j\)观测到观察\(v_k\)的概率的估计是\(\hat{b}_j(v_k)\),我们将其表示为

\[\hat{b}_j(v_k)=\frac{状态j并且观测到v_k的总数期望}{状态j出现的总数期望}
\]

为了计算\(\hat b_j(v_k)\),我们需要知道在时间\(t\)处在状态\(j\)的概率\(\gamma_t(j)\)

\[\gamma_t(j)=P\{q_t=j|O,\lambda\}=\frac{P\{q_t=j,O|\lambda\}}{P\{O|\lambda\}}=\frac{\alpha_t(j)\beta_t(j)}{P\{O|\lambda\}}
\]

那么

\[\hat b_j(v_k)=\frac{\sum_{t=1, s.t. o_t=v_k}^T\gamma_t(j)}{\sum_{t=1}^T\gamma_t(j)}
\]

因此,对于算法而言,这是一个EM(Expectation, Maximization)算法,在E阶段我们计算\(\xi\)和\(\gamma\),在M阶段我们估计\(A\)和\(B\)直到收敛。算法伪代码如下

Forward-Backward(长度为T的观察,观察取值集合V,隐藏状态取值集合S):
初始化A和B
迭代直到收敛:
# E阶段
for each t and j:
计算gamma[t][j]
for each t, i and j
计算xi[t][i][j]
# M阶段
计算A[i][j]
计算B[j][v[k]]
return A, B

参考文献

  1. Daniel Jurafsky, James H. Martin. Speech and Language Processing. Draft of August 7, 2017.
  2. Gregory F. Lawler. Introduction to Stochastic Processes(Second Edition). China Machine Press.

隐马尔可夫模型(Hidden Markov Model)的更多相关文章

  1. [综]隐马尔可夫模型Hidden Markov Model (HMM)

    http://www.zhihu.com/question/20962240 Yang Eninala杜克大学 生物化学博士 线性代数 收录于 编辑推荐 •2216 人赞同 ×××××11月22日已更 ...

  2. 隐马尔科夫模型(hidden Markov Model)

    万事开头难啊,刚开头确实不知道该怎么写才能比较有水平,这篇博客可能会比较长,隐马尔科夫模型将会从以下几个方面进行叙述:1 隐马尔科夫模型的概率计算法  2 隐马尔科夫模型的学习算法 3 隐马尔科夫模型 ...

  3. 从马尔可夫模型(Markov Model)到隐马尔可夫模型(Hidden Markov Model)

    1.参考资料: 博客园 - 刘建平随笔:https://www.cnblogs.com/pinard/p/6945257.html 哔站up主 - 白手起家的百万富翁:https://www.bili ...

  4. 隐马尔科夫模型(hidden Markov model, HMM)

  5. 隐马尔科夫模型(Hidden Markov Models)

    链接汇总 http://www.csie.ntnu.edu.tw/~u91029/HiddenMarkovModel.html 演算法笔记 http://read.pudn.com/downloads ...

  6. 隐马尔科夫模型(Hidden Markov Models) 系列之三

    转自:http://blog.csdn.net/eaglex/article/details/6418219 隐马尔科夫模型(Hidden Markov Models) 定义 隐马尔科夫模型可以用一个 ...

  7. 隐马尔科夫模型(Hidden Markov Models) 系列之五

    转自:http://blog.csdn.net/eaglex/article/details/6458541 维特比算法(Viterbi Algorithm) 找到可能性最大的隐藏序列 通常我们都有一 ...

  8. 隐马尔科夫模型(Hidden Markov Models) 系列之二

    转自:http://blog.csdn.net/eaglex/article/details/6385204 隐含模式(Hidden Patterns) 当马尔科夫过程不够强大的时候,我们又该怎么办呢 ...

  9. 隐马尔科夫模型(Hidden Markov Models) 系列之一

    转自:http://blog.csdn.net/eaglex/article/details/6376826 介绍(introduction) 通常我们总是对寻找某一段时间上的模式感兴趣,这些模式可能 ...

随机推荐

  1. codevs 1029 遍历问题

    1029 遍历问题 http://codevs.cn/problem/1029/  时间限制: 1 s  空间限制: 128000 KB     题目描述 Description 我们都很熟悉二叉树的 ...

  2. UVA 1647 Computer Transformation

    https://vjudge.net/problem/UVA-1647 题意: 开始有一个1,接下来每一步1变成01,0变成10 问n不之后00的个数 打表找规律 第3步之后: 如果第i步之后有x个字 ...

  3. 什么是Qt Widget?

    Qt帮助文档如此解释: The user interface contains visual elements that are called widgets in Qt. Examples of w ...

  4. Stat1—浅谈协方差矩阵

    今天看论文的时候又看到了协方差矩阵这个破东西,以前看模式分类的时候就特困扰,没想到现在还是搞不清楚,索性开始查协方差矩阵的资料,恶补之后决定马上记录下来,嘿嘿~本文我将用自认为循序渐进的方式谈谈协方差 ...

  5. 铺地砖|状压DP练习

    有一个N*M(N<=5,M<=1000)的棋盘,现在有1*2及2*1的小木块无数个,要盖满整个棋盘,有多少种方式?答案只需要mod1,000,000,007即可. //我也不知道这道题的来 ...

  6. 【51nod】1238 最小公倍数之和 V3 杜教筛

    [题意]给定n,求Σi=1~nΣj=1~n lcm(i,j),n<=10^10. [算法]杜教筛 [题解]就因为写了这个非常规写法,我折腾了3天…… $$ans=\sum_{i=1}^{n}\s ...

  7. 组合数+逆元 A - Chat Group Gym - 101775A

    题目链接:https://cn.vjudge.net/contest/274151#problem/A 具体思路:我们可以先把所有的情况算出来,为2^n.然后不合法的情况减去就可以了.注意除法的时候要 ...

  8. React Native DEMO for Android

    Demo1: 主要知识:navigator,fecth 地址:https://github.com/hongguangKim/ReactNativeDEMO1 Demo2: 主要知识:navigato ...

  9. S3C6410 SPI全双工读写流程分析(原创)【转】

    转自:http://blog.csdn.net/hustyangju/article/details/21165721 原创博文,知识共享!转载请注明出处:http://blog.csdn.net/h ...

  10. java-String中的 intern()

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...