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

  隐含马尔可夫模型 -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的几率下雨,如果今天为雨天,明天……,由此我们可以得到一个状态转移矩阵。
数学之美笔录(3):隐含马尔可夫模型(详解)_第1张图片
  要初始化这样一个系统,我们需要确定起始日天气的(或可能的)情况,定义其为一个初始概率向量,称为П向量,如:
(sun=1 cloud=0 rain=0) ,即晴天概率为1
  这样一阶马尔科夫过程定义了以下三个部分:
  状态:晴天、阴天和下雨
  初始向量:定义系统在时间为0的时候的状态的概率
  状态转移矩阵:每种天气转换的概率
  所有的能被这样描述的系统都是一个马尔科夫过程。

  但是在某些情况下,我们并不能直接观测到状态的转换,来看下面的例子:
  在一个房间中,假定有 N 个坛子,每个坛子中都装有不同颜色的小球,并且假定总共有 M 种不同颜色的小球。一个精灵在房间中首先随机地选择一个坛子,从这个坛子中随机选择一个小球,然后把球放回到坛子中,然后再随机选择一个坛子,从中随机选择一个小球,然后放回小球,如此继续…,这样可以得到由这个过程产生的一个小球颜色的序列。
  1)如果令每一个坛子对应与一个状态,令小球颜色对应状态的输出。
  2)可以用一个一阶马尔科夫过程来描述坛子的选择过程。在马尔科夫过程中,每个状态只有一个输出,但在坛子和小球的问题中。可以从每个坛子中拿出不同颜色的小球。也就是每个状态能按照特定的概率分布产生多个输出,状态和输出之间不再是一一对应关系。
  3)在坛子与小球问题中,如果给定一个观察序列(不同颜色的小球序列),不能直接确定状态转换序列(坛子的序列),因为状态转移过程被隐藏起来了。所以这类随机过程被称为隐马尔科夫过程。
数学之美笔录(3):隐含马尔可夫模型(详解)_第2张图片
数学之美笔录(3):隐含马尔可夫模型(详解)_第3张图片
  其中五元组(五要素)可概括为:
  1.状态和状态间转换的概率
  2.不同状态下,有着不同的外在表现的概率。
  3.最开始设置的初始状态
  4.能转换的所有状态的集合
  5.能观察到外在表现的结合

再来看一个抛掷硬币的例子
  三枚硬币,随机选择一枚,进行抛掷,记录抛掷结果。
  可以描述为一个三个状态的隐马尔科夫模型l。
  l = (S, V, A, B, π),其中
  S = {1, 2, 3}
  V = {H,T}
数学之美笔录(3):隐含马尔可夫模型(详解)_第4张图片

那么问题来了:
问题一:
  给定上述模型,观察到下列抛掷结果的概率是多少?
  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: 估算观察序列概率
  对隐马尔可夫模型而言,状态转换序列是隐藏的,一个观察序列可能由任何一种状态转换序列产生。因此要计算一个观察序列的概率值,就必须考虑所有可能的状态转换序列。
数学之美笔录(3):隐含马尔可夫模型(详解)_第5张图片
  上图表示了产生观察序列O = ( o1 o2 o3 … oT )的所有可能的状态转换序列。
数学之美笔录(3):隐含马尔可夫模型(详解)_第6张图片
  理论上,可以通过穷举所有状态转换序列的办法计算观察序列O的概率。
  实际上,这样做并不现实。因为可能的状态转换序列共有N^T个。需要做(2T–1)N^T次乘法运算, N^T–1 次加法运算。若N = 5, T=100,则(2×100-1)×5^100≈10^72
  需要寻找更为有效的计算方法。

向前算法(Forward Algorithm)
数学之美笔录(3):隐含马尔可夫模型(详解)_第7张图片
  这很好懂吧,简单的说,就是按时间分成各个时间段,按不同的时间阶段逐次向前演算。
数学之美笔录(3):隐含马尔可夫模型(详解)_第8张图片
  让我来看之前的抛硬币的例子:
数学之美笔录(3):隐含马尔可夫模型(详解)_第9张图片
数学之美笔录(3):隐含马尔可夫模型(详解)_第10张图片

向后算法(Backward Algorithm)
数学之美笔录(3):隐含马尔可夫模型(详解)_第11张图片
  后向变量(局部概率)表示的是已知隐马尔科夫模型λ及t时刻位于隐藏状态Si,从t+1时刻到终止时刻的局部观察序列的概率。
  注意这里从T+1开始的输出是不存在的(因为T时刻是终止终止状态),即T之后是空,是个必然事件,所以概率为1。
数学之美笔录(3):隐含马尔可夫模型(详解)_第12张图片
数学之美笔录(3):隐含马尔可夫模型(详解)_第13张图片
数学之美笔录(3):隐含马尔可夫模型(详解)_第14张图片
  这里 β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)闪亮登场。
数学之美笔录(3):隐含马尔可夫模型(详解)_第15张图片
数学之美笔录(3):隐含马尔可夫模型(详解)_第16张图片
数学之美笔录(3):隐含马尔可夫模型(详解)_第17张图片
  可以发现,韦特比算法和前向算法很像。

时间复杂度:
  计算某时刻的某个状态的前向变量需要比较前一时刻的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

你可能感兴趣的:(机器学习)