隐马尔科夫模型(一)
隐马尔科夫模型是一种序列模型,广泛应用于自然语言处理,语音识别,生物信息等领域。
1. 模型的定义与约定:
定义一:一个隐马尔科夫模型指的是如下的两个随机序列$I,O$:
1)一个不可观测随机序列:$I=(i_{1},...,i_{T})$, 可以取值状态集合$Q=\lbrace 1,...,K\rbrace$, 并且满足齐次马尔科夫性:
\begin{equation}P(i_{t+1}\mid i_{t},i_{t-1},...,i_{1})=P(i_{t+1}\mid i_{t}), \end{equation}
且与$t$无关。
2) 一个可观测随机序列:$O=(o_{1},...,o_{T})$, 可以取值的状态集合$V=\lbrace 1,...,L\rbrace$, 且与随机序列$I$一起满足观测独立性:
\begin{equation}P(o_{t}\mid i_{t},i_{t-1},o_{t-1},...,i_{1},o_{1})=P(o_{t}\mid i_{t})\end{equation}
且与$t$无关。
由以上的定义可以知道,一个隐马尔科夫模型完全由相应的$K\times K$矩阵$A$与$L\times K$矩阵$B$还有向量$\pi\in\mathbb{R}^{K}$确定,使得:
\begin{equation}A_{ji}=P(i_{t+1}=j\mid i_{t}=i),\end{equation}
对任意的$i,j=1,...,K$, $t=1,...,T-1$, 并且:
\begin{equation}B_{\alpha i}=P(o_{t}=\alpha\mid i_{t}=i),\end{equation}
对任意的$\alpha=1,...,L$,$i=1,...,K$,$t=1,...,T$(这里我们用希腊字母表示可观测状态,而用拉丁字母表示不可观测状态), 且:
\begin{equation}\pi_{i}=P(i_{1}=i),\end{equation}
所以我们今后也约定:"一个具有参数$\lambda=(A,B,\pi)$的隐马尔科夫模型" 为一个满足上述条件(3)-(5)的隐马尔科夫模型。
2.隐马尔科夫链的几大基本问题
现在我们自然地会问如下三个基本问题:
1)概率计算问题:给定模型参数$\lambda=(A,B,\pi)$ 以及某个观测序列$O=(0_{1},...,0_{T})$, 如何高效地计算出概率$P(O\mid \lambda)$?
2)学习问题:已知某个观测序列$O=(o_{1},...,o_{T})$, 如何得到参数$\lambda=(A,B,\pi)$使得似然函数$P(O\mid\lambda)$极大,或者至少尽量大?
3)预测问题:预测问题,也成为解码问题(Decoding Problem),也就是已知观测序列$O=(o_{1},...,o_{T})$, 以及参数$\lambda=(A,B,\pi)$, 求不可观测序列$I$使得概率: \begin{equation}P(I\mid O,\lambda)\end{equation}极大。
3.概率计算的直接算法:
对于第一个问题,概率计算问题,我们由条件(1),(2)我们很容易得到理论上的概率计算公式:
\begin{equation}P(O\mid\lambda)=\sum_{I=(i_{1},...,i_{T})}A_{i_{T}i_{T-1}}...A_{i_{3}i_{2}}A_{i_{2}i_{1}}B_{o_{T}i_{T}}...B_{o_{2}i_{2}}B_{o_{1}i_{1}}\end{equation}
很容易知道这种算法如果交给计算机执行,其时间复杂度为$O(TK^{T})$, 是一种糟糕的算法。
4. 概率计算的前向算法
下面介绍一种前向迭代算法:
我们定义$\alpha_{t,i}\triangleq P(o_{1},...,o_{t},i_{t}=i\mid \lambda)$, 对于任意的$i=1,...,K$, $t=1,...,T$,首先我们很容易知道:
\begin{equation}\alpha_{1,i}=B_{o_{1}i}\pi_{i},\end{equation}
对任意的$i=1,...,K$。并且迭代步骤中, 结合假设(1),(2)我们可以计算:
\begin{equation}\begin{split}\alpha_{t+1,i}&=P(o_{1},...,o_{t+1},i_{t+1}=i\mid \lambda)\newline &=\sum_{j=1}^{K}P(o_{1},...,o_{t+1},i_{t}=j,i_{t+1}=i\mid \lambda)\newline &=\sum_{j=1}^{K}P(o_{t+1}\mid o_{1},...,o_{t},i_{t}=j,i_{t+1}=i,\lambda)P(i_{t+1}=i\mid o_{1},...,o_{t},i_{t}=j,\lambda)P(o_{1},...,o_{t},i_{t}=j\mid \lambda)\newline &=\sum_{j=1}^{K}P(o_{t+1}\mid i_{t+1}=j,\lambda)P(i_{t+1}=i\mid i_{t}=j,\lambda)\alpha_{t,j}\newline &=\sum_{j=1}^{K}B_{o_{t+1}i}A_{ij}\alpha_{t,j}\end{split}\end{equation}
于是我们可以总结出前向算法计算概率:
算法一:
输入:某带有参数$\lambda=(A,B,\pi)$的隐马尔科夫模型,某观测序列$O=(o_{1},...,o_{T})$;
输出:概率$P(O\mid \lambda)$。
算法:
Step1:对$i=1,...,K$, 计算$\alpha_{i,t}=B_{o_{1}i}\pi_{i}$;
Step2:对任意$t=2,...,T$, 我们计算:
\begin{equation}\alpha_{i,t}=\sum_{j=1}^{K}B_{o_{t}i}A_{ij}\alpha_{j,t-1},\end{equation}
其中$i=1,...,K$;
Step3:计算$P(O\mid \lambda)=\sum_{i=1}^{K}\alpha_{i,T}$, 输出$P(O\mid \lambda)$。
容易看出该算法的时间复杂度为$O(K^{2}T)$, 空间复杂度为$O(KT)$。
5.概率计算的后向算法:
下面看一种方向相反的算法。这时候我们定义后向概率:
\begin{equation}\beta_{t,i}\triangleq P(o_{t+1},...,o_{T}\mid i_{t}=i)\end{equation}
这时候$\beta_{T,i}=1$,且与前向算法相反的是$\beta_{t,i}$由$\beta_{t+1,j}$递推得到,容易计算:
\begin{equation}\beta_{t,i}=\sum_{j=1}^{K}\beta_{t+1,j}B_{o_{t+1}j}A_{ji}\end{equation}
算法二:
输入:某带有参数$\lambda=(A,B,\pi)$的隐马尔科夫模型,某观测序列$O=(o_{1},...,o_{T})$;
输出:概率$P(O\mid \lambda)$。
算法:
Step1:对$i=1,...,K$, 令$\beta_{T,i}=1$;
Step2:对任意$t=T-1,...,1$, 我们计算:
\begin{equation}\beta_{t,i}=\sum_{j=1}^{K}\beta_{t+1,j}B_{o_{t+1}j}A_{ji}\end{equation}
其中$i=1,...,K$;
Step3:计算$P(O\mid \lambda)=\sum_{i=1}^{K}B_{o_{1}i}\beta_{1,i}\pi_{i}$, 输出$P(O\mid \lambda)$。
该算法的时间复杂度为$O(K^{2}T)$, 空间复杂度为$O(KT)$。