NLP基础 : HMM 隐马尔可夫模型

Hidden Markov Model, HMM 隐马尔可夫模型,是一种描述隐性变量(状态)和显性变量(观测状态)之间关系的模型。该模型遵循两个假设,隐性状态i只取决于前一个隐性状态i-1,而与其他先前的隐形状态无关。观测状态也只取决于当前的隐形状态。因此我们常常将隐马尔科夫模型表现为一种如下图所示链式的模型。
显性状态链与隐性状态链图示
其中, x t x_t xt代表某一时刻的隐形状态链,其N个状态取值集合为 { s 1 , s 2 , s 3 , . . . , N } \{s_1,s_2,s_3,...,_N\} {s1,s2,s3,...,N} y t y_t yt表示为对应的该时刻的显性状态(观测状态),其M个状态取值集合为 { o 1 , o 2 , o 3 , . . . , o k , . . . , o M } \{o_1,o_2,o_3,...,o_k,...,o_M\} {o1,o2,o3,...,ok,...,oM}。隐马尔科夫模型 θ \theta θ可以由三个矩阵来进行描述 θ = ( A , B , Π ) \theta = (A,B,\Pi) θ=(A,B,Π)

1. 大小为 N*N (N代表N种隐性的状态)的过渡矩阵 A:

A = { a i j } = { P ( x t + 1 = s j ∣ x t = s i ) } = { P ( s j ∣ s i ) } A = \{a_{ij}\} = \{P(x_{t+1}=s_j|x_t=s_i)\} = \{P(s_j|s_i)\} A={aij}={P(xt+1=sjxt=si)}={P(sjsi)}
过渡矩阵A中的每一个元素表示由上一个隐性状态 s i s_i si变为下一个隐性状态的条件概率。

2. 大小为 1*N 的初始概率向量 Π \Pi Π :

Π = π i = P ( x 1 = s i ) = P ( s i ) \Pi ={\pi_i} = {P(x_1 = s_i)} = {P(s_i)} Π=πi=P(x1=si)=P(si)
初始概率向量 Π \Pi Π中的每一个元素,表示初始隐性状态为 s i s_i si的概率,该向量的长度N与隐性状态的可能取值个数相同。

3. 大小为 M*N 的观测矩阵 B :

B = { b k i } = { P ( y t = o k ∣ x t = s i ) } = { P ( o k ∣ s i ) } B = \{b_{ki}\} = \{P(y_t=o_k|x_t=s_i)\} = \{P(o_k|s_i)\} B={bki}={P(yt=okxt=si)}={P(oksi)}

观测矩阵B中的每个元素,是用来描述N个隐形状态对应M个观测状态的概率。即在隐形状态为 s i s_i si 的条件下,观测状态为 o k o_k ok的概率。

上述三个矩阵构成了一个完整的隐马尔可夫模型。

掷骰子问题可以帮助我们更好地理解显性状态链和隐性状态链。例如我们有三个面数不一样的骰子可供选择投掷,三个骰子一个面数为4,一个面数为6,一个面数为8。每次选择的骰子是随机的且满足继续选到同一个骰子的概率是选到其他骰子概率的两倍。此时,隐性状态链 x t x_t xt就是我们每次选择的骰子,取值集合就是骰子1,骰子2,骰子3。显性状态链就是我们掷出的一系列数值,取值集合为 { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 } \{1,2,3,4,5,6,7,8\} {1,2,3,4,5,6,7,8}
根据上述的信息,我们不难整理出这个骰子问题HMM模型的三个核心矩阵 :

过渡矩阵A

previous state \ current stateD4D6D8
D4 2 3 \frac{2}{3} 32 1 6 \frac{1}{6} 61 1 6 \frac{1}{6} 61
D6 1 6 \frac{1}{6} 61 2 3 \frac{2}{3} 32 1 6 \frac{1}{6} 61
D8 1 6 \frac{1}{6} 61 1 6 \frac{1}{6} 61 2 3 \frac{2}{3} 32

初始概率向量 Π \Pi Π
由于一开始是随机选取骰子,因此初始抽到三个骰子的概率是相同的 1 3 \frac{1}{3} 31

D4D6D8
1 3 \frac{1}{3} 31 1 3 \frac{1}{3} 31 1 3 \frac{1}{3} 31

观测矩阵B :
观测矩阵存放了每种隐性状态下各观测状态的条件概率

observed state \ hidden stateD4D6D8
1 1 4 \frac{1}{4} 41 1 6 \frac{1}{6} 61 1 8 \frac{1}{8} 81
2 1 4 \frac{1}{4} 41 1 6 \frac{1}{6} 61 1 8 \frac{1}{8} 81
3 1 4 \frac{1}{4} 41 1 6 \frac{1}{6} 61 1 8 \frac{1}{8} 81
4 1 4 \frac{1}{4} 41 1 6 \frac{1}{6} 61 1 8 \frac{1}{8} 81
50 1 6 \frac{1}{6} 61 1 8 \frac{1}{8} 81
60 1 6 \frac{1}{6} 61 1 8 \frac{1}{8} 81
700 1 8 \frac{1}{8} 81
800 1 8 \frac{1}{8} 81

使用HMM模型会衍生出三类基础问题 :

第一类问题. 在HMM模型 θ \theta θ确定的情况下,针对一组显性状态链 y 1 : T y_{1:T} y1:T,计算出该模型生成这组显性状态链的概率。

还是沿用上述的骰子为例,这类问题实际就是在确定了骰子的种类,D4D6D8(观测矩阵B),随机选择骰子的方式(过渡矩阵A和初始概率向量 Π \Pi Π)的情况下,用于计算使用这三个骰子掷出一组数的可能性的问题。计算显性状态链的生成概率也是对模型是否和实际情况吻合的检验。如果多次实验得出的显性状态链由该模型生成的概率很低,可以认为构成模型的三个矩阵要素可能与实际情况不符,即在该例子中使用的骰子有被掉包的可能或实际随机选取骰子的方式与模型不一致。下面给出计算该问题的其中一个算法 forward algorithm 前向算法,与之对应的还有backward algorithm 后向算法,由于两者的思路很相似,本文中不再对backward algorithm作过多阐述。

forward algorithm 前向算法

计算一组显性状态链 y 1 , y 2 , y 3 , . . . , y T y_1,y_2,y_3,...,y_T y1,y2,y3,...,yT (下文中统一称 y 1 : T y_{1:T} y1:T)生成的概率,即计算 𝔏 = P ( y 1 : T ) P(y_{1:T}) P(y1:T)。我们先定义 α i ( t ) = P ( y 1 : t , x t = s i ) \alpha_i(t) = P(y_{1:t}, x_t = s_i) αi(t)=P(y1:t,xt=si), 其中 s i s_i si是该显性状态链最后一个值对应的隐性状态, t t t是这个显性状态链的总长度。 α i ( t ) \alpha_i(t) αi(t)即是掷出该显性状态链,且最后一个隐形状态为 s i s_i si的概率,则最终要求的生成概率 𝔏 = P ( y 1 : T ) = P ( y 1 : T , x t = s 1 ) + P ( y 1 : T , x t = s 2 ) + . . . + P ( y 1 : T , x t = s N ) = ∑ i = 1 N α i ( T ) P(y_{1:T}) = P(y_{1:T},x_t = s_1) + P(y_{1:T},x_t = s_2) +... + P(y_{1:T},x_t = s_N) \\ = \sum_{i=1}^{N}\alpha_i{(T)} P(y1:T)=P(y1:T,xt=s1)+P(y1:T,xt=s2)+...+P(y1:T,xt=sN)=i=1Nαi(T)
这样我们就把问题转化为了计算 α i ( T ) = P ( y 1 : T , x t = s i ) \alpha_i{(T)} = P(y_{1:T},x_t=s_i) αi(T)=P(y1:T,xt=si)。使用前向算法forward algorithm如下图所示,通过去掉最后一个状态的状态链的生成概率 α i ( t − 1 ) \alpha_i(t-1) αi(t1)推导至 α i ( t ) \alpha_i{(t)} αi(t),可以归纳为一个递推模型。
首先我们计算生成 y 1 : t y_{1:t} y1:t这个显性状态链且最后一个隐形状态为 s 1 s_1 s1的概率 α 1 ( t ) \alpha_1(t) α1(t),通过这个概率我们就不难推导出同样生成该显性状态链,且最后一个隐性状态为 s 2 , s 3 , . . . , s N s_2,s_3,...,s_N s2,s3,...,sN的概率 α i ( t ) \alpha_i(t) αi(t)

α 1 ( t ) = P ( y 1 : t , x t = s i ) = P ( y 1 : t − 1 , x t − 1 = s 1 ) ∗ P ( s 1 ∣ s 1 ) ∗ P ( y t ∣ s 1 ) + P ( y 1 : t − 1 , x t − 1 = s 2 ) ∗ P ( s 1 ∣ s 2 ) ∗ P ( y t ∣ s 1 ) + . . . + P ( y 1 : t − 1 , x t − 1 = x N ) ∗ P ( s 1 ∣ s N ) ∗ P ( y t ∣ s 1 ) \alpha_1{(t)} = P(y_{1:t},x_t = s_i) = P(y_{1:t-1},x_{t-1}=s_1) * P(s_1|s_1) * P(y_t|s_1) \\ + P(y_{1:t-1},x_{t-1}=s_2) * P(s_1|s_2) * P(y_t|s_1) \\+ \\...\\+ P(y_{1:t-1},x_{t-1}=x_N) * P(s_1|s_N) * P(y_t|s_1) α1(t)=P(y1:t,xt=si)=P(y1:t1,xt1=s1)P(s1s1)P(yts1)+P(y1:t1,xt1=s2)P(s1s2)P(yts1)+...+P(y1:t1,xt1=xN)P(s1sN)P(yts1)

对于每个前置状态 x t − 1 x_{t-1} xt1,计算 α 1 ( t ) \alpha_1(t) α1(t)为三个概率的乘积 : 前一时刻 t − 1 t-1 t1隐形状态为 s i s_i si且状态链为 y 1 : t − 1 y_{1:t-1} y1:t1的概率,由前一时刻的隐形状态 s i s_i si过渡到当前时刻 s 1 s_1 s1的过渡概率,以及在隐性状态为 s 1 s_1 s1的情况下,显性状态呈现 y t y_t yt的概率。
整理可得 :
α 1 ( t ) = α 1 ( t − 1 ) ∗ a 11 ∗ b y t , 1 + α 2 ( t − 1 ) ∗ a 21 ∗ b y t , 1 + . . . + α N ( t − 1 ) ∗ a N 1 ∗ b y t , 1 = b y t , 1 ∑ k = 1 N α k ( t − 1 ) ∗ a k 1 \alpha_1(t) = \alpha_1(t-1) * a_{11} * b_{yt,1} \\+\\ \alpha_2(t-1)*a_{21} * b_{yt,1} \\+\\ ... \\+\\ \alpha_N(t-1) * a_{N1} * b_{yt,1} \\= b_{yt,1}\sum_{k=1}^N\alpha_k(t-1) * a_{k1} α1(t)=α1(t1)a11byt,1+α2(t1)a21byt,1+...+αN(t1)aN1byt,1=byt,1k=1Nαk(t1)ak1
tips : a i j a_{ij} aij是过渡矩阵A中第i行第j列元素, a i j = P ( x t − 1 = s j ∣ x t = s i ) a_{ij} = P(x_{t-1}=s_j|x_t=s_i) aij=P(xt1=sjxt=si)即由前一个隐形状态 s i s_i si过渡到现状态 s j s_j sj的概率。

同理可得 α 2 ( t ) = b y t , 2 ∑ k = 1 N α k ( t − 1 ) ∗ a k 2 \alpha_2(t) = b_{yt,2}\sum_{k=1}^N\alpha_k(t-1) * a_{k2} α2(t)=byt,2k=1Nαk(t1)ak2
不难推出 α i ( t ) = b y t , i ∑ k = 1 N α k ( t − 1 ) ∗ a k i    f o r ( t > = 2 ) \alpha_i(t) = b_{yt,i}\sum_{k=1}^N\alpha_k(t-1) * a_{ki} \space \space for (t>=2) αi(t)=byt,ik=1Nαk(t1)aki  for(t>=2)
我们就得到了一个计算 α i ( t ) \alpha_i(t) αi(t)的递推模型,初始值 α i ( 1 ) = π i ∗ b y 1 , i \alpha_i(1) = \pi_i*b_{y_{1},i} αi(1)=πiby1,i tips : π i \pi_i πi是初始隐性状态为i的概率(见初始概率向量 Π \Pi Π)。

且𝔏 = P ( y 1 : T ) = P ( y 1 : T , x t = s 1 ) + P ( y 1 : T , x t = s 2 ) + . . . + P ( y 1 : T , x t = s N ) = ∑ i = 1 N α i ( T ) P(y_{1:T}) = P(y_{1:T},x_t = s_1) + P(y_{1:T},x_t = s_2) +... + P(y_{1:T},x_t = s_N) \\ = \sum_{i=1}^{N}\alpha_i{(T)} P(y1:T)=P(y1:T,xt=s1)+P(y1:T,xt=s2)+...+P(y1:T,xt=sN)=i=1Nαi(T)易得 P ( y 1 : T ) = ∑ i = 1 N ( b y T , 1 ∑ k = 1 N α k ( T − 1 ) ∗ a k 1 )    f o r (   T > = 2 ) P(y_{1:T} ) = \sum_{i=1}^N(b_{y_{T,1}}\sum_{k=1}^N\alpha_k(T-1) * a_{k1}) \space\space for (\space T>=2) P(y1:T)=i=1N(byT,1k=1Nαk(T1)ak1)  for( T>=2)

在这里插入图片描述

第二类问题. 在HMM模型 θ \theta θ确定的情况下,给出一组显性状态链 y 1 : T y_{1:T} y1:T,找出与其对应的可能性最大 的隐性状态序列 x 1 : T x_{1:T} x1:T

这个问题广泛应用于自然语言处理NLP中。例如在我们获取了一组手写符号时,找出其最大概率对应的字符。解决这个问题我们就要用到viterbi algorithm 维特比算法。维特比算法仍然利用递推关系,由 t t t时刻的状态推出 t + 1 t+1 t+1时刻的状态。定义 δ i ( t ) \delta_i(t) δi(t) t t t时刻且显性状态为 s i s_i si的最优路径的概率。
初始情况非常简单,在 t = 1 t=1 t=1时刻, δ i ( t ) = π i ∗ b y 1 , i \delta_i(t) = \pi_i * b_{y_1,i} δi(t)=πiby1,i,每个隐性状态对应的概率均是初始状态概率与对应的显性状态观测概率的乘积。紧接着有递推关系 :
δ i ( t + 1 ) = [ max ⁡ j δ j ( t ) a j i ] ∗ b y t + 1 , i \delta_i(t+1) = [\max_j\delta_j(t)a_{ji}] * b_{y_{t+1},i} δi(t+1)=[jmaxδj(t)aji]byt+1,i在这个递推关系中,下一时刻 t + 1 t+1 t+1每个隐性状态 i i i的最大概率 δ i ( t + 1 ) \delta_i(t+1) δi(t+1)总是对应上一时刻 t t t中最优路径概率 δ j ( t ) \delta_j(t) δj(t)与过渡概率 a j i a_{ji} aji乘积最大的隐性状态 j j j。因此,最优的隐性状态路径序列$\Psi_i(t) = [\argmax_j\delta_i(t)a_{ji}]。下面引用索邦大学课件上的例题作为使用维特比算法的例子 :

给定一个HMM模型 θ \theta θ,其中
A = ∣ 0.3 0.5 0.2 0 0.3 0.7 0 0 1 ∣ A = \left| \begin{matrix} 0.3 & 0.5 & 0.2\\ 0 & 0.3 & 0.7\\ 0 & 0 & 1 \end{matrix} \right| A=0.3000.50.300.20.71

Π = ∣ 0.6 0.4 0 ∣ \Pi = \left| \begin{matrix} 0.6\\ 0.4 \\ 0 \end{matrix} \right| Π=0.60.40

B = ∣ 1 0.5 0 0 0.5 1 ∣ B = \left| \begin{matrix} 1 & 0.5 & 0\\ 0 & 0.5 & 1 \end{matrix} \right| B=100.50.501
计算显性序列为 y = [1,1,2,2] 时,对应可能性最大的隐性序列。
结果如下 :
最终的最大概率隐性状态链为[1 2 3 3],对应的概率为0.105。
在这里插入图片描述

第三类问题. Baum-Welch算法,给定一个序列 y 1 : T y_{1:T} y1:T,估算出能最大化该序列生成概率的HMM模型的参数。

这类问题是非常常见的,HMM建模的问题。通过一组给定的显性状态链,推测出可能性最大的HMM模型。 首先我们需要用到前向算法中提到的 α i ( t ) \alpha_i(t) αi(t)以及后向算法中的 β i ( t ) \beta_i(t) βi(t)。前向算法的推导过程可以参考之前的部分,类似的后向算法如果有兴趣可以自行再查找资料,这里不过多赘述只列出使用的公式。
根据之前前向算法部分,我们定义了 α i ( t ) = P ( y 1 : t , x t = s i ) \alpha_i(t) = P(y_{1:t}, x_t = s_i) αi(t)=P(y1:t,xt=si)这个可以递推出的概率, α i ( t ) \alpha_i(t) αi(t)代表了观测状态为 y 1 : t y_{1:t} y1:t且第 t t t个隐性状态 s i s_i si的概率。同样在后向算法中我们定义了 β i ( t ) = P ( y t + 1 , . . . , y T , x t = s i ) \beta_i(t) =P(y_{t+1},...,y_T, x_t=s_i) βi(t)=P(yt+1,...,yT,xt=si)代表了观测状态为 y t + 1 : T y_{t+1:T} yt+1:T且第 t t t个隐性状态为 s i s_i si的概率。

显然我们有 α i ( t ) β i ( t ) = P ( y 1 : T , x t = s i ) \alpha_i(t)\beta_i(t)=P(y_{1:T},x_t=s_i) αi(t)βi(t)=P(y1:T,xt=si) 且 𝔏 = P ( y 1 : T ) P(y_{1:T}) P(y1:T)

根据贝叶斯公式 P ( A ∣ B ) = P ( A , B ) P ( B ) P(A|B) = \frac{P(A,B)}{P(B)} P(AB)=P(B)P(A,B), [2] 我们不难得出在给定观测序列 y 1 : T y_{1:T} y1:T以及HMM模型 θ \theta θ的情况下,在 t t t时刻状态是 s i s_i si的概率 :

γ i ( t ) = P ( x t = s i ∣ y 1 : T ) = P ( x t = s i , y 1 : T ) P ( y 1 : T ) = α i ( t ) β i ( t ) ∑ j = 1 N α j ( t ) β j ( t ) \gamma_i(t) = P(x_t=s_i|y_{1:T}) = \frac{P(x_t=s_i,y_{1:T})}{P(y_{1:T})}=\frac{\alpha_i(t)\beta_i(t)}{\sum_{j=1}^{N}\alpha_j(t)\beta_j(t)} γi(t)=P(xt=siy1:T)=P(y1:T)P(xt=si,y1:T)=j=1Nαj(t)βj(t)αi(t)βi(t)

t t t时刻状态是 s i s_i si,在 t + 1 t+1 t+1时刻状态时 s j s_j sj的概率 :
ξ i j = P ( x t = s i , x t + 1 = s j ∣ y 1 : T ) = P ( s j ∣ s i ) α i ( t ) β j ( t + 1 ) P ( y t + 1 ∣ s j ) P ( y 1 : T ) = a i j β j ( t + 1 ) b y t + 1 , j P ( y 1 : T ) \xi_{ij} =P(x_t=s_i,x_{t+1} =s_j|y_{1:T}) = \frac{P(s_j|s_i)\alpha_i(t)\beta_j(t+1)P(y_{t+1}|s_j)}{P(y_{1:T})} = \frac{a_{ij}\beta_j(t+1)b_{y_{t+1},j}}{P(y_{1:T})} ξij=P(xt=si,xt+1=sjy1:T)=P(y1:T)P(sjsi)αi(t)βj(t+1)P(yt+1sj)=P(y1:T)aijβj(t+1)byt+1,j

通过这些基础的概率,我们更新 θ \theta θ中的参数。

初始状态是 s i s_i si的概率向量:
Π i ∗ = γ i ( 1 ) \Pi^*_i = \gamma_i(1) Πi=γi(1)

更新过渡矩阵:
a i j ∗ = P ( s j ∣ s i ) = ∑ t = 1 T − 1 ξ i j ( t ) ∑ t = 1 T − 1 γ i ( t ) a^*_{ij} = P(s_j|s_i) = \frac{\sum_{t=1}^{T-1}\xi_{ij}(t)}{\sum_{t=1}^{T-1}\gamma_{i}(t)} aij=P(sjsi)=t=1T1γi(t)t=1T1ξij(t)

更新观测矩阵:
b o k , i ∗ = ∑ t = 1 T α i ( t ) P ( y t ∣ s i ) 1 y t = o k ∑ t = 1 T α i ( t ) β i ( t ) b^*_{o_k,i} = \frac{\sum_{t=1}^T\alpha_i(t)P(y_t|s_i)1_{y_t=o_k}}{\sum_{t=1}^T\alpha_i(t)\beta_i(t)} bok,i=t=1Tαi(t)βi(t)t=1Tαi(t)P(ytsi)1yt=ok
其中
1 y t = o k = 1    w h e n    y t = o k 1_{y_t=o_k} = 1 \space\space when \space \space y_t=o_k 1yt=ok=1  when  yt=ok
1 y t = o k = 0    w h e n    e l s e 1_{y_t=o_k} = 0 \space\space when \space \space else 1yt=ok=0  when  else

不断重复上述更新操作直至收敛,就得到了新的HMM模型。

\newline
\newline
\newline
\newline
\newline

References :

[1] Viterbi AJ (April 1967). “Error bounds for convolutional codes and an asymptotically optimum decoding algorithm”. IEEE Transactions on Information Theory. 13

[2] Baum-Welch algorithm

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:点我我会动 设计师:我叫白小胖 返回首页
评论

打赏作者

Cy_coding

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值