浅谈语音识别基础

承接前面的《浅谈机器学习基础》、《浅谈深度学习基础》和《浅谈自然语言处理基础》,主要参考了《解析深度学习:语音识别实践》以及其它相关博客和Wikipedia。

简介

其实自动语音识别(Automatic Speech Recognition,ASR)这个研究领域已经活跃了五十多年,但一直并没有真正成为一种重要的人机交流的形式,一个是缘于当时技术的落后,语音技术在大多数实际用户实际使用的场景下还不大可用;另一个是,很多情况下使用键盘、鼠标这样的形式比语音更有效、更准确、约束更小。

近年来,首先是,由于摩尔定律持续有效,今天可用的计算力仅仅相比十几年前就高了几个量级;其次是,借助越来越先进的互联网和云计算,我们得到了比先前多得多的数据资源。最后,移动设备、可穿戴设备、智能家居设备、车载信息娱乐系统正变得越来越流行,在这些设备和系统上,鼠标和键盘不再那么便捷了,而对话交互会成为人机交互的未来。

语音技术同时可以促进人类之间的交流(HHC)以及人机交流(HMC),HHC比如,发送给他人的语音消息可以转化为文字方便阅读,采用语音输入也更为便捷,语音识别技术还可以用来将演讲和课程内容进行识别和索引;HMC比如,语音搜索、个人智能助理、声控游戏、智能家居等。

一个语音对话系统一般包含四个主要组成部分中的一个或多个:语音识别系统将语音转化为文本、语义理解系统提取用户说话的语义信息、文字转语音系统将内容转化为语音、对话管理系统连接其他三个系统并完成与实际应用场景的沟通。如下图:


语音对话系统的组成

这里我们只关注语音识别系统,语音识别系统主要由四部分组成:信号处理和特征提取、声学模型(AM)、语言模型(LM)和解码搜索部分。如下图:


语音识别系统的架构

信号处理和特征提取是语音识别系统的第一部分,接受最原始的音频信号,通过消除噪声和信道失真对语音进行增强,将信号从时域转化到频域,并为后面的声学模型提取合适的有代表性的特征向量。

声学模型以特征提取部分生成的特征为输入,为可变长特征序列生成声学模型分数。

语言模型估计通过训练语料学习词与词之间的相互关系,来估计假设词序列的可能性,又叫语言模型分数。如果了解领域或任务相关的先验知识,语言模型的分数通常可以估计的更准确。

解码搜索综合声学模型分数与语言模型分数的结果,将总体输出分数最高的词序列当做识别结果。

或者看这张图:


语音识别就是一个先编码后解码的过程,信号处理和特征提取就是编码的过程,也即图中的Feature Extraction,特征抽取,由原始的语音得到语音向量。后面即是对语音向量的解码,而解码需要的Acoustic Model、Language Model就是上面提到过的声学模型和语言模型。声学模型这篇文章会着重讲,语言模型就是《浅谈自然语言处理基础》里面提过的N-gram那部分。

声学模型处理的问题主要在于特征向量序列的可变长音频信号的丰富变化性,因为语音长度是不确定的,所以特征向量序列的长度也是不确定的,我们一般通过动态时间规整方法和隐马尔可夫模型来处理。音频信号的丰富变化性指,音频信号的多样性会由说话人的性别、健康状况、紧张程度、说话风格以及环境噪声、周围人声、信道扭曲、方言差异、非母语口音等各种原因所引起。

在过去,信号处理和特征抽取一般用梅尔倒谱系数或者相对频谱变换-感知线性预测
作为特征向量,然后使用混合高斯模型-隐马尔可夫模型(GMM-HMM)
作为声学模型,然后再用最大似然准则(maximum likelihood,ML)去训练,再之后序列鉴别性训练算法,比如最小分类错误(MCE)和最小音素错误(MPE)等准则被提了出来。

近些年,分层鉴别模型比如DNN,变得可行起来,比如上下文相关的深度神经网络-隐马尔可夫模型(context-dependent DNN-HMM,CD-DNN-HMM)就比传统的GMM-HMM表现要好得多。这篇文章将会着重介绍CD-DNN-HMM。

混合高斯模型

这里先说一下什么是高斯分布,高斯分布就是正态分布。如下图:


红色的是标准的正态分布,µ指均值,σ^2指方差,方差越大,分布越分散。

正态分布

E(x) = μ,var(x) = σ^2 = r^(−1)

正态分布的累积分布函数如下图所示,与前面提过的Sigmoid函数类似:


累积分布函数

上面说的只是普通的高斯分布,还有混合高斯分布,不同于高斯分布的单模态性质M=1,混合高斯分布是多模态的M>1,是多个高斯分布的按权叠加,如下式:


混合高斯分布

另外还有多元高斯分布和多元混合高斯分布,是将相应的高斯分布推广到多变量:


多元高斯分布
多元混合高斯分布联合

这里的x就不再是一个值而是一个向量,拥有多个维度。Σm是协方差矩阵,前面讲PCA主成分分析时提到过,协方差矩阵用于描述不同维度变量之间的相关关系。

在这里,如果变量x的维度很大,那么使用全协方差矩阵(非对角)将引入大量参数,为了减少这个数量,可以使用对角协方差矩阵,或者所有M模态都使用同样的协方差矩阵。

前面说,协方差矩阵用于描述不同维度变量之间的相关关系,如果我们采用了对角阵,看似是假设了数据向量的各个维度不相关,但是实际上,因为混混合高斯模型具有多个高斯成分,多个模态,所以虽然每个成分都使用了对角协方差矩阵,但总体上至少可以有效地描述由一个使用全协方差矩阵的单高斯模型所描述的向量维度相关性。

对GMM相关参数变量的训练,需要用到EM算法,这个算法在《浅谈自然语言处理基础》中有详细的讲解。

讲完了高斯模型,我们需要讨论一下如何利用混合高斯分布对语音特征建模的问题。

原始语音数据经过一些处理(如短时傅里叶变换形式或者取倒谱)后会成为特征序列,在忽略时序信息的条件下,可以以帧为单位,用GMM对语音特征进行建模。GMM因其拟合任意复杂的、多种形式的分布能力而广为人知。

如果把语音顺序信息考虑进去,GMM便不再是个好模型,因为它不包含任何顺序信息,所以这里我们要引入隐马尔可夫模型(HMM)与GMM结合,来处理时序问题。

我们利用GMM对HMM每个状态的语音特征分布进行建模,《浅谈自然语言处理基础》也详细讲过HMM了,这里的GMM就相当于描述状态的符号发射概率,对于属于该状态的语音特征向量的概率分布进行建模。

GMM尽管有着众多优势,但也有一个严重的不足,就是GMM不能有效地对呈非线性或近似非线性的数据进行建模。比如描述一个球面,如果选择合适的模型,只需要很少的参数,而GMM却需要非常多对角协方差高斯分布或相当多的全协方差高斯分布。

隐马尔可夫模型及其变体

前面的文章已经详细的讲过了HMM的基础内容,这里着重说一下之前没有覆盖到的部分。

先说什么是马尔可夫链的稳态分布。

我们讲过HMM有初始条件概率分布矩阵π和状态间转移概率矩阵a,这部分就源自马尔可夫链。考虑这样一个问题,我们可以直观的感受到,从一个固定的初始状态出发,马尔可夫链第n步之后的分布和初始状态以及n都是相关的,同时与初始状态的相关性会随着时间增长而衰减。但在理论研究和实际应用的很多情形下,我们并不希望第n步后的分布取决于初始位置和n。

所以由此引出了一种具有稳态分布的马尔可夫链,这种马尔可夫链满足一定的条件,使得该马尔可夫链之于这个稳态分布是渐进无偏的,也即无论初始分布如何,马尔可夫链到它的稳态分布都是渐进收敛的。具有稳态分布的马尔可夫链,从任何初始状态出发,第n步分布在n趋于无穷的时候都会趋近于同样的稳态分布。

另一点对于HMM要提到的,如果HMM各个状态的观测概率分布没有任何重叠,那么这样的序列便不是一个隐马尔可夫模型,因为尽管状态有了随机性,但对一个特定的状态而言,由于概率分布没有重叠,某个固定范围内的观察值总能找到唯一的状态与之对应,那在这种情况下,HMM便退化成了马尔可夫链,也即相当于只有单重随机过程。

前面简单的提到了GMM与HMM的结合,这里详细说一下。GMM用于描述HMM中给定状态下的符号发射概率,有多少种状态就有多少个GMM,每个状态自己独占一个GMM。然后相当于我们有了一张GMM分布图,是这个状态下的不同符号的发射概率,这样给定输出符号就能在相应的GMM图中找到该状态产生该指定符号的概率,横坐标就是输出符号,纵坐标是生成概率。当然如果M=1,那混合高斯分布就退化成了高斯分布。

在HMM中,输出序列用于描述语音特征向量,而状态序列代表相应的文字,所以语音识别问题就是HMM中的解码问题,在HMM中,我们用维特比算法来解码,得到概率最大的状态序列。

维特比算法所找到的针对一个从左到右传播的HMM的最佳状态转移路径,等价于确定最优HMM状态分割所需要的信息。状态分割的概念在语音建模和识别中最常用于从左到右传播的HMM,其中每个HMM状态通常与较大数量的连续帧数的观察向量序列相对应。

传统的认为,图像和视频是高维信号,相比之下,语音是一维时间信号。这种观点过于简单,语音实际上应被视为二维信号,其中空间(即频率或音位)和时间维度有很不一样的性质。

尽管GMM-HMM在语音建模和识别中取得了巨大成功,但20世纪90年代,人们开始开发可以捕捉更多现实的语音在时域中的动态属性的统计模型,比如隐藏动态模型、轨迹分段模型等等。

这些HMM模型变体的共同之处在于模型中都包含了时间的动态结构,它们依赖对语音时序相关结构不同的先验知识简化假设。根据这种结构的特点,我们可以把这些模型分为两类,第一类模型关注表层声学级别的时间相关结构;第二类由较深的隐藏的动态结构组成,其中底层的语音产生机制被用作一种先验知识来描述可观察的语音模式的时间结构。

在其中很多生成性动态/轨迹模型中,时间跨度通常由一系列语言标签决定,它们将整句从左到右的分成多个段。因此是分段模型。

这里有些难理解,我提出我自己的理解,也许不正确。在传统GMM-HMM中,我们为每个状态训练一个GMM来描述符号发射概率,但即便是同样的状态,不同时序下的GMM也应该是有一定区别的,可HMM中有有限历史性假设和输出独立性假设,无法考虑到更多的信息,所以我们考虑通过引入一些先验知识来优化这块的假设,增加对时间的动态结构的考虑。所谓分段,大概是对该时间段内状态所对应的符号发射概率进行统一的调整,以更贴近真实情况。

深度神经网络

DNN在《浅谈深度学习基础》中也有过详细的讲解了,这里也是着重说一下之前没有覆盖到的内容。

像权重衰减、dropout、mini-batch、bagging、boosting、momentum,自适应学习速率这些都有讲过,还缺一个数据预处理。

数据预处理在许多机器学习算法中都扮演着重要的角色,常见的有样本特征归一化全局特征标准化,也都很好理解。

如果每个样本均值的变化与处理的问题无关,就应该将特征均值归零,减小特征相对于深度神经网络模型的变化,例如,减去一张图片的强度均值,可以减弱亮度引起的变化。

全局特征标准化的目标是使用全局转换缩放每维数据,使得最终的特征向量处于相似的动态范围内,例如在图像处理中,经常将[0, 255]范围内的色值缩放到[0, 1]范围内。

高级模型初始化技术

至于模型初始化,《浅谈深度学习基础》也讲过了,就是自编码器和受限玻尔兹曼机。它们能对网络进行一定程度的预训练,在防止陷入局部最优或梯度消失上能起到一定的作用。

深度神经网络-隐马尔可夫模型混合系统(DNN-HMM)

这里我们先给出两张图,分别是GMM-HMM和DNN-HMM的示意图:


GMM-HMM

从图中可以看到,就像上文所说的,HMM中的状态序列就是语音识别的结果词汇序列,每种状态对应一种GMM,根据这个GMM可以得到该状态生成不同语音特征向量的概率。

接下来是DNN-HMM:


DNN-HMM

在混合系统中,HMM对语音信号的序列特性进行建模,DNN对所有聚类后的状态的似然度进行建模,这里对时间上的不同点采用同样的DNN。

在20世纪90年代中叶,这种混合模型就已被提出,早期被称作ANN-HMM,通常只使用上下文无关的音素(音素是语音的最小单位)状态作为ANN训练的标注信息,随后被扩展到上下文相关的音素建模,再后来,浅层的神经网络被替换成DNN,其次使用聚类后的状态(绑定后的三音素状态)代替单音素状态作为神经网络的输出单元,这种改善后的ANN-HMM混合模型称为CD-DNN-HMM。与传统的GMM-HMM相比,性能有了重大的提升。

在CD-DNN-HMM中,对于所有的状态,我们只训练一个完整的DNN来估计状态的后验概率,这与传统的GMM是不同的,因为GMM框架下,我们会使用多个不同的GMM对不同的状态建模。除此之外,典型的DNN输入不是单一的一帧,而是一个2ω+1帧大小的窗口特征,这使得相邻帧的信息可以被有效的利用。

CD-DNN-HMM的解码

这里一定要说明的一点是,我们想一下,HMM对于符号发射概率分布的要求是什么?是给定某状态的前提下,产生某输出符号的概率。再考虑一下GMM是怎么做的,是每个状态给了一张GMM分布图,再根据输出符号,就能找到给定某状态的前提下,产生某输出符号的概率。但是DNN不一样,上面也说了,DNN的输入是一个多帧的语音向量,输出是不同状态的概率,也即与HMM的要求相反,DNN描述的是,给定某输出符号的前提下,该输出符号是由某个状态产生的概率。所以我们就需要通过贝叶斯公式将DNN计算出来的这个似然度转为HMM需要的后验概率。


贝叶斯公式

HMM要的是后验概率,也就是式子左边的,给定状态下,某输出符号的概率,DNN给的是式子右侧加粗的似然度,所以我们通过上式得到后延概率。P(Ot1)是语音向量出现的概率,与字词序列无关,这里可以忽略。P(St1)是某状态的先验概率,在缓解标注不平衡问题中是非常重要的,特别是训练句中包含很长静音段时就更是如此。

由CD-DNN-HMM最终解码出的字词序列需要同时考虑到声学模型和语言模型的概率,通过权重系数λ去平衡二者之间的关系。语言模型的概率由其它训练方法根据训练语料得出,而声学模型的概率,是所有状态转移概率以及符号发射概率的乘积。

CD-DNN-HMM的训练

训练CD-DNN-HMM的第一步通常就是使用无监督的训练数据训练一个GMM-HMM系统,因为DNN训练标注是由GMM-HMM系统采用维特比算法产生得到的,而且标注的质量会影响DNN系统的性能。(我们知道,训练GMM-HMM采用EM算法,只需给定观察序列,而不需给定标注结果,而DNN需要相应的标注结果)

这里先详细的讲一下涉及到的语音学的知识。

语音是一个连续的音频流,它是由大部分的稳定态和部分动态改变的状态混合构成。

一个单词的发声(波形)实际上取决于很多因素,而不仅仅是音素,例如音素上下文、说话者、语音风格等;

协同发音(指的是一个音受前后相邻音的影响而发生变化,从发声机理上看就是人的发声器官在一个音转向另一个音时其特性只能渐变,从而使得后一个音的频谱与其他条件下的频谱产生差异。)的存在使得音素的感知与标准不一样,所以我们需要根据上下文来辨别音素。将一个音素划分为几个亚音素单元。如:数字『three』,音素的第一部分与在它之前的音素存在关联,中间部分是稳定的部分,而最后一部分则与下一个音素存在关联,这就是为什么在用HMM模型做语音识别时,选择音素的三状态HMM模型。(上下文相关建模方法在建模时考虑了这一影响,从而使模型能更准确地描述语音,只考虑前一音的影响的称为Bi-Phone,考虑前一音和后一音的影响的称为 Tri-Phone。)

有时候,音素会被放在上下文中考虑,这样就形成了三音素或者多音素。但它与亚音素不同,他们在波形中匹配时长度还是和单一音素一样。只是名字上的不同而已,所以我们更倾向于将这样的多音素称为senone。一个senone的上下文依赖比单纯的左右上下文复杂得多,它是一个可以被决策树或者其他方式来定义的复杂函数。(英语的上下文相关建模通常以音素为基元,由于有些音素对其后音素的影响是相似的,因而可以通过音素解码状态的聚类进行模型参数的共享。聚类的结果称为senone。决策树用来实现高效的triphone对senone的对应,通过回答一系列前后音所属类别(元/辅音、清/浊音等等)的问题,最终确定其HMM状态应使用哪个senone。分类回归树CART模型用以进行词到音素的发音标注。)

在实际应用中,senone的声学模型就是三态高斯混合模型。简单的说,它就是一个最有可能的特征向量。

一旦训练好GMM-HMM模型hmm0,我们就可以创建一个从状态名字到senoneID的映射,前面也提到了,从状态到senone的映射并不简单,因为每个逻辑三音素是由聚类后的一系列物理三音素代表的。

然后我们利用hmm0采用维特比算法生成一个状态层面的强制对齐,以生成从特征到senoneID的映射对,为DNN提供标注好的训练数据。

上下文窗口的影响

我们前面提到,DNN的输入是一个长为2ω+1(典型的是9到13)帧大小的窗口特征,这样引入了相邻帧,DNN也可以对不同特征帧之间的相互关系进行建模,这样部分缓和了传统的HMM无法满足输出独立性假设的问题。

CD-DNN-HMM的关键模块

一系列的实验成果表明,CD-DNN-HMM相较于GMM-HMM,带来性能提升的三大关键因素是:

  • 使用足够深的深度神经网络
  • 使用一长段帧作为输入
  • 直接对三音素进行建模,使用三音素是性能提升的最大单一来源

传统的DNN是采用softmax作为输出层,我们也可以将softmax层换成KL距离,KL距离就是我们在上篇中提到的相对熵,用于度量两种概率分布之间的差异。

这里要着重的讲一下softmax了,虽然在《浅谈深度学习基础》中简答的提到过softmax层起到了归一化,便于计算概率的作用,但softmax远不止这么简单。

首先softmax是对数似然度,是一种对数线性模型。而且softmax就是最大熵模型的结果,学习softmax层的参数过程就等同于在输出层前一层给定特征的基础上训练一个最大熵模型。且多类分类问题的目标函数常常选cross-entropy,而cross-entropy loss(交叉熵损失函数) 在形式上与softmax有特别的契合关系,PRML里面讲,cross-entropy loss是softmax的 canonical link function。

另外SVD这种低秩近似的方法可以用来加速训练和解码,能够减小模型的规模以及2/3的解码时间。

深度神经网络序列鉴别性训练

传统DNN进行多分类问题时通常采用交叉熵损失函数,它能够独立的处理每一帧语音向量,但是,语音识别本质上是一个序列分类问题,DNN的输入也是一长段帧,所以我们需要引入一些更契合这种问题的序列鉴别性训练方法,比如常用的最大互信息(MMI)、增强型最大互信息(BMMI)、最小音素错误(MPE)和最小贝叶斯风险训练准则(MBR)。

这里简单介绍一下这几种方法的基本思想,语音识别中使用的最大互信息(MMI)准则旨在最大化单词序列分布和观察序列分布的互信息。增强型MMI是MMI准则的一个变种,它增强了错误较多的路径的似然度。最小音素错误和状态级最小贝叶斯风险都旨在最小化不同颗粒度标注下的期望错误。比如,MPE准则旨在最小化期望音素错误,而状态级贝叶斯风险(sMBR)旨在最小化状态错误的统计期望。

序列鉴别性训练准则的形式可以有很多,如果准则被形式化成最大化的目标方程,我们可以通过乘以-1来使其成为一个最小化的损失函数。这样损失函数可以被永远形式化为两个词图的值的比率:代表参考标注的分子词图和代表与之竞争的解码输出的分母词图。

这里我们介绍一下词图(lattice),词图本质上是一个有向无环(directed acyclic graph)图。每个词网格包含一个开始结点以及一个结束结点,即在每个词网格中,仅存在一个入度(in-degree)为0的节点和一个出度(out-degree)为0的节点。我们也一般采用词图来保存识别的候选序列。


词图示例

深度神经网络中的特征表示学习

在传统的浅层模型中,特征工程师系统成功的关键。从业者的主要工作就是构建特定任务上,对特定学习算法表现良好的特征。系统的提高通常来自具有某个强大领域知识的人发现了一个更好的特征,典型的例子包括广泛用于图像识别的尺度不变特征转换(SIFT)和用于语音识别任务的梅尔倒谱系数(MFCC)。

然后像深度神经网络这样的深度模型,不需要手工定制的高级特征。相反,它们可以自动联合学习特征表示和分类器。

前面也说了,softmax层,本质上是一个简单的对数线性分类器,或者有时也被称作最大熵模型。因此,DNN生成后验概率的过程也可以被认为是一个两步非随机过程,第一步,通过L-1层的非线性变换,观察向量被转换成一个L-1层隐神经元个数维的特征向量。第二步,在给定转换好的特征向量后,根据这个特征向量训练一个最大熵模型。

在传统的最大熵模型中,特征是人为设计的,人工的特征构建适用于一些人们容易观察和知道什么特征可以被使用的任务,而不适合那种原始特征高度可变的任务。然而在深度神经网络中,特征是由前L-1层定义的,并且最终根据训练数据通过最大熵模型联合学习得到。这样不仅消除了人工特征构建过程中的繁琐和错误,而且通过许多层的非线性变换,具有提取不变的和鉴别型特征的潜力,这种特征几乎是不可能由人工构建的。

在深度神经网络中,离输入层越近的隐层表示越低层的特征,离输出层越近的隐层表示更高层的特征。越低层的特征通常能抓住局部模式,同时这些局部模式对输入特征的变化非常敏感。但是,更高层的特征因为建立在低层特征之上,显得更加抽象和对输入特征的变化更加具有不变性。

一般来说,特征是在分层深度模型中按阶段处理的,每一个阶段都可以被看作以下几个可选步骤:归一化、滤波器组处理、非线性处理和池化。

典型的归一化技术包括均值消除、局部差异归一化和方差归一化;滤波器组处理的目的是把特征投影到一个更高的维度空间以便分类会更加容易,这可以通过维度扩充或者特征投影得到;非线性处理是在深度模型里非常关键的一个步骤,因为线性变换的组合仅仅是另外一个线性变换,常用的非线性函数包括稀疏化、饱和、侧抑制、双曲正切、sigmoid和maxout;池化步骤引入了聚集和聚类,其目的是为了提取具有不变性的特征和降低维度。

在GMM框架下,通常使用对角协方差矩阵以减少模型参数,此时(若M=1)要求输入特征的每维相互独立。但是DNN是判别模型,没这种独立性假设。

一个好特征的重要性质就是它对变化的鲁棒性,在语音信号中有两种主要的变化类型:说话人变化和环境变化。在传统的GMM-HMM中,这两种类型的变化都需要被明确处理。

先是对说话人变化的鲁棒性,主要有两种方法,声道长度归一化(vocal tract length normalization,VTLN)特征空间最大似然线性回归(feature-space maximum likelihood linear regression,fMLLR)

有这样一个事实,声道中的共振峰位置大体上是按照说话人的声道长度单调的变化的,所以VTLN通过引入扭曲因子来实现声道长度归一化。

另一方面,fMLLR是一种作用于特征向量之上的仿射变换,其目的是使变换后的特征更好地适应模型。

对环境变化的鲁棒性也有相应的向量泰勒级数(VTS)自适应最大似然线性回归归一化输入特征或者自适应模型参数

除了这两者之外,还有对噪声的鲁棒性,其对应的方法有噪声自适应训练(noise adaptive training,NAT);还有对语速变化的鲁棒性。

而对于DNN,输入数据中的小扰动会随着我们转移到更高层次内在表达的过程中逐渐收缩。但也只能是小扰动,如果存在足够大的偏移,DNN不能准确地对它们进行分类。

比如一个单独的系统如果能够同时识别8kHz采样率录音的窄带语音信号和16kHz采样率录音的宽带语音信号,那将会是很有优势的。

我们可以通过利用混合带宽的训练数据,让DNN学习出宽带和窄带输入特征的不同应当与识别结果不相关这一特性。宽窄带的变化在多层的非线性转换中被抑制。

深度神经网络和混合高斯模型的融合

在使用浅层的多层感知机时期,就有文献提出了Tandem方法,它通过使用从一个或多个神经网络中衍生出来的特征来扩展GMM-HMM系统中的输入向量。换句话说,就是在GMM-HMM中使用由神经网络自主学习出来的特征。

还有文献提出,要使用瓶颈隐层(隐层节点个数比其他隐层的少)的输出作为特征的方法来代替直接使用神经网络的输出特征向量。因为隐层的大小的选择是独立于输出层大小的,这个方法提供了训练目标维度和扩展的特征维度之间的灵活性。而且瓶颈隐层在网络中建立了一个限制,将用于分类的相关信息压缩成一个低维度的表示。

提到这个『将用于分类的相关信息压缩成一个低维度的表示』,RBM和稀疏自编码器也能起到类似的作用,也可以被视为一种非线性的维度下降的方法。然而,因为从自动编码器中学习到的瓶颈特征对识别任务没有针对性,这些特征通常不如从那些用于进行识别的神经网络的瓶颈层提取出的特征有区分性。

不过DNN中提出的特征的维度通常非常高,我们可以使用主成分分析(PCA)来减少特征的维度。或者可以直接减少最后一个隐层的大小,将其改造成一个瓶颈层。这里搞来一张示意图:


但是我们很难知道哪一层隐层可以提取最好的特征,同样,添加更多的隐层对性能是否有帮助也很难得知。

DNN-HMM混合系统与采用深度特征的GMM-HMM系统相比,性能几乎相等,在实际中,CD-DNN-HMM系统运用起来更简单。而且GMM可以被一个拥有非常宽的隐层,同时隐层与输出层连接很稀疏的单隐层神经网络建模。

由传统的GMM-HMM系统产生的识别错误和由DNN-HMM系统产生的错误往往是不一样的,这使得通过融合GMM-HMM和DNN-HMM的结果可以获得全局的性能提高。最广泛的系统融合技术包括识别错误票选降低技术分段条件随机场基于最小贝叶斯风险的词图合并

然后就是多流语音识别,目前最好的语音识别系统中固定分辨率(包括时域和频域)的前端特征处理方法是权衡后的一种结果,这使得很多现象不能很好地被建模,比如CD-DNN-HMM的系统性能当说话速度很快或很慢时会显著下降。一个可能的解决方法是采用多流系统,这种方法可以同时容纳多个时间和频率的分辨率。

常用的多流语音识别架构也有三种,一种是所有流的特征合并在一起,然后使用一个单独的DNN-HMM来生成结果。第二种是,每个流的特征先独立使用分隔的DNN,然后再中阿金的一个集成层进行集成,集成之后的特征随后输入一个单独的DNN-HMM生成最后的结果。第三种是,每个独立流的解码结果融合得到最终的解码结果。

深度神经网络的自适应技术

与其它机器学习技术一样,在深度神经网络中有一个假设是,训练数据和测试数据服从一个相同的概率分布,但实际上,这个假设是很难满足的。

训练-测试的不匹配问题可以通过自适应技术来解决,前面已经提过了GMM-HMM框架下的自适应方法,来保证对说话人、环境、噪音、语速等的鲁棒性。但GMM是一个生成性模型,DNN是一个鉴别性模型,因为这个原因,DNN需要与GMM框架下不同的一些自适应方法。

DNN的自适应技术可以被分成三类:线性变换、保守训练和子空间方法。

线性变换的想法是,在输入特征、某个隐层的激活或者softmax层的输入处加上一个说话人或者环境相关的线性变换,通过一个线性变换,说话人相关的特征可以与说话人无关的DNN模型向匹配。

线性变换的常见方法有三种,第一种是线性输入网络(LIN),线性变换被应用在输入的特征上;第二种是线性输出网络(LON),在最后一个隐层上对一个特别的说话人使用一个线性变换,可以被放在softmax层的权重之前,也可以放在之后;第三种是线性隐层网络(LHN),线性变换被用在隐层中,而且同样的可以被用在原始权重矩阵之后或之前。而且前面也提到过,一个DNN的任意一个隐层都可以被划分成两部分,:包括输入层的那一部分加上隐层可以被视为一个变换后的特征;包含输出层的部分可以视作作用在隐层特征上的分类器。

LIN、LON、LHN虽然非常相似,但它们在参数数量和特征上还有微小的不同,而且性能是任务相关的。

然后是保守训练,保守训练是为了避免线性变换等其它自适应方法出现过拟合,破坏之前学到的信息,我们可以通过添加正则项做到这一点。保守训练中最常使用的正则项是L2正则项和KLD正则项。

L2正则项之前详细讲过,这里主要提一下KL距离(KLD)正则项。KL距离正则项方法的直观解释是,从自适应模型中估计出的senone后验概率不应和从未自适应模型中估计出的后延概率差别太大。而且我们知道KL距离/相对熵就是描述两种概率分布之间的差异的,所以我们把KLD添加到损失函数里去一起被最小化,就能限制两种概率分布之间的差异不至于过大。

L2正则项限制的是模型参数自身,而非输出概率,但我们在意的是输出概率而不是模型参数自身,所以KLD正则项的表现不会比L2正则项更差。

保守训练只能减轻在自适应过程中的过拟合问题,但并不能解决对每个说话人都要存储一个巨大的自适应模型的问题。我们可以采用SVD分解,并舍弃掉部分过小奇异值的方法来对模型大小进行压缩。

然后我们还有子空间方法,我们可以通过PCA构建一个足够大的说话人空间,每个新的说话人可以由特征向量的线性组合来表示,而且我们也可以通过丢弃特征向量中方差小的向量来控制。

还有一些子空间方法明确的从句子中估计噪声或者说话人信息,并把这些信息输入网络中,希望DNN训练算法能够自动理解怎样利用噪声、说话人或者设备信息来调整模型参数。

说话人信息的估计可以完全独立于DNN训练,也即从一个独立的DNN中学习得到,有文献提出了i-vector方法,i-vector方法是在说话人确认以及识别中流行的一种技术,它在低维固定长度中压缩表示了说话人特征最重要的信息,这对于ASR中的说话人自适应来说是一个非常理想的工具。

深度神经网络中的表征共享和迁移

这部分简单的介绍一下多任务学习和迁移学习,在深度神经网络(DNN)中,每个隐藏层都是输入DNN的原始数据的一种新特征表示(表征),较高层次的表征比较低层次的表征更抽象,我们可以通过多任务学习和迁移学习将这些表征共享和迁移到相关的任务。

多任务学习(Multitask learning,MTL)是一种旨在通过联合学习多个相关的任务来提高模型泛化能力的机器学习技术,这些相关的任务需要在一定抽象层次上可以共享一部分表征。MTL可以为每个任务增加训练数据量,而且有助于任务间迁移知识。


图中画红圈的隐层就被三个任务所共享。

迁移学习致力于通过保持和利用从一个或多个相似的任务、领域或概率分布中学习到的知识,来快速并有效地为一个新的任务、领域或概率分布开发一个有较好性能的系统,DNN得益于隐藏层所表示的更加抽象和更具不变性的特征,所以非常适合迁移学习。

经实验验证,不仅法语DNN的隐层所表示的特征变换可以有效地迁移以识别美式英语语音,而且欧洲语言到中文普通话的迁移学习也是有效的。不过标注信息是非常有必要提供的。

在语音识别中,多任务学习还有其他应用场景,比如通过同时学习数字分类、噪声语音增强和说话人性别识别任务来训练神经网络,提高噪声环境下数字识别的性能。给DNN选择添加合适的辅助任务,网络能够在不同的任务中利用公共的结构去学习一个具有更好泛化能力的模型,比如同时识别音素和字素。

而且,受人类语言感知的双模态原理(视觉和听觉)的启发,还可以同时为DNN提供音频和图像,大概是唇语识别。

循环神经网络及相关模型

RNN和LSTM之前的文章也简要的提过。

我们在上文中,提到GMM-HMM无法对语音的动态特性进行建模,因此有了HMM的若干种变种,以求捕捉更多现实的语音在时域中的动态属性的统计模型,比如隐藏动态模型、轨迹分段模型等等。

同样的,DNN-HMM方法也并没有对语音的动态特性进行建模,所以人们考虑引入RNN,在时间维度上使用一个带时间延迟的循环结构使网络拥有了记忆结构,通常表示为一个内部状态。RNN所使用的状态空间使得它可以表示和学习常见时间范围内序列的相关性。

首先RNN本身就是一个深度模型,而且RNN如果在时间上进行展开,可以建立一个和输入语音句子长度一样层数的深度模型。

RNN的训练主要依靠延时反向传播算法(BPTT),它是经典反向传播算法(BP)的一个拓展,用于学习循环神经网络随着时间展开网络的权重矩阵和通过时间顺序回传错误信号,BP中对统一训练帧t时刻的多个堆积隐层,被替换成T个跨越时间的相同单一隐层。

这里其实还有几个点,但是难度较大,这里列出来,有机会再回来补,BPTT、回声状态性质、状态紧缩、梯度消失的充分条件、梯度爆炸的必要条件、原始对偶法、拉格朗日算子。

计算型网络

这里简单介绍一下什么是计算型网络(computational network,CN),计算型网络是一种描述任意学习机的整合框架,比如DNN、CNN、RNN、LSTM、逻辑回归和最大熵模型等。一个CN是一个有向图,其中的每个叶子节点代表一个输入值或者一个参数,每个非叶子节点表示一个在它的子节点上的矩阵操作。

在主要的机器学习模型中,例如DNN、CNN、RNN有一个常见的属性:所有的这些模型都可以被描述成一系列的计算步骤,如果我们知道如何计算每一步和每一步计算的顺序,就有了一个神经网络的实现。该观察表明,我们可以在计算型网络的框架下统一所有这些模型,其中部分模型就已经实现在Theano、Tensorflow、CNTK这些工具中实现了。

CN给我们提供了描述任意网络时更大的便利性,并且允许我们在同样的联合框架里构建几乎所有我们感兴趣的模型。比如我们可以很容易的修改某神经网络,比如以ReLU代替Sigmoid,或者自定义的去建立一个共享模型参数的网络。

总结以及未来研究方向

在语音识别中应用神经网络可以追溯到20世纪80年代,比如ANN/HMM、时间延迟神经网络(TDNN),但是效果一直无法与优化后的GMM-HMM相比,后来CD-DNN-HMM被提出了,效果远好于GMM-HMM。

CD-DNN-HMM商用的第一个问题就是解码速度的问题,如果使用简陋的实现,在单个CPU核上计算DNN的声学分数需要3.89倍的实时时间,后来,Google采用了量化、SIMD指令、批量化和延迟计算等技术后,DNN的计算时间相应的降到了0.21倍的实时时间。

然后第二个问题是训练速度,尽管训练309小时的CD-DNN-HMM的表现已经比2000小时训练数据上训练出来的CD-GMM-HMM系统表现更好,但仍然无法令人满意,为了进一步提高训练速度,一些并行的训练算法被开发出来,而且异步随机梯度下降算法也被应用来提高训练速度。2013年,低秩近似算法被提出,用较小的矩阵的乘积来近似较大的矩阵,可以用于加速训练和解码,可以减少2/3的解码时间,而且简单有效,已被广泛应用于商用语音识别系统中。

然后是序列鉴别性训练被提出,因为交叉熵损失函数是帧级别的,如果采用序列鉴别性训练准则明显可以低风险的提高语音识别的准确率。

GMM本身不能转换特征,在传统的GMM系统中,特征的处理需要包含很多步骤,但是人们开始发现,对于DNN系统来说,很多特征处理步骤都是无足轻重的。人们解释为,所有DNN的隐层都可以认为是一个强大的非线性特征转化器,而softmax层是基于前一隐层表征的分类器。特征转化和分类之间可以交叉优化。而且DNN可以将相关输入中很多在GMM系统中不能直接使用的特征用起来。

然后是自适应,当CD-DNN-HMM被提出时,有人担心它缺少有效的自适应技术,为了处理这个问题,特征鉴别性线性回归自适应技术被提出,而且后续还有加KLD正则项的保守训练,还有各种噪声感知训练(NaT)、说话人感知训练(SaT)被提出,i-vector也被提出了,可以将说话人最重要的特征压缩表示到一个低维固定长度。

然后是多任务和迁移学习,人们发现有些可以共享相似表征的任务可以共享隐层隐层结构,发现通过添加合适的辅助任务可以提高模型的泛化性,而且还可以通过迁移学习利用相似任务的隐层结构。

再然后是RNN和LSTM,这种结构可以更好的考虑音频在时域上的动态特性,可以更充分有效的利用历史信息。

现在的语音识别技术还有很多亟待提高的场景:

  • 远场麦克风语音识别
  • 高噪音环境下语音识别
  • 带口音的语音识别
  • 不流利的自然语音,变速或带有情绪的语音识别
  • 多人语音或背景交谈的语音识别

《浅谈语音识别基础》至此结束,其实这篇文章我自己是很不满意的,尤其是后面RNN的性质、训练以及CN这两部分,根本没有深入进去,都是浅尝辄止。一个是因为我参考的这本《解析深度学习:语音识别实践》可以讲是一本需要较丰富经验才可以流畅理解的资料,而且这两块内容的其他相关资料极少,无法对比参考,如果一篇篇英文论文去研究又太耗时间,也与我自身产品经理的定位不符,所以就只好仅做简单的介绍。对于想通过阅读这篇文章来增进理论水平的技术人员(如果还真有的话),我感到十分抱歉,也非常惭愧。

推荐阅读更多精彩内容