隐含马尔可夫模型 -HMM(Hidden Markov Model)是一个数学模型,到目前为之,它一直被认为是实现快速精确语音识别系统的最为快速有效的方法。复杂的语音识别问题通过隐含马尔可夫模型能非常简单地被表述、解决。
  自然语言是人类交流信息的工具。很多自然语言处理问题都可以等同于通信系统中的解码问题 – 一个人根据接收到的信息,去猜测发话人要表达的意思。这其实就象通信中,我们根据接收端收到的信号去分析、理解、还原发送端传送过来的信息。
  那么怎么根据接收到的信息来推测说话者想表达的意思呢?我们可以利用叫做“隐含马尔可夫模型”(Hidden Markov Model)来解决这些问题。以语音识别为例,当我们观测到语音信号 o1,o2,o3 时,我们要根据这组信号推测出发送的句子 s1,s2,s3。显然,我们应该在所有可能的句子中找最有可能性的一个。用数学语言来描述,就是在已知 o1,o2,o3,…的情况下,求使得条件概率P (s1,s2,s3,…|o1,o2,o3….) 达到最大值的那个句子 s1,s2,s3,…
  当然,上面的概率不容易直接求出,于是我们可以间接地计算它。利用贝叶斯公式(可以参考我前面的文章)并且省掉一个常数项,可以把上述公式等价变换成:
P(o1,o2,o3,…|s1,s2,s3….) * P(s1,s2,s3,…)
  其中P(o1,o2,o3,…|s1,s2,s3….) 表示某句话 s1,s2,s3…被读成 o1,o2,o3,…的可能性, 而P(s1,s2,s3,…) 表示字串 s1,s2,s3,…本身能够成为一个合乎情理的句子的可能性,所以这个公式的意义是用发送信号为 s1,s2,s3…这个数列的可能性乘以 s1,s2,s3…本身可以一个句子的可能性,得出概率。
  现在是不是把问题变得更复杂了,别着急,我们现在就来简化这个问题。我们在这里做两个假设:
  第一,s1,s2,s3,… 是一个马尔可夫链,也就是说,si 只由 si-1 决定 (详见系列一);
  第二, 第 i 时刻的接收信号 oi 只由发送信号 si 决定(又称为独立输出假设, 即 P(o1,o2,o3,…|s1,s2,s3….) = P(o1|s1) * P(o2|s2)*P(o3|s3)…。
那么我们就可以很容易利用算法 Viterbi 找出上面式子的最大值,进而找出要识别的句子 s1,s2,s3,…。
  满足上述两个假设的模型就叫隐含马尔可夫模型。我们之所以用“隐含”这个词,是因为状态 s1,s2,s3,…是无法直接观测到的。这么说你可能还不清楚,没关系,后面有例子会介绍。
  隐含马尔可夫模型的应用远不只在语音识别中。在上面的公式中,如果我们把 s1,s2,s3,…当成中文,把 o1,o2,o3,…当成对应的英文,那么我们就能利用这个模型解决机器翻译问题; 如果我们把 o1,o2,o3,…当成扫描文字得到的图像特征,就能利用这个模型解决印刷体和手写体的识别。
  P (o1,o2,o3,…|s1,s2,s3….) 根据应用的不同而又不同的名称,在语音识别中它被称为“声学模型” (Acoustic Model), 在机器翻译中是“翻译模型” (Translation Model) 而在拼写校正中是“纠错模型” (Correction Model)。 而P (s1,s2,s3,…) 就是我们在系列一中提到的语言模型。
  在利用隐含马尔可夫模型解决语言处理问题前,先要进行模型的训练。 常用的训练方法由伯姆(Baum)在60年代提出的,并以他的名字命名。隐含马尔可夫模型在处理语言问题早期的成功应用是语音识别。七十年代,当时 IBM 的 Fred Jelinek (贾里尼克) 和卡内基•梅隆大学的 Jim and Janet Baker (贝克夫妇,李开复的师兄师姐) 分别独立地提出用隐含马尔可夫模型来识别语音,语音识别的错误率相比人工智能和模式匹配等方法降低了三倍 (从 30% 到 10%)。 八十年代李开复博士坚持采用隐含马尔可夫模型的框架, 成功地开发了世界上第一个大词汇量连续语音识别系统 Sphinx,被《商业周刊》评为1988年美国最重要的科技发明。

下面介绍一下生成模式。
  生成模式分为确定性模式和非确定性模式两种。
  确定性模式是指在已知前一状态和前几个状态,则下一状态是确定的。如红绿灯系统,如果当前为绿灯,则下一状态为黄灯,这是确定的。
  非确定模式我们无法预知下一状态,即下一状态的变化是非确定性的。根据马尔科夫假设,我们对模型进行简化,即下一状态仅依赖前几个状态。

一阶马尔科夫链:
  设S是一个由有限个状态组成的集合,S={1, 2, 3, …,n-1, n}
随机序列 X 在 t 时刻所处的状态为qt,其中 qt∈S,若有:

则随机序列 X 构成一个一阶马尔科夫链。 (Markov Chain)

  我们考虑这样一个例子,能否根据今天的天气预测明天的天气情况,其实可以建立一阶的马尔科夫模型,即状态选择仅与前一个状态有关。如果今天为晴天,明天有0.7的几率为晴天,0.2的几率为阴天,0.1的几率下雨,如果今天为雨天,明天……,由此我们可以得到一个状态转移矩阵。

  要初始化这样一个系统,我们需要确定起始日天气的(或可能的)情况,定义其为一个初始概率向量,称为П向量,如:
(sun=1 cloud=0 rain=0) ,即晴天概率为1
  这样一阶马尔科夫过程定义了以下三个部分:
  状态:晴天、阴天和下雨
  初始向量:定义系统在时间为0的时候的状态的概率
  状态转移矩阵:每种天气转换的概率
  所有的能被这样描述的系统都是一个马尔科夫过程。

  但是在某些情况下,我们并不能直接观测到状态的转换,来看下面的例子:
  在一个房间中,假定有 N 个坛子,每个坛子中都装有不同颜色的小球,并且假定总共有 M 种不同颜色的小球。一个精灵在房间中首先随机地选择一个坛子,从这个坛子中随机选择一个小球,然后把球放回到坛子中,然后再随机选择一个坛子,从中随机选择一个小球,然后放回小球,如此继续…,这样可以得到由这个过程产生的一个小球颜色的序列。
  1)如果令每一个坛子对应与一个状态,令小球颜色对应状态的输出。
  2)可以用一个一阶马尔科夫过程来描述坛子的选择过程。在马尔科夫过程中,每个状态只有一个输出,但在坛子和小球的问题中。可以从每个坛子中拿出不同颜色的小球。也就是每个状态能按照特定的概率分布产生多个输出,状态和输出之间不再是一一对应关系。
  3)在坛子与小球问题中,如果给定一个观察序列(不同颜色的小球序列),不能直接确定状态转换序列(坛子的序列),因为状态转移过程被隐藏起来了。所以这类随机过程被称为隐马尔科夫过程。


  其中五元组(五要素)可概括为:
  1.状态和状态间转换的概率
  2.不同状态下,有着不同的外在表现的概率。
  3.最开始设置的初始状态
  4.能转换的所有状态的集合
  5.能观察到外在表现的结合

再来看一个抛掷硬币的例子
  三枚硬币,随机选择一枚,进行抛掷,记录抛掷结果。
  可以描述为一个三个状态的隐马尔科夫模型l。
  l = (S, V, A, B, π),其中
  S = {1, 2, 3}
  V = {H,T}

那么问题来了:
问题一:
  给定上述模型,观察到下列抛掷结果的概率是多少?
  O = (H H H H T H T T T T)
问题二:
  给定上述模型,若观察到上述抛掷结果,最可能的硬币选择序列(状态转换序列)是什么?
问题三:
  若上述模型中的状态转移矩阵 A、状态输出概率 B 和初始状态分布 p 均未知,如何根据观察序列得到它们?

其实这就对应了隐马尔科夫模型的三个问题:
1)估算问题
  给定HMM l = ( A, B, π )
  给定观察序列 O = ( o1 o2 o3 … oT )
  如何有效地计算出观察序列的概率,即P(O|λ)?
2)解码问题
  给定HMM l = ( A, B, π)
  给定观察序列O = ( o1 o2 o3 … oT )
  如何寻找一个状态转换序列 q = (q1 q2 q3 … qT ),使得该状态转换序列最有可能产生上述观察序列?
3)学习问题或训练问题
  在模型参数未知或不准确的情况下,如何根据观察序列O = ( o1 o2 o3 … oT )求得模型参数或调整模型参数。按照MLE的原则,即如何确定一组模型参数,使得P (O|λ)最大?

问题1: 估算观察序列概率
  对隐马尔可夫模型而言,状态转换序列是隐藏的,一个观察序列可能由任何一种状态转换序列产生。因此要计算一个观察序列的概率值,就必须考虑所有可能的状态转换序列。

  上图表示了产生观察序列O = ( o1 o2 o3 … oT )的所有可能的状态转换序列。

  理论上,可以通过穷举所有状态转换序列的办法计算观察序列O的概率。
  实际上,这样做并不现实。因为可能的状态转换序列共有N^T个。需要做(2T–1)N^T次乘法运算, N^T–1 次加法运算。若N = 5, T=100,则(2×100-1)×5^100≈10^72
  需要寻找更为有效的计算方法。

向前算法(Forward Algorithm)

  这很好懂吧,简单的说,就是按时间分成各个时间段,按不同的时间阶段逐次向前演算。

  让我来看之前的抛硬币的例子:

向后算法(Backward Algorithm)

  后向变量(局部概率)表示的是已知隐马尔科夫模型λ及t时刻位于隐藏状态Si,从t+1时刻到终止时刻的局部观察序列的概率。
  注意这里从T+1开始的输出是不存在的(因为T时刻是终止终止状态),即T之后是空,是个必然事件,所以概率为1。



  这里 βT-1(i)=P(OT|qT-1=si,μ) = ai1*b1(OT)βT(1) + ai2*b2(OT)βT(2) + ai3*b3(OT)*βT(3)

时间复杂度:
  计算某时刻在某个状态下的后向变量需要看后一时刻的N个状态,此时时间复杂度为O(N),每个时刻有N个状态,此时时间复杂度为N*O(N)=O(N2),又有T个时刻,所以时间复杂度为T*O(N2)=O(N2T)。

问题2:计算出一个能最好解释观察序列的状态转换序列
  理论上,可以通过枚举所有的状态转换序列,并对每一个状态转换序列q计算P(O, q |λ),能使P(O, q |λ)取最大值的状态转换序列q*就是能最好解释观察序列的状态转换序列
  这个想法太直白了,工作量是不是太大了点,肯定还有更好的计算方法,恩。
  怎么优化呢?上面显然我们做了很多无用功,我们是否可以借助动态规划的思想。
  于是韦特比算法(Viterbi Algorithm)闪亮登场。



  可以发现,韦特比算法和前向算法很像。

时间复杂度:
  计算某时刻的某个状态的前向变量需要比较前一时刻的N个状态,此时时间复杂度为O(N),每个时刻有N个状态,此时时间复杂度为N*O(N)=O(N^2),又有T个时刻,所以时间复杂度为T*O(N^2)=O(N^2T)。
  以上的算法需要做乘法,韦特比算法一般在实现时,一般要把模型参数取对数,这样乘法运算变为加法,改进后的算法时间复杂度仍为 O(N^2T),但不再有乘法运算。但增加了预处理的开销,预处理只需要进行一次,对于多数系统而言,预处理开销是微不足道的。

问题3:参数学习
  如何根据观察序列O =( o1 o2 o3 … oT )求得模型参数或调整模型参数,即如何确定一组模型参数使得P (O|l )最大?
  隐马尔科夫模型的前两个问题均假设模型参数已知,第三个问题是模型参数未知,求最佳模型的问题,是三个问题中最为困难的问题。对于一个隐马尔可夫模型而言,关键有三组参数,状态转移概率矩阵 A、状态输出概率 B 以及初始状态概率分布π。因此该问题是如何选择λ = ( A, B, π ),使得在该模型下,已知的观察序列的概率 P (O|λ )为最大?把观察序列视为训练样本, A、 B、 π 视为未知参数,问题就是一个参数估计的问题。

  参数学习分为有指导的参数学习(supervised learning)和无指导的参数学习(unsupervised learning)

有指导的参数学习(supervised learning)
  在模型(λ)未知的情况下,如果给定观察序列的同时,也给定了状态转换序列,此时可以通过有指导的学习方法学习模型参数。例如给定下面的训练数据,可以通过最大似然估计法估计模型参数:
H/1 H/1 T/1 T/2 H/3 T/5 …
T/2 H/1 T/2 H/3 H/3 H/1 …
  参数学习非常简单,在训练数据足够大的前提下,效果不错。
  缺点:状态信息未知时无法使用。或者要由人工标注状态信息,代价高。在NLP中,在无指导学习效果不佳时,需要采用有指导学习。

无指导的参数学习(unsupervised learning)
  在模型(λ)未知的情况下,如果仅仅给定了观察序列,此时学习模型的方法被称做无指导的学习方法。
  对于隐马尔科夫模型而言,采用无指导学习方法,没有解析方法。通常要首先给定一组不准确的参数,再通过反复迭代逐步求精的方式调整模型参数,最终使参数稳定在一个可以接受的精度。
  利用无指导的学习方法估计隐马尔科夫模型参数时,并不能一定保证求得最优模型,一般能得到一个局部最优模型。

  可以使用Baum-Welch算法,它是EM(Expectation-Maximization)算法的一个特例。
  EM 算法是 Dempster,Laind,Rubin 于 1977 年提出的求参数极大似然估计的一种方法,它可以从非完整数据集中对参数进行 MLE 估计,是一种非常简单实用的学习算法。这种方法可以广泛地应用于处理缺损数据,截尾数据,带有讨厌数据等所谓的不完全数据(incomplete data)。

  关于EM算法可以看我前面一篇文章EM算法。

参考:
https://zh.wikipedia.org/wiki/%E9%9A%90%E9%A9%AC%E5%B0%94%E5%8F%AF%E5%A4%AB%E6%A8%A1%E5%9E%8B
http://www.cnblogs.com/kaituorensheng/archive/2012/12/03/2800489.html

数学之美笔录(3):隐含马尔可夫模型(详解)相关推荐

  1. 数学之美 系列三 -- 隐含马尔可夫模型在语言处理中的应用

    发表者:吴军,Google 研究员 前言:隐含马尔可夫模型是一个数学模型,到目前为之,它一直被认为是实现快速精确的语音识别系统的最成功的方法.复杂的语音识别问题通过隐含马尔可夫模型能非常简单地被表述. ...

  2. 隐含马尔可夫模型在语言处理中的应用(Z)

    Original address: http://www.google.com.hk/ggblog/googlechinablog/2006/04/blog-post_1583.html 数学之美 系 ...

  3. 数学之美-隐含马尔可夫模型-笔记

    <数学之美>吴军 著 第二版 --读书笔记 原理 通信模型: Created with Raphaël 2.1.2信息.上下文信息.上下文传递的信息传递的信息接收的信息接收的信息(s1,s ...

  4. 数学之美——隐含马尔科夫模型

    隐含马尔科夫模型由美国数学家鲍姆等人在20世纪6070年代提出. 马尔科夫链:也称马尔科夫过程,指符合马尔科夫假设的随机过程. 某个特定的状态序列s1,s2,s3--产生输出序列o1,o2,o3--的 ...

  5. 《数学之美》第5章 隐含马尔可夫模型

    1 通信模型 通信的本质就是一个编解码和传输的过程. 当自然语言处理的问题回归到通信系统中的解码问题时,很多难题就迎刃而解了. 雅格布森通信六要素是:发送者(信息源),信道,接受者,信息, 上下文和编 ...

  6. 《数学之美》读书记录【思维导图记录】:第五章,隐含马尔可夫模型

    隐含马尔可夫模型: 补充资料: 状态转移矩阵: 状态转移矩阵是俄国数学家马尔科夫提出的,他在20世纪初发现:一个系统的某些因素在转移过程中,第n次结果只受第n-1的结果影响,即只与当前所处状态有关,而 ...

  7. 以拼音输入法(自然语言处理)为例,简单理解隐含马尔可夫模型

    最近在学习 语音&搜索 方面的知识,属于从门外汉起步,很多这方面的书在讲解的时候都是要求有相关知识背景或者是一堆公式让像我这样不是学计算机出身而且数学也学得不好的菜鸟看得头晕眼花的,因此特地写 ...

  8. 北京大学生物信息学学习(6)隐含马尔可夫模型

    北京大学生物信息学学习(6)隐含马尔可夫模型 马尔可夫链(时间和状态都离散的状态组合) https://www.bilibili.com/video/BV13t411G7oh?p=14 隐含马尔可夫模 ...

  9. 隐含马尔可夫模型——Hidden Markov models (HMM)

    本文首发于 算法社区 dspstack.com,转载请注明出处,谢谢. 写在前面# 统计学是个好东东,说它是个好东东,因为统计学不像其他有些学科,它不仅在科研领域应用广泛,在平常的生活中我们也会经常碰 ...

  10. 转:从头开始编写基于隐含马尔可夫模型HMM的中文分词器

    http://blog.csdn.net/guixunlong/article/details/8925990 从头开始编写基于隐含马尔可夫模型HMM的中文分词器之一 - 资源篇 首先感谢52nlp的 ...

最新文章

  1. 我的世界java版双海底神殿种子_我的世界海底神殿种子2021
  2. The user specified as a definer ('root'@'%') does not exist
  3. message/maillog日志提示磁盘innode、io错误等,扫描磁盘很多坏道
  4. 【Python】青少年蓝桥杯_每日一题_10.19_回文数和个数
  5. P_C_Brules
  6. sign python_python机器学习
  7. v8学习笔记(五) 编译过程
  8. [Java基础]生产者和消费者模式概述与案例分析
  9. 数据源管理 | 分布式NoSQL系统,Cassandra集群管理
  10. RabbitMQ架构模型(二)
  11. SystemVerilog中根据系统时间产生随机数的函数
  12. centos 文件夹网络连接_CentOS的网络配置的命令详解
  13. windows 本地搭建git仓库_windows局域网搭建本地git代码版本管理仓库
  14. c51汇编语言如何定义全局变量_汇编语言程序访问C语言全局变量
  15. 聚类算法-k均值聚类(K-means)
  16. 已安装pywinrm,仍报错winrm or requests is not installed: No module named winrm
  17. 计算机中的睡眠和休眠
  18. Linux,DNS服务器配置
  19. 幽默故事:1、我喜欢的女神;2、农村淑女(木子家原创)
  20. 从一个男人的角度告诉你如何选老婆 (实在是写的太好了 忍不住转一个)

热门文章

  1. presenting view controller Vs presented view controller
  2. LeetCode 53. 最大子序和 动态规划
  3. 网站报错类型及状态码总结
  4. 雷霆战机单机老版本_雷霆战机下载_雷霆战机电脑版单机游戏下载
  5. 公钥和私钥的区别与应用-----到底谁来加密谁来解密
  6. 这12首极短的诗歌,有极大的魅力
  7. python之禅怎么读_混为一谈的读音
  8. MySQL数据库CPU使用率过高,怎么办
  9. [IDE]webstorm安装并配置sass踩坑(windwos)
  10. 设计原则(单一职能原则,开闭原则,里氏替换原则,依赖倒置原则,接口分离原则,迪米特原则)