Advertisement

comments on"An Experimental Study on Speech Enhancement Based on Deep Neural Networks"(一)

阅读量:

这篇论文是由中科大语音与语言信息处理实验室写的,今年1月发表在IEEE Signal Processing Letters(Impact factor :1.67)

论文大致分为两个部分:语音增强的建模基于TIMIT数据集的模型检验、对比

论文的创新点/突破点:

·提出了一个应用于语音增强的基于DNN的非线性回归模型;

·使用了大量的训练集(浅层神经网络的劣势);

·通过把context information连接到一个供DNN(深度神经网络)学习的长特征输入向量里,使得DNN能够随着时间轴(利用多帧展开)和频率轴(利用有全频点的对数频谱特征)捕获内容信息(context information)(数据驱动方法的劣势,如在时-频域进行二进制分类判决);

·与L-MMSE(Logarithmic minimum mean square error)方法相比,在选取的三个质量指标:segmental SNR(SegSNR)和log-spectral distortion(LSD),perceptual evaluation of speech quality(PESQ) 方面,DNN算法表现出更好的性能。同时在主观听力测试中,DNN算法表现更优。

一、基于DNN的非线性回归模型

语音增强(speech enhncement)的主要目的就是行含噪音的语音信号(noisy speech)提取出有用信号(clean speech),或者说是noisy sppeech到clean speech的映射。

这篇论文就是基于DNN的非线性回归模型,利用多种条件训练下(说话者、噪声类型、信噪比)的数据,学习到从含噪音的语音信号到有用信号的复映射函数,从而达到语音增强这一目的。这里的复映射函数,对应的是图1的DNN decoding。系统图如下:

论文看到这里,再往下看,我几乎看不懂了,模型主要涉及的两个过程:通过噪声数据对深度神经网络进行预训练基于最小均方差的微调 。这两个过程简直是神来之笔,完全不知所云。后来,我就试着找深度神经网络/深度学习的最原始/基本的思想,结果被我找到了,看完这个,有种醍醐灌顶的感觉。

--------------------------------------------延伸内容-------------------------------------------------------------------------------------------------------

引言

2006年,加拿大多伦多大学教授、机器学习领域的泰斗Geoffrey Hinton和他的学生RuslanSalakhutdinov在《科学》上发表了一篇文章,开启了深度学习在学术界和工业界的浪潮。这篇文章有两个主要观点:1)多隐层的人工神经网络具有优异的特征学习能力,学习得到的特征对数据有更本质的刻画,从而有利于可视化或分类;2)深度神经网络在训练上的难度,可以通过“逐层初始化”(layer-wise pre-training)来有效克服,在这篇文章中,逐层初始化是通过无监督学习实现的。

当前多数分类、回归等学习方法为浅层结构算法,其局限性在于有限样本和计算单元情况下对复杂函数的表示能力有限,针对复杂分类问题其泛化能力受到一定制约。深度学习可通过学习一种深层非线性网络结构,实现复杂函数逼近,表征输入数据分布式表示,并展现了强大的从少数样本集中学习数据集本质特征的能力。(多层的好处是可以用较少的参数表示复杂的函数)

deep learning训练过程

2006年,hinton提出了在非监督数据上建立多层神经网络的一个有效方法,简单的说,分为两步,一是每次训练一层网络,二是调优,使原始表示x向上生成的高级表示r和该高级表示r向下生成的x'尽可能一致。方法是:

1)首先逐层构建单层神经元,这样每次都是训练一个单层网络。

2)当所有层训练完后,Hinton使用wake-sleep算法进行调优。

将除最顶层的其它层间的权重变为双向的,这样最顶层仍然是一个单层神经网络,而其它层则变为了图模型。向上的权重用于“认知”,向下的权重用于“生成”。然后使用Wake-Sleep算法调整所有的权重。让认知和生成达成一致,也就是保证生成的最顶层表示能够尽可能正确的复原底层的结点。比如顶层的一个结点表示人脸,那么所有人脸的图像应该激活这个结点,并且这个结果向下生成的图像应该能够表现为一个大概的人脸图像。Wake-Sleep算法分为醒(wake)和睡(sleep)两个部分。

1)wake阶段:认知过程,通过外界的特征和向上的权重(认知权重)产生每一层的抽象表示(结点状态),并且使用梯度下降修改层间的下行权重(生成权重)。也就是“如果现实跟我想象的不一样,改变我的权重使得我想象的东西就是这样的”。

2)sleep阶段:生成过程,通过顶层表示(醒时学得的概念)和向下权重,生成底层的状态,同时修改层间向上的权重。也就是“如果梦中的景象不是我脑中的相应概念,改变我的认知权重使得这种景象在我看来就是这个概念”。

deep learning训练过程具体如下:

1)使用自下上升非监督学习(就是从底层开始,一层一层的往顶层训练):

采用无标定数据(有标定数据也可)分层训练各层参数,这一步可以看作是一个无监督训练过程,是和传统神经网络区别最大的部分(这个过程可以看作是feature learning过程):

具体的,先用无标定数据训练第一层,训练时先学习第一层的参数(这一层可以看作是得到一个使得输出和输入差别最小的三层神经网络的隐层),由于模型capacity的限制以及稀疏性约束,使得得到的模型能够学习到数据本身的结构,从而得到比输入更具有表示能力的特征;在学习得到第n-1层后,将n-1层的输出作为第n层的输入,训练第n层,由此分别得到各层的参数;

2)自顶向下的监督学习(就是通过带标签的数据去训练,误差自顶向下传输,对网络进行微调):

基于第一步得到的各层参数进一步fine-tune整个多层模型的参数,这一步是一个有监督训练过程;第一步类似神经网络的随机初始化初值过程,由于DL的第一步不是随机初始化,而是通过学习输入数据的结构得到的,因而这个初值更接近全局最优,从而能够取得更好的效果;所以deep learning效果好很大程度上归功于第一步的feature learning过程。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

基于此,也就不难明白这篇论文的模型思想了,基本上,论文的模型也就是Hitton的wake-sleep算法在语音增强上的应用。

由于深度学习效果好的很大程度归功于第一步的feature learning,所以大量的有代表性的数据会是至关重要的一环。论文里采用了4种噪声类型(加性高斯白噪声(AWGN),Babble,Restaurant,Street)和6种信噪比(20dB,15dB,10dB, 5dB, 0dB,-5dB)。TIMIT数据集加上不同的噪声和信噪比,构成多条件立体训练集。从而产生了约100小时的噪声训练数据(包含一个纯净训练数据的例子)。对于语音信号来说,频谱是最能反映其特征的手段之一,这里通过framing和DFT两个语音信号过程来提取待测语音信号特征,在论文中只考虑了语音信号的能量谱(log-power spectra),这里假设噪声语音的相位信息对人类听觉无影响,听觉只受语音能量幅度的影响。

特征提取完后,就要开始训练DNN学习这些特征了,使用自下上升非监督学习,这里使用的是deep learning的常用模型**:Restricted Boltzmann Machine (RBM)限制波尔兹曼机**

-----------------------------Restricted Boltzmann Machine (RBM)限制波尔兹曼机------------------------------------------

假设有一个二部图,每一层的节点之间没有链接,一层是可视层,即输入数据层(v),一层是隐藏层(h),如果假设所有的节点都是随机二值变量节点(只能取0或者1值),同时假设全概率分布p(v,h)满足Boltzmann 分布,我们称这个模型是Restricted BoltzmannMachine (RBM)。

下面我们来看看为什么它是Deep Learning方法。首先,这个模型因为是二部图,所以在已知v的情况下,所有的隐藏节点之间是条件独立的(因为节点之间不存在连接),即p(h|v)=p(h1|v)…p(hn|v)。同理,在已知隐藏层h的情况下,所有的可视节点都是条件独立的。同时又由于所有的v和h满足Boltzmann 分布,因此,当输入v的时候,通过p(h|v) 可以得到隐藏层h,而得到隐藏层h之后,通过p(v|h)又能得到可视层,通过调整参数,我们就是要使得从隐藏层得到的可视层v1与原来的可视层v如果一样,那么得到的隐藏层就是可视层另外一种表达,因此隐藏层可以作为可视层输入数据的特征,所以它就是一种Deep Learning方法。

如何训练呢?也就是可视层节点和隐节点间的权值怎么确定呢?我们需要做一些数学分析。也就是模型了。

联合组态(jointconfiguration)的能量可以表示为:

而某个组态的联合概率分布可以通过Boltzmann 分布(和这个组态的能量)来确定:

因为隐藏节点之间是条件独立的(因为节点之间不存在连接),即:

然后我们可以比较容易(对上式进行因子分解Factorizes)得到在给定可视层v的基础上,隐层第j个节点为1或者为0的概率:

同理,在给定隐层h的基础上,可视层第i个节点为1或者为0的概率也可以容易得到:

给定一个满足独立同分布的样本集:D={v(1), v(2),…, v(N)},我们需要学习参数θ={W,a,b}。

我们最大化以下对数似然函数(最大似然估计:对于某个概率模型,我们需要选择一个参数,让我们当前的观测样本的概率最大):

也就是对最大对数似然函数求导,就可以得到L最大时对应的参数W了。

---------------------------------------------------------------------------------------------------------------------------------------

论文采用的方法是:首先,通过一堆受限波兹曼机(RBM)学习一个噪声频谱的深度生成模型。第一个是高斯伯努利RBM,它有一个线性变量的可见层,连接到一个隐藏层,之后一堆伯努利-伯努利RBM堆在高斯-伯努利RBM后面。之后,它们就可以一层一层的进行非贪婪监督训练。在这个过程中,有一个目标准则,称为对比分歧(contrastive divergence),用于更新每个RBM的参数,即上面的参数W。

之后,就是自顶向下的监督学习,也就是文中基于最小均方差的微调。

这里采用的监督学习里非常常见的BP算法(Back-propagation),用BP算法联合目标频谱和增强的频谱特征的最小均方差(MMSE)函数用来训练DNN。
为什么用MMSE?因为MMSE准则在log域里和人类的听觉系统有很高的一致性。

为了提高收敛速度,这里还采用了随机梯度算法。

能量函数:

通过式(2),计算出每一层的微调因子b(bias)。

通过noisy到clean speech的非线性映射,再通过与特征提取相反的过程,即IDFT和重叠相加法,就能恢复出有用的语音信号。

这里几乎没有用到任何假设,因为作者们相信DNN能拟合出从noisy到clean speech的非线性映射函数。而且,这里也不像传统方法需要对不同频率点设置相互独立这一假设,因为DNN能够随着时间轴(利用多帧展开)和频率轴(利用有全频点的对数频谱特征)捕获内容信息,通过把他们连接到一个长的特征输入向量里(用于DNN学习)。

至此,模型解读完毕,论文最后的部分是实验和结果分析。最近有点忙,希望能抽时间尽量读懂些皮毛,将在comments on "An Experimental Study on Speech Enhancement Based on Deep Neural Networks"(二)继续讨论。

以上仅为博主个人见解,鄙人才疏学浅,希望各位前辈指正。

全部评论 (0)

还没有任何评论哟~