zoukankan      html  css  js  c++  java
  • 隐马尔科夫模型的来龙去脉

    作为应用广泛的一种统计模型(尤其是在自然语言处理(NLP)中),隐马尔科夫模型是非常值得一说的,本文就隐马尔科夫模型的原理和应用介绍进行说明。由于隐马尔科夫模型有着很多不同的具体算法实现,本文暂时跳过这部分内容,算法部分会另外写成一篇博文。

    马尔科夫链

    语言模型及其实现中,我曾经简单地提到过马尔科夫链,这里将会全面详细的说明。

    其实马尔科夫链是一种离散的随即过程,可以将其看成是一种有限自动机,但是其状态之间的转移并不是依赖于外界的输入,而是依赖于每个状态之间的转移概率。

    如下图所示:

    上图中每条边上的权重表示状态转移的概率,对于来说,用数学语言表达就是:

    现在用更加严谨的数学表达来说明:

    假设当前系统中一共有个状态,而在每个时刻只可能处于一个状态,所有可能的状态集合用表示,用表示在时刻时的状态。

    马尔科夫链有两个假设条件,分别是:

    1. 有限视野:当前时刻的状态只与上一个时刻的状态有关。用公式表示就是:

    2. 时间独立性:状态转移概率与时间无关。用公式表示就是:

    隐马尔科夫模型

    而隐马尔科夫模型则是马尔科夫过程的一种扩展,或者说是一种双重的随机过程。隐马尔科夫模型是指,在马尔科夫链中的那些状态其实是不可见的,而可见的只是输出的状态,而从不可见状态到可见状态的转移也存在着一个概率,那些不可见的状态就被称为是隐藏状态,隐马尔科夫模型中的”隐”就是这么来的。

    还是先用图来说明吧:

    上图中的就是被观察到的状态(可见状态),就是隐藏状态(不可见状态).

    相对于之前的马尔科夫链隐马尔科夫模型有以下的不同之处:

    1. 观察状态与隐藏状态之间存在概率关系
    2. 多一个假设条件,输出独立性:可见状态仅与当前状态有关,用公式说明就是:

    隐马尔科夫模型可以用一个五元组来表示:,其中:

    • 表示隐藏状态集合,
    • 表示观察状态集合,
    • 状态序列(隐藏),观察序列(可见)
    • 是状态转移概率分布
    • 是观察值生成的概率分布
    • 是初始的状态概率分布,

    应用

    到目前为止所说的隐马尔科夫模型都是太抽象了,仅仅知道它是什么还不能帮助我们完全理解它作用,下面就通过两个隐马尔科夫模型的应用,来说明这个模型的强大之处。

    词性标注

    在自然语言处理中,词性标注是一个非常基本的任务,简单来说,每一个词,不管是中文还是英语,它在句子中一定会有一个词性标记1

    1同一个词在不同的句子中,可能具有不同的词性标记。

    ,比如名词、形容词等等。确定一个句子中每一个词的词性,是一个最基本的任务,它为后续的其他处理提供了基础信息。

    在词性标注的任务中,我们可以将一个句子看成是可见状态序列,每一个词都是一个可见的状态(),而每一个词都对应着一个词性,这个词性就是隐藏状态(),而整个文本中的所有词汇表就是观察状态的集合(),预定义的词性标记集就是隐藏状态集合()。而我们的目标是,在给定一个观察序列(句子,或者可以看成是词组的序列)的情况下,寻找其对应的隐藏状态序列(每一个词对应的词性标记)。

    拼音输入法

    隐马尔科夫模型另外一个比较重要的应用就是拼音输入法,目前主流的拼音输入法或多或少地运用到了隐马尔科夫模型。

    在输入法的应用中,我们可以将用户输入的拼音序列看成是可见的状态序列,而拼音所对应的汉语词语就是不可见的隐藏状态,我们的目标是就是在给定拼音序列的情况下,寻找概率最大的隐藏状态序列。如下图所示:

    其中,表示用户输入的拼音串(可见状态),表示第一个拼音的候选汉字,其他的依次类推。

    总结

    在本篇文章中,只是着重介绍了马尔科夫过程和隐马尔科夫模型及其应用,具体的算法实现全部略过了,这是因为其实现算法中也包含了很多的内容,因此我打算将算法部分单独写成一篇博文,本篇文章中就没有涉及算法部分的内容了。

    这里可以做一下简单的说明,隐马尔科夫模型的实现过程,主要有两大步骤:

    1. 模型参数的学习,也即要学习获得隐马尔科夫模型5个要素中的转移概率矩阵.这个过程主要有两种方法,分别是基于监督方法的极大似然估计和基于非监督方法的EM算法。

    2. 模型解码,也即在给定转移矩阵和可见转台序列的情况下,如何寻找到最有的隐藏状态序列,这个过程可以利用基于动态规划思想的Viterbi算法来解决。

    参考资料

    转载自:http://zhouyichu.com/nlp/Hidden-Markov-Model.html

  • 相关阅读:
    tlb、tlh和tli文件的关系
    String算法
    Reverse A String by STL string
    windows内存管理复习(加深了理解得很!)
    [转载]有关DLL中New和外部Delete以以及跨DLL传递对象的若干问题
    顺势工作时间
    C++箴言:绝不在构造或析构期调用虚函数
    inline函数复习
    从编译器的角度更加深入考虑封装的使用
    复习:constructor和destructor的compiler实现
  • 原文地址:https://www.cnblogs.com/chenying99/p/4666134.html
Copyright © 2011-2022 走看看