隐马尔科夫模型HMM(一)HMM模型
隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率
隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数
隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列
在本篇我们会讨论HMM模型参数求解的问题,这个问题在HMM三个问题里算是最复杂的。在研究这个问题之前,建议先阅读这个系列的前两篇以熟悉HMM模型和HMM的前向后向算法,以及EM算法原理总结,这些在本篇里会用到。在李航的《统计学习方法》中,这个算法的讲解只考虑了单个观测序列的求解,因此无法用于实际多样本观测序列的模型求解,本文关注于如何使用多个观测序列来求解HMM模型参数。
1. HMM模型参数求解概述
HMM模型参数求解根据已知的条件可以分为两种情况。
第一种情况较为简单,就是我们已知D个长度为T的观测序列和对应的隐藏状态序列,即{(O1,I1),(O2,I2),...(OD,ID)}是已知的,此时我们可以很容易的用最大似然来求解模型参数。
假设样本从隐藏状态qi转移到qj的频率计数是Aij,那么状态转移矩阵求得为:A=[aij],其中aij=AijN∑s=1Ais
假设样本隐藏状态为qj且观测状态为vk的频率计数是Bjk,那么观测状态概率矩阵为:B=[bj(k)],其中bj(k)=BjkM∑s=1Bjs
假设所有样本中初始隐藏状态为qi的频率计数为C(i),那么初始概率分布为:Π=π(i)=C(i)N∑s=1C(s)
可见第一种情况下求解模型还是很简单的。但是在很多时候,我们无法得到HMM样本观察序列对应的隐藏序列,只有D个长度为T的观测序列,即{(O1),(O2),...(OD)}是已知的,此时我们能不能求出合适的HMM模型参数呢?这就是我们的第二种情况,也是我们本文要讨论的重点。它的解法最常用的是鲍姆-韦尔奇算法,其实就是基于EM算法的求解,只不过鲍姆-韦尔奇算法出现的时代,EM算法还没有被抽象出来,所以我们本文还是说鲍姆-韦尔奇算法。
2. 鲍姆-韦尔奇算法原理
鲍姆-韦尔奇算法原理既然使用的就是EM算法的原理,那么我们需要在E步求出联合分布P(O,I|λ)基于条件概率P(I|O,¯¯¯λ)的期望,其中¯¯¯λ为当前的模型参数,然后再M步最大化这个期望,得到更新的模型参数λ。接着不停的进行EM迭代,直到模型参数的值收敛为止。
首先来看看E步,当前模型参数为¯¯¯λ, 联合分布P(O,I|λ)基于条件概率P(I|O,¯¯¯λ)的期望表达式为:L(λ,¯¯¯λ)=∑IP(I|O,¯¯¯λ)logP(O,I|λ)
在M步,我们极大化上式,然后得到更新后的模型参数如下: ¯¯¯λ=argmaxλ∑IP(I|O,¯¯¯λ)logP(O,I|λ)
通过不断的E步和M步的迭代,直到¯¯¯λ收敛。下面我们来看看鲍姆-韦尔奇算法的推导过程。
3. 鲍姆-韦尔奇算法的推导
我们的训练数据为{(O1,I1),(O2,I2),...(OD,ID)},其中任意一个观测序列Od={o(d)1,o(d)2,...o(d)T},其对应的未知的隐藏状态序列表示为:Id={i(d)1,i(d)2,...i(d)T}
首先看鲍姆-韦尔奇算法的E步,我们需要先计算联合分布P(O,I|λ)的表达式如下:P(O,I|λ)=D∏d=1πi(d)1bi(d)1(o(d)1)ai(d)1i(d)2bi(d)2(o(d)2)...ai(d)T−1i(d)Tbi(d)T(o(d)T)
我们的E步得到的期望表达式为:L(λ,¯¯¯λ)=∑IP(I|O,¯¯¯λ)logP(O,I|λ)
在M步我们要极大化上式。由于P(I|O,¯¯¯λ)=P(I,O|¯¯¯λ)/P(O|¯¯¯λ),而P(O|¯¯¯λ)是常数,因此我们要极大化的式子等价于:¯¯¯λ=argmaxλ∑IP(O,I|¯¯¯λ)logP(O,I|λ)
我们将上面P(O,I|λ)的表达式带入我们的极大化式子,得到的表达式如下:¯¯¯λ=argmaxλD∑d=1∑IP(O,I|¯¯¯λ)(logπi1+T−1∑t=1logait,it+1+T∑t=1logbit(ot))
我们的隐藏模型参数λ=(A,B,Π),因此下面我们只需要对上式分别对A,B,Π求导即可得到我们更新的模型参数¯¯¯λ
首先我们看看对模型参数Π的求导。由于Π只在上式中括号里的第一部分出现,因此我们对于Π的极大化式子为:¯¯¯¯¯πi=argmaxπi1D∑d=1∑IP(O,I|¯¯¯λ)logπi1=argmaxπiD∑d=1N∑i=1P(O,i(d)1=i|¯¯¯λ)logπi
由于πi还满足N∑i=1πi=1,因此根据拉格朗日子乘法,我们得到πi要极大化的拉格朗日函数为:argmaxπiD∑d=1N∑i=1P(O,i(d)1=i|¯¯¯λ)logπi+γ(N∑i=1πi−1)
其中,γ为拉格朗日系数。上式对πi求偏导数并令结果为0, 我们得到:D∑d=1P(O,i(d)1=i|¯¯¯λ)+γπi=0
令i分别等于从1到N,从上式可以得到N个式子,对这N个式子求和可得:D∑d=1P(O|¯¯¯λ)+γ=0
从上两式消去γ,得到πi的表达式为:πi=D∑d=1P(O,i(d)1=i|¯¯¯λ)D∑d=1P(O|¯¯¯λ)=D∑d=1P(O,i(d)1=i|¯¯¯λ)DP(O|¯¯¯λ)=D∑d=1P(i(d)1=i|O,¯¯¯λ)D=D∑d=1P(i(d)1=i|O(d),¯¯¯λ)D
利用我们在隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率里第二节中前向概率的定义可得:P(i(d)1=i|O(d),¯¯¯λ)=γ(d)1(i)
因此最终我们在M步πi的迭代公式为:πi=D∑d=1γ(d)1(i)D
现在我们来看看A的迭代公式求法。方法和Π的类似。由于A只在最大化函数式中括号里的第二部分出现,而这部分式子可以整理为:D∑d=1∑IT−1∑t=1P(O,I|¯¯¯λ)logait,it+1=D∑d=1N∑i=1N∑j=1T−1∑t=1P(O,i(d)t=i,i(d)t+1=j|¯¯¯λ)logaij
由于aij还满足N∑j=1aij=1。和求解πi类似,我们可以用拉格朗日子乘法并对aij求导,并令结果为0,可以得到aij的迭代表达式为:aij=D∑d=1T−1∑t=1P(O(d),i(d)t=i,i(d)t+1=j|¯¯¯λ)D∑d=1T−1∑t=1P(O(d),i(d)t=i|¯¯¯λ)
利用隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率里第二节中前向概率的定义和第五节ξt(i,j)的定义可得们在M步aij的迭代公式为:aij=D∑d=1T−1∑t=1ξ(d)t(i,j)D∑d=1T−1∑t=1γ(d)t(i)
现在我们来看看B的迭代公式求法。方法和Π的类似。由于B只在最大化函数式中括号里的第三部分出现,而这部分式子可以整理为:D∑d=1∑IT∑t=1P(O,I|¯¯¯λ)logbit(ot)=D∑d=1N∑j=1T∑t=1P(O,i(d)t=j|¯¯¯λ)logbj(ot)
由于bj(ot)还满足M∑k=1bj(ot=vk)=1。和求解πi类似,我们可以用拉格朗日子乘法并对bj(k)求导,并令结果为0,得到bj(k)的迭代表达式为:bj(k)=D∑d=1T∑t=1P(O,i(d)t=j|¯¯¯λ)I(o(d)t=vk)D∑d=1T∑t=1P(O,i(d)t=j|¯¯¯λ)
其中I(o(d)t=vk)当且仅当o(d)t=vk时为1,否则为0. 利用隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率里第二节中前向概率的定义可得bj(ot)的最终表达式为:bj(k)=D∑d=1T∑t=1,o(d)t=vkγ(d)t(j)D∑d=1T∑t=1γ(d)t(j)
有了πi,aij,bj(k)的迭代公式,我们就可以迭代求解HMM模型参数了。
4. 鲍姆-韦尔奇算法流程总结
这里我们概括总结下鲍姆-韦尔奇算法的流程。
输入: D个观测序列样本{(O1),(O2),...(OD)}
输出:HMM模型参数
1)随机初始化所有的πi,aij,bj(k)
2) 对于每个样本d=1,2,...D,用前向后向算法计算γ(d)t(i),ξ(d)t(i,j),t=1,2...T
3) 更新模型参数:
πi=D∑d=1γ(d)1(i)D
aij=D∑d=1T−1∑t=1ξ(d)t(i,j)D∑d=1T−1∑t=1γ(d)t(i)
bj(k)=D∑d=1T∑t=1,o(d)t=vkγ(d)t(j)D∑d=1T∑t=1γ(d)t(j)
4) 如果πi,aij,bj(k)的值已经收敛,则算法结束,否则回到第2)步继续迭代。
以上就是鲍姆-韦尔奇算法的整个过程。
(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义