搞懂HMM

文章目录

  • 1 概述
  • 2 符号说明
  • 3 两点假设
  • 4 Evaluation
    • 4.1 前向算法(forward algorithm)
    • 4.2 后向算法(backward algorithm)
  • 5 Learning
  • 6 Decoding
  • 参考资料

1 概述

本文是B站上机器学习-白板推导系列(十四)-隐马尔可夫模型HMM的学习笔记,UP主讲得实在是太清楚了,赶紧记录下来,以防之后忘记。

某些细节上根据个人理解做了改动。

HMM示意图

图1 HMM示意图

HMM全名为Hidden Markov Model,其示意图如上图所示,是一个概率图。观测变量,顾名思义,就是我们观测到的量,比如语音识别里就是我们听到的声音信号;状态变量就是隐藏的特征,在语音识别里,可以是发音单元Phoneme,甚至是更小的单元Tri-phone,不管是什么,这必须要是一个离散的可枚举的集合。当状态变量变成连续变量的时候,如果连续变量是线性的,典型的代表就是Kalman Filter,如果是连续变量是非线性的,典型的代表就是Particle Filter。本文只讲HMM。

同一个时刻,从状态变量转变为观测变量,服从某个分布,一般是混合高斯分布(GMM)。

状态变量从前一个时刻转变为下一个时刻的,也服从某个分布,一般也是GMM。

每个时刻的观测变量之间,必须不是独立同分布的。

2 符号说明

令整个序列共有T个time step。

状态序列为S=[s1,s2,...,st,...,sT−1,sT]S = [s_1, s_2, ..., s_t, ..., s_{T-1}, s_T]S=[s1,s2,...,st,...,sT1,sT]sts_tst是可枚举的离散变量,值域为{q1,q2,...,qN}\{q_1, q_2, ..., q_N\}{q1,q2,...,qN}NNN表示有NNN种状态。

观测序列为O=[o1,o2,...,ot,...,oT−1,oT]O = [o_1, o_2, ..., o_t, ..., o_{T-1}, o_T]O=[o1,o2,...,ot,...,oT1,oT]oto_tot可以是连续变量

πi\pi_iπi为初始时刻的状态概率,即πi=P(s1=qi)\pi_i = P(s_1=q_i)πi=P(s1=qi)

AAA为状态转移矩阵[aij]N×N[a_{ij}]_{N \times N}[aij]N×N,矩阵中aij=P(st=qj∣st−1=qi)a_{ij}=P(s_{t}=q_j|s_{t-1}=q_i)aij=P(st=qjst1=qi),表示任意两个相邻时间点时间状态从qiq_iqi转变为qjq_jqj的概率。

bj(ot)b_j(o_t)bj(ot)为发射概率,表示从状态qjq_jqj变成观测值oto_tot的概率,即bj(ot)=P(ot∣st=qj)b_j(o_t)=P(o_t|s_t=q_j)bj(ot)=P(otst=qj)

λ=(π,a,b)\lambda = (\pi, a, b)λ=(π,a,b)表示模型中所有的可学习的参数。

有了符号的图1就变成了

HMM示意图-有符号

图2 HMM示意图(有符号)

3 两点假设

(1)齐次Markov假设
t+1t+1t+1时刻的状态只和ttt时刻的状态有关。
P(st+1∣s1,s2,...,st,o1,o2,...,ot)=P(st+1∣st)(3-1)P(s_{t+1} | s_1, s_2, ..., s_t, o_1, o_2, ..., o_t) = P(s_{t+1}|s_t) \tag{3-1}P(st+1s1,s2,...,st,o1,o2,...,ot)=P(st+1st)(3-1)

(2)观测独立假设
ttt时刻的观测变量只和ttt时刻的状态变量有关。
P(ot∣s1,s2,...,st,o1,o2,...,ot−1)=P(ot∣st)(3-2)P(o_t|s_1, s_2, ..., s_t, o_1, o_2, ..., o_{t-1}) = P(o_t|s_t) \tag{3-2}P(ots1,s2,...,st,o1,o2,...,ot1)=P(otst)(3-2)

这两个假设在后面的推导中有着极其重要的作用。

4 Evaluation

Evaluation要做的事情是,给定所有的模型参数,即λ\lambdaλ,之后,求得到某个观测序列O=[o1,o2,...,oT]O=[o_1, o_2, ..., o_T]O=[o1,o2,...,oT]的概率,记作P(O∣λ)P(O|\lambda)P(Oλ)。注意,现在我们是知道模型所有的参数的,只是做一个inference的过程。

我们先来看下直接求解的情况是如何的。我们把这个条件概率稍微变一下,把状态变量给引进来

P(O∣λ)=∑allSP(S,O∣λ)=∑allSP(O∣S,λ)P(S∣λ)(4-1)P(O|\lambda) = \sum_{all\ S}P(S, O| \lambda) = \sum_{all\ S} P(O|S, \lambda)P(S|\lambda) \tag{4-1}P(Oλ)=all SP(S,Oλ)=all SP(OS,λ)P(Sλ)(4-1)

这个没问题吧,我们把所有可能的SSS序列都考虑进来了,这是个全概率。

然后我们把P(S∣λ)P(S|\lambda)P(Sλ)展开来看下,λ\lambdaλ只表示已知所有模型参数,可写可不写

P(S∣λ)=P(s1,s2,...,sT∣λ)=P(sT∣s1,s2,...,sT−1,λ)P(s1,s2,...,sT−1,λ)利用齐次Markov假设(3−1),λ可写可不写=P(sT∣sT−1)P(s1,s2,...,sT−1)继续拆拆拆=P(sT∣sT−1)P(sT−1∣sT−2)...P(s2∣s1)P(s1)除了最后一项都是状态转移矩阵里的=∏t=1T−1ast,st+1πs1(4-2)\begin{aligned} P(S|\lambda) &= P(s_1, s_2, ..., s_T | \lambda) \\ &= P(s_T|s_1, s_2, ..., s_{T-1}, \lambda)P(s_1, s_2, ..., s_{T-1}, \lambda) \\ &利用齐次Markov假设(3-1),\lambda 可写可不写 \\ &= P(s_T|s_{T-1})P(s_1, s_2, ..., s_{T-1}) \\ &继续拆拆拆 \\ &= P(s_T|s_{T-1})P(s_{T-1}|s_{T-2})...P(s_2|s_1)P(s_1) \\ &除了最后一项都是状态转移矩阵里的 \\ &=\prod_{t=1}^{T-1} a_{s_t, s_{t+1}} \pi_{s_1} \end{aligned} \tag{4-2} P(Sλ)=P(s1,s2,...,sTλ)=P(sTs1,s2,...,sT1,λ)P(s1,s2,...,sT1,λ)Markov(31)λ=P(sTsT1)P(s1,s2,...,sT1)=P(sTsT1)P(sT1sT2)...P(s2s1)P(s1)=t=1T1ast,st+1πs1(4-2)

接着我们再把P(O∣S,λ)P(O|S, \lambda)P(OS,λ)展开看下

P(O∣S,λ)=P(o1,o2,...,oT∣s1,s2,...,sT,λ)=P(oT∣o1,o2,...,oT−1,s1,s2,...,sT,λ)P(o1,o2,...,oT−1∣s1,s2,...,sT,λ)利用观测独立假设(3−2)=P(oT∣sT)P(o1,o2,...,oT−1∣s1,s2,...,sT,λ)继续拆拆拆=P(oT∣sT)P(oT−1∣sT−1)...P(o1∣s1)用发射概率函数=∏t=1Tbst(ot)(4-3)\begin{aligned} P(O|S, \lambda) &= P(o_1, o_2, ..., o_T |s_1, s_2, ..., s_T, \lambda ) \\ &= P(o_T | o_1, o_2, ..., o_{T-1}, s_1, s_2, ..., s_T, \lambda)P(o_1, o_2, ..., o_{T-1} | s_1, s_2, ..., s_T, \lambda) \\ &利用观测独立假设(3-2) \\ &=P(o_T|s_T)P(o_1, o_2, ..., o_{T-1} | s_1, s_2, ..., s_T, \lambda)\\ &继续拆拆拆 \\ &=P(o_T|s_T)P(o_{T-1}|s_{T-1})...P(o_1|s_1)\\ &用发射概率函数\\ &=\prod_{t=1}^{T}b_{s_t}(o_t) \end{aligned} \tag{4-3} P(OS,λ)=P(o1,o2,...,oTs1,s2,...,sT,λ)=P(oTo1,o2,...,oT1,s1,s2,...,sT,λ)P(o1,o2,...,oT1s1,s2,...,sT,λ)(32)=P(oTsT)P(o1,o2,...,oT1s1,s2,...,sT,λ)=P(oTsT)P(oT1sT1)...P(o1s1)=t=1Tbst(ot)(4-3)

将(4-2)和(4-3)带入(4-1)可得

P(O∣λ)=∑allS∏t=1Tbst(ot)∏t=1T−1ast,st+1πs1把allS展开=∑s1=q1qN∑s2=q1qN...∑sT=q1qN∏t=1Tbst(ot)∏t=1T−1ast,st+1πs1(4-4)\begin{aligned} P(O|\lambda) &= \sum_{all\ S} \prod_{t=1}^{T}b_{s_t}(o_t)\prod_{t=1}^{T-1} a_{s_t, s_{t+1}} \pi_{s_1} \\ &把all\ S展开\\ &=\sum_{s_1=q_1}^{q_N}\sum_{s_2=q_1}^{q_N}...\sum_{s_T=q_1}^{q_N}\prod_{t=1}^{T}b_{s_t}(o_t)\prod_{t=1}^{T-1} a_{s_t, s_{t+1}} \pi_{s_1} \end{aligned} \tag{4-4} P(Oλ)=all St=1Tbst(ot)t=1T1ast,st+1πs1all S=s1=q1qNs2=q1qN...sT=q1qNt=1Tbst(ot)t=1T1ast,st+1πs1(4-4)

这个的复杂度是O(NT)O(N^T)O(NT)的,计算量随着序列的变长而爆炸式指数增长,没法用的。

于是,就有人提出了前向和后向算法来降低计算成本。

4.1 前向算法(forward algorithm)

如下图3所示,前向算法考虑的就是橘黄色方框内变量的联合概率,记作

αt(qi)=P(o1,o2,...,ot,st=qi∣λ)(4-5)\alpha_t(q_i) = P(o_1, o_2, ..., o_t, s_t=q_i | \lambda) \tag{4-5} αt(qi)=P(o1,o2,...,ot,st=qiλ)(4-5)

若要问为什么要是(4−5)(4-5)(45),那我还真答不上来,这是一种设计,如果有其他的设计应该也可以。
前向算法示意图

图3 前向算法示意图

我们来看看αT(qi)\alpha_T(q_i)αT(qi)是怎么样的

αT(qi)=P(o1,o2,...,oT,sT=qi∣λ)=P(O,sT=qi∣λ)(4-6)\alpha_T(q_i) = P(o_1, o_2, ..., o_T, s_T=q_i | \lambda) =P(O, s_T=q_i|\lambda) \tag{4-6} αT(qi)=P(o1,o2,...,oT,sT=qiλ)=P(O,sT=qiλ)(4-6)

sTs_TsT的状态是可枚举的,我们遍历所有的sTs_TsT的可能性,然后求个和,就有了

∑i=1NαT(qi)=∑i=1NP(O,sT=qi∣λ)=P(O∣λ)(4-7)\sum_{i=1}^N \alpha_T(q_i) = \sum_{i=1}^N P(O, s_T=q_i|\lambda) = P(O|\lambda) \tag{4-7} i=1NαT(qi)=i=1NP(O,sT=qiλ)=P(Oλ)(4-7)

这不,P(O∣λ)P(O|\lambda)P(Oλ)出现了。

接下来我们的工作就是,看看怎么求这个αt(qi)\alpha_t(q_i)αt(qi)α1(qi)\alpha_1(q_i)α1(qi)我们是知道的

α1(qi)=P(o1,s1=qi∣λ)=P(o1∣s1=qi,λ)P(s1=qi∣λ)\alpha_1(q_i) = P(o_1,s_1=q_i|\lambda)=P(o_1|s_1=q_i, \lambda)P(s_1=q_i|\lambda) α1(qi)=P(o1,s1=qiλ)=P(o1s1=qi,λ)P(s1=qiλ)

看出来了吗?一个是我们的发射概率,一个是我们的初始概率,所以有

α1(qi)=bi(o1)πi(4-8)\alpha_1(q_i) = b_i(o_1) \pi_i \tag{4-8} α1(qi)=bi(o1)πi(4-8)

既然知道了α1(qi)\alpha_1(q_i)α1(qi),那我们如果还能知道αt(qi)\alpha_t(q_i)αt(qi)αt+1(qi)\alpha_{t+1}(q_i)αt+1(qi)的递推公式,这个问题不久解决了吗?我们来试试看!λ\lambdaλ写不写都无所谓,我们心里知道就好,下面就不写了。

αt+1(qi)=P(o1,o2,...,ot+1,st+1=qi)用全概率凑个st出来试试=∑j=1NP(o1,o2,...,ot+1,st=qj,st+1=qi)提ot+1=∑j=1NP(ot+1∣o1,o2,...ot,st=qj,st+1=qi)P(o1,o2,...,ot,st=qj,st+1=qi)利用观测独立假设(3−2)=∑j=1NP(ot+1∣st+1=qi)P(o1,o2,...,ot,st=qj,st+1=qi)提后项的st+1=∑j=1NP(ot+1∣st+1=qi)P(st+1=qi∣o1,o2,...,ot,st=qj)P(o1,o2,...,ot,st=qj)利用齐次Markov假设(3−1)=∑j=1NP(ot+1∣st+1=qi)P(st+1=qi∣st=qj)P(o1,o2,...,ot,st=qj)\begin{aligned} \alpha_{t+1}(q_i) &= P(o_1, o_2, ..., o_{t+1}, s_{t+1}=q_i) \\ &用全概率凑个s_t出来试试\\ &=\sum_{j=1}^N P(o_1, o_2, ..., o_{t+1}, s_t=q_j, s_{t+1}=q_i) \\ &提o_{t+1}\\ &=\sum_{j=1}^N P(o_{t+1}|o_1, o_2, ...o_t, s_t=q_j, s_{t+1}=q_i)P(o_1, o_2, ...,o_t, s_t=q_j, s_{t+1}=q_i)\\ &利用观测独立假设(3-2)\\ &=\sum_{j=1}^N P(o_{t+1}|s_{t+1}=q_i)P(o_1, o_2, ...,o_t, s_t=q_j, s_{t+1}=q_i)\\ &提后项的s_{t+1}\\ &=\sum_{j=1}^N P(o_{t+1}|s_{t+1}=q_i)P(s_{t+1}=q_i|o_1, o_2, ...,o_t, s_t=q_j)P(o_1, o_2, ...,o_t, s_t=q_j)\\ &利用齐次Markov假设(3-1)\\ &=\sum_{j=1}^N P(o_{t+1}|s_{t+1}=q_i)P(s_{t+1}=q_i|s_t=q_j)P(o_1, o_2, ...,o_t, s_t=q_j)\\ \end{aligned} αt+1(qi)=P(o1,o2,...,ot+1,st+1=qi)st=j=1NP(o1,o2,...,ot+1,st=qj,st+1=qi)ot+1=j=1NP(ot+1o1,o2,...ot,st=qj,st+1=qi)P(o1,o2,...,ot,st=qj,st+1=qi)(32)=j=1NP(ot+1st+1=qi)P(o1,o2,...,ot,st=qj,st+1=qi)st+1=j=1NP(ot+1st+1=qi)P(st+1=qio1,o2,...,ot,st=qj)P(o1,o2,...,ot,st=qj)Markov(31)=j=1NP(ot+1st+1=qi)P(st+1=qist=qj)P(o1,o2,...,ot,st=qj)

发现了吗?这三项分别是发射概率,状态转移概率和αt(qj)\alpha_t(q_j)αt(qj)

于是我们就得到了递推式

αt+1(qi)=∑j=1Nbi(ot+1)ajiαt(qj)(4-9)\alpha_{t+1}(q_i) = \sum_{j=1}^N b_i(o_{t+1})a_{ji}\alpha_t(q_j) \tag{4-9} αt+1(qi)=j=1Nbi(ot+1)ajiαt(qj)(4-9)
结合(4−8)(4-8)(48)(4−9)(4-9)(49)我们可以得到所有状态下的αT(qi)\alpha_T(q_i)αT(qi)(4−7)(4-7)(47)得解,此时的复杂度为O((TN)2)O((TN)^2)O((TN)2)

4.2 后向算法(backward algorithm)

如下图4所示,后向算法考虑的就是青绿色方框内变量的联合概率,记作

βt(qi)=P(ot+1,...,oT−1,oT∣st=qi,λ)(4-10)\beta_t(q_i) = P(o_{t+1}, ..., o_{T-1}, o_T | s_t = q_i, \lambda) \tag{4-10} βt(qi)=P(ot+1,...,oT1,oTst=qi,λ)(4-10)

这也是一种设计,和前向的互补。注意看与(4−5)(4-5)(45)的区别,后向的推导相比前向要绕一点。
后向算法示意图

图4 后向算法示意图

我们来看下β1(qi)\beta_1(q_i)β1(qi)是怎么样的

β1(qi)=P(o2,...,oT−1,oT∣s1=qi∣λ)(4-11)\beta_1(q_i) = P(o_2, ..., o_{T-1}, o_T | s_1 = q_i | \lambda) \tag{4-11} β1(qi)=P(o2,...,oT1,oTs1=qiλ)(4-11)

我们来看下这个β1(qi)\beta_1(q_i)β1(qi)和我们要求的P(O∣λ)P(O|\lambda)P(Oλ)有什么关系

P(O∣λ)=P(o1,o2,...,oT∣λ)省略λ,引入s1=∑i=1NP(o1,o2,...,oT,s1=qi)把s1当成条件=∑i=1NP(o1,o2,...,oT∣s1=qi)P(s1=qi)拆出o1,注意后向为初始概率=∑i=1NP(o1∣o2,...,oT,s1=qi)P(o2,...,oT∣s1=qi)πi利用观测独立假设(3−2)=∑i=1NP(o1∣s1=qi)P(o2,...,oT∣s1=qi)πi代入(4−11)和发射概率=∑i=1Nbi(o1)β1(qi)πi(4-12)\begin{aligned} P(O|\lambda) &= P(o_1, o_2, ..., o_T|\lambda) \\ &省略\lambda,引入s_1\\ &=\sum_{i=1}^{N} P(o_1, o_2, ..., o_T, s_1=q_i) \\ & 把s_1当成条件\\ &=\sum_{i=1}^{N} P(o_1, o_2, ..., o_T | s_1=q_i)P(s_1=q_i)\\ &拆出o_1,注意后向为初始概率\\ &=\sum_{i=1}^{N} P(o_1 | o_2, ..., o_T, s_1=q_i)P(o_2, ..., o_T | s_1=q_i)\pi_i\\ &利用观测独立假设(3-2)\\ &=\sum_{i=1}^{N} P(o_1 | s_1=q_i)P(o_2, ..., o_T | s_1=q_i)\pi_i\\ &代入(4-11)和发射概率\\ &=\sum_{i=1}^{N} b_i(o_1)\beta_{1}(q_i)\pi_i \tag{4-12} \end{aligned} P(Oλ)=P(o1,o2,...,oTλ)λs1=i=1NP(o1,o2,...,oT,s1=qi)s1=i=1NP(o1,o2,...,oTs1=qi)P(s1=qi)o1=i=1NP(o1o2,...,oT,s1=qi)P(o2,...,oTs1=qi)πi(32)=i=1NP(o1s1=qi)P(o2,...,oTs1=qi)πi(411)=i=1Nbi(o1)β1(qi)πi(4-12)

这样以来,P(O∣λ)P(O|\lambda)P(Oλ)β1(qi)\beta_1(q_i)β1(qi)的一个关系就找到了,要做的就是来求一下这个β1(qi)\beta_1(q_i)β1(qi)了。

我们令

βT(qi)=1(4-13)\beta_T(q_i) = 1 \tag{4-13} βT(qi)=1(4-13)

然后再来算一下βt(qi)\beta_t(q_i)βt(qi)βt+1(qj)\beta_{t+1}(q_j)βt+1(qj)递推关系,λ\lambdaλ我就直接省略了。

βt(qi)=P(ot+1,...,oT−1,oT∣st=qi)利用全概率引入st+1=∑j=1NP(ot+1,...,oT,st+1=qj∣st=qi)把st+1引到条件当中去=∑j=1NP(ot+1,...,oT∣st+1=qj,st=qi)P(st+1=qj∣st=qi)前项中的ot+1,...,oT只和st+1=qj有关,这个可证,但这里不证后项为状态转移概率=∑j=1NP(ot+1,...,oT∣st+1=qj)aij把ot+1拿出来=∑j=1NP(ot+1∣ot+2,...,oT,st+1=qj)P(ot+2,...,oT∣st+1=qj)aij利用观测独立假设(3−2)=∑j=1NP(ot+1∣st+1=qj)βt+1(qj)aij前项为发射概率=∑j=1Nbj(ot+1)βt+1(qj)aij(4-14)\begin{aligned} \beta_t(q_i) &= P(o_{t+1}, ..., o_{T-1}, o_T | s_t = q_i) \\ &利用全概率引入s_{t+1}\\ &= \sum_{j=1}^{N}P(o_{t+1}, ..., o_T, s_{t+1} = q_j | s_t = q_i) \\ &把s_{t+1}引到条件当中去\\ &=\sum_{j=1}^{N}P(o_{t+1}, ..., o_T | s_{t+1} = q_j, s_t = q_i)P(s_{t+1} = q_j | s_t = q_i)\\ &前项中的o_{t+1}, ..., o_T只和s_{t+1} = q_j有关,这个可证,但这里不证\\ &后项为状态转移概率\\ &=\sum_{j=1}^{N}P(o_{t+1}, ..., o_T | s_{t+1} = q_j)a_{ij}\\ &把o_{t+1}拿出来\\ &=\sum_{j=1}^{N}P(o_{t+1}| o_{t+2},..., o_T, s_{t+1} = q_j)P(o_{t+2}, ..., o_T | s_{t+1} = q_j)a_{ij}\\ &利用观测独立假设(3-2)\\ &=\sum_{j=1}^{N}P(o_{t+1}|s_{t+1} = q_j)\beta_{t+1}(q_j)a_{ij}\\ &前项为发射概率\\ &=\sum_{j=1}^{N}b_j(o_{t+1})\beta_{t+1}(q_j)a_{ij} \end{aligned} \tag{4-14} βt(qi)=P(ot+1,...,oT1,oTst=qi)st+1=j=1NP(ot+1,...,oT,st+1=qjst=qi)st+1=j=1NP(ot+1,...,oTst+1=qj,st=qi)P(st+1=qjst=qi)ot+1,...,oTst+1=qj=j=1NP(ot+1,...,oTst+1=qj)aijot+1=j=1NP(ot+1ot+2,...,oT,st+1=qj)P(ot+2,...,oTst+1=qj)aij(32)=j=1NP(ot+1st+1=qj)βt+1(qj)aij=j=1Nbj(ot+1)βt+1(qj)aij(4-14)

结合(4−13)(4-13)(413)(4−14)(4-14)(414),我们就可以求得β1(qi)\beta_1(q_i)β1(qi),也就可以求得P(O∣λ)P(O|\lambda)P(Oλ)

值得注意的是,在任意时刻ttt,我们结合前向和后向算法,都可以有

P(O∣λ)=∑i=1Nαt(qi)βt(qi)(4-15)P(O|\lambda) = \sum_{i=1}^N \alpha_t(q_i)\beta_t(q_i) \tag{4-15} P(Oλ)=i=1Nαt(qi)βt(qi)(4-15)

这个这里简单说下,这个会依赖于一个不靠谱的假设,就是o1,...,oto_1,...,o_to1,...,otot+1,...,oTo_{t+1},...,o_{T}ot+1,...,oT是不相关的。

P(O∣λ)=∑i=1NP(O,st=qi∣λ)=∑i=1NP(o1,...,ot,ot+1,..,oT,st=qi∣λ)=∑i=1NP(o1,...,ot,st=qi∣λ)P(ot+1,..,oT∣o1,...,ot,st=qi)前项为αt(qi),后向依赖于假设忽略o1,...,ot就是βt(qi)=∑i=1Nαt(qi)βt(qi)\begin{aligned} P(O|\lambda) &= \sum_{i=1}^N P(O, s_t=q_i|\lambda) \\ &= \sum_{i=1}^N P(o_1,...,o_t, o_{t+1}, .., o_T, s_t=q_i|\lambda) \\ &= \sum_{i=1}^N P(o_1,...,o_t, s_t=q_i|\lambda)P(o_{t+1}, .., o_T | o_1,...,o_t, s_t=q_i)\\ &前项为\alpha_t(q_i),后向依赖于假设忽略o_1,...,o_t就是\beta_t(q_i)\\ &=\sum_{i=1}^N \alpha_t(q_i)\beta_t(q_i) \end{aligned} P(Oλ)=i=1NP(O,st=qiλ)=i=1NP(o1,...,ot,ot+1,..,oT,st=qiλ)=i=1NP(o1,...,ot,st=qiλ)P(ot+1,..,oTo1,...,ot,st=qi)αt(qi)o1,...,otβt(qi)=i=1Nαt(qi)βt(qi)

虽然这个假设不靠谱,但是为了简化计算,都是这么做的。

5 Learning

Learning要做的一件事情就是,在给定了观测序列之后,找到得到该观测序列概率最大的那组参数λ\lambdaλ,即

λMLE=argmax⁡λP(O∣λ)(5-1)\lambda_{MLE} = arg\max_{\lambda}P(O|\lambda) \tag{5-1} λMLE=argλmaxP(Oλ)(5-1)

这里的MLE就是Max Likelyhood Estimation。

讲道理,如果能够把导数的表达式求出来的话,这个λMLE\lambda_{MLE}λMLE一下子就出来了,但这里的P(O∣λ)P(O|\lambda)P(Oλ)一般都是混合高斯函数,没法直接求导,所以就需要用到EM算法了。

这篇不讲EM算法是什么,我们直接使用EM算法,想知道EM算法是什么的话,推荐看徐亦达老师的EM算法讲解。一句话概括就是,本来没法直接求导的,我们添加了一个隐变量,变成去求另一个方程的导数,这个方程求导相对简单,但是没法一步到位,需要不断迭代,逐渐逼近局部最优点。

EM算法的迭代公式为

θ(t+1)=argmax⁡θ∫zlogP(x,z∣θ)P(z∣x,θ(t))dz(5-2)\theta^{(t+1)} = arg\max_{\theta} \int_{z}log P(x,z|\theta)P(z|x, \theta^{(t)})dz \tag{5-2} θ(t+1)=argθmaxzlogP(x,zθ)P(zx,θ(t))dz(5-2)

这里的θ\thetaθ就是我们的模型参数λ\lambdaλxxx就是我们的观测变量OOOzzz就是我们的状态变量SSS,我们这里的SSS是离散的,积分变累加。我们来改写一下(5−2)(5-2)(52)就有

λ(t+1)=argmax⁡λ∑allSlogP(O,S∣λ)P(S∣O,λ(t))(5-3)\lambda^{(t+1)} = arg\max_{\lambda} \sum_{all\ S}log P(O,S|\lambda)P(S|O, \lambda^{(t)}) \tag{5-3} λ(t+1)=argλmaxall SlogP(O,Sλ)P(SO,λ(t))(5-3)

我们这里再对P(S∣O,λ(t))P(S|O,\lambda^{(t)})P(SO,λ(t))做一个小的改动

P(S∣O,λ(t))=P(S,O∣λ(t))P(O∣λ(t))P(S|O,\lambda^{(t)}) = \frac{P(S,O|\lambda^{(t)})}{P(O|\lambda^{(t)})} P(SO,λ(t))=P(Oλ(t))P(S,Oλ(t))

这里的λ(t)\lambda^{(t)}λ(t)是一个常数,OOO又是和λ\lambdaλ无关的,所以P(O∣λ(t))P(O|\lambda^{(t)})P(Oλ(t))这项是个常数,可以忽略。故把(5−3)(5-3)(53)改为

λ(t+1)=argmax⁡λ∑allSlogP(O,S∣λ)P(O,S∣λ(t))(5-4)\lambda^{(t+1)} = arg\max_{\lambda} \sum_{all\ S}log P(O,S|\lambda)P(O, S|\lambda^{(t)}) \tag{5-4} λ(t+1)=argλmaxall SlogP(O,Sλ)P(O,Sλ(t))(5-4)

实际操作时,就是不断迭代(5−4)(5-4)(54)。但看到这里,这个argmax还是不会求呀。这个其实也挺复杂的,下面会以求初始概率参数π\piπ为例,简单说明下,其他的就不求了,太复杂了,吃不消。

我们定义

Q(λ,λ(t))=∑allSlogP(O,S∣λ)P(O,S∣λ(t))(5-5)Q(\lambda, \lambda^{(t)}) = \sum_{all\ S} log P(O,S|\lambda)P(O, S|\lambda^{(t)}) \tag{5-5} Q(λ,λ(t))=all SlogP(O,Sλ)P(O,Sλ(t))(5-5)

我们把式(4−4)(4-4)(44)代进来看下

Q(λ,λ(t))=∑s1=q1qN...∑sT=q1qNlog(∏t=1Tbst(ot)∏t=1T−1ast,st+1πs1)P(O,S∣λ(t))=∑s1=q1qN...∑sT=q1qN(logπs1+∑t=1Tlogbst(ot)+∑t=1T−1logast,st+1)P(O,S∣λ(t))\begin{aligned} Q(\lambda, \lambda^{(t)}) &= \sum_{s_1=q_1}^{q_N}...\sum_{s_T=q_1}^{q_N}log(\prod_{t=1}^{T}b_{s_t}(o_t)\prod_{t=1}^{T-1} a_{s_t, s_{t+1}} \pi_{s_1})P(O, S|\lambda^{(t)})\\ &=\sum_{s_1=q_1}^{q_N}...\sum_{s_T=q_1}^{q_N}(log\pi_{s_1} + \sum_{t=1}^T logb_{s_t}(o_t) + \sum_{t=1}^{T-1}loga_{s_t,s_{t+1}})P(O, S|\lambda^{(t)}) \end{aligned} Q(λ,λ(t))=s1=q1qN...sT=q1qNlog(t=1Tbst(ot)t=1T1ast,st+1πs1)P(O,Sλ(t))=s1=q1qN...sT=q1qN(logπs1+t=1Tlogbst(ot)+t=1T1logast,st+1)P(O,Sλ(t))

好,我们令第ttt次迭代过程中,初始概率的参数为π(t)\pi^{(t)}π(t),那么

π(t+1)=argmax⁡πQ(λ,λ(t))过滤掉和π无关的变量=argmax⁡π∑s1=q1qN...∑sT=q1qNlogπs1P(O,s1,...,sT∣λ(t))和s1无关的状态变量用全概率去掉=argmax⁡π∑s1=q1qNlogπs1P(O,s1∣λ(t))(5-6)\begin{aligned} \pi^{(t+1)} &= arg\max_{\pi}Q(\lambda, \lambda^{(t)})\\ &过滤掉和\pi无关的变量\\ &=arg\max_{\pi} \sum_{s_1=q_1}^{q_N}...\sum_{s_T=q_1}^{q_N}log\pi_{s_1}P(O, s_1,...,s_T|\lambda^{(t)})\\ &和s_1无关的状态变量用全概率去掉\\ &=arg\max_{\pi} \sum_{s_1=q_1}^{q_N}log\pi_{s_1}P(O, s_1|\lambda^{(t)})\\ \end{aligned} \tag{5-6} π(t+1)=argπmaxQ(λ,λ(t))π=argπmaxs1=q1qN...sT=q1qNlogπs1P(O,s1,...,sTλ(t))s1=argπmaxs1=q1qNlogπs1P(O,s1λ(t))(5-6)

这样一来,我们就方便去求导了。不过这里别忘了有一个约束条件,就是
s.t.∑s1=q1qNπs1=1(5-7)s.t. \sum_{s_1=q_1}^{q_N}\pi_{s_1} = 1 \tag{5-7} s.t.s1=q1qNπs1=1(5-7)

有约束求极值,拉格朗日乘子法来也。令

L(πs1,η)=∑s1=q1qN(logπs1P(O,s1∣λ(t)))+η(∑s1=q1qNπs1−1)(5-8)L(\pi_{s_1}, \eta) = \sum_{s_1=q_1}^{q_N}(log\pi_{s_1}P(O, s_1|\lambda^{(t)})) + \eta (\sum_{s_1=q_1}^{q_N}\pi_{s_1} - 1) \tag{5-8} L(πs1,η)=s1=q1qN(logπs1P(O,s1λ(t)))+η(s1=q1qNπs11)(5-8)

(5−8)(5-8)(58)进行求偏导,有
∂L∂πs1=1πs1P(O,s1∣λ(t)))+η(5-9)\frac{\partial L}{\partial \pi_{s_1}} = \frac{1}{\pi_{s_1}}P(O, s_1|\lambda^{(t)})) + \eta \tag{5-9} πs1L=πs11P(O,s1λ(t)))+η(5-9)

令偏导等于0,有

P(O,s1∣λ(t)))+πs1(t+1)η=0(5-10)P(O, s_1|\lambda^{(t)})) + \pi_{s_1}^{(t+1)}\eta = 0 \tag{5-10} P(O,s1λ(t)))+πs1(t+1)η=0(5-10)

对所有的状态变量求和,有

∑s1=q1qN(P(O,s1∣λ(t))+πs1(t+1)η)=0\sum_{s_1=q_1}^{q_N} (P(O, s_1|\lambda^{(t)}) + \pi_{s_1}^{(t+1)}\eta) = 0 s1=q1qN(P(O,s1λ(t))+πs1(t+1)η)=0

故有

P(O∣λ(t))+η=0P(O|\lambda^{(t)}) + \eta = 0 P(Oλ(t))+η=0


η=−P(O∣λ(t))(5-11)\eta = -P(O|\lambda^{(t)}) \tag{5-11} η=P(Oλ(t))(5-11)

(5−11)(5-11)(511)代入到(5−12)(5-12)(512)

πs1(t+1)=P(O,s1∣λ(t))P(O∣λ(t))(5-12)\pi_{s_1}^{(t+1)} =\frac{P(O, s_1|\lambda^{(t)})}{P(O|\lambda^{(t)})} \tag{5-12} πs1(t+1)=P(Oλ(t))P(O,s1λ(t))(5-12)

终于求出来了,其他的参数用类似的方法求即可,不过会复杂一些。

6 Decoding

Decoding要解决的问题是

S^=argmax⁡SP(S∣O,λ)(6-1)\hat{S} = arg\max_{S}P(S|O, \lambda) \tag{6-1} S^=argSmaxP(SO,λ)(6-1)

翻译过来就是,给定了模型参数,对应的状态变量序列最优可能是哪一组。

由于P(O∣λ)P(O|\lambda)P(Oλ)是已经观测到的变量,我们也可以认为(6−1)(6-1)(61)等价于

S^=argmax⁡SP(S∣O,λ)P(O∣λ)=argmax⁡SP(S,O∣λ)(6-2)\hat{S} = arg\max_{S}P(S|O, \lambda)P(O|\lambda) = arg\max_{S}P(S, O| \lambda) \tag{6-2} S^=argSmaxP(SO,λ)P(Oλ)=argSmaxP(S,Oλ)(6-2)

我们画个图看下

decoding示意图

图5 decoding示意图

看图一下子就明白了,我们的每time step的状态变量都有NNN个状态,我们在每个time step选择一个状态变量,形成一条路径,使得经过整条路径的联合概率最大。

这里一共有NTN^TNT条路径,如果把每条路径的概率都算一遍,再取找概率最大的那条,时间复杂度就太高了。因此,我们用动态规划的思路去求解这个问题,也叫做Viterbi algorithm。

我们令

δt(qi)=max⁡s1,...,st−1P(o1,...,ot,s1,...,st−1,st=qi∣λ)(6-3)\delta_t(q_i)=\max_{s_1, ..., s_{t-1}}P(o_1,...,o_t, s_1, ..., s_{t-1}, s_t=q_i | \lambda) \tag{6-3} δt(qi)=s1,...,st1maxP(o1,...,ot,s1,...,st1,st=qiλ)(6-3)

翻译一下就是,当ttt时刻的状态取qiq_iqi时,使得到ttt时刻为止的联合概率最大的状态路径[s1,...,st−1][s_1, ..., s_{t-1}][s1,...,st1]δt(qi)\delta_t(q_i)δt(qi)

我们来看下δt+1(qj)\delta_{t+1}(q_j)δt+1(qj)时刻和δt(qi)\delta_t(q_i)δt(qi)的关系

δt+1(qj)=max⁡s1,...,stP(o1,...,ot+1,s1,...,st,st+1=qj∣λ)遍历t时刻所有的δt(qi)=max⁡1≤i≤Nδt(qi)aijbj(ot+1)(6-4)\begin{aligned} \delta_{t+1}(q_j) &= \max_{s_1, ..., s_{t}}P(o_1,...,o_{t+1}, s_1, ..., s_{t}, s_{t+1}=q_j | \lambda)\\ &遍历t时刻所有的\delta_t{}(q_i)\\ &=\max_{1\leq i \leq N}\delta_{t}(q_i)a_{ij}b_j(o_{t+1}) \end{aligned} \tag{6-4} δt+1(qj)=s1,...,stmaxP(o1,...,ot+1,s1,...,st,st+1=qjλ)tδt(qi)=1iNmaxδt(qi)aijbj(ot+1)(6-4)

这就是递推式了。用这个递推式,把所有的δt(qi)\delta_t(q_i)δt(qi)算出来。

同时我们也要定义一个记录到每个time step的各个状态的最优的前一个状态

ψt(j)=argmax⁡iδt(qi)aij(6-5)\psi_t(j) = arg\max_{i}\delta_t(q_i)a_{ij} \tag{6-5} ψt(j)=argimaxδt(qi)aij(6-5)

这个(6−5)(6-5)(65)是用来回溯路径的,这个学过动态规划的就再熟悉不过了。

最终我们会在最后一个time step找到是的概率最大的那个状态,记作

qT∗=argmax⁡i(δT(qi))(6-6)q_T^* = arg\max_{i}(\delta_T(q_i)) \tag{6-6} qT=argimax(δT(qi))(6-6)

然后用(6−5)(6-5)(65)不断回溯就行了。

参考资料

[1] 机器学习-白板推导系列(十四)-隐马尔可夫模型HMM

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

书店售书最低价格问题

书店针对《哈利波特》系列书籍进行促销活动,一共5卷,用编号0、1、2、3、4表示,单独一卷售价8元, 具体折扣如下所示:本数 折扣 2 5% 3 10% 4 …

十七、PHP框架Laravel学习笔记——模型的定义

一.默认设置 框架可以使用 Eloquent ORM 进行数据库交互,也就是关系对象模型; 在数据库入门阶段,我们已经创建了一个 User.php 模型,如下: php artisan make:model Http/Models/User //默认在 app 目录 …

centos 启动一个redis_基于prometheus+grafana体系监控redis缓存服务

概述前面已经介绍了怎么用prometheus监控mysql数据库,今天主要分享下怎么去监控redis服务。由于没有redis环境,所以用docker模拟了一下。一、Docker部署1、下载sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.…

十八、PHP框架Laravel学习笔记——模型的增删改

一.增删改操作 新增方法如下,注意:默认模型接管 created_at 和 updated_at; $users new User(); $users->username 辉夜; $users->password 123; $users->email huiye163.com; $users->details 123; $use…

搞懂语音去噪

文章目录1 概述2 传统语音去噪2.1 谱减法2.2 维纳滤波法3 深度语音去噪参考资料1 概述 语音去噪(noise reduction)又被称为语音增强(speech enhancement),主要是针对于有人声的音频进行处理,目的是去除那些背景噪声,增强音频中人声的可懂性(…

软件架构设计案例_透过现象看本质:常见的前端架构风格和案例

所谓软件架构风格,是指描述某个特定应用领域中系统组织方式的惯用模式。架构风格定义一个词汇表和一组约束,词汇表中包含一些组件及连接器,约束则指出系统如何将构建和连接器组合起来。软件架构风格反映了领域中众多系统所共有的结构和语义特…

十九、PHP框架Laravel学习笔记——批量赋值和软删除

一.批量赋值 上一节增删改中,新增中我们发现需要进行批量赋值的许可;一般情况下,是为了防止提交过来的字段在部分场景中不需要或不能;所以,我们需要通过黑白名单机制进行过滤掉必要的字段; //通…

speech production model

文章目录1 概述2 source model3 filter model4 小结参考资料1 概述 本文的目的是为了厘清在speech production model中source model和filter model所扮演的角色,不涉及具体公式的推导或者模型的建立,只是为了把这两个model在干什么事情说明白。文中用到…

二十、PHP框架Laravel学习笔记——模型的作用域

一.本地作用域 很多情况下,我们在数据查找时有一部分条件会被重复且大量使用;而这个条件,可能只是在这个模型对应的数据表使用,别的表并不使用;那么这种情况,可以使用本地作用域的方式&#xf…

论文阅读 - Joint Beat and Downbeat Tracking with Recurrent Neural Networks

文章目录1 概述2 信号预处理3 分类神经网络4 动态贝叶斯网络(HMM)4.1 原始的bar pointer model4.2 原始的bar pointer model的缺点4.3 改进后的模型5 预测参考资料1 概述 最近在做音乐卡点相关的项目,需要对音乐的基本特征进行理解&#xff…

二十一、PHP框架Laravel学习笔记——模型的访问器和修改器

一.访问器 访问器:就是在获取数据列表时,拦截属性并对属性进行修改的过程;比如,我们在输出性别时,在性别左右加上括号,或给邮件转换为大写; //访问器,前固定 get&#…

python将txt转json_Python控制乐高EV3,以及VSCODE环境配置

乐高EV3的可扩展性很强,但如何用pc连接ev3,并用python代码来控制EV3,资料太少了,试着做了一次,记录在这里。需要的硬/软件硬件准备一、乐高EV3二、PC,win10系统三、TF卡(我用的是64G的&#xff…

移动文件读/写指针----lseek

头文件&#xff1a;#include<sys/types.h>、#include<unistd.h> 函数原型&#xff1a;off_t lseek(int fildes,off_t offset,int whence) 参数说明&#xff1a;fildes:文件描述符 offset:偏移量&#xff0c;正数表示正向偏移&#xff0c;负数表示负向偏移。 whence…

Yolo系列知识点梳理(Yolov1-v5)

文章目录1 概述2 Yolo系列模型2.1 基石 - Yolov12.1.1 Yolov1的网络结构2.1.2 Yolov1的feature map2.1.3 Yolov1的训练2.1.4 Yolov1的预测2.1.5 Yolov1小结2.2 Yolo9000 - Yolov22.2.1 Better2.2.1.1 引入了Batch normalization2.2.1.2 高分辨率的分类器2.2.1.3 加入了anchor机…

二十二、PHP框架Laravel学习笔记——集合的使用

一&#xff0e;创建集合 什么是集合&#xff1f;即&#xff1a;它是一种更具读取性和处理能力的数组封装&#xff1b;比如&#xff0c;我们从数据库得到的数据列表&#xff0c;它就是一种集合&#xff1b;数据集合&#xff0c;提供了大量的方法方便我们进行各种操作&#xff1…

二十三、PHP框架Laravel学习笔记——集合的常用方法

一&#xff0e;常用方法 all()方法&#xff0c;转换为属性形式输出&#xff0c;使用 dd 方法看类型&#xff1b; $collection collect([1, 2, 2, 3, 4, 4, 4]); dd($collection->all()); PS&#xff1a;$collection->dd()方法可以以 dd()模式输出&#xff0c;还有 du…

mac看图软件哪个好用_细数Mac上那些好用且免费的软件(三)

许多朋友购买了Mac电脑之后发现很多软件都没有&#xff0c;而且苹果商店好多软件都是收费的。那有没有免费的软件也能满足日常的需求呢&#xff1f;macw小编就为大家推荐一些免费且超级好用的软件&#xff0c;赶快来看看有没有你需要的吧&#xff01;细数Mac上那些好用且免费的…

图像表格实线和虚线检测

文章目录1 背景简述2 camelot中的方法2.1 二值化2.2 腐蚀膨胀2.3 轮廓检测2.4 结果展示3 基于霍夫直线检测的方法3.1 霍夫直线检测原理3.2 概率霍夫直线检测3.3 霍夫直线应用参考资料1 背景简述 图像中的表格结构化是一个比较热门的话题&#xff0c;其输入是一张图片&#xff…

二十四、PHP框架Laravel学习笔记——模型的数据集合

一&#xff0e;数据集合 数据集合&#xff0c;就是已经将模型方法 get()获取到的数据再进行处理&#xff1b;比如&#xff1a;map()方法&#xff0c;通过它可以实现类似访问器一样对字段进行处理的效果&#xff1b; $users User::get(); //使用集合方法 map 可以对输出的字…

论文阅读 - AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder Loss

文章目录1 概述2 模型架构3 模块解析3.1 获取梅尔频谱3.2 speaker encoder3.3 AutoVC3.4 Vocoder4 关键部分参考资料1 概述 voice conversion这个任务的目标是输入两个音频&#xff0c;其输入是两段音频&#xff0c;一段音频称为content_audio&#xff0c;另一段称为speaker_a…