统计语言模型和隐马尔科夫模型

”数学之美”是一本科普书籍,作者吴军是语音识别,自然语言处理方面的专家。这本书讲了一些数学在语音识别,自然语言处理方面的应用。

第三章和第五章分别讲了统计语言模型和隐含马尔可夫模型,很有意思,这篇文章做一下总结。

语音识别要解决的问题是,我们拿到了一段语音,如何推测出原始的文本是什么。假设这段语音的内容是”你好“,那么我们希望根据语音能推测出原始文本是”你好“。

我们把语音看做一个序列,o1, o2, o3, … , on,每个字母代表一个语音片段,原始文本看做另一个序列s1, s2, s3, … , sn。

假设语音是汉语,那么我们s1, s2, s3 … sn是汉字的序列。一般的思路是,我们尝试找出一定的规则,在给定语音序列的时候,推测出文字序列。或者我们可以换一个思路。因为我们已知文字序列是汉字的序列,那么汉字组成的序列的数量是有限的,在给定语音序列的时候,我们计算出每个汉字序列出现的概率,概率最大的那个组合就是我们想要的汉字序列。

例如给定语音序列o1, o2, o3, … , on,我们计算出P(”中国“) = 0.9, P(”你好“) = 0.6, 那么中国就更可能是语音对应的文本。

也就是说我们无法100%根据语音推算出原始文本是什么,我们只能说,给定语音,我们认为原始文本是s1, s2, s3, …, sn的概率最大。也就是P(s1, s2, s3, … | o1, o2, o3, …)最大。那么如何计算P(s1, s2, s3, … | o1, o2, o3, …)呢?

根据贝叶斯公式,

1
P(s1, s2, s3, ... | o1, o2, o3, ...) = P(o1, o2, o3, ... | s1, s2, s3, ...) P(s1, s2, s3, ...) / P(o1, o2, o3, ...)

因为o1, o2, o3是语音序列,这个序列一旦产生就不会再变了,因此P(o1, o2, o3, …)是一个可以忽略的常数,最大化P(s1, s2, s3, … | o1, o2, o3, …),相当于最大化P(o1, o2, o3, … | s1, s2, s3, …) P(s1, s2, s3, …)。

我们先来计算P(o1, o2, o3, … | s1, s2, s3, …),按照条件概率

1
P(o1, o2, o3, ... | s1, s2, s3, ...) = P(o1|s1...)P(o2|o1,s1...)P(o3|o2,o1,s1...)...P(on|o(n-1)...o1,s1...)

这个概率计算还是比较复杂的,有一个简化的办法,我们假设o(t)仅仅和s(t)相关,这个假设叫做独立输出假设。这样一来上面的等式可以简化为:

P(o1, o2, o3, … | s1, s2, s3, …) = P(o1|s1)P(o2|s2)P(o3|s3)…P(on|sn) = ∏P(ot|st)

我们用这个简化的概率来近似原来的概率。

然后来看P(s1, s2, s3, …),同样根据条件概率

P(s1, s2, s3, …) = P(s1)P(s2|s1)P(s3|s1,s2)…P(sn|s1, s2, …)

同样我们简化这个概率的计算,我们假设s(t)仅仅和s(t-1)相关,也就是说一个状态仅仅和前一个状态有关,这个假设叫做马尔科夫假设。

1
P(s1, s2, s3, ...) = P(s1)P(s2|s1)P(s3|s2)...P(sn|s(n-1)) = ∏ P(s(t) | s(t-1))

现在我们来看如何计算∏P(ot|st)和∏ P(s(t) | s(t-1))。这两个值可以用人工标注的数据来估算。

我们可以选择很多语音片段,然后人工标注对应的文本,也就是说我们准备了很多(s1, s2, …, sn)到(o1, o2, …, on)的对应关系。

我们注意到

1
P(ot|st) = P(ot, st) / p(st)。

在标注数据中,我们统计ot和st同时出现的次数,N(ot, st),把这个值除以整个标注数据的大小N,这里的N可以是所有标注数据的序列长度之和。那么根据大数定理,在有足够多的数据的情况下

1
N(ot, st) / N ≃ P(ot, st) / p(st) 。

再来看P(s(t) | s(t-1)),同样因为P(s(t) | s(t-1)) = P(st, s(t-1)) / P(s(t-1)),而通过标注的数据,我们统计st和s(t-1)同时出现的次数N(st, s(t-1)),然后除以标注数据的大小N, 那么

1
N(st, s(t-1) / N ≃ P(st, s(t-1)) / P(s(t-1)) 。

也就是说,通过标注的数据,我们就可以计算出∏P(ot|st)和∏ P(s(t) | s(t-1)),而通过∏P(ot|st)和∏ P(s(t) | s(t-1)),我们可以计算出,在给定o1, o2, …, on序列的情况下,每种s1, s2, …, sn的概率,最大概率的那个序列就很可能是语音的原始文本。这样就实现了语音识别的功能。

P(o1, o2, o3, … | s1, s2, s3, …)被称作声学模型,而P(ot|st)和P(s(t) | s(t-1))就是模型的参数,在给定标注数据的情况下,我们可以计算出模型的参数。而根据模型参数,给定o1, o2, …, o3序列,我们可以计算出每个s1, s2, …, sn序列的概率。