基本概念
定义
- 隐马尔可夫模型是关于时间序列的概率模型
- 由隐藏的马尔可夫链生成不可观测的隐藏状态序列,再由每个状态生成一个观测而产生观测序列的过程。
组成
| 符号 |
含义 |
| Q={q1,q2,...qN} |
状态的集合(共N个) |
| V={v1,v2,...vM} |
观测的集合(共M个) |
| I={i1,i2,...iT} |
长度为T的状态序列 |
| O={o1,o2,...oT} |
长度为T的观测序列 |
| A=[aij]N∗N |
状态转移概率矩阵,其中,$a_{ij} = P(i_{t+1} = q_j |
| B=[bj(ot)]N∗M |
状态转移概率矩阵,其中,$b_{ij} = P(o_{t} = v_t |
| $\pi = (\pi_i) $ |
初始状态概率相量,其中,πi=P(i1=qi),描述在t=1时刻,状态为i的概率 |
λ=(A,B,π) 称为HMM的三要素
基本假设
HMM模型有两个基本假设
- 齐次马尔可夫性假设,隐藏的马尔可夫链在t时刻的状态只与t-1时刻的有关,与其他时刻以及观测状态无关,即:
P(it∣it−1,ot−1,it−2,ot−2,...,i1,o1)=P(it∣it−1)t=1,2,...,T
- 观测独立性假设,观测值只和当前状态有关,即:
P(ot∣it,it−1,ot−1,...,i1,o1)=P(ot∣it)t=1,2,...,T
分类
HMM根据观测值是否是离散值,分为离散HMM和连续HMM两类:
离散HMM
离散HMM的观测值是离散的,每个观测有其对应的概率值
连续HMM
连续HMM的观测值是实数或者实数向量,可以用概率密度函数描述观测值的概率分布,例如:
观测值服从单高斯分布:
bj(ot)=N(ot∣μj,Σj)
观测值服从高斯混合分布:
bj(ot)=k=1∑KπjkN(ot∣μjk,Σjk)
当HMM的观测概率分布由高斯混合模型(GMM)表示时,合称为GMM-HMM
基本问题
HMM模型有3个基本问题,分别是:
概率计算问题
简述
- 已知HMM模型$\lambda = (A, B, \pi) 和观测序列O={o_1, o_2, …, o_t}$
- 计算产生观测序列O的概率,P(O∣λ)
算法
直接计算法
直接计算法通过遍历HMM所有可能产生的隐藏状态,计算各个状态序列下,产生所求观测序列的概率,再将他们相加,从而得到合计的观测序列的概率,即:
P(O∣λ)=I∑P(O∣I,λ)∗P(I∣λ)=i1,i2,...,iT∑πi1bi1(o1)ai1i2bi2(o2)ai2i3...aiT−1iTbiT(oT)
由于要计算每个可能的隐藏状态,因此该算法的时间复杂度为:O(TNT),N是可能的状态数量
前向算法
前向算法通过按时序计算每个状态下产生对应观测的前向概率,并基于当前时刻的前向概率,计算下一时刻的前向概率,避免了重复计算,可以大大降低时间复杂度。
前向概率
前向概率的定义是:给定隐马尔可夫模型λ,定义到时刻t产生部分观测序列为o1,o2,...,ot 且时刻t状态为qi的
概率为前向概率,记作:
αt(i)=P(o1,o2,...ot,it=qi)
计算方法
- 初值
α1(i)=πibi(o1),i=1,2...,N
- 递推
αt+1(i)=j=1∑N(αt(j)aji)bi(ot+1),i=1,2...,N
- 结束
P(O∣λ)=j=1∑N(αT(j))
时间复杂度降为了O(TN2)
后向算法
后向算法与前向算法类似,区别在于是从时刻T开始,计算产生相应后缀观测序列的概率
后向概率
后向概率的定义是:给定隐马尔可夫模型λ,在时刻t状态的为qi的条件下,从t+1到从T所产生的部分观测序列为ot+1,ot+2,...,oT 的概率称为后向概率,记作:
βt(i)=P(ot+1,ot+2,...,oT∣it=qi)
计算方法
- 初值
βT(i)=1,i=1,2...,N
- 递推
βt(i)=j=1∑Naijβt+1(j)bj(ot+1),i=1,2...,N
- 结束
P(O∣λ)=i=1∑Nπiβ1(i)bj(o1)
预测问题(解码问题)
简述
- 已知HMM模型$\lambda = (A, B, \pi) 和观测序列O={o_1, o_2, …, o_t}$
- 计算使概率P(O∣I)最大的状态序列I={i1,i2,...,it}
算法
维特比算法(Viterb算法)
用动态规划求概率最大的路径(最优路径),一个路径对应一个状态序列
概率最大路径满足以下特点:若概率最大路径在t时刻经过状态i,则从t时刻到T时刻(结束)所对应的路径也是最优路径。即基于t时刻经过状态i的最优路径,计算从t时刻到结束的最优路径,即可获得全局最优路径。
根据这一特点,可以通过从t=1时刻开始,基于前一时刻的最优路径,依次计算每个时刻的各个状态产生对应观测的概率,取最大概率对应的状态作为最优路径,直至得到时刻t=T的最优路径。
计算方法
输入:模型$\lambda = (A, B, \pi) 和观测O={o_1, o_2, …, o_t}输出:最优路径I^={i_1^, i_2^, …, i_t^}$
- 初始化
δ1(i)=πibi(o1),i=1,2,...,Nψ1(i)=0,i=1,2,...,N
- 递推
δt(i)=1≤j≤Nmax[δt−1(j)aji]bi(ot),i=1,2,...,Nψt(i)=1≤j≤Nargmax[δt−1(j)aji],i=1,2,...,N
- 终止
δt(i)=1≤i≤NmaxδT(i)iT∗=1≤i≤NargmaxδT(i)
- 最优路径回溯
从t=T时刻开始,依次求T-1,T-2,…,1时刻,最优路径的状态:
it∗=ψt+1(it+1∗)
得到最优路径:I∗={i1∗,i2∗,...,it∗}
比较
维特比算法和前向算法相比,都是从t=1时刻开始,依次计算各个时刻产生对应观测序列的概率值,不同之处在于,维特比算法基于t-1时刻的概率δ,计算到t时刻状态的概率最大路径,而前向算法则是对能到达当前状态的所有路径的概率求和。
学习问题
概述
- 已知观测序列O={o1,o2,...,ot}
- 估计模型λ,使P(O∣λ)最大
算法
Viterbi学习算法
Viterbi学习算法将每个观测对齐到某个状态中,使用这些观测值去更新该状态对应的GMM模型参数,然后再更新HMM的参数、用Viterbi算法重新对齐,重复这个过程,直到收敛。
-
初始化GMM-HMM参数$\lambda = (\pi_i, a_{ij}, \alpha_{jm}, \mu_{jm}, \Sigma_{jm}) $ (后三个为GMM的参数,每个状态j对应一个GMM模型,m表示GMM模型的第m个分量)
-
基于GMM-HMM参数λ和Viterbi算法得到状态-观测对齐,得到每个观测对应的隐藏状态
-
更新参数λ
- πi^=∑kC(k)C(i) 其中,C(i)表示初始状态为i的次数
- aij^=∑kC(i−>k)C(i−>j),其中,C(i−>j)表示从状态i转移到状态j的次数
- 根据每个观测对应的状态,使用EM算法计算各个状态所对应的GMM模型的参数$(\alpha_{jm}, \mu_{jm}, \Sigma_{jm}) $
- 重复2,3步,直到收敛
Baum-Welch学习算法
Baum-Welch学习算法不把观测值和状态一一对应,而是计算观测值对应某个状态的概率,是一种“软对齐”。基于“软对齐”的结果,使用EM算法去更新HMM-GMM模型的参数。
-
初始化GMM-HMM参数$\lambda = (\pi_i, a_{ij}, (\alpha_{jm}, \mu_{jm}, \Sigma_{jm})) $
-
E步:
对所有时刻t和状态i,计算:
1)前向概率αt(i)和后向概率βt(i)
2)计算:
ζt(j,k)=∑i=1NαT(i)∑iαt−1(i)aijcjkbjk(ot)βt(j)ξt(i,j)=∑i=1NαT(i)αt(i)aijbj(ot+1)βt+1(j)γt(i)=k=1∑Nξt(i,k)
其中,γt表示状态占用概率,给定模型λ ,在时刻t处于状态qi的概率为:
γt(i)=P(it=qi∣O,λ)=∑i=1NαT(i)αt(i)βt(i)
- M步:
μ^jk=Σ^jk=c^jk=a^ij=π^i=∑t=1Tζt(j,k)∑t=1Tζt(j,k)ot∑t=1Tζt(j,k)∑t=1Tζt(j,k)(ot−μ^jk)(ot−μ^jk)T∑t=1T∑kζt(j,k)∑t=1Tζt(j,k)∑t=1T−1∑k=1Nξt(i,k)∑t=1T−1ξt(i,j)=∑t=1T−1γt(i)∑t=1T−1ξt(i,j)γ1(i)
- 重复2,3步,直到收敛