隐含马尔科夫模型(HMM)原理及其实现

来源:互联网 发布:python黑帽子中文 编辑:程序博客网 时间:2024/06/05 10:13

隐含马尔科夫模型(Hidden Markov Model)

  • 公式推导

    s1,s2,,sn = Args1,s2,,snS Max P(s1,s2,,sn|o1,o2,,on)     

    注:S为所有可能的源信息,o1,o2,,on是接受到的观测信息

    我们可以将①式利用贝叶斯公式来间接计算:

    P(s1,s2,,sn|o1,o2,,on) = P(o1,o2,,on|s1,s2,,sn)P(s1,s2,,sn)P(o1,o2,,on) = kP(o1,o2,,on|s1,s2,,sn)P(s1,s2,,sn)     

​ 对于②式我们可以利用隐含马尔科夫模型(Hidden Markov Model)来估计。

P(o1,o2,,on|s1,s2,,sn) = t=1nP(ot|st)      

P(s1,s2,,sn) = t=2nP(st|st1)    

​ 这样,有③和④两式就求解了②式

  • HMM的训练

    要利用隐含马尔科夫模型解决实际问题,那么我们必须事先知道它的参数,即要知道由前一个状态St1进入当前状态St的概率P(St|St1),称之为转移概率(Transition Probability),以及每个状态St产生相应输出Ot的概率P(Ot|St),称之为生成概率(Generation Probability),得到这些参数的过程就是模型的训练

    P(Ot|St) = P(Ot, St)P(St)    P(St|St1) = P(St1, St)P(St1)   

    现在如果有足够多的人工标记数据,那么我们可以知道经过状态St有多少次记为#(St),以及经过这个状态而产生的输出Ot的次数,就可以知道有多少次#(St, Ot),那么上式⑤就为,

    P(Ot|St)  #(St, Ot)#(St)

    而这种数据集均是有标记的,因此为有监督的训练方法(Supervised Training),而对于式⑥我们直接利用统计语言模型P(ωi|ωi1)  #(ωi1, ωi)#(ωi1)即可得到

    另外,如果我们仅仅通过大量观测到的信号O1,O2,,On来计算(估计)模型参数,这种就为无监督的训练方法(Unsupervised Training),而这就要提到鲍姆-韦尔奇算法(Baum-Welch Algorithm)

    • 两个不同的HMM可以产生同样的信号O1,O2,,On,因此仅仅通过观测信号来推断产生它的HMM,这样就会可能有多个HMM适合,但是总会有一个模型参数Mθ2要比另一个Mθ1更加可能产生这个观测到的输出,而鲍姆-韦尔奇算法就是找到这个最有可能的参数Mθ^
      1. 我们找到一组能够产生输出序列O1,O2,,On的一组模型参数,记为Mθ0
      2. 由这个初始模型,接着利用Forward-Backward算法得到由某个可能的输入S1,S2,,SnS产生O1,O2,,On的概率P(O1,O2,,On|Mθ0),以及利用维特比算法(Viterbi Algorithm)得出那个最可能产生这个输出O1,O2,,On的状态序列,以及产生O1,O2,,On过程中所有可能路径及其概率,这样就可以得到新的模型参数Mθ1,至此完成了一次迭代,可以证明P(O1,O2,,On|Mθ1)>P(O1,O2,,On|Mθ0)
      3. 接着继续按照步骤2的过程迭代,直到模型质量不再明显提高为止
    • 值得一提的是,鲍姆-韦尔奇算法每一次迭代就是不断的估计新的HMM参数,而使得O1,O2,,On的概率达到最大化,这个过程被称之为期望值最大化(Expectation-Maximization)过程,但是EM过程只能保证收敛到一个局部最优解,而不能找打全局最优解,因此在相关的NLP的应用中,如词性标注(Part-of-Speech tagging),往往会使用人工标记数据这种有监督的训练方法,因为它能够收敛于全局最优解。当然,如果我们的目标函数为一个凸函数(只有一个最优点),这种情况EM过程就能找到最价值。
原创粉丝点击