本周我们来介绍一篇直接使用 Raw Waveforms 来对语音数据进行深度学习的方法。我们知道,即使在 CNN 等深度模型在语音识别领域大放异彩的当下,直接使用原始音频数据进行建模依然不是最主流的方法,如何让网络对于原始数据能更加有效地学习,是语音建模的一个前沿探索方向。本文就是在这样背景下面的一次尝试,并且创造性提出的 SincNet 结构,是能在保证学习效果的同时也大大降低了模型需要学习的参数量。
相关工作
语音识别的建模方式亿次经历过以下几个阶段:
1.手工特征+Gaussian Mixture Model-Universal Background Models (GMMUBMs);
2.手工特征 + DNN,这两个阶段所用到的典型特征如 FBANK、MFCC系数等;
3.频域特征 + CNN,这里的频域特征相比前面的手工特征,更加简单,手工痕迹更轻,一个典型的特征抽取方式:通过FFT来提取语音数据的 spectrum bin 信息
可以看到两个趋势:
1、模型结构越来越现代化,这得意于以 ResNet 为首的网络结构设计的热潮,特别是CNN对于时序数据的适应性改造工作,使得 CNN 在语音识别领域的适应性更加全面。
2、对原始数据的特征加工越来越少,当然最少的方式就是直接使用 Raw data 进行建模
为什么以前很难对Raw data进行建模?
笔者认为这其中的难点就在于音频数据的维度太高,一般音频的采样频率很高,这导致即使 1s 的语音数据都很长,如果直接套用CNN,卷积的kernel size设为3,那么网络对于信息的聚合速度太慢,除非堆很多层,或者用很大的kernel size 如200,但是这两种方式都使得模型的参数量太大,很难优化。
频域特征+CNN为什么有效,就是因为通过滑窗内的FFT操作,可以快速聚合该窗口内的全局信息,这样后面的CNN就可以设置很小的kernel size,学习负担少了很多,自然学起来就更加有效。
顺着这样的思路,我们发现,要想直接对Raw data 进行建模,第一层操作算子所承担的作用至为关键。
SincNet
我们来看看,本文是怎么针对这个关键因素进行设计的:
标准的卷积操作:
是一个数据片段,是一个卷积核,长度为L。我们说语音里面需要很大的L来对数据进行快速处理,这导致卷积核的参数量太大。作者的一个基本想法,就是改进变为,只需要很少的参数量就可以决定这个卷积核。
具体 g 怎么设计呢?借用信号处理的一些先验知识,标准的信号处理时常在频域用到一个矩阵带宽的滤波器,式子表达如下:
分布是低频和高频阈值,是一个矩形函数。将上式通过逆傅里叶变换反解到时域,g 变为:
其中。
如此,这个g 就仅有两个参数需要拟合。
一个理想的矩形带宽滤波器的处理对象是无限长的时域信号,若为有限长,会产生频谱泄露的问题,一个常见的处理方法,就是加上一个窗口函数:
本文选择了一种最常见的窗口函数,Hamming window:
对于窗口函数的深层次作用,可以去查一下 window function,笔者理解的也不是很透彻。
如此,整个操作就完成了,而需要学习的参数仅有两个阈值,与的长度无关。这充分借鉴了信号处理的一些基本思路。
有了这个操作之后,只需要将标准CNN网络的第一层换成这个SincNet Filter就行了,示意图如下:
SincNet 的优势如下:
1、收敛快:SincNet 强制将卷积的Filter 学习成一个频域上的矩阵窗形状,当然同时也保留了参数的自适应性。这种先验知识的引入,大大简化了网络的学习任务,收敛自然更快。
2、参数量少:SincNet 显著减少了模型的参数量,假设标准卷积核有 F 个filters,长度为L,那么其参数量就为 FL,而SincNet仅为2F。我们前面说了,一般在第一层L需要设置的很大,如100,那么SincNet的参数量减少的就很可观了。
3、计算更加高效:我们观察到 g 函数是轴对称的,实际上只需要计算一半,就可以同时得到另一半的结果。
4、可解释性更强:SincNet 第一层学习到的filters 性质比较简单,物理意义比较明显,可解释性很强,当然,这是该算子的设计初衷所导致的。
实验
作者在 Librispeech 和TIMIT 两个数据集上对SincNet 做了Speaker Identification 和 Speaker Verification 的实验验证。首先对比了标准CNN 和SincNet 的差异,下图就比较了两者在第一层学习到的 filters 形状:
可以明显的看到,SincNet 学习出来的 filter 更加干净,可解释性也更强,符合最初设计的目的。
其次,作者分析了两者 filters 的 Cumulative frequency response,可以看到SincNet 出现了两个更明显的波峰,这是声学上的一种共振峰,反映了系统对于声纹特征的捕捉能力,当然这方面的背景知识,文章并没有详细指出,大家可以去查阅资料补充。
最后作者对比了SincNet相比其他方法在两个任务上的表现,SincNet 表现优异。
总结
SincNet 的卷积算子,具有很强的设计感,带有先验的知识在里面。其实标准的CNN算子又何尝不是这样的呢?好的算子要契合数据的内在结构去进行计算,只有这样,才能真正抓住数据的内在模式。