这篇文章主要介绍目前一些语音识别技术与HMM有什么关系,然后你就会发现,很多技术其实有借用HMM的思想
过去,我们用统计模型的方式来做语音识别。$X$是输入语音序列,$Y$是输出文字,我们的目标是穷举所有可能的$Y$,找到一个$Y^*$使得$P(Y|X)$最大化。这个过程叫作解码。根据贝叶斯定律,我们可以把它变成$frac{P(X|Y)P(Y)}{P(X)}$。由于$P(X)$与我们的解码任务是无关的,因为不会随着$Y$变化而变化。所以我们只需要算$argmaxP(X|Y)P(Y)$。前面这项$P(X|Y)$是Acoustic Model,HMM可以建模,后面那项$P(Y)$是Language Model,有很多种建模方式
之前我们有讲到输出的$Y$可以有很多不同的粒度,比如拿音标,字或词。但这些单位,对HMM的隐变量来说,都太大了。所以我们需要将$P(X|Y)$建模变为$P(X|S)$建模,S为状态,是人定义的,它是比音素 Phoneme 还要小的单位。序列中的每一个音素,都会受到前后音素单位的影响。我们会用一个Tri-phone,把当前的每一个音素,都加上它前后的音素,相当于把原来的音素切得更细。这样d后面的uw,和y后面的uw表达出来就会是不同的单位
假设我们有一段声音信号$X$,它包含了一系列特征向量。我们会先从Start状态转移到第一个状态,发射出一些向量,再到第二个状态,发射出一些向量……以此类推,直至走到END状态
一个状态有两种概率,一种是转移概率,如$P(b|a)$,即当前状态转移到其它状态或不转移状态的概率,另一种是发射概率,如$P(x|"t-d uw1")$,即该状态发射出某个样子的声学特征向量的概率。 假设每一个状态,它产生出来的声学特征向量有一个固定的分布。我们可以用高斯混合模型,GMM来表示这个概率。这便是为什么我们要用比Phoneme还要小的单位来表示状态。因为我们要假设每个状态发射出来的分布稳定。为什么我们不用字符单位来当作状态呢?c这个字母它的发音不是固定的。它在很多时候是发"ke",但它在h后面就发音"ch"。这样就不适合拿来当作HMM的状态
但我们需要多少的高斯混合模型呢?我们需要30^30×3这么多模型。很多的State在训练中只出现一两次,你根本就估计不准它的高斯混合分布。所以过去有很多关键性的技术叫作Tied-state。它假设某些State的发音就是一样的,所以可以共用同样的高斯混合分布,来减少使用的高斯混合模型的数量。这就好比你有两个命名不一样的指针,都指向了同样的内存。 这个方法在经过很多年很多年的研究之后,就产生了一个终极形态Subspace GMM。所有的State都共用同一个高斯混合模型。它有一个池子,里面有很多高斯分布。每一个State,就好比是一个网子,它去这个池子中捞几个高斯分布出来,当作自己要发射的高斯混合分布。所以每个State既有不同的高斯分布,又有相同的高斯分布。这篇是来自ICASSP 2010年的论文。有趣的是,Hinton在同年也在该论坛上发表了一篇关于深度学习的ASR的论文。但当时大家的注意力都在前一篇论文上,Hinton的研究并没有受到很多重视。原因在,它的表现当时不如SOTA
假设我们已经用给定好的数据算好了发射概率和转移概率,但我们还是算不出$P(X|S)$的概率。这个关键技术叫做Alignment。我们需要知道哪一个声学特征,是由哪一个状态产生的,才有办法用发射概率和转移概率去计算$P(X|S)$。假设我们有3个状态abc。我们需要知道把它变成aabbcc的序列才可以和声学特征对齐一样。我们会存在很多各种不同可能的对齐方式,比如abbbbc。给定的候选对齐状态不同,算出来产生的声学特征的概率也就会不一样。我们就需要穷举所有可能,找到它产生与观测X的声学特征概率最大,最一致的对齐方式。这便是HMM在解码过程中在做的事情
HMM中没有深度学习。当深度学习崛起的时候,人们就开始思考怎么把深度学习用进去。最早的想法都是基于HMM的变体。第一个最常见的方法是Tandem。它在2009年就已经满街都是。它没有变动HMM的模型。深度学习在做的是,怎样获得更好的声学特征。之前的声学特征用的是MFCC做的。而深度学习在做的是,输入一个MFCC,预测它属于哪个状态的概率。接着我们把HMM的输入,由深度学习的输出取代掉声学特征。我们也可以取最后一个隐层或者是bottleneck层
第二个方法是DNN-HMM的混合模型。HMM中有一个高斯混合模型。我们想把它用DNN取代掉。高斯混合模型是给定一个状态,预测声学特征向量的分布,即$P(x|a)$。而DNN是训练一个State的分类器,计算给定一个声学特征下,它是某个状态的概率,即$P(a|x)$。我们用贝叶斯定律,可以得到$P(x|a) = frac{P(a|x)P(x)}{P(a)}$。$P(a)$可以通过在训练资料中统计得到。$P(x)$可以忽略。有人会觉得这个混合模型的厉害之处在把生场模型HMM中加入了判别模型。这个很早就有人做了,没什么稀奇。也有人觉得他厉害之处在于用有更多参数的深度神经网络替换了GMM。但这小看了参数量也大起来时GMM的表征能力。实际上,这篇论文的贡献在,它让所有的给定观测计算当前可能状态概率,都共用了一个模型。而不是像GMM那样,有很多不同的模型。所以它是一个非常厉害的状态标注的方法。DNN可以是任何神经网络,比如CNN或者LSTM
我们要如何训练一个状态分类器呢?它的输入是一个声学特征,输出是它是某个状态的概率。我们训练这个之前,需要知道每个声学特征和状态之间的对应关系。但实际中的标注数据都是没对齐的。过去的做法是训练一个HMM-GMM,那这个粗糙的模型去做找出一个概率最大的对齐。然后再根据声学特征与状态之间的对齐数据,去训练状态分类器
接着,我们再拿这个训练好的状态分类器,替换掉原来的 HMM-GMM 再对数据对齐,来训练出一个更好的状态分类器。我们反复重复这个过程。用训练得到的DNN去对数据做对齐,再用对齐的数据去训练一个新的DNN
这个方法很强吗?它很强。微软就是用这个方法,在2016年的时候,让语音识别超过了人类水平。实际生产中,因为要考虑到推断速度,端对端的深度学习模型并不多,除了谷歌的手机助理。大部分都是混合模型。语音识别的公认错误率指标大概在5%左右,就已经很强了。专业听写人员就在这个水平。因为正确答案也是人标注的,也存在5%左右的错误率。模型能达到5%算是极限了。很难再往上提升了
在微软的文献中,他们训练了一个49层的残差神经网络。输出有9000个状态类别,输出是一个向量,用的是Softmax作归一化
总结:以前只知道深度学习模型是可以和CRF,为发射概率矩阵建模。没想到它也可以与HMM接,而且思路还是一样的