隐马场与中文分词

既然LSTM都OK了,为啥researchers搞一个LSTM+CRF的hybrid model?

哈哈,因为a single LSTM预测出来的标注有问题啊!举个segmentation例子(BES; char level),plain LSTM 会搞出这样的结果:

input: "学习出一个模型,然后再预测出一条指定"

expected output: 学/B 习/E 出/S 一/B 个/E 模/B 型/E ,/S 然/B 后/E 再/E 预/B 测/E ……

real output: 学/B 习/E 出/S 一/B 个/B 模/B 型/E ,/S 然/B 后/B 再/E 预/B 测/E ……

看到不,用LSTM,整体的预测accuracy是不错indeed, 但是会出现上述的错误:在B之后再来一个B。这个错误在CRF中是不存在的,因为CRF的特征函数的存在就是为了对given序列观察学习各种特征(n-gram,窗口),这些特征就是在限定窗口size下的各种词之间的关系。然后一般都会学到这样的一条规律(特征):B后面接E,不会出现E。这个限定特征会使得CRF的预测结果不出现上述例子的错误。当然了,CRF还能学到更多的限定特征,那越多越好啊!

 

  • 我们从如何进行中文分词的角度来理解HMM

原文:https://www.leiphone.com/news/201704/nT29tSWJlJ0WsWL7.html

根据可观察状态的序列找到一个最可能的隐藏状态序列

中文分词,就是给一个汉语句子作为输入,以“BEMS”组成的序列串作为输出,然后再进行切词,进而得到输入句子的划分。其中,B代表该字是词语中的起始字,M代表是词语中的中间字,E代表是词语中的结束字,S则代表是单字成词。

例如:给个句子

小明硕士毕业于中国科学院计算所

得到BEMS组成的序列为

BEBEBMEBEBMEBES

因为句尾只可能是E或者S,所以得到切词方式为

BE/BE/BME/BE/BME/BE/S

进而得到中文句子的切词方式为

小明/硕士/毕业于/中国/科学院/计算/所

这是个HMM问题,因为你想要得到的是每个字的位置,但是看到的只是这些汉字,需要通过汉字来推出每个字在词语中的位置,并且每个字属于什么状态还和它之前的字有关。 

此时,我们需要根据可观察状态的序列找到一个最可能的隐藏状态序列。

五元组,三类问题,两个假设

五元组

通过上面的例子,我们可以知道 HMM 有以下5个要素。

观测序列-O:小明硕士毕业于中国科学院计算所

状态序列-S:BEBEBMEBEBMEBES

初始状态概率向量-π:句子的第一个字属于{B,E,M,S}这四种状态的概率

隐马场与中文分词

状态转移概率矩阵-A:如果前一个字位置是B,那么后一个字位置为BEMS的概率各是多少

隐马场与中文分词

观测概率矩阵-B:在状态B的条件下,观察值为耀的概率,取对数后是-10.460

隐马场与中文分词

备注:示例数值是对概率值取对数之后的结果,为了将概率相乘的计算变成对数相加,其中-3.14e+100作为负无穷,也就是对应的概率值是0

三类问题

当通过五元组中某些已知条件来求未知时,就得到HMM的三类问题:

  • 似然度问题:参数(O,π,A,B)已知的情况下,求(π,A,B)下观测序列O出现的概率。(Forward-backward算法)
  • 解码问题:参数(O,π,A,B)已知的情况下,求解状态值序列S。(viterbi算法)
  • 学习问题:参数(O)已知的情况下,求解(π,A,B)。(Baum-Welch算法)

中文分词这个例子属于第二个问题,即解码问题。

我们希望找到 s_1,s_2,s_3,… 使 P (s_1,s_2,s_3,…|o_1,o_2,o_3….) 达到最大。 

意思是,当我们观测到语音信号 o_1,o_2,o_3,… 时,我们要根据这组信号推测出发送的句子 s_1,s_2,s_3,….,显然,我们应该在所有可能的句子中找最有可能性的一个。

两个假设

利用贝叶斯公式得到: 

隐马场与中文分词

这里需要用到两个假设来进一步简化上述公式 

隐马场与中文分词

有限历史性假设: si 只由 si-1 决定 

隐马场与中文分词

独立输出假设:第 i 时刻的接收信号 oi 只由发送信号 si 决定 

隐马场与中文分词

有了上面的假设,就可以利用算法 Viterbi 找出目标概率的最大值。

Viterbi算法

根据动态规划原理,最优路径具有这样的特性:如果最优路径从结点 i_{t}^ 到终点 i_{T}^,那么这两点之间的所有可能的部分路径必须是最优的。 

依据这一原理,我们只需从时刻 t=1 开始,递推地计算在时刻 t 状态为 i 的各条部分路径的最大概率,直至得到时刻 t=T 状态为 i 的各条路径的最大概率 P^,最优路径的终结点 i_{T}^ 也同时得到。之后,为了找出最优路径的各个结点,从终结点 i_{T}^ 开始,由后向前逐步求得结点 i_{T-1}^…,i_{1}^,进而得到最优路径 I^=i_{1}^…,i_{T}^,这就是维特比算法.

举个栗子: 

隐马场与中文分词

观测序列 O=(红,白,红),想要求状态序列S。

需要定义两个变量:

  • weight[3][3],行3是状态数(1,2,3),列3是观察值个数(红,白,红)。意思是,在时刻 t 状态为 i 

的所有单个路径中的概率最大值。

  • path[3][3],意思是,在时刻 t 状态为 i 的所有单个路径中概率最大的那条路径,它的第 t-1 个结点是什么。比如 

path[0][2]=1, 则代表 weight[0][2] 取到最大时,前一个时刻的状态是 1.

1.初始化

t=1 时的红,分别是在状态 1,2,3 的条件下观察得来的概率计算如下: 

隐马场与中文分词

此时 path 的第一列全是 0.

2.递归

t=2 时的白,如果此时是在 1 的条件下观察得来的话,先计算此时状态最可能是由前一时刻的哪个状态转换而来的,取这个最大值,再乘以 1 条件下观测到 白 的概率,同时记录 path矩阵:如下图 weight[0][1]=0.028,此值来源于前一时刻状态是3,所以, 

隐马场与中文分词

 

隐马场与中文分词

 

3.终止

在 t=3 时的最大概率 P^=0.0147,相应的最优路径的终点是 i_3^=3.

4.回溯

由最优路径的终点 3 开始,向前找到之前时刻的最优点:

在 t=2 时,因 i_3^=3,状态 3 的最大概率 P=0.0147,来源于状态 3,所以 i_2^=3.

在 t=1 时,因 i_2^=3,状态 3 的最大概率 P=0.042,来源于状态 3,所以 i_1^=3.

最后得到最优路径为 I^=(i_{1}^,i_{2}^,i_{3}^)=(3,3,3) 

隐马场与中文分词

用Viterbi算法求解中文分词问题

根据上面讲的 HMM 和 Viterbi,接下来对中文分词这个问题,构造五元组并用算法进行求解。

InitStatus:π 

隐马场与中文分词

TransProbMatrix:A 

隐马场与中文分词

EmitProbMatrix:B 

隐马场与中文分词

Viterbi求解

经过这个算法后,会得到两个矩阵 weight 和 path:

二维数组 weight[4][15],4是状态数(0:B,1:E,2:M,3:S),15是输入句子的字数。比如 weight[0][2] 代表 状态B的条件下,出现’硕’这个字的可能性。

二维数组 path[4][15],4是状态数(0:B,1:E,2:M,3:S),15是输入句子的字数。比如 path[0][2] 代表 weight[0][2]取到最大时,前一个字的状态,比如 path[0][2] = 1, 则代表 weight[0][2]取到最大时,前一个字(也就是明)的状态是E。记录前一个字的状态是为了使用viterbi算法计算完整个 weight[4][15] 之后,能对输入句子从右向左地回溯回来,找出对应的状态序列。 

隐马场与中文分词

先对 weight 进行初始化,

使用 InitStatus 和 EmitProbMatrix 对 weight 二维数组进行初始化。

由 EmitProbMatrix 可以得出 

隐马场与中文分词

所以可以初始化 weight[i][0] 的值如下: 

隐马场与中文分词

注意上式计算的时候是相加而不是相乘,因为之前取过对数的原因。

然后遍历找到 weight 每项的最大值,同时记录了相应的 path

//遍历句子,下标i从1开始是因为刚才初始化的时候已经对0初始化结束了 for(size_t i = 1; i < 15; i++) { // 遍历可能的状态 for(size_t j = 0; j < 4; j++) { weight[j][i] = MIN_DOUBLE; path[j][i] = -1; //遍历前一个字可能的状态 for(size_t k = 0; k < 4; k++) { double tmp = weight[k][i-1] + _transProb[k][j] + _emitProb[j][sentence[i]]; if(tmp > weight[j][i]) // 找出最大的weight[j][i]值 { weight[j][i] = tmp; path[j][i] = k; } } } }

 

如此遍历下来,weight[4][15] 和 path[4][15] 就都计算完毕。

确定边界条件和路径回溯

边界条件如下:

对于每个句子,最后一个字的状态只可能是 E 或者 S,不可能是 M 或者 B。 

所以在本文的例子中我们只需要比较 weight[1(E)][14] 和 weight[3(S)][14] 的大小即可。

在本例中:

weight[1][14] = -102.492;

weight[3][14] = -101.632;

所以 S > E,也就是对于路径回溯的起点是 path[3][14]。

进行回溯,得到序列

SEBEMBEBEMBEBEB。

 

再进行倒序,得到

BEBEBMEBEBMEBES

 

接着进行切词得到

BE/BE/BME/BE/BME/BE/S

 

最终就找到了分词的方式

小明/硕士/毕业于/中国/科学院/计算/所

 

HMM不只用于中文分词,如果把 S 换成句子,O 换成语音信号,就变成了语音识别问题,如果把 S 换成中文,O 换成英文,就变成了翻译问题,如果把 S 换成文字,O 换成图像,就变成了文字识别问题,此外还有词性标注等等问题。

对于上述每种问题,只要知道了五元组中的三个参数矩阵,就可以应用 Viterbi 算法得到结果。

 

 

  • 机器学习之语音识别与隐马尔科夫模型(HMM):

https://blog.****.net/u011411283/article/details/51689262 写的极好!!!不过浅显,适合入门

 

 

 

 

论文下载地址:https://www.tandfonline.com/doi/abs/10.1080/00401706.1991.10484833

使用隐马尔科夫进行语音识别

作者:B.H.Juang,L.R.Rabiner

语言语音研究所,Bell实验室

Murray Hill,NJ 07974

摘要:

       在近几年发表的论文和大型语言语音会议上中,隐马尔科夫定律已经成为语音识别研究的主导方法。这个方法之所以如此流行就在于其固有的统计框架:从有限语音训练集数据中训练出模型近似参数的简单易行;模型可根据特殊的词汇、声音等改变认知系统的大小、种类或模型的架构的灵活多变;实现整个认知系统的简单方便。在这篇解释性的文章中,我们将讲解应用在语音识别中的非常重要的统计方法,并讨论一系列尚未解决的原理性的和实际性的问题,因为他们很重要并对不同系统实现的性能有很大影响。

关键词:

       Baum-Welch算法,Incomplete data problem ,Maximum a posteriori decoding;极大似然度

 

       机器语音识别已经达到了可以投入到实际使用的水平了。大量的语音识别系统已经应用在众多应用领域如语音拨号、语音应答、语音查询股价、语音报价等。导致这些有用的技术能够应用于实际是因为最近技术的进步使得语音认知系统能辨别不同的说话者并达到了一定量的认知词汇。其中的一项进步就是统计方法的使用,马尔科夫模型就是其中一个很有趣的方法。

       使用HMM来进行语音识别在过去的一段时间内很流行。虽然报告过的大量基于HMM的语音认知系统不易在此深入地讨论,列出其中最重要的部分和这些系统的成功之处仍然是值得的。其中包括在卡内基梅隆大学早期进行的Dragon System的工作,IBM公司在语音系统方面进行的长期的工作,在Bell实验室的工作,MIT林肯实验室的工作,Philips在使用HMM进行的整词识别的工作,DARPA资源管理任务,及其它在该相关领域的众多的工作。HMM的广泛流行可以归功于它简单的算法结构和它相对于其它语音识别方法的清晰高效性。

       性能,特别是精度,是评价一个语音认知系统实际价值的关键因素。语音识别任务经常根据它的需求,如是处理特定的还是非特定说话者,处理单个词汇的输入还是连续的一个句子的输入,来进行分类。如今,该技术能够轻松达到对非特定说话者的精确识别,当识别由非特定说话者说出的连续数字字串时,错误率仅有2-3%.更进一步,但在非特定说话者以特定的语法限制说出连续1000个词时,一些使用HMM的系统证实可以达到96%的识准率。这些结果说明了自动语音识别系统在指定的应用中的有用性和可用性。

       虽然隐马尔科夫模型显著地改善了当前语音识别系统的性能。完全流利的、非特定说话者的语音识别仍是一个普遍存在并等待着解决的问题。例如,没有一个系统能够识别没有限制(话题)的对话语音,也没有一个好的方法使用借助于有限语料库的统计方法去推断语言的结构。这篇解释性的文章的目的是提供HMM的原理的一个概述,讨论统计方法的作用,并指出一系列值得注意和理解的原理性和实践性问题,以便于推动语音识别这一领域的发展。

 

1.语音的度量和建模

语音是不稳定的信号量。当我们说话时,我们的发音器官(嘴唇、下颚、舌头,如图1所示)调节空气压力并影响气流产生一系列的声音。虽然任何一个声音的范围会是在几千赫兹的范围内,我们的关节配置(声道形状,舌头移动等)经常不能忍受每秒超过10次的动态变化。语音建模包括两个方面:(1)以10毫秒采样分析不同声音的短时间的范围属性,(2)根据关节配置的不同,以100毫秒采样去分析长时间声音的变化特征。

 

2.隐马尔科夫模型统计方法

       在HMM方法发展的过程中,如下问题显得特别有意思。首先,给出一个观察序列O和一个模型λ,我们怎么样有效的度量模型λ产生观察序列O的概率,即Pr(O|λ)?第二,给出观察序列O,反过来我们怎么解决估算模型λ中的参数?虽然(8)中的概率不完全依赖于q,(译者注:(8)是在论文前出现的一个公式),关于导致观察序列O的最可能的状态序列q的信息在很多的应用中都是需要的。第三个问题就是怎么有效地从观察序列O中推出最有可能的状态序列q.通常我们将这三个问题称为(1)评估问题(2)估计问题(3)解释问题。

在下面的段落中,我们将描述几个对这三个问题通用的解决方法。

2.1 评估问题

       在评估问题中主要关注的是计算的效率。如果没有复杂度约束,可以直接简单的直接计算出Pr(O|λ).在公式(8)中,一共有个可能的q序列。总共的计算需要2*T*个操作。计算公式(8)同时没有指数级增长的计算量,是HMM技术实现的第一个挑战。

幸运的是,使用著名的前向-后向算法,这个昂贵的计算开销可以轻松的减轻。

 

2.2 估计问题

       给出一个观察序列(或一个序列的集合)O.估计问题包括找到合适的模型参数使模型最可能产生给定的序列。在语音识别中,这经常被称为“训练”。我们用来获取模型参数的给定序列,被成为训练序列,即使这儿的准则是统计的。

 

2.3 解释问题

       正如前面所说的,我们经常对找到产生观察序列O极大似然度的状态序列感兴趣。

虽然HMM的概率度量定义中没有涉及到状态序列,在很多的应用场合中仍然需要知道极大似然度的状态序列。举个例来说,如果我们使用一个词汇模型的状态来代表该词汇中的特定的声音,就有必要知道语音片段和词的声音之间的关系,因为单独的语音片段为语音识别提供了有用信息。

 

2.4 使用HMM进行语音识别

       HMM在语音识别中的应用和其他传统的模式匹配方法差不多。成功的使用HMM算法包括一下步骤:

1.定义一个用来建模的L声音类的集合。例如音素或词汇,定义声音类V={v1,v2,..,v3};

2. 对于每一个类,积累一定量的已知的标记语音集合。

3.在训练集合的基础上,解决估计问题,为每个类Vi获取一个最好的模型λi.

4. 在认识的过程中,对每个未知观察序列O估计Pr(O|λi)(i=1,2,…,L)),并为每个类Vi确定产生O的语音.其满足:

Pr(O|λi) =  Pr(O|λi)

本文将不详细地描述如何实现一个HMM识别器。感兴趣的读者可以阅读Jelinek,Bahl,Mercer(1975)及Levinson,Rabiner,Sondhi(1983)的文章。

 

 

3.使用隐马尔科夫模型进行语音识别的优点

       HMM方法的优点体现在两个大的方面:(1)它的数学框架和(2)它的实现结构。在数学框架方面,我们讨论问题的连续统计方法学和它为相关问题提供的直接的解决方案。

在实现结构方面,我们讨论它在处理不同的、复杂的语音认知任务的灵活性和实现的简单性,这些都是在实际工程领域中需要考虑的关键问题。

3.1          HMM方法学的连续统计框架

3.2          HMM的训练算法

3.3          模型灵活性

 

4.进一步考虑隐马尔科夫定理的问题

5.总结

       在这篇文章中,我们复习了HMM的统计学方法,展示了这个方法的统计学框架及由其带来的灵活性和通用性,特别是在语音识别方面,以及其实现的简单性,使其在工程实现方面显出优势。我们还指出了在一般的HMM方法中值得注意的方面,希望有人能在这些方面取得进步,这些进步将会大大提高性能。这些领域包括建模标准,特别是最小分类错误,将新的特征和之前的语言学知识的融合,对状态的建模和其在语音识别领域中的应用。根据我们现在的理解,HMM系统识别非特定说话者在一定量词汇量的语音识别率已经高达95%。随着技术的发展,不难预料到基于HMM模型的语音识别系统将能应用到我们的日常生活中去。