2.3 机器感知

2.3.1 语音识别

1.深度学习的语音识别

基于深度学习的语音识别的通用流程包括语音输入环节、深度神经网络的结构和辅助语言模型。

1)语音输入环节的处理

对于语音输入环节,通常有两种处理方式。

(1)基于语音的时频谱图(Spectrogram)。对于每一段语音,要通过傅里叶变换,将其每个时间段上的频谱展示出来,然后形成一个横轴为时间、纵轴为频率,以不同颜色区分对应频率幅度的频谱图。

(2)直接输入原始波形,然后对波形进行时间域上的卷积变换。也就是利用滤波器组(Filter Banks)提取不同频率上的信号,从而得到对应的时间-频率关系。

2)深度神经网络的结构

对于以语音的频谱特征为输入的神经网络而言,有3种通常的神经网络结构。一种是采用CNN,即卷积神经网络的方法。另一种是利用RNN,即循环神经网络的方法。RNN的一种替换方式是LSTM,即长短时记忆循环网络。LSTM的一个简化版本是GRU。最后一种是利用FCN(Fully Connected Network)或DNN,即全连接网络。

3)辅助语言模型

N-gram语言模型(N-gram Language Models)主要是对前面的神经网络输出进行进一步的处理优化。N-gram考虑了前后连续N个词语之间的相互联系,通过统计词频的方式,近似地计算前后若干词一起按序出现的概率,最终得出整个语句出现的概率。

2.混合模型或合金模型

过去,利用高斯混合模型(Gaussian Mixture Model,GMM)以及隐藏马尔可夫模型(Hidden Markov Model,HMM)实现了大词汇量级下的连续语音识别(Large Vocabulary Continuous Speech Recognition,LVCSR)。传统使用HMM和GMM混合方案,其中,HMM用来规范时间的变化,GMM用来计算HMM之中各个组合的可能性。

深度神经网络(DNN)可以与隐藏马尔可夫模型、上下文相关模型(Context-dependent Phone Models)、N-gram语言模型和维特比搜索算法(Viterbi Search Algorithms)进行混合使用。

尽管可以采用混合方法来构建语音识别引擎。但是,混合模型一般比较复杂,需要一套精致的训练方法,以及相当多的专业知识来帮助搭建模型。

3.CTC方法

CTC(Connectionist Temporal Classification)称为连接主义的时间分类。

CTC最早是由Alex Graves等人提出,用来解决找到概率最高的标签序列,解决语音文件训练中的标记问题。CTC模型描述如下。

输入:一个m维的时间序列输入x={x1xt },其中xt∈R m

输出:一个序列z={z1zu },zuL,其中L是标签集,ut,因此输入输出不对齐。

分类器:给定输入,得到输出。

数据集S:一个由许多(xz)组成的集合,包含了指定的输入和期望的输出。

分类指标:错误率

ZS中的标签总数,ED(h(x),z)是编辑距离:通过插入、删除、替换将h(x)变为z的最少操作数。

CTC模型的详细数学推导,见AlexGraves的论文:

AlexGraves,Santiago Fernández,Faustino Gomez,and Jürgen Schmidhuber.Connectionist Temporal Classification:Labelling Unsegmented Sequence Data with Recurrent Neural Networks,ICML 2006.

4.谷歌公司的CLDNN模型

从2012年开始,深度神经网络在连续语音识别方面也取得了巨大成功。最近一段时间,卷积神经网络和循环网络(LSTM)的实现效果又优于深度神经网络(DNN)。不过这几种神经网络各有特点,所以也各有各的局限之处。

如果把这几种网络有机地组合到一个统一的框架下,性能可以再次得到提升。谷歌团队针对现有的几种神经网络类型:卷积神经网络、循环神经网络、深度神经网络,进一步提出了一种新的整合模型CLDNN(CNN+LSTM+DNN),在语音识别方面获得了新的提升。

CLDNN是以原始波形为直接输入的网络结构,它主要结合了卷积神经网络(CNN)、循环神经网络(LSTM)和深度神经网络(DNN)。当输入信号进行时间域的卷积操作之后,输出数据再进行一次频率域的卷积操作,以减少频谱的变化,之后再通过三层循环网络,最后再通过一层全连接网络。训练过程中,时间卷积层和其他层会一起进行训练。

CLDNN的具体组成主要分为3部分,如图2-13所示。

图2-13 CLDNN的结构图

第一部分是频率建模,采用卷积神经网络,输入数据是以时间为下标的连续向量。

第一部分分为两层:

第一层是9×9的频率卷积核(Filter)。

第二层是3×3的卷积核。

分别进行卷积,以减少频率的变化种类,采用非重叠(Non-overlapping)的最大池化(Max-pooling)技术。

第二部分:二层循环网络(LSTM),采用截断的BPTT(Back-Propagation Through Time)算法,展开20个时间步。为了保证连续识别过程中只分析过去的信息,不识别未来的信息,输入中r=0。

第三部分:二层深度神经网络,很容易分别出高阶特征,从而将数据分类。

LSTM对语料进行单帧(某特定时刻的音频信息)特征分析,但是分析获得的特征是有限的。而一些未分析出的高阶信息可以帮助人们更好地识别上下文关系。CNN可以分析出这些高阶特征,所以可以将两者组合。

相比其他网络结构,CLDNN的两处改进如下。

(1)将输入中的短时特征传输给LSTM层。

(2)将CNN的输出传输给LSTM和DNN,以获得更多的特征数据。

在LSTM中,从输入到输出的映射网络不深,意味着没有中间隐藏的非线性层。若中间变量数减少,则模型会更加高效,输出会更容易预测。这可以通过LSTM层后加DNN实现。

实验中采用了3组不同的数据作为测试集。第一种是200h的小语料库。第二种是2000h的大语料库,不带噪声。第三种是2000h的大语料库,人为加入了噪声。测试的结果表明CLDNN的健壮性不错,均取得了4%~5%的性能提升。

5.纯DNN模型

深度学习采用通用的神经网络来替代复杂的、多维度的机器学习方法。这些神经网络经过训练以后可以用来优化可微分的代价函数或损失函数(Loss/Cost Function)。这种方法已经在语音识别上取得巨大的成功,被称为“纯正”的DNN方法。

只要拥有了相当多的训练数据和足够的计算资源,就可以构建一个高水准的大词汇量连续语音识别系统。

1)百度公司的DeepSpeech2

百度公司的DeepSpeech2的方法是比较典型的语音识别的纯深度神经网络结构。Deep Speech2采用5~9层的网络,其中隐含层有1~7层。网络架构包括一到多个卷积层网络,多个(单向或双向)循环网络,一个全连接网络(FCN),一个softmax层网络。

DeepSpeech2的特点如下。

(1)输入为频谱图;英文输出为{a,b,c,…,z,space,apostrophe,blank},中文输出为{罗马字母表,6000个汉字}。

(2)采用BatchNorm(Batch Normalization)方法,加速收敛。

(3)采用SortaGrid方法,保证CTC的平稳性(短句优先训练)。

(4)采用GRU。GRU和LSTM的准确性相差不大,但GRU运算更快。

(5)采用Lookahead Convolution和单向模型,因为双向LSTM的时延达不到要求。

2)Nervana公司的实现

下面介绍一下Nervana公司(已被Intel公司收购)提出的端到端语音识别模型,采用的是百度Deep Speech2的设计。该端到端语音识别系统由3个主要部分组成(见图2-14)。

(1)特征提取。将原始音频信号(例如来自wav文件)作为输入,并产生特征向量序列,其中有一个给定音频输入帧的特征向量。

图2-14 端到端英文语音识别系统

特征提取级的输出示例包括原始波形、频谱图和同样流行的梅尔频率倒频谱系数(Mel-Frequency Cepstral Coefficients,MFCCs)的切片。

(2)将特征向量序列作为输入,并产生以特征向量输入为条件的字符或音频序列的概率声学模型。

(3)采用两个输入(声学模型的输出和语言模型)的解码器,在声学模型生成序列的情况下,搜索最可能的转录。

纯DNN模型的语音识别,可以参考百度公司的DeepSpeech和DeepSpeech2论文。

一个具体实现和源代码,可参考如下网址。

(1)https://www.nervanasys.com/end-end-speech-recognition-neon/。

(2)https://github.com/NervanaSystems/deepspeech。

目前各大互联网公司,如百度、科大讯飞、搜狗等,纷纷发布了语音输入法、方言识别、语音转录(如百度公司的swiftscribe)等功能,也进一步表明端到端深度学习的语音识别的成熟性,以及深度学习技术在语音识别中的日益普及。

2.3.2 计算机视觉

计算机视觉(Computer Vision,CV)包含对象检测、人脸识别、文字识别等。对象检测(Object Detection)是计算机视觉的一项基本功能。下面主要研究一下对象检测技术。

1.R-CNN系列

AlexNet在图像识别任务上取得的巨大成功,让目标检测领域的研究者们也将更多的精力投入到基于深度学习的检测方法上。

Ross Girshick等人提出的R-CNN(Region-based Convolutional Neural Networks)算法第一次将这个想法变为现实,并在Pascal VOC目标检测比赛中取得巨大突破。R-CNN的工作流程是首先利用选择性搜索(Selective Search)算法提取候选区域(Proposal),接着通过卷积神经网络对候选区域提取特征,最后通过SVM分类器对每个候选区域进行分类识别,将非极大值抑制(Non-Maximum Suppression,NMS)去重后的最终结果返回。

随后,Ross Girshick和其他研究者对R-CNN算法进行了多次改进,包括借鉴SPP-Net思想减少候选区域卷积特征重复提取的Fast R-CNN算法,以及使用RPN(Region Proposal Network)代替选择性搜索算法加速候选区域提取的Faster R-CNN算法。

2.YOLO算法

YOLO(You Only Look Once)算法是第一个达到实时性要求的深度学习检测算法,在Titan X GPU上的运行速度可以达到45帧/秒(Frame Per Second)。和R-CNN系列算法事先提取候选区域再对其进行分类识别的思路不同,YOLO直接将整张图像输入到神经网络中,将目标检测任务化简成一个回归问题,在保证精度不过多损失的前提下,极大地提高了识别速度,实现端到端(End-to-End)的快速目标检测。

YOLOv2算法在YOLO算法的基础上,该研究的作者同样采取了Anchor机制,并新加入了K均值聚类、批次规范化、转移层、直接位置预测等技巧,使得YOLOv2在网络训练时的收敛速度,以及最终检测时的结果准确度和计算速度等方面得到显著提升。