机器学习基础——隐马尔可夫模型
隐马尔可夫模型
-
定义:隐马尔可夫模型是关于时序的概率模型,描述由一个隐藏的马尔科夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程。

-
对该问题中的数据进行数学定义
-
所有可能的状态集合QQQ,其中NNN为所有可能的状态数:
Q={q1,q2,...,qN} Q = \{q_1,q_2,...,q_N\} Q={q1,q2,...,qN} -
所有可能的观测集合VVV,其中MMM为所有可能的观测数:
V={v1,v2,...,vM} V = \{v_1,v_2,...,v_M\} V={v1,v2,...,vM} -
长度为TTT的状态序列III:
I=(i1,i2,...iT) I = (i_1,i_2,...i_T) I=(i1,i2,...iT) -
长度为TTT的观测序列OOO:
O=(o1,o2,...,oT) O = (o_1,o_2,...,o_T) O=(o1,o2,...,oT)
1.模型定义
隐马尔可夫模型立足于两个基本假设:齐次马尔可夫性假设,观测独立性假设。
- 齐次马尔可夫性假设: 假设隐藏的马尔科夫链在任意时刻ttt的状态只依赖于前一时刻的状态,与其他时刻的状态及观测无关,也与时刻ttt无关。数学表示如下:
P(it∣it−1,ot−1,...i1,o1)=P(it∣it−1), t=1,2,...T P(i_t|i_{t-1},o_{t-1},...i_1,o_1) = P(i_t|i_{t-1}),\space t=1,2,...T P(it∣it−1,ot−1,...i1,o1)=P(it∣it−1), t=1,2,...T - 观测独立性假设: 即假设任意时刻的观测只能依赖于该时刻的马尔科夫链的状态,与其他观测及状态无关。数学表示如下:
P(ot∣iT,oT,iT−1,oT−1,...,it+1,ot+1,it,it−1,ot−1,...i1,o1)=P(ot∣it) P(o_t|i_T,o_T,i_{T-1},o_{T-1},...,i_{t+1},o_{t+1},i_t,i_{t-1},o_{t-1},...i_1,o_1)=P(o_t|i_t) P(ot∣iT,oT,iT−1,oT−1,...,it+1,ot+1,it,it−1,ot−1,...i1,o1)=P(ot∣it)
基于两个基本假设,我们建立状态转移概率矩阵AAA和观测概率矩阵BBB。 - 状态转移概率矩阵AAA:
A=[aij]N×N A = [a_{ij}]_{N×N} A=[aij]N×N
式中,aija_{ij}aij表示由状态qiq_iqi转移到状态qjq_jqj的概率。数学表示如下:
aij=P(it+1=qj∣it=qi) a_{ij}=P(i_{t+1}=q_j|i_t=q_i) aij=P(it+1=qj∣it=qi) - 观测概率矩阵BBB:
B=[bj(k)]N×M B = [b_j(k)]_{N×M} B=[bj(k)]N×M
式中,bj(k)表示状态为qj时,观测为vk的概率。数学表示如下:式中,b_j(k)表示状态为q_j时,观测为v_k的概率。数学表示如下:式中,bj(k)表示状态为qj时,观测为vk的概率。数学表示如下:
bj(k)=P(ot=vk∣it=qj) b_j(k) = P(o_t=v_k|i_t=q_j) bj(k)=P(ot=vk∣it=qj)
对已有的矩阵A和B,补充初始状态概率即可构成闭合问题。定义初始状态台率向量π:对已有的矩阵A和B,补充初始状态概率即可构成闭合问题。定义初始状态台率向量\pi:对已有的矩阵A和B,补充初始状态概率即可构成闭合问题。定义初始状态台率向量π:
π=(πi) \pi = (\pi_i) π=(πi)
πi表示t=1时刻处于状态qi的概率。数学表示如下:\pi_i表示t=1时刻处于状态q_i的概率。数学表示如下:πi表示t=1时刻处于状态qi的概率。数学表示如下:
πi=P(i1=qi) \pi_i = P(i_1 = q_i) πi=P(i1=qi)
对构成的闭合问题,π和A可以决定状态序列,B可以决定观测序列,所以隐马尔可夫模型可以表示为:对构成的闭合问题,\pi和A可以决定状态序列,B可以决定观测序列,所以隐马尔可夫模型可以表示为:对构成的闭合问题,π和A可以决定状态序列,B可以决定观测序列,所以隐马尔可夫模型可以表示为:
λ=(A,B,π) \lambda = (A,B,\pi) λ=(A,B,π)
2.隐马尔可夫模型的3个基本问题
- 1.概率计算问题。给定模型λ=(A,B,π)\lambda=(A,B,\pi)λ=(A,B,π)和观测序列O=(o1,o2,...oT)O=(o_1,o_2,...o_T)O=(o1,o2,...oT),计算在模型λ\lambdaλ下观测序列OOO出现的概率P(O∣λ)P(O|\lambda)P(O∣λ).
- 2.学习问题。已知观测序列O=(o1,o2,...oT)O=(o_1,o_2,...o_T)O=(o1,o2,...oT),估计模型λ=(A,,B,π)\lambda=(A,,B,\pi)λ=(A,,B,π)参数,使得在该模型下观测序列概率P(O∣λ)P(O|\lambda)P(O∣λ)最大,即用极大似然估计的方法估计参数。
- 3.解码问题。已知模型λ=(A,B,π)\lambda=(A,B,\pi)λ=(A,B,π)和观测序列O=(o1,o2,...oT)O=(o_1,o_2,...o_T)O=(o1,o2,...oT),求对给定观测序列条件概率P(I∣O)P(I|O)P(I∣O)最大的状态序列I=(i1,i2,...,iT)I=(i_1,i_2,...,i_T)I=(i1,i2,...,iT),即给定观测序列,求最有可能的对应的状态序列。
- 其中,解码问题常常被用来解决序列标注问题,假设给定了一段文本,这段文本可以视为马尔科夫链,文本为观测序列,文字的词性即为状态,构成状态序列,序列标注问题就是求出模型λ\lambdaλ后,求出最有可能的状态序列,即求出词性序列。
2.1 概率计算问题
本文重点讨论解码问题,即序列标注问题,概率计算问题不是我们关注的重点,不过概率计算问题中引入的前向概率和后向概率值得学习,所以本节仍做讲解。
概率计算问题是已知λ\lambdaλ和OOO,求OOO出现的概率。数学表示为:
P(O∣λ)
P(O|\lambda)
P(O∣λ)
对观测概率的计算离不开状态序列,设状态序列为I=(i1,i2,...,iT)I=(i_1,i_2,...,i_T)I=(i1,i2,...,iT),III的概率是:
P(I∣λ)=πi1ai1i2ai2i3....aiT−1iT
P(I|\lambda)=\pi_{i_1}a_{i_1i_2}a_{i_2i_3}....a_{i_{T-1}i_T}
P(I∣λ)=πi1ai1i2ai2i3....aiT−1iT
在该状态序列下,观测序列O=(o1,o2,...oT)O=(o_1,o_2,...o_T)O=(o1,o2,...oT)出现的概率为:
P(O∣I,λ)=bi1(o1)bi2(o2)...biT(oT)
P(O|I,\lambda)=b_{i_1}(o_1)b_{i_2}(o_2)...b_{i_T}(o_T)
P(O∣I,λ)=bi1(o1)bi2(o2)...biT(oT)
由以上两式,可计算联合概率分布P(O,I∣λ)P(O,I|\lambda)P(O,I∣λ),即给定模型参数时,状态序列I,OI,OI,O同时出现的概率:
P(O,I∣λ)=P(I∣λ)P(O∣I,λ)=πi1bi1(o1)ai1i2bi2(o2).....aiT−1iTbiT(oT)
P(O,I|\lambda) = P(I|\lambda)P(O|I,\lambda)=\pi_{i_1}b_{i_1}(o_1)a_{i_1i_2}b_{i_2}(o_2).....a_{i_{T-1}i_T}b_{i_T}(o_T)
P(O,I∣λ)=P(I∣λ)P(O∣I,λ)=πi1bi1(o1)ai1i2bi2(o2).....aiT−1iTbiT(oT)
由此,可通过对所有可能的状态序列III求和,就可以计算出边缘概率分布P(O∣λ)P(O|\lambda)P(O∣λ),即:
P(O,I∣λ)=∑IP(I∣λ)P(O∣I,λ)=∑i1,i2,...iTπi1bi1(o1)ai1i2bi2(o2).....aiT−1iTbiT(oT)
P(O,I|\lambda) = \sum_I P(I|\lambda)P(O|I,\lambda)=\sum_{i_1,i_2,...i_T}\pi_{i_1}b_{i_1}(o_1)a_{i_1i_2}b_{i_2}(o_2).....a_{i_{T-1}i_T}b_{i_T}(o_T)
P(O,I∣λ)=I∑P(I∣λ)P(O∣I,λ)=i1,i2,...iT∑πi1bi1(o1)ai1i2bi2(o2).....aiT−1iTbiT(oT)
每一时刻的状态iii有NNN种可能,所以该算法的计算复杂度为O(TNT)O(TN^T)O(TNT),为避免如此复杂的计算,引入前向算法和后向算法。
2.1.1 前向算法
- 首先定义前向概率:给定到ttt时刻,部分观测序列为o1,o2,...oto_1,o_2,...o_to1,o2,...ot,且ttt时刻状态为qiq_iqi的概率为前向概率,数学表示为:
αt(i)=P(o1,o2,...,ot,it=qt∣λ) \alpha_t(i) = P(o_1,o_2,...,o_t,i_t=q_t|\lambda) αt(i)=P(o1,o2,...,ot,it=qt∣λ)
由此,给出递推公式:
初值:α1(i)=πib1(o1),i=1,2,....N递推:αt+1(i)=[∑j=1Nαt(j)]ajibt+1(ot+1),t=1,2,...T−1终止:P(O∣λ)=∑iNαT(i) \red{初值}:\alpha_1(i) = \pi_ib_1(o_1),i=1,2,....N\\ \red{递推}:\alpha_{t+1}(i) = [\sum_{j=1}^N\alpha_{t}(j)]a_{ji}b_{t+1}(o_{t+1}),t=1,2,...T-1\\ \red{终止}:P(O|\lambda) = \sum_i^N\alpha_T(i) 初值:α1(i)=πib1(o1),i=1,2,....N递推:αt+1(i)=[j=1∑Nαt(j)]ajibt+1(ot+1),t=1,2,...T−1终止:P(O∣λ)=i∑NαT(i)
这里需要注意,在第一步中没有计算所有状态出现的概率和,是因为在计算α2(i)\alpha_2(i)α2(i)时,会计算t=1t=1t=1时刻的所有状态出现的概率和;在递推过程中,执行到最后一项,得到αT(i)\alpha_T(i)αT(i),但是我们需要计算的是OOO出现的概率,所以需要对所有可能的状态相加,得到边缘概率分布。
2.1.2 后向算法
- 后向概率:给定隐马尔可夫模型λ\lambdaλ,在时刻ttt状态为qiq_iqi的条件下,从t+1t+1t+1到TTT的部分观测序列为ot+1,...oTo_{t+1},...o_Tot+1,...oT的概率为后向概率,数学表示为:
βt(i)=P(ot+1,...oT∣it=qi,λ) \beta_t(i)=P(o_{t+1},...o_T|i_t=q_i,\lambda) βt(i)=P(ot+1,...oT∣it=qi,λ) - 由此给出递推公式:
初始化:βT(i)=1递推:βt(i)=∑j=1Naijbt(ot)βt+1(j),t=1,2,...T−1终止:P(O∣λ)=∑i=1Nπib1(o1)β1(i) \red{初始化:}\beta_T(i)=1\\ \red{递推:}\beta_t(i) = \sum_{j=1}^{N}a_{ij}b_t(o_t)\beta_{t+1}(j),t=1,2,...T-1\\ \red{终止:}P(O|\lambda)=\sum_{i=1}^{N}\pi_ib_1(o_1)\beta_1(i) 初始化:βT(i)=1递推:βt(i)=j=1∑Naijbt(ot)βt+1(j),t=1,2,...T−1终止:P(O∣λ)=i=1∑Nπib1(o1)β1(i)
2.13 概率给出
根据前项公式和后向公式,可以给出OOO出现的概率计算公式:
P(O∣λ)=∑i=1NαT(i)=∑i=1Nπib1(o1)β1(i)=∑i=1Nαt(i)βt(i)=∑i=1N∑j=1Nαt(i)aijbj(ot+1)βt+1(j)
P(O|\lambda)=\sum_{i=1}^N\alpha_T(i)=\sum_{i=1}^N\pi_ib_1(o_1)\beta_1(i)=\sum_{i=1}^N\alpha_t(i)\beta_t(i)\\=\sum_{i=1}^N\sum_{j=1}^N\alpha_t(i)a_{ij}b_{j}(o_{t+1})\beta_{t+1}(j)
P(O∣λ)=i=1∑NαT(i)=i=1∑Nπib1(o1)β1(i)=i=1∑Nαt(i)βt(i)=i=1∑Nj=1∑Nαt(i)aijbj(ot+1)βt+1(j)
2.2 学习算法
2.2.1 监督学习方法
假设训练数据包含S个长度相同的观测序列和对应的状态序列{(O1,I1),(O2,I2),...,(Os,Is)}\{(O_1,I_1),(O_2,I_2),...,(O_s,I_s)\}{(O1,I1),(O2,I2),...,(Os,Is)},可以利用极大似然估计法来估计隐马尔可夫模型的参数。
- 转移概率aija_{ij}aij的估计
a^ij=Aij∑j=1NAij ,i=1,2,...N;j=1,2,...N \hat{a}_{ij} = \frac{A_{ij}}{\sum_{j=1}^{N}A_{ij}}\space ,i=1,2,...N;j=1,2,...N a^ij=∑j=1NAijAij ,i=1,2,...N;j=1,2,...N
AijA_{ij}Aij为由状态iii向状态jjj转移的频数。 - 观测概率bj(k)b_j(k)bj(k)的估计
b^j(k)=Bjk∑k=1MBjk ,j=1,2,...N;k=1,2,...,M \hat{b}_j(k)=\frac{B_{jk}}{\sum_{k=1}^{M}B_{jk}}\space ,j=1,2,...N;k=1,2,...,M b^j(k)=∑k=1MBjkBjk ,j=1,2,...N;k=1,2,...,M
BjkB_{jk}Bjk为状态为jjj,观测为kkk的频数。 - 初始状态概率πi\pi_iπi的估计
πi^=QiS ,i=1,2,...,N \hat{\pi_i}=\frac{Q_i}{S}\space ,i=1,2,...,N πi^=SQi ,i=1,2,...,N
QiQ_iQi为初始状态为qiq_iqi的频数,SSS为样本数量。
2.2.2 无监督学习方法
这一部分式子太多了,改手写吧。。。字难看,各位见谅。
- 无监督学习使用著名的baum-welch算法,该方法后来被证明为使EM算法。
算法同EM算法相同,分两步:E步和M步。E步求期望,M步最大化模型参数。
2.2.2.1 E步求期望
E步是指在给定当前模型参数λˉ\bar\lambdaλˉ和观测数据OOO的条件下,求完全数据O,IO,IO,I的对数似然概率关于未知数据III的期望。数学表示及推导见下图,各位见谅。。。

2.2.2.2 M步最大化模型参数

2.3 解码方法
- 设在ttt状态为iii的所有单个路径(i1,i2,...iT)(i_1,i_2,...i_T)(i1,i2,...iT)中概率最大值为δt(i)\delta_t(i)δt(i)。数学表示为:
δt(i)=max P(it=i,it−1,...,i1,ot,...,o1∣λ), i=1,2,...N \delta_t(i)=\max\space P(i_t=i,i_{t-1},...,i_1,o_t,...,o_1|\lambda), \space i=1,2,...N δt(i)=max P(it=i,it−1,...,i1,ot,...,o1∣λ), i=1,2,...N
递推:
初始:δ1(i)=πibi(o1), i=1,2,...,N递推:δt+1(i)=max1≤j≤N[δt(j)aji]bi(ot+1) 初始:\delta_1(i) = \pi_ib_i(o_1),\space i = 1,2,...,N \\递推:\delta_{t+1}(i)=\max_{1\leq j\leq N}[\delta_t(j)a_{ji}]b_{i}(o_{t+1}) 初始:δ1(i)=πibi(o1), i=1,2,...,N递推:δt+1(i)=1≤j≤Nmax[δt(j)aji]bi(ot+1) - 设在时刻ttt状态为iii的所有单个路径(i1,i2,...,it−1,i)(i_1,i_2,...,i_{t-1},i)(i1,i2,...,it−1,i)中概率最大的路径第t−1t-1t−1个结点为Ψt(i)\Psi_t(i)Ψt(i),数学表示为:
Ψt(i)=arg max1≤j≤N[δt−1(j)aji] \Psi_t(i)=\arg\space \max_{1\leq j\leq N}[\delta_{t-1}(j)a_{ji}] Ψt(i)=arg 1≤j≤Nmax[δt−1(j)aji]
递推:
初始:Ψ1(i)=0递推:Ψt(i)=arg max1≤j≤N[δt−1(j)aji] 初始:\Psi_1(i)=0 \\递推:\Psi_t(i)=\arg\space \max_{1\leq j\leq N}[\delta_{t-1}(j)a_{ji}] 初始:Ψ1(i)=0递推:Ψt(i)=arg 1≤j≤Nmax[δt−1(j)aji]
2.3.1 维特比算法求解过程
初始化(t=1):
δ1(i)=πibi(o1), i=1,2,...,NΨ1(i)=0
\\\delta_1(i) = \pi_ib_i(o_1),\space i = 1,2,...,N
\\ \Psi_1(i)=0
δ1(i)=πibi(o1), i=1,2,...,NΨ1(i)=0
递推t=2,…,T:
δt(i)=max1≤j≤N[δt−1(j)aji]bi(ot)Ψt(i)=arg max1≤j≤N[δt−1(j)aji]
\\\delta_{t}(i)=\max_{1\leq j\leq N}[\delta_{t-1}(j)a_{ji}]b_{i}(o_{t})
\\ \Psi_t(i)=\arg\space \max_{1\leq j\leq N}[\delta_{t-1}(j)a_{ji}]
δt(i)=1≤j≤Nmax[δt−1(j)aji]bi(ot)Ψt(i)=arg 1≤j≤Nmax[δt−1(j)aji]
终止:
iT∗=argmax1≤i≤N[δT(i)]
i^*_T = \arg \max_{1\leq i\leq N}[\delta_T(i)]
iT∗=arg1≤i≤Nmax[δT(i)]
最优路径回溯t=T−1,...,2,1t=T-1,...,2,1t=T−1,...,2,1:
it∗=Ψi+1(it+1∗)
i^*_t = \Psi_{i+1}(i^*_{t+1})
it∗=Ψi+1(it+1∗)
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)