八、总结(Summary)

  通常,模式并不是单独的出现,而是作为时间序列中的一个部分——这个过程有时候可以被辅助用来对它们进行识别。在基于时间的进程中,通常都会使用一些假设——一个最常用的假设是进程的状态只依赖于前面N个状态——这样我们就有了一个N阶马尔科夫模型。最简单的例子是N = 1。
  存在很多例子,在这些例子中进程的状态(模式)是不能够被直接观察的,但是可以非直接地,或者概率地被观察为模式的另外一种集合——这样我们就可以定义一类隐马尔科夫模型——这些模型已被证明在当前许多研究领域,尤其是语音识别领域具有非常大的价值。
  在实际的过程中这些模型提出了三个问题都可以得到立即有效的解决,分别是:
  * 评估:对于一个给定的隐马尔科夫模型其生成一个给定的观察序列的概率是多少。前向算法可以有效的解决此问题。
  * 解码:什么样的隐藏(底层)状态序列最有可能生成一个给定的观察序列。维特比算法可以有效的解决此问题。
  * 学习:对于一个给定的观察序列样本,什么样的模型最可能生成该序列——也就是说,该模型的参数是什么。这个问题可以通过使用前向-后向算法解决。
  隐马尔科夫模型(HMM)在分析实际系统中已被证明有很大的价值;它们通常的缺点是过于简化的假设,这与马尔可夫假设相关——即一个状态只依赖于前一个状态,并且这种依赖关系是独立于时间之外的(与时间无关)。
  关于隐马尔科夫模型的完整论述,可参阅:
  L R Rabiner and B H Juang, `An introduction to HMMs', iEEE ASSP Magazine, 3, 4-16.

  全文完!

  后记:这个翻译系列终于可以告一段落了,从6月2日起至今,历史四个多月,期间断断续续翻译并夹杂些自己个人的理解,希望这个系列对于HMM的学习者能有些用处,我个人也就很满足了。接下来,我会结合HMM在自然语言处理中的一些典型应用,譬如词性标注、中文分词等,从实践的角度讲讲自己的理解,欢迎大家继续关注52nlp。

本文翻译自:http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/main.html
部分翻译参考:隐马尔科夫模型HMM自学

转载请注明出处“我爱自然语言处理”:www.52nlp.cn

本文链接地址:https://www.52nlp.cn/hmm-learn-best-practices-eight-summary

作者 52nlp

《HMM学习最佳范例八:总结》有66条评论
  1. 辛苦了!

    我个人感觉是学了graphical model以后,才对这些模型(HMM, CRF, Bayesian Network, MLN, etc.)有了比较清楚的认识,换句话说就是,不被天花乱坠的名字所迷惑,呵呵

    [回复]

    52nlp 回复:

    谢谢,有空好好看一下graphical model,现在的感觉是一些本质的东西还抓不住,还要好好努力!

    [回复]

  2. 刚看完《A tutorial on HMM and selected Applications in Speech Recognition》这篇经典的HMM文献后,觉得很蒙,但是看了你的讲解,才感觉好象明白了些,对照原文和你的讲解,觉得你的翻译不错。你辛苦地讲解,对我帮助很大,忠心地说声谢谢!

    [回复]

    52nlp 回复:

    不用客气,对你有帮助就好,欢迎常来看看!

    [回复]

  3. 无论是翻译还是讲解都非常的棒,真是辛苦了,对俺的帮助真的是很大,不枉此学!!非常感谢喽!

    [回复]

    52nlp 回复:

    不客气,欢迎多来走走!

    [回复]

  4. 除了翻译,还有自己的见解和补充,很赞~
    补充一点就是HMM在NLP领域中的另一应用就是spelling correction.

    [回复]

    52nlp 回复:

    谢谢崔师兄!
    关于spelling correction,讲解的比较通俗易懂的莫过于Peter Norvig大牛的:How to Write a Spelling Corrector
    http://norvig.com/spell-correct.html

    [回复]

  5. 这么好的劳动成果,我们要好好珍惜,,好好学习!

    [回复]

    52nlp 回复:

    谢谢,只要有点用就行,呵呵!

    [回复]

  6. 你好,看了你对HMM的讲解,我受益良多,我主要是对照着UMDHMM实现版本看得,还有如下问题:
    1 UMDHMM缺少K-means学习,K-means在离散状态的马尔科夫模型中是否必要?

    2 如果没有通过K-means对状态转移矩阵进行预处理,会在多大程度上影响HMM分类的结果?

    [回复]

    52nlp 回复:

    抱歉,之前没有考虑过hmm和k-means之间有什么关系,所以不知道为什么UMDHMM中需要一个k-means学习?
    查了一下,好像可以用k-means生成一个初始模型,不过我也不清楚不对状态转移矩阵进行预处理会有多大的影响。但是,如果仅仅是学习一个HMM模型的话,我估计仅仅是收敛快慢的问题,对于最终的模型影响不大。

    [回复]

    lzf8888 回复:

    谢谢,我现在要解决的是通过学习笔画的路径(方向值)来解决手势识别问题。但在设定了监督(状态有方向的跳转)的情况下,一般都会在10次以内收敛,这正常么?我翻看你以前的回答,说到观测序列的长短影响训练的结果,但对于我目前的算法,序列长度一般在10到20的长度序列,学习完毕后如果对部分训练集进行评估,有些训练集概率会在0.001左右,你觉得正常么?

    [回复]

    52nlp 回复:

    抱歉,很长时间没有碰HMM,都有点忘了,关于“正常与否”的问题,可能需要根据具体问题具体分析。你所描述的这个问题对于我来说还是比较抽象(可能你觉得已经描述的足够好了),还是有点不太明白。

    lzf8888 回复:

    抱歉,其实收到你的回复很久了,找工作忙没有留言。最终做出来觉得虽然概率算得稍低,但是足够分辨手势图形(我做的是手势识别)。如果没有你这个网站对我的指点,我想我会很困难。非常感谢。

    52nlp 回复:

    不客气,其实我也没做什么,祝找到一个心仪的好工作!

    colin 回复:

    你好,我现在学习HMM的目的也是手势识别。请问关于此项应用,还可以在哪里找到关于HMM的介绍?

    52nlp 回复:

    抱歉,不清楚这方面的应用。

  7. 还有一个问题,那就是我们初始建立了一个HMM模型,在有多个训练样本的时候,我们应该如何训练?UMDHMM中似乎是对一个观测序列进行循环训练直到满足终止条件,如果是这样对观测序列先后训练,是否会有所偏差呢?

    [回复]

    52nlp 回复:

    不清楚你所指的训练样本是已经分好类的还是没有分好类的?如果是分好累的,基本上就是直接计算各个参数值就可以了。如果没有分好类,应该是你所说的“对一个观测序列进行循环训练直到满足终止条件”,这个大概就是EM算法了,事实上我对EM算法也不是很明白,你可以再了解一下。

    [回复]

    lzf8888 回复:

    谢谢。我是分好类的,问题是:假设用十个属于一类的观测序列对HMM进行训练。采用
    1 训练第一个序列,直到收敛...
    2 训练第二个,直到收敛....
    10 第十个直到收敛

    然后我再用训练好的HMM进行评估,发现对后面的评估结果比第一个序列,第二个序列要高,这让我很郁闷。有什么好的解决方法么?还是我的训练样本不够?
    这是我的训练样本,采用3个状态,2个观测值,状态之间单向跳转
    new int[] { 0,1,1,1,1,0,1,1,1,1 },
    new int[] { 0,1,1,1,0,1,1,1,1,1 },
    new int[] { 0,1,1,1,1,1,1,1,1,1 },
    new int[] { 0,1,1,1,1,1 },
    new int[] { 0,1,1,1,1,1,1 },
    new int[] { 0,1,1,1,1,1,1,1,1,1 },
    new int[] { 0,1,1,1,1,1,1,1,1,1 }
    double[] pi = new double[] { 1.0, 0, 0 };
    double[,] trans = new double[3, 3]
    {
    {0.5, 0.5, 0},
    {0, 0.5,0.5},
    {0, 0, 1}
    };
    训练后结果对1和2序列的评估值为:
    0.002******
    对剩余所有的评估值均在1.00****(我也不摘掉为什么计算会超过1,我移植了UMDHMM中算法并进行过一致性验证,但小幅修改了收敛条件以防止delta变化为负数的情况)。也就是说中间有一个0效果接回很差,ms如果是4个状态也没有多少改进。

    [回复]

    lzf8888 回复:

    当然,非常感谢你及时的回复,呵呵。

    [回复]

    52nlp 回复:

    首先非常抱歉,可能还是会让你失望。
    显然,你对这个问题是进入过深入研究的,不过我感觉自己还是不太明白其中描述的是什么,尤其是你的问题描述“用十个属于一类的观测序列对HMM进行训练”。我所指的分类是观测序列中任一个观察节点(或者观察值)的分类,不太明白观测序列属于一类的情况。
    可能隔行如隔山吧,我还是比较糊涂所应用的场景,这个并不是指你说的不明白,不细致。另外我个人最近有点忙,可能没有多花时间去思考这个问题,非常抱歉。
    不过我觉得你既然已经很深入的了解了UMDHMM,可以再找一个HMM工具来验证一下是实验的问题还是工具的问题。

  8. 除了表达感激外,我还能说什么呢?
    向博由致敬!

    [回复]

    52nlp 回复:

    非常感谢你的留言和建议!近期有些忙,不能一一回复,再次感谢!

    [回复]

  9. 看完了 当然说声感谢无私的分享。
    学东西是自己的事情,但是自己学习之余能够拿出来分享给大家,精神可贵。

    [回复]

  10. 你好,谢谢你的翻译,我想请问哈比较愚蠢的问题。以上的代码是在什么程序上实现。我想在MATLAB表示,请问有参考的资料吗?谢谢

    [回复]

    52nlp 回复:

    这里的示例是c程序。

    关于Matlab实现,可参考:
    https://www.52nlp.cn/several-different-programming-language-version-of-hmm
    里面介绍了几种不同程序版本实现的HMM,包括matlab的。

    Malab版:
    5、 Hidden Markov Model (HMM) Toolbox for Matlab:
      This toolbox supports inference and learning for HMMs with discrete outputs (dhmm’s), Gaussian outputs (ghmm’s), or mixtures of Gaussians output (mhmm’s).
      Matlab-HMM主页:http://www.cs.ubc.ca/~murphyk/Software/HMM/hmm.html

    [回复]

  11. 一个困扰了很久的问题,如何将一个提取的特征集转化为DHMM的训练集呢?恳求大虾帮忙啊

    [回复]

    52nlp 回复:

    建议你看一下《HMM在自然语言处理中的应用一:词性标注1》,里面有示例如何做。

    [回复]

  12. 谢谢博主的翻译,你的讲解再结合老师的课件,能够帮助我较好的理解和实现HMM中提到的三个算法

    [回复]

  13. 向辛勤工作的楼主致以崇高的敬意!楼主的工作让初学者拨云见天!

    [回复]

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注