隐马尔科夫模型是一种序列模型,广泛应用于自然语言处理,语音识别,生物信息等领域。
1. 模型的定义与约定:
定义一:一个隐马尔科夫模型指的是如下的两个随机序列$I,O$:
1)一个不可观测随机序列:$I=(i_{1},...,i_{T})$, 可以取值状态集合$Q=lbrace 1,...,K brace$, 并且满足齐次马尔科夫性:
egin{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 brace$, 且与随机序列$I$一起满足观测独立性:
egin{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 imes K$矩阵$A$与$L imes K$矩阵$B$还有向量$piinmathbb{R}^{K}$确定,使得:
egin{equation}A_{ji}=P(i_{t+1}=jmid i_{t}=i),end{equation}
对任意的$i,j=1,...,K$, $t=1,...,T-1$, 并且:
egin{equation}B_{alpha i}=P(o_{t}=alphamid i_{t}=i),end{equation}
对任意的$alpha=1,...,L$,$i=1,...,K$,$t=1,...,T$(这里我们用希腊字母表示可观测状态,而用拉丁字母表示不可观测状态), 且:
egin{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(Omid lambda)$?
2)学习问题:已知某个观测序列$O=(o_{1},...,o_{T})$, 如何得到参数$lambda=(A,B,pi)$使得似然函数$P(Omidlambda)$极大,或者至少尽量大?
3)预测问题:预测问题,也成为解码问题(Decoding Problem),也就是已知观测序列$O=(o_{1},...,o_{T})$, 以及参数$lambda=(A,B,pi)$, 求不可观测序列$I$使得概率: egin{equation}P(Imid O,lambda)end{equation}极大。
3.概率计算的直接算法:
对于第一个问题,概率计算问题,我们由条件(1),(2)我们很容易得到理论上的概率计算公式:
egin{equation}P(Omidlambda)=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} riangleq P(o_{1},...,o_{t},i_{t}=imid lambda)$, 对于任意的$i=1,...,K$, $t=1,...,T$,首先我们很容易知道:
egin{equation}alpha_{1,i}=B_{o_{1}i}pi_{i},end{equation}
对任意的$i=1,...,K$。并且迭代步骤中, 结合假设(1),(2)我们可以计算:
egin{equation}egin{split}alpha_{t+1,i}&=P(o_{1},...,o_{t+1},i_{t+1}=imid lambda) ewline &=sum_{j=1}^{K}P(o_{1},...,o_{t+1},i_{t}=j,i_{t+1}=imid lambda) ewline &=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}=imid o_{1},...,o_{t},i_{t}=j,lambda)P(o_{1},...,o_{t},i_{t}=jmid lambda) ewline &=sum_{j=1}^{K}P(o_{t+1}mid i_{t+1}=j,lambda)P(i_{t+1}=imid i_{t}=j,lambda)alpha_{t,j} ewline &=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(Omid lambda)$。
算法:
Step1:对$i=1,...,K$, 计算$alpha_{i,t}=B_{o_{1}i}pi_{i}$;
Step2:对任意$t=2,...,T$, 我们计算:
egin{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(Omid lambda)=sum_{i=1}^{K}alpha_{i,T}$, 输出$P(Omid lambda)$。
容易看出该算法的时间复杂度为$O(K^{2}T)$, 空间复杂度为$O(KT)$。
5.概率计算的后向算法:
下面看一种方向相反的算法。这时候我们定义后向概率:
egin{equation}eta_{t,i} riangleq P(o_{t+1},...,o_{T}mid i_{t}=i)end{equation}
这时候$eta_{T,i}=1$,且与前向算法相反的是$eta_{t,i}$由$eta_{t+1,j}$递推得到,容易计算:
egin{equation}eta_{t,i}=sum_{j=1}^{K}eta_{t+1,j}B_{o_{t+1}j}A_{ji}end{equation}
算法二:
输入:某带有参数$lambda=(A,B,pi)$的隐马尔科夫模型,某观测序列$O=(o_{1},...,o_{T})$;
输出:概率$P(Omid lambda)$。
算法:
Step1:对$i=1,...,K$, 令$eta_{T,i}=1$;
Step2:对任意$t=T-1,...,1$, 我们计算:
egin{equation}eta_{t,i}=sum_{j=1}^{K}eta_{t+1,j}B_{o_{t+1}j}A_{ji}end{equation}
其中$i=1,...,K$;
Step3:计算$P(Omid lambda)=sum_{i=1}^{K}B_{o_{1}i}eta_{1,i}pi_{i}$, 输出$P(Omid lambda)$。
该算法的时间复杂度为$O(K^{2}T)$, 空间复杂度为$O(KT)$。