隐马尔可夫模型(HMM)是一种标注模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型。其在语音识别,自然语言处理,模式识别等领域有着广泛的应用。
1.基本概念
友好起见,我们以例子来导出马尔可夫的定义
- 盒子与球模型
设有4个盒子,每个盒子里装有红白两种颜色的球。该模型抽取过程定义如下:先等概率选择一个盒子,从中抽取一次得到一个观测结果,然后换盒子,并且换盒子的过程中服从一些概率,比如1号盒子到2、3、4号的概率分别为0.1、0.4、0.5。2号盒子到1、2、3、4号的概率分别为0.3、0.2、0.1、0.4。假设抽取了5次,结果为“红,白,白,红,红”。
总共抽取了5次,那么得到一个时间长度为5的观测序列,这里”红,白,白,红,红“便是最终的观测序列,其中每次抽取是在不同的盒子中进行的,这5次选择的盒子构成了一个状态随机序列,表示是在什么状态下抽取的。注意模型开始假设是等概率选择一个盒子,这个概率叫初始状态概率(pi)。
设所有可能的状态Q有N种,可能的V观测有M种,为了公式表达方便, 用 (q=i) 表示状态为第(i) 个状态, (q_t=i)表示在 (t) 时刻的状态是第 (i) 个状态,(y_t) 表示第 (t)个时刻的观测。
其中每个状态(当前盒子)都有转移到另一个状态的概率,这些概率可以方便的用矩阵表示,并且这个矩阵一定是方阵,
[A=[a_{ij} ] _ {N*N}
]
其中,
[a_{ij} = P(q_{(t+1)} =j|q_t = i), i=1,2,...,N;j=1,2,...,
]
表示在时刻 t 处于状态 i 的条件下在下一时刻 t+1 转移到状态 j 的概率。
除了状态转移矩阵,要知道还有每个状态下各个观测事件发生的概率,因此也用矩阵B将其表示
[B = [b_j(k)]_{N*M}
]
其中
[b_j(k) = P(y_t = v_k|q_t = j)
]
表示在状态 (j) 下生成观测(v_k)的概率。
(pi)表示初始状态概率向量
[pi = (pi_i) ,
]
其中,(pi = P(q_1 =i)),表示(t = 1)时刻处于状态 (i) 的概率。
状态转移概率矩阵A,观测概率矩阵B和初始状态概率(pi)构成了隐马尔可夫模型的三要素,常用三元符表示隐马尔可夫模型的参数
[lambda = (A,B,pi)
]
1.1 两个重要假设
隐马尔可夫模型有两个非常重要的假设,后面简化算法的推导都是基于这两个假设
- 齐次马尔可夫性假设
即假设隐马尔可夫链在任意时刻(t)的状态只依赖与前一时刻的状态,与其他时刻的装态和观测值无关,也与(t)时刻无关,即得概率简化公式如下
[P(q_t|y_1,y_2,...,y_{t-1},q_1,q_2,...,q_{t-1})= P(q_t|q_{t-1})
]
- 观测独立性假设
即假设任意时刻的观测只依赖于当前时刻马尔可夫链的状态,而与其他观测和状态无关
[P(y_t|y_1,y_2,...,y_{t-1},q_1,q_2,...,q_t) = P(y_t|q_t)
]
总结一下隐马尔可夫的过程,那么假设(lambda)的参数已知,生成一个长度为T的时间序列的过程如下:
(1) 按照初始状态概率(pi)产生一个状态(q_1)。
(2)令 t = 1
(3)按照状态(q_t)的观测概率矩阵B生成(y_t)。
(4)安装状态(q_t)的状态转移矩阵A产生下一个时刻的状态。
(5)(t= t +1), 如果(t < T),转至(3),否则结束。
大致明白隐马尔可夫模型是什么之后我们需要考虑它是干嘛的,能做什么。事实上隐马尔可夫模型有三个基本问题,解决这三个基本问题的过程也就是解决不同问题的过程,同时其问题描述也很明确,相信看完问题描述之后便对它能做什么有大致的了解。
- 隐马尔可夫的三个基本问题
(1) 概率计算问题。给定隐马尔可夫模型的参数(lambda=(A,B,pi))和观测序列(Y=(y_1,y_2,...,y_t)),计算在该模型下观测 序列(Y)出现的概率(P(Y|lambda))。
(2) 学习问题。已知观测序列(Y= (y_1,y_2,...,y_t)),估计模型的参数(lambda=(A,B,pi)),使得该模型下的该观测序列发生的概率(P(Y|lambda))最大,即极大似然估计该模型参数。
(3) 预测问题,也称为解码(decoding)问题。已知模型(lambda=(A,B,pi))和观测序列(Y=(y_1,y_2,...,y_t)),求使给定序列条件下状态序列的概率(P(Q|Y))最大的状态序列,即给定观测序列,求最有可能生成该观测序列的状态序列。
后面继续讨论如何计算这些问题以及如何简化这些问题。
2. (P(Y|lambda))概率计算问题
本问题可以通过前向和后向算法进行计算,不过先来看看该问题的直接解法,以及该方法为什么不可行。前面已经说过隐马尔可夫有两个基本假设,其计算基本都是基于它们来化简的,先考虑其基本用法,即一个观测序列可以如何简化表达,以三个观测序列为例(P(y_1,y_2,y_3)),其中共有K个状态
[egin{aligned}
P(y_1,y_2,y_3) = & sum_{q_3}^Ksum_{q_2}^Ksum_{q_1}^KP(y_1,y_2,y_3,q_1,q_2,q_3)\
= &sum_{q_3}^Ksum_{q_2}^Ksum_{q_1}^KP(y_3|y_1,y_2,q_1,q_2,q_3)cdot P(y_1,y_2,q_1,q_2,q_3)\
= &sum_{q_3}^Ksum_{q_2}^Ksum_{q_1}^KP(y_3|q_3)cdot P(q_3|y_1,y_2,q_1,q_2)cdot P(y_1,y_2,q_1,q_2)\
=& sum_{q_3}^Ksum_{q_2}^Ksum_{q_1}^KP(y_3|q_3) cdot P(q_3|q_2) cdot P(y_1,y_2,q_1,q_2)\
& cdots cdots\
=& sum_{q_3}^Ksum_{q_2}^Ksum_{q_1}^KP(y_3|q_3) cdot P(q_3|q_2) cdot P(y_2|q_2)cdot P(q_2|q_1) cdot P(y_1|q_1) cdot P(q_1)\
=& sum_{q_3}^Ksum_{q_2}^Ksum_{q_1}^KP(y_3|q_3) cdot P(q_3|q_2) cdot P(y_2|q_2)cdot P(q_2|q_1) cdot P(y_1|q_1) cdot pi(pi_1)
end{aligned}
]
虽然这一方法在直接计算法中没有用到,但是是后面化简都会用到的,所以先写在这儿。
2.1 直接计算方法
回忆问题,给定模型参数和一个观测序列,计算这个观测序列出现的概率(P(Y,lambda)),若要直接计算,需考虑我们有哪些已知条件。首先初始状态概率(pi)知道,状态转移概率矩阵A也知道,那么生成和这个观测序列相同长度的状态序列的概率(P(Q|lambda))就能表示出来了
[P(Q|lambda)=pi_{q_1} a_{q_1q_2}a_{q_2q_3} cdots a_{q_{t-1}q_{t}}
]
(P(Y|lambda))不能直接表达的原因是中间还有隐变量——转移状态,在固定状态下的观测概率B是已知的,那么已经得到了一串状态序列的概率,在这串状态序列下的观测是能够表示的,这便得到了
[P(Y|Q,lambda) = b_{q_i}(y_1)cdot b_{q_2}(y_2)cdots b_{q_t}(y_t)
]
有了这两个概率,隐变量和观测变量的联合概率分布可表示为
[egin{aligned}
P(Y,Q|lambda) =&P(Y|Q,lambda) P(Q|lambda)\
=&pi_{q_1}b_{q_1}(y_1)a_{q_1q_2}b_{q_2}(y_1)cdots a_{q_{t-1}q_t}b_{q_t}(y_t)
end{aligned}
]
对于联合概率分布,可以求解其一个变量的边缘分布的和或积分得到另一个变量的分布,这是机器学习中常见的 手段,应熟练掌握,现对状态序列求和
[egin{aligned}
P(Y|lambda) =& sum_QP(Y|Q,lambda) P(Q|lambda)\
=& sum_{q_t}^K cdots sum_{q_1}^Kpi_{q_1}b_{q_1}(y_1)a_{q_1q_2}b_{q_2}(y_1)cdots a_{q_{t-1}q_t}b_{q_t}(y_t)
end{aligned}
]
这个计算量是非常大的,T个观测序列,每个序列有K种可能的状态,且内部还有T个乘积需要计算,相当于T个for循环,每个循环执行K次,每次的复杂度T,那么总复杂度(O(TK^T))。
2.2 前向算法
为了简化,首先定义了前向概率表达,对于隐马尔可夫模型(lambda),定义在时刻 t 的观测序列为((y_1,y_2,...,y_t))且状态为(q_t = i)的概率为前向概率(alpha_t(i)),即
[alpha_t(i) = P(y_1,y_2,...,y_t,q_t = i |lambda)
]
下面通过这个前向概率推导(P(Y|lambda))的递推表达式
[egin{aligned}
alpha_1(i) = & P(y_1,q_1 = i | lambda)\
=&pi(pi_i)bi(y_1)\
,&\
alpha_2(i)=&P(y_1,y_2,q_2 = i)\
=&sum_jP(y_1,y_2,q_2 = i,q_1 = j)\
=&sum_jP(y_2|q_2 = i)P(q_2 = i|q_1 =j)cdot alpha_1(j)\
=&P(y_2|q_2)sum_jP(q_2 = i|q_1 = j) cdot alpha_1(j)\
&cdots\
alpha_t(i)=&P(y_t|q_t = i)sum_jP(q_t = i|q_{t-1} = j) cdot alpha_{t-1}(j)\
=&b_i(y_t)sum_ja_{ji}cdot alpha_{t-1}(j)
end{aligned}
]
这是我之前想的推导方法,但不得不说是比较蠢的,由定义观察式子中少了什么多了什么即可,法2
[egin{aligned}
alpha_t(i) = &P(y_1,cdots,y_t,q_t = i|lambda)\
=& sum_j P(y_1,cdots,y_t,q_{t-1} = j,q_t = i|lambda)\
=& sum_j P(y_t|q_t=i)P(q_t = i|q_{t-1}=j)P(y_1,cdots,y_{t-1},q_{t-1}=j|lambda)\
=&sum_jb_i(y_t) a_{ji}alpha_{t-1}(j)
end{aligned}
]
注意求第二个前向概率的时候,为了化简式子,引入了(q_1)但将它当作边缘概率求和去掉了。这个递推式就这样神奇的得到了 t 时刻状态为 (q = i) 的概率,得到t 时刻的前向概率的表达式后,根据它的定义(alpha_T(i) = P(y_1,y_2,...,y_T,q_t = i|lambda))可知,计算(P(Y|lambda))只需要将 t 时刻的所有状态的概率求和就可以了(边缘概率)
[P(Y|lambda) = sum_i^Kalpha_T(i)
]
而且这个递推式极大的简化了计算量,因为在计算下一个时刻的前向概率的时候,上一个时刻的前向概率是已经算出来了的,只需做少量乘法,最后的复杂度为(O(KT))。
2.3 后向算法
明白前向算法的推导过程后,后向算法的思想其实是一样的,并且得到的结果都一样,只不过后向是从后面往前面推,前向可与后向算法组合在一起表达(P(Y|lambda))
定义:
给定隐马尔可夫模型(lambda),定义在 t 时刻 且状态为(q_t = i)的条件下,从 t + 1 时刻到 T 时刻的观测序列的概率为后向概率,即
[eta_t(i) = P(y_{t+1},y_{t+2},...,y_T| q_t = i, lambda)
]
注意观测数据是从 t + 1 时刻开始的,并且(eta_t(i) = 1),
[egin{aligned}
eta_T(i) = & 1\
,&\
eta_{T-1}(i)=&P(y_T|q_{T-1} = i,lambda)\
=&sum_{j}^KP(y_T,q_T=j|q_{T-1} = i,lambda)\
=&sum_j^KP(y_T|q_T =j)P(q_T = j|q_{T-1} =i)\
=&sum_j^Kb_j(y_T)a_{ij} eta_T(j)\
&,\
eta_{T-2}(i)=&P(y_{T-1},y_T|q_{T-2} = i, lambda)\
=&sum_{j}^K P(y_{T-1},y_T,q_{T-1} = j|q_{T-2} = i, lambda)\
(乘法公式)=&sum_{j}^K P(y_T|q_{T-1} = j)cdot P(y_{T-1}|q_{T-1}=j)cdot P(q_{T-1}=j|q_{T-2} = i,lambda)\
=&sum_j^K eta_{T-1}(j)cdot b_j(y_{T-1})a_{ij}\
&cdots\
eta_t(i)=&sum_j^Keta_{t+1}(j)cdot b_j(y_{t+1})cdot a_{ij}
end{aligned}
]
和上面一样,法2,由定义,补充一个(q_{t+1})即可
[egin{aligned}
eta_t(i) = &P(y_{t+1},y_{t+2},cdots,y_T|q_t = i,lambda)\
=&sum_jP(y_{t+1},y_{t+2},cdots,y_T,q_{t+1}=j|q_t = i,lambda)\
=& sum_jP(y_{t+1}|q_{t+1}=j)P(q_{t+1}=j|q_t=i)P(y_{t+2},cdots,y_T|q_{t+1} =j,lambda)\
=&sum_j b_j(y_{t+1})a_{ij}eta_{t+1}(j)
end{aligned}
]
同样,得到后向概率的表达式后,根据其定义(eta_t(i) = P(y_{t+1},y_{t+2},...,y_T| q_t = i, lambda)),所求序列为1-T,但t 至少为1 ,这使得该表达式缺少了第一个观测值的概率,不过这很简单,乘上(pi_i b_{i}(y_1))即可,通过后向概率得到(P(Y|lambda))
[P(Y|lambda) = sum_i^Kpi_i b_i(y_1)eta_1(i)
]
从刚刚这个求和运算中发现后向概率的定义从 t + 1 时刻开始似乎不方便,但是当它和前向概率结合时,就会发现,应当如此!
2.4 通过前向与后向概率表达两个重要概率和三个期望
(1)计算(P(q_t = i|Y,lambda),Y = (y_1,y_2,...y_T))时,即计算给定一串序列情况下,其 t 时刻的状态为 i 的几率,记为(gamma_t(i))。利用前向与后向概率,先计算t 时刻状态与观测的联合分布
[egin{aligned}
gamma_t(i)=P(Y,q_t = i | lambda) = &P(Y|q_t = i)cdot P(q_t = i)\
=& P(y_1,cdots,y_t|q_t = i)cdot P(y_{t+1},cdots ,y_T|q_t = i)cdot P(q_t = i)\
=& P(y_1,cdots,y_t,q_t = i)cdot P(y_{t+1},cdots ,y_T|q_t = i)\
=& alpha_t(i)cdot eta_t(i)
end{aligned}
]
即序列中某个时刻 t 的状态与观测的联合分布可用前向与后向拼接而成,由该联合分布可得观测的分布
[P(Y|lambda) = sum_i^KP(Y,q_t = i|lambda)=sum_i^Kalpha_t(i)eta_t(i)
]
再根据条件概率或乘法公式
[gamma_t(i)=P(q_t = i|Y,lambda) =frac {P(Y,q_t = i|lambda)} {P(Y|lambda)}= frac {alpha_t (i) eta_t(i)} {sum_ialpha_t(i) eta_t(i)}
]
(2)给定模型参数和观测序列Y,求在时刻 t 处于状态 i 且在时刻 t + 1 处于状态 j 的概率,记为(xi_t(i,j)),大概已经找到窍门了,就是通过其联合概率和观测概率
[egin{aligned}
xi_t(i,j)=P(q_t =i,q_{t+1}=j|Y,lambda) = & frac {P(q_t =i ,q_{t+1} = j,Y, lambda)} {P(Y|lambda)}\
=& frac {P(q_t =i ,q_{t+1} = j,Y, lambda)} {sum_i^Ksum_j^KP(q_t =i ,q_{t+1} = j,Y, lambda)}\
end{aligned}
]
其中,
[egin{aligned}
P(&q_t =i ,q_{t+1} = j,Y, lambda)\
=&P(Y|q_t=i,q_{t+1} = j)P(q_t=i,q_{t+1} = j)\
=&P(y_T,y_{T-1},cdots,y_{t+1}|q_t=i,q_{t+1}=j)P(y_t,cdots,y_1|q_t=i,q_{t+1}=j)P(q_{t+1}=j,q_t=i)P(q_t=i)\
=&P(y_T,y_{T-1},cdots,y_{T+2}|q_{t+1}=j)P(y_{T+1}|q_{t+1} = j)P(y_T,cdots,y_1,q_t=i)P(q_{t+1}=j,q_t = i)\
=&eta_{t+1}(j)b_j(y_{t+1})alpha_t(i)a_{ij}
end{aligned}
]
此过程中应仔细考虑马尔可夫的两个基本假设,确定其中哪些变量是相互独立的,还有哪些是我们之前已经求出来的。这里以 t 和 t + 1 为界将观测量分开,这样时刻 t 和 时刻 t + 1 的状态都只能作用 于其中一边了。带入原式
[xi_t(i,j)=frac {alpha_t(i)a_{ij}b_j(y_{t+1})eta_{t+1}(j)} { sum_i^Ksum_j^Kalpha_t(i)a_{ij}b_j(y_{t+1})eta_{t+1}(j)}
]
(3)上面计算出的两个概率求和可以方便的表示一些有用的期望
1> 在观测Y下状态 i 出现的期望
[=sum_t^Tgamma_t(i) = sum_t^TP(q_t=i|Y,lambda)
]
2> 在观测Y下由状态 i 转移的期望,即前 T- 1个时刻有过状态 i
[= sum_t^{T-1} gamma_t (i) = sum_t^{T-1}P(q_t = i | Y, lambda)
]
3>在观测Y下由状态 i 转移到状态 j 的期望
[=sum_t^{T-1} xi _t(i,j) = sum_i^{T-1} P(q_t = i,q_{t+1} = j|Y, lambda)
]
3. 学习算法(EM)
对于学习算法,可分为知道状态序列和不知道状态序列,知道状态序列的计算可直接用极大似然估计经验概率。这里就不说了,一般都是不知道状态序列的,这就和上一篇讲的EM算法一致了,即包含隐变量的概率模型的学习。隐马尔可夫的学习算法叫Baum-Welch,不过原理和EM是一致的,只是因为那时候EM算法还未成体系。
在隐马尔可夫中,模型参数是(lambda= (A,B,pi)),观测序列(Y)便是观测数据,而状态转移序列(Q)作为不可观测的隐数据,这样便确立了EM的结构,下面只需按EM算法的步骤计算即可。(按理说初始状态产生的概率也应算作隐变量,但事实上状态序列的第一个已经包含它,并且在后面的计算中状态转移都是依赖于(pi)的,可同时将其计算出来)
首先,确立完全数据的对数似然函数
[L(lambda,Q) = logP(Y,Q|lambda)
]
E-Step:
E步求对数似然函数关于 隐变量 Q (状态序列)的条件后验概率的期望,但在隐马尔可夫模型中,并未用关于隐变量Q的条件后验概率的期望,而是用 关于 观测序列 Y 和 状态序列的联合后验概率的期望,可以这么做的原因是联合概率等于观测概率 * 隐变量的条件概率——(P(Y,Q|ar lambda) = P(Q|Y,ar lambda)P(Y|ar lambda)),而(P(Y|ar lambda))是常数,并不影响对似然函数的极大化。至于为什么这么做,当然是为了化简后面的结果——用前面推导出的容易表示的概率和期望。于是Q函数表示为
[Q(lambda,ar lambda) = sum_Q(Y,Q|ar lambda)logP(Y,Q|lambda)
]
其中(Q = (q_1,q_2,cdots ,q_t)),表示有 t 个求和运算,log前是参数已知的概率,实际要优化的是后面参数未知的(lambda),而
[P(Y,Q|lambda) = pi_{q_1} prod_{t=1}^{T-1}a_{q_tq_{t+1}}prod_{t = 1}^Tb_{q_t}(y_t)
]
于是,
[Q(lambda,ar lambda) = sum_QP(Y,Q|ar lambda)left { logpi_{q_1} + sum_{t=1}^{T-1}loga_{q_tq_{t+1}} + sum_{t=1}^T log b_{q_t}(y_t)
ight }
]
M-Step:
得到Q函数后就可以进行M步求解模型参数
[widehat lambda = arg underset lambda {max} Q(lambda,ar lambda)
]
对于这个Q函数,由于(lambda)的三个参数都是互相分离的,因此可以分开极大化求解
(1)对于第1 项
[egin{aligned}
sum_QP(Y,Q|ar lambda)logpi_{q_q} = & sum_{q_1}cdots sum_{q_t}P(Y,Q|ar lambda)logpi_{q_1}\
=&sum_{q_1}logpi_{q_1}sum_{q_2}cdots sum_{q_t}P(Y,q_1,cdots,q_t|ar lambda)\
=&sum_{q_1}P(Y,q_1|ar lambda) log pi_{q_1}
end{aligned}
]
注意log 函数中只与 状态序列中第一个有关,于是可以提到 第二个状态序列的求和前面,而后面的求和就是常见的边缘概率的求和=1,相当于把那部分变量积分消去了,这时添加(sum_ipi_i =1)的约束,利用拉格朗日乘数法计算极大点,这里求偏导时其实就是对每个(pi_i)求偏导,也就是说有 N 个等式都得为0 ,然后分别求(pi_i)
[egin{aligned}
frac {partial sum_i^NP(Y,q_1 = i|ar lambda)logpi_{q_1}+gamma(sum_i^Npi_i - 1) } {partial pi_i}=&0\
P(Y,q_1 = i| ar lambda) + gamma pi_i=& 0\
sum_i^N P(Y, q_1 = i| ar lambda) + gamma sum_i^N pi_i=&0\
gamma=&-P(Y|ar lambda)
end{aligned}
]
(gamma)带回到上面等式第二步,
[pi_i = frac { P(Y,q_1 = i|ar lambda)} {P(Y|ar lambda)}\
= frac {alpha_1(i) eta_1(i)} {sum_i^Nalpha_t(i)}\
=gamma_1(i)
]
其中分母也可用后向概率表示,或是后向与前向组合,注意分子被前面得到的前向后向概率简单的表示出来,这便是开始选择Q函数的时候为什么选择联合概率的原因。
(2)** 对于第二项**
[egin{aligned}
sum_QP(Y,Q|ar lambda)sum_{t=1}^{T-1} loga_{q_tq_{t+1}}=& sum_{q_1} cdots sum_{q_t} P(Y,Q|ar lambda)sum_{t=1}^{T-1} log a_{q_tq_{t+1}}\
=&sum_isum_jP(Y,q_t = i,q_{t +1} =j|ar lambda)sum_{t=1}^{T-1} log a_{ij}
end{aligned}
]
原理与第一项是一样的,虽是对每个状态变量都要求和,但是当 t 确定时,求和中只有时刻 t 和与它相邻的 t + 1 时刻的状态有关,因此外面的T个求和运算总是只有两个有效,然后添加关于(a_{ij})的约束(sum_j a_{ij}= 1)构造拉格朗日即可
[egin{aligned}
0=&frac partial {partial a_{ij}} left { sum_isum_jP(Y,q_t = i,q_{t +1} =j|ar lambda)sum_{t=1}^{T-1} log a_{ij} + eta( sum_ja_{ij} -1)
ight } \
0=&sum_{t-1}^{T-1}P(Y,q_t =i,q_{t+1} =j|ar lambda) + eta a_{ij}\
0=&sum_j left { sum_{t-1}^{T-1}P(Y,q_t =i,q_{t+1} =j|ar lambda) + eta a_{ij}
ight }\
0=&sum_{t=1} ^{T-1} P(Y,q_t =i | ar lambda) + eta\
eta=&-sum_{t=1} ^{T-1} P(Y,q_t =i | ar lambda)
end{aligned}
]
代回上式第二步,
[egin{aligned}
a_{ij} = &frac { sum_{t-1}^{T-1}P(Y,q_t =i,q_{t+1} =j|ar lambda) } { sum_{t=1} ^{T-1} P(Y,q_t =i | ar lambda) }\
=&frac {sum_t^{T-1} xi_t(i,j) } { sum_t^{T-1} gamma_t(i) }
end{aligned}
]
(3) 对于第三项
[sum_QP(Y,Q|ar lambda) sum_t b_{q_t}(y_t) = sum_jP(Y,q_t = j|ar lambda)sum_tb_j(y_t)
]
求解方法相同,这里不赘述,只需要注意(b_j(y_t))偏导时不止要保证 j 相同就不为0,还需保证观测值也相同,可用(I(y_t = k))表示,结果为
[b_j(k) = frac { sum_t P(Y,q_t = j| ar lambda) I(y_t = k) } { sum_tP(Y,q_t = j | ar lambda) } \
=frac { sum_{t=1,y_t = k}^T gamma_t (j) } { sum_t^Tgamma_t(j) }
]
这些结果最后都可以用前向后向的简化而来的期望进行计算和表达。
4.预测算法
隐马尔可夫的预测是指给定模型参数和已知的观测序列,求解最有可能的状态序列,所以也称为解码运算(decoding)。下面介绍用于预测的近似算法和维特比算法(Viterbi algorithm)。
4.1 近似算法
近似算法是不考虑状态之间的互相影响而简化的一种算法,它的基本思想是分别选取每个时刻 t 最有可能出现的状态 (q_i),从而得到一个状态序列。而前面我们已经将 t 时刻最有可能出现的概率表示出了
[gamma_t(i) = frac { alpha_t(i) eta_t(i) } {P(Y|lambda)} = frac {alpha_t(i) eta_t(i) } { sum_j alpha_t(j) eta_t(j)}
]
于是,t 时刻最有可能的状态是
[q_t^* = argunderset i {max} [gamma_t(i) ]
]
对 T 个时刻依次求解即可得到状态序列,从求解过程中也可以看到,每个状态只是单独的用观测序列进行估计,并未考虑状态序列之间的整体影响和概率最大情况。但近似算法计算简单,并在有些场景仍可使用。
4.2 维特比算法
维特比算法采用动态规划求解隐马尔可夫模型的状态序列,即从初始时刻开始,依次计算到每个状态的概率,保存到当前时刻的每个状态最大的概率的上一个状态是什么,直到T时刻时,便计算出了所有状态的最大概率,选择概率最大的那个状态,并从该状态回溯,得到其状态序列,那么该序列便是总概率最大的状态序列。其实就是贪心的思想,先求解最优子问题。
根据刚刚的分析,该问题需要计算的有两个,一是当前时刻是状态 i 的最大概率,二是当前时刻是状态 i 的最大概率是由上个时刻哪个状态得到的。
(1) . 在时刻 t 状态为 i 的状态序列的概率最大值为(注意 时刻 t 前的序列都已确定)
[delta_t(i) = underset {q_1,cdots ,q_{t-1}} {max} P(q_t = i,q_{t-1},cdots,q_1,Y|lambda)
]
那么无论是通过定义,还是考虑这是一个递归过程,都能得到
[delta_{t+1} (i) = underset {q_1,cdots ,q_{t}} {max} P(t_{t+1} = i,q_t,cdots,q_1,y_{t+1},cdots,y_1|lambda)\
=underset {0<j<N+1} {max}[ delta_t(j)a_{ji}b_i(y_{t+1}) ]
]
(2) . 在时刻 t 状态为 i 的概率最大的状态序列的上一个时刻的状态为
[Psi_t(i) = arg underset {0<j<N+1} {max}[delta_{t-1}(j)a_{ji}]
]
注意求上一个时刻的状态时不需要乘发射概率,因为当前时刻 t 的状态已确定,与观测无关。
算法过程:
需要计算的量和贪心策略确定后,算法过程也就比较简单了。
(1)初始化
[delta_1(i) = pi_ib_i(y_1)\
Psi_1(i) = 0
]
(2)递推,t = 2, 3, ... , T
[delta_t(i) = =underset {0<j<N+1} {max}[ delta_t(j)a_{ji}b_i(y_{t+1}) ]\
Psi_t(i) = arg underset {0<j<N+1} {max}[delta_{t-1}(j)a_{ji}]
]
(3)停止
[P^* = underset{0<i<N+1} {max} delta_T(i)\
q_T^* = arg underset {0<i<N+1} {max} delta_T(i)
]
(4)回溯 ,t = T-1,..., 1
[q_t^* = Psi_{t+1} (q_{t+1})
]
算法完成便得到一个状态序列,这个序列对于观测序列来说是概率最大的。