文章目录
- 1 概述
- 2 符号说明
- 3 两点假设
- 4 Evaluation
- 4.1 前向算法(forward algorithm)
- 4.2 后向算法(backward algorithm)
- 5 Learning
- 6 Decoding
- 参考资料
1 概述
本文是B站上机器学习-白板推导系列(十四)-隐马尔可夫模型HMM的学习笔记,UP主讲得实在是太清楚了,赶紧记录下来,以防之后忘记。
某些细节上根据个人理解做了改动。
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,...,sT−1,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,...,oT−1,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=qj∣st−1=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(ot∣st=qj)。
λ=(π,a,b)\lambda = (\pi, a, b)λ=(π,a,b)表示模型中所有的可学习的参数。
有了符号的图1就变成了
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+1∣s1,s2,...,st,o1,o2,...,ot)=P(st+1∣st)(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(ot∣s1,s2,...,st,o1,o2,...,ot−1)=P(ot∣st)(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 S∑P(S,O∣λ)=all S∑P(O∣S,λ)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(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=1∏T−1ast,st+1πs1(4-2)
接着我们再把P(O∣S,λ)P(O|S, \lambda)P(O∣S,λ)展开看下
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(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=1∏Tbst(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 S∑t=1∏Tbst(ot)t=1∏T−1ast,st+1πs1把all S展开=s1=q1∑qNs2=q1∑qN...sT=q1∑qNt=1∏Tbst(ot)t=1∏T−1ast,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)(4−5),那我还真答不上来,这是一种设计,如果有其他的设计应该也可以。
我们来看看α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=1∑NαT(qi)=i=1∑NP(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(o1∣s1=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=1∑NP(o1,o2,...,ot+1,st=qj,st+1=qi)提ot+1=j=1∑NP(ot+1∣o1,o2,...ot,st=qj,st+1=qi)P(o1,o2,...,ot,st=qj,st+1=qi)利用观测独立假设(3−2)=j=1∑NP(ot+1∣st+1=qi)P(o1,o2,...,ot,st=qj,st+1=qi)提后项的st+1=j=1∑NP(ot+1∣st+1=qi)P(st+1=qi∣o1,o2,...,ot,st=qj)P(o1,o2,...,ot,st=qj)利用齐次Markov假设(3−1)=j=1∑NP(ot+1∣st+1=qi)P(st+1=qi∣st=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=1∑Nbi(ot+1)ajiαt(qj)(4-9)
结合(4−8)(4-8)(4−8)和(4−9)(4-9)(4−9)我们可以得到所有状态下的αT(qi)\alpha_T(q_i)αT(qi),(4−7)(4-7)(4−7)得解,此时的复杂度为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,...,oT−1,oT∣st=qi,λ)(4-10)
这也是一种设计,和前向的互补。注意看与(4−5)(4-5)(4−5)的区别,后向的推导相比前向要绕一点。
我们来看下β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,...,oT−1,oT∣s1=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=1∑NP(o1,o2,...,oT,s1=qi)把s1当成条件=i=1∑NP(o1,o2,...,oT∣s1=qi)P(s1=qi)拆出o1,注意后向为初始概率=i=1∑NP(o1∣o2,...,oT,s1=qi)P(o2,...,oT∣s1=qi)πi利用观测独立假设(3−2)=i=1∑NP(o1∣s1=qi)P(o2,...,oT∣s1=qi)πi代入(4−11)和发射概率=i=1∑Nbi(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,...,oT−1,oT∣st=qi)利用全概率引入st+1=j=1∑NP(ot+1,...,oT,st+1=qj∣st=qi)把st+1引到条件当中去=j=1∑NP(ot+1,...,oT∣st+1=qj,st=qi)P(st+1=qj∣st=qi)前项中的ot+1,...,oT只和st+1=qj有关,这个可证,但这里不证后项为状态转移概率=j=1∑NP(ot+1,...,oT∣st+1=qj)aij把ot+1拿出来=j=1∑NP(ot+1∣ot+2,...,oT,st+1=qj)P(ot+2,...,oT∣st+1=qj)aij利用观测独立假设(3−2)=j=1∑NP(ot+1∣st+1=qj)βt+1(qj)aij前项为发射概率=j=1∑Nbj(ot+1)βt+1(qj)aij(4-14)
结合(4−13)(4-13)(4−13)和(4−14)(4-14)(4−14),我们就可以求得β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=1∑Nαt(qi)βt(qi)(4-15)
这个这里简单说下,这个会依赖于一个不靠谱的假设,就是o1,...,oto_1,...,o_to1,...,ot和ot+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=1∑NP(O,st=qi∣λ)=i=1∑NP(o1,...,ot,ot+1,..,oT,st=qi∣λ)=i=1∑NP(o1,...,ot,st=qi∣λ)P(ot+1,..,oT∣o1,...,ot,st=qi)前项为αt(qi),后向依赖于假设忽略o1,...,ot就是βt(qi)=i=1∑Nα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θmax∫zlogP(x,z∣θ)P(z∣x,θ(t))dz(5-2)
这里的θ\thetaθ就是我们的模型参数λ\lambdaλ,xxx就是我们的观测变量OOO,zzz就是我们的状态变量SSS,我们这里的SSS是离散的,积分变累加。我们来改写一下(5−2)(5-2)(5−2)就有
λ(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 S∑logP(O,S∣λ)P(S∣O,λ(t))(5-3)
我们这里再对P(S∣O,λ(t))P(S|O,\lambda^{(t)})P(S∣O,λ(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(S∣O,λ(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)(5−3)改为
λ(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 S∑logP(O,S∣λ)P(O,S∣λ(t))(5-4)
实际操作时,就是不断迭代(5−4)(5-4)(5−4)。但看到这里,这个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 S∑logP(O,S∣λ)P(O,S∣λ(t))(5-5)
我们把式(4−4)(4-4)(4−4)代进来看下
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=q1∑qN...sT=q1∑qNlog(t=1∏Tbst(ot)t=1∏T−1ast,st+1πs1)P(O,S∣λ(t))=s1=q1∑qN...sT=q1∑qN(logπs1+t=1∑Tlogbst(ot)+t=1∑T−1logast,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=q1∑qN...sT=q1∑qNlogπs1P(O,s1,...,sT∣λ(t))和s1无关的状态变量用全概率去掉=argπmaxs1=q1∑qNlogπ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=q1∑qNπ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=q1∑qN(logπs1P(O,s1∣λ(t)))+η(s1=q1∑qNπs1−1)(5-8)
对(5−8)(5-8)(5−8)进行求偏导,有
∂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} ∂πs1∂L=π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=q1∑qN(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)(5−11)代入到(5−12)(5-12)(5−12)有
π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^=argmaxSP(S∣O,λ)(6-1)\hat{S} = arg\max_{S}P(S|O, \lambda) \tag{6-1} S^=argSmaxP(S∣O,λ)(6-1)
翻译过来就是,给定了模型参数,对应的状态变量序列最优可能是哪一组。
由于P(O∣λ)P(O|\lambda)P(O∣λ)是已经观测到的变量,我们也可以认为(6−1)(6-1)(6−1)等价于
S^=argmaxSP(S∣O,λ)P(O∣λ)=argmaxSP(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(S∣O,λ)P(O∣λ)=argSmaxP(S,O∣λ)(6-2)
我们画个图看下
看图一下子就明白了,我们的每time step的状态变量都有NNN个状态,我们在每个time step选择一个状态变量,形成一条路径,使得经过整条路径的联合概率最大。
这里一共有NTN^TNT条路径,如果把每条路径的概率都算一遍,再取找概率最大的那条,时间复杂度就太高了。因此,我们用动态规划的思路去求解这个问题,也叫做Viterbi algorithm。
我们令
δt(qi)=maxs1,...,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,...,st−1maxP(o1,...,ot,s1,...,st−1,st=qi∣λ)(6-3)
翻译一下就是,当ttt时刻的状态取qiq_iqi时,使得到ttt时刻为止的联合概率最大的状态路径[s1,...,st−1][s_1, ..., s_{t-1}][s1,...,st−1]为δ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)=maxs1,...,stP(o1,...,ot+1,s1,...,st,st+1=qj∣λ)遍历t时刻所有的δt(qi)=max1≤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)=1≤i≤Nmaxδt(qi)aijbj(ot+1)(6-4)
这就是递推式了。用这个递推式,把所有的δt(qi)\delta_t(q_i)δt(qi)算出来。
同时我们也要定义一个记录到每个time step的各个状态的最优的前一个状态
ψt(j)=argmaxiδ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)(6−5)是用来回溯路径的,这个学过动态规划的就再熟悉不过了。
最终我们会在最后一个time step找到是的概率最大的那个状态,记作
qT∗=argmaxi(δ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)(6−5)不断回溯就行了。
参考资料
[1] 机器学习-白板推导系列(十四)-隐马尔可夫模型HMM