-
Notifications
You must be signed in to change notification settings - Fork 31
Description
刚弄完与语音有关的毕业设计,对于语音识别系统算是入门了。
不同于图片识别,语音识别系统与其他时序系统一样,都是极度复杂的,为了让大家对这类系统有一定了解,特开此天坑。
//word图片不能直传,手动复制黏贴五十张图。。。辛酸
//word格式转换有点问题,因此部分公式不能较清楚地显示
//大部分图片取自网络,但所有文字均为手打
第四章基于DNN的CD-DNN-HMM模型简介
4.1神经网络(Neural Network)
4.1.1神经网络结构
假如有训练样本集{X->Y},其中X为特征向量,Y为分类标注,那么,神经网络可以提供一种复杂的非线性模型
来拟合这一样本集。
神经网络由许多的神经元组成,以单一的神经元为例,如图4-1所示:
图4-1,一个神经元的结构
这个神经元的结构,是一个以x1,x2,x3及常量+1为输入值的运算单元,其输出为:

其中函数f(z)被称为激活函数,一个典型的激活函数为sigmoid函数:

其对应的图像如图4-2所示:

图4-2,sigmoid函数图像
事实上,这一个单一从神经元对输入做了一次逻辑回归,即首先将特征作线性的加权求和,然后将输出映射到(0,1)区间内。事实上,可以使用多种激活函数如sigmoid、tanh、relu,函数的具体比较见第六章。
对于NN(Neural Network),就是将许多单一的运算单元组合在一起。这样,一个神经元的输出可以是另一个神经元的输入,如图4-3:
图4-3,一个具有单一输出的神经网络
图13就是一个NN,这个网络有三层,从左往右第一层称为输入层(input layer),中间第二层称为隐藏层(hidden layer),第三层称为输出层(output layer)。图中的+1是一个偏置项,是一种表示网络结构的方式,用于表示神经网络中存在常量输入部分。这个网络,具有三个输入单元、三个隐藏单元以及一个输出单元(不考虑偏置项)。
这个网络具有参数:
,其中
表示从第一层到第二层的权重矩阵,如输入层节点
指向隐藏层节点
的权重是
。
该网络的计算如下:

如果用向量表示上式,可以表示为:

其中z称为节点的输入值,a称为节点的激活值(输出值)。
进一步抽象,可得:

其中L为层数,此即为神经网络的前向传播过程,可以运用线性代数快速求解。
在实际运用中,输出层的值可以做归一化来表示特征属于某个类别的概率P(yi|x),类别的数目即为输出层的维度,例如疾病的诊断中,输入受测者的生命体征向量x,然后通过神经网络的运算,即可求得患者患各种疾病的可能性,而对于分类问题,则分类到输出值最大的项代表的类别去。
4.1.2梯度下降法与反向传播
训练神经网络的过程,实际上是让网络输出拟合实际标注的过程。为了训练神经网络,可以采用梯度下降法与反向传播,值得注意的是,梯度下降法只能得到一个局部最优解。如何优化神经网络,取得较好的局部最优解,见第六章。
为了训练神经网络,首先定义损失函数
。
对于单个样本(x,y)定义其损失函数为(该损失函数不唯一):

则整体损失函数为:

为了训练参数,需要对参数进行梯度下降法:

其中α是学习率,决定参数往梯度方向改变的速度,这是一个经验值,当学习率过高时会导致模型难以收敛、不稳定,而学习率过低时会导致模型收敛过慢,取值与实际模型有很大关系,一个经验取值是0.001。
梯度下降法需要对损失函数求各个参数的偏导,但是隐藏层的偏导数较难求解,为了便于求解隐藏层的梯度,需要使用反向传播算法,反向传播算法的思想如下:
首先,需要对数据进行前向传播计算,得到每个节点的输入值z,然后考虑一个残差
,该残差说明了节点的输入值的改变量会对损失函数造成多大的影响
对于输出层L,残差这样计算:

其中NL为y的维度。
对于2~N-1层的节点的残差计算如下:

得到残差后,即可求解梯度下降所需的偏导数:

对于每层参数的计算可以向量化来加速运算:

对于批量的样本进行梯度下降时,每次梯度改变量应取所有样本提供的梯度改变量的平均值。批量梯度下降法的一次迭代如下:
I、计算所有参数的平均梯度改变量
II、更新所有参数
训练过程即循环此迭代直至模型收敛(损失函数不再变化)。
4.1.3 深度神经网络(Deep Neural Network)
所谓深度神经网络,顾名思意,即为隐藏层较多的神经网络。对于单隐层的神经网络,其表达能力有限。
以二维二分类任务为例子,分类任务实质上将二维平面分割成了几个边界不规则的区域,这些区域或属于类别1,或属于类别2,可以想象在二维曲面上涂上代表两个类别的两种颜色的样子。神经网络的分类,在这里实质上是对区域边界的拟合。
对于单隐层的神经网络,对于区域边界的拟合效果很粗糙,往往不尽人意,而深度神经网络由于对特征进行了多层非线性变换,所以可以更好地拟合复杂的边界,分类效果较好,对于单隐层的拟合效果如图4-4、4-5:
图4-4:一个利用tensorflow playground图形界面实现的单隐层二维二分类神经网络
图4-5:另一个利用tensorflow playground图形界面实现的单隐层二维二分类神经网络
图中的每个小方块代表一个节点,其图案表示在该节点对模型的分类效果,后一层的图案实质上是前一层的加权叠加。从图中可以看出,单隐层虽然可以进行简单的方块、圆形边界的拟合,却对螺旋边界十分无力,相反,深度神经网络虽然对螺旋边界表现仍然不佳,但是相比单隐层有了很大的提升,测试集损失从0.45降低到了0.3如图4-6:
图4-6:具有比单隐层网络更好分类能力的深度神经网络
对该图形界面的进一步调试发现,对输入特征进行特征变换,例如对x、y取平方、sin后作为特征的补充,添加到神经网络输入层中,可以取得很好的拟合效果,如图4-7、4-8:
图4-7:一个损失函数很低的二隐层网络结构
图4-8:一个损失函数更低的三隐层网络结构
如果是单隐层网络,损失函数仍然差于深度网络,如图4-9:
图4-9:一个单隐层网络结构
对节点表达出的分类区域进行分析可以看出,深层的神经网络表达出了更加细腻的拟合边界。深度神经网络的强大分类能力在于它可以学习到变量之间的隐藏联系。事实上,对于输入特征进行特征变换只是对网络训练的一种人为引导,神经网络本身是有能力表达出如X^2和sin(x)的区域分界的。然而,使用梯度下降法进行训练时,由于网络参数很多,因此存在大量的局部最优解。如何跳出这些局部最优解让网络有效地表达出所需的拟合结果,需要进一步研究。
另外,在神经网络的训练中,会遇到一系列问题,例如网络参数过多、过拟合与欠拟合、训练速度过慢、反向传播对于靠近输入层的浅隐藏层影响很小导致浅隐藏层收敛过慢、部分神经网络的结点输出接近零浪费计算资源等问题,为此需要对深度神经网络进行优化,详见第五章。
(注:对tensorflow playground的调试中,给了我很多的关于网络调优的启发,我建议大家都上去尝试一下,网址是:http://playground.tensorflow.org)
4.2 DNN与HMM的联合
4.2.1 用DNN来替换GMM
在第四章已经详细地描述了GMM-HMM系统的构建方法,在构建好一个GMM-HMM系统后,可以该GMM-HMM系统为基础,构建一个DNN-HMM系统。
在构建DNN-HMM系统时,保留GMM-HMM中的HMM转移部分,然后将GMM的概率输出替换为DNN的概率输出即可构成基于DNN的语音识别系统,这样做的好处是可以直接比较DNN与GMM的性能,而排除HMM转移概率的影响。
DNN-HMM模型的结构如图4-10:
图4-10, DNN-HMM模型的结构
需要注意的是深度神经网络对单个特征的分类是不能考虑时间上下文的,这又浪费了神经网络可以学习大量隐藏联系的能力,因此,在实际操作中,可以给特征序列加窗,即将特征向量Xt的上下文一同输入到神经网络中,例如考虑的上下文长度是4,那么实际输入神经网络的数据是{Xt-4,Xt-3,Xt-2,Xt-1,Xt,Xt+1,Xt+2,Xt+3,Xt+4}一共九个向量拼接而成的大向量数据。假如特征向量Xt没有经过特征变换而直接采用原始的13维MFCC,那么实际输入神经网络的是13*9=117维的向量。
对于timit数据集经过决策树得到的1947个三音素模型而言,状态有约6000个,在GMM-HMM模型中,对应了6000组混合高斯模型参数(因此使用DNN带来的一个附加好处是压缩了参数数目),而DNN分类的输出对应这6000个状态。
由于DNN的输入已经考虑了上下文,因此在实际应用中,将对6000个状态进行简化,直接对特征进行音素级的分类(1947个输出),然后认为音素内部的几个状态是一样的,其观测概率都是音素的观测概率。
此外,由于我们需要求解的值是概率,而神经网络提供的输出形式根据激活函数不同,其值域各有不同,所以还需要将输出做归一化。通常的做法是在输出层使用softmax回归,softmax函数如下:

其中N是输出层的分类的数目,L是层数,Wj是W的第j列参数。
当输出是概率分布以后,计算损失函数时,可以采用交叉熵:P(x)log(Q(x))其中,P(x)是真实的概率分布,即训练数据的分布。交叉熵用于衡量两个概率分布的差距,那么,优化损失函数即优化交叉熵的负数。
当i是标注向量对应的分类时,P(x|yi)=1;当i是其它的分类时,P(x|yi)=0
当输出是其它的分类时,其交叉熵恒为0,可以不考虑,对于标注对应的分类,其交叉熵为:

当计算一批M个数据的交叉熵时,假设第i个输入数据是
输出是
,定义当j是正确的标注时{y(i)==j}的值是1,否则输出0,那么交叉熵损失函数如此计算:

对交叉熵进行反向传播的方式与4.1.2节相同。
4.2.2 实践中的DNN训练方式
在实际应用中,输出层通常进行softmax回归,损失函数采用交叉熵损失函数,帧级别的标注直接使用GMM-HMM基准的对齐结果,使用时先将状态代号转换为对应的音素代号,然后进行梯度下降法训练。
在训练之前,需要对参数进行初始化,常见的办法是采用随机初始化,因为如果对所有的参数赋值一样的权重,将会导致每次进行梯度下降时所有参数同步变化,无法达到训练的目的。考虑到使用的sigmoid激活函数时,导数最大的地方在原点附近,在这附近梯度下降最快,模型收敛速度也最快,所以一般对权重初始化为靠近0的值。
鉴于输入数据较多,对所有输入数据采用批量梯度下降法会导致运算时间过长,因此采用了小批量梯度下降法(mini-batch)。执行时,先将数据集所有录音语句的顺序打乱(每句话内部帧的顺序没有打乱),然后每次顺序从打乱的数据集中取出一定量的语句,对每帧数据扩充上下文特征,附带上对应的标注,然后执行神经网络的训练。
参考文献
[1]赵力. 语音信号处理-第2版[M]. 机械工业出版社, 2009.
[2]吴军. 数学之美.第2版[M]. 人民邮电出版社, 2014.
[3]俞栋, 邓力, 俞凯,等. 解析深度学习语音识别实践[M]. 电子工业出版社, 2016.
[4]郑泽宇, 顾思宇. TensorFlow实战Google深度学习框架[M]. 电子工业出版社. 2017.
[5]卡拉特.苏彦捷.生物心理学[M].第10版.北京.人民邮电出版社,2012
[6]Rabiner L, Juang B H. Fundamentals of speech recognition[M]. Tsinghua University Press, 1999.
[7]Bishop C M. Pattern Recognition and Machine Learning (Information Science and Statistics)[M]. Springer-Verlag New York, Inc. 2006.
[8]Andrew NG, Jiquan Ngiam, Chuan YU Foo, et al. UFLDL tutorial. http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial. 2013.
[9]Young S J. Token Passing: a Simple Conceptual Model for Connected Speech Recognition Systems[J]. Help, 1994.
[10]Hinton G, Deng L, Yu D, et al. Deep Neural Networks for Acoustic Modeling in Speech Recognition: The Shared Views of Four Research Groups[J]. IEEE Signal Processing Magazine, 2012, 29(6):82-97.
[11]Young S. A review of large-vocabulary continuous-speech[J]. IEEE Signal Processing Magazine, 1996, 13(5):45.
[12]Miao Y, Metze F. Improving low-resource CD-DNN-HMM using dropout and multilingual DNN training[J]. Proc Interspeech, 2013.
[13]Rath S, Povey D, Veselý K, et al. Improved feature processing for Deep Neural Networks[C]. conference of the international speech communication association, 2013.
[14]Mohamed A R, Dahl G, Hinton G. Deep Belief Networks for phone recognition[J]. 2009, 4.








