深度学习时代之前,基于GMM-HMM的方法在语音识别领域曾被广泛应用。本文主要对参考博文进行翻译,介绍HMM的三大基本问题:前向算法、解码、训练,同时简要介绍其如何结合GMM进行语音识别。与原文相比省略较多,有能力的可以阅读原文。
PS:本文适合对HMM及语音识别有一定了解的人阅读;或只想得到一些直观理解;大部分公式未作详细解释。
语音识别
利用HMM进行语音识别的基本原理如下图。
语音识别的主要目的就是构建统计模型,由输入特征向量X推断文本序列W,即
利用贝叶斯公式即可得到
,其中
为一段固定音频的特征序列的概率,因此省略。
从上面的推断中可以判断出模型主要包括的两部分:语言模型
,和声学模型
。此外,通常还需要一个发音字典模型。模型的基本结构如下。
发音字典模型用于将字词转换成音素(即最小发声单元)的组合。语言模型的功能是让识别出来的句子更符合日常使用的意义,如"the rose is red"和"the rose is read"都可能出现在识别结果中,使用语言模型后可以提升前者的输出概率。而声学模型的本质有点类似一个生成模型,因为它的概率意义是在给定句子W的条件下输出特征X的概率(给定音素状态W条件下产生观测特征X的概率)。
通过结合声学模型和语言模型,我们就能够利用最大似然的方法对最佳文本序列进行搜索。
这个公式可能看起来不太直观,但其中的组成部分都是很容易进行建模的。语言模型在传统方法中借助N-GRAM即可完成建模。声学模型部分
在语音识别中也容易表达。首先,从训练数据中为每一个音素学习一个GMM分布。接着,音素之间的转移和音素到观测状态之间的发射利用HMM模型建模。最后,我们只需要寻找一条最优路径来对观测状态和音素进行解码即可。
一个HMM模型由隐变量和观测变量构成。如下图,上面的节点代表音素(隐变量),下面的节点代表音频特征(观测变量);水平箭头表示音素之间的转移,竖直箭头表示音素到对应特征之间的变换。
下面是ASR系统的一种实现框图。
经过上面的介绍,我们现在可以知道,我们能够利用HMM来对一个声学模型
进行建模。HMM用来表示音素的转移和音素与观测状态之间的联系;GMM模型用来对观测状态(音频特征)进行建模。之所以要用GMM来对特征进行建模,是因为即使相同的音素,不同时刻、不同人表达出来的也会不一样,因此需要用概率模型对其建模表示。
Hidden Markov Model (HMM)
介绍隐马尔可夫模型首先要介绍马尔可夫链。一个马尔科夫链或者说马尔可夫过程,简单来说,就是几个状态之间以一定概率进行互相转换的过程。下图左边是一个马尔可夫过程,右边是其对应状态之间的转移概率矩阵。
但是在机器学习中,通常不是所有的变量都可以被观测到,无法被观测到的变量就称之为隐变量。下面是一个简单的示例,不需要管字母的意义,只简单理解转换关系即可。它与上面的一张图片很类似。上面的节点称为隐状态,下面的节点称为观测状态。隐状态之间的相互转换的概率称为转移概率;由隐状态生成观测状态的概率称为发射概率。
对语音识别来说,隐变量就表示音素,观测变量就表示音频特征。因为通常我们能得到的是一段音频和其对应的特征,我们需要的是其潜在的音素的变化,这不是明面上的东西,是隐含在特征变化规律之中的。
Likelihood with the forward algorithm
对于一个给定的HMM模型,我们可以使用前向算法来计算观测的概率。其基本计算公式如下:
单从计算公式出发,当时间步增加时,计算量将呈指数倍增加。因此需要采用更聪明的方法——动态规划。即每个时间步利用上一时间步已经计算好的结果进行计算,这样可以将计算量压缩在线性范畴。
在t时刻,时间t之前的观测状态出现的概率为:
将红线部分
定义为前向概率,该概率可以迭代计算:
由于我们在每一步计算前向概率时都只用到了上一步计算的结果,所以每个时间步的计算量为
,k为隐藏状态的数目。因此总的计算复杂度为
。
下面是前向算法的总步骤,每个符号的解释很明确。
Decoding (find the internal states — Viterbi algorithm)
解码是三大基本问题中的第二个,通常采用维特比解码。
首先介绍一些基本符号。考虑时间t时隐状态为j,
表示观测序列由最佳隐状态序列产生的联合概率。
从上面的计算公式可以看出,
也可以通过迭代计算得到,这与前向算法类似,只不过前向算法中的求和变成了取最大值。
以下图为例,纵轴是隐状态的马尔科夫链,横轴是每个时间步的观测值。可以看见,从开始状态到结束状态,许多条路径(马尔科夫链上状态的转换)都可以产生目前的观测值序列,但其中有概率最大的一条(以红色为例)。这条路径就是我们解码时需要找到的最佳路径。
Learning (Baum–Welch algorithm/forward-backward algorithm)
第三个基本问题是训练问题,如何学习一个HMM模型?通常采用的是Baum–Welch算法,也叫前向后向算法。
HMM建模的对象主要是隐状态的转移概率和隐状态向观测状态的发射概率。如果我们知道状态出现概率(t时刻的状态分布),我们就可以推导发射概率和转移概率;如果我们知道发射概率和转移概率,我们也能够推导出t时刻的状态分布。这种“鸡和蛋”的问题通常可以用EM算法解决。EM算法在每一步迭代时,先后固定一部分变量,去更新另一部分变量,在不断的迭代中使模型逐渐收敛。
在介绍Baum–Welch算法之前,先熟悉一些符号。
其中
在前向算法中已经介绍过,称前向概率。
称后向概率,来自后向算法。后向算法基本原理与迭代过程与前向算法基本一致。只不过换了个方向。
可以看出,前向算法与后向算法,区别只在于各自先看见的观测状态的时间顺序。前向算法先看见前面的观测状态,进而推测后面的;后向算法先看见后面的状态,再推测前面的。
要学习HMM模型,我们需要知道用哪个状态能最好描述我们的观测。这就引出了状态出现概率
——表示在给出所有观测值的条件下,在时间t,隐状态为i的概率。状态出现概率
可以由前向后向概率计算得到。结合前向后向概率的意义很好理解。
是在给定所有观测值的条件下,在t时刻,隐状态从i转移到j的概率。同样可以由前向后向概率计算得到。
在给定一个HMM模型后(可能是初始化模型),我们通过观测值定义
和
:
接着,在有了
和
之后,我们对HMM模型中的转移概率和发射概率进行修正,就完成了一次EM算法的迭代过程。
顺便看看EM算法的公式化表达:
下图对上述EM算法的流程做了个很好的回顾:
GMM
高斯混合模型其实就是对每个音素的39维MFCC特征进行拟合。训练时利用含标签的数据进行拟合;检测时利用最大似然推测音频特征概率最大的音素。
结语
本文简单介绍了HMM的三大问题,对其在语音识别中的应用做了直觉性描述。许多地方结合了自己的理解,可能不准确,大家批判性阅读,欢迎指正。