(IS 19)Binary Speech Features for Keyword Spotting Tasks Alexandre Riviello, Jean-Pierre David(重点)

会议:INTERSPEECH 2019
论文:Binary Speech Features for Keyword Spotting Tasks
Alexandre Riviello, Jean-Pierre David

作者:Alexandre Riviello, Jean-Pierre David

Abstract

关键字发现是一项分类任务,旨在检测一组特定的口语单词。 通常,此类任务在功耗受限的设备(例如智能手机)上运行。 降低关键字发现算法(通常是神经网络)功耗的一种方法是降低网络权重和激活的精度。 在本文中,我们提出了一种语音特征的新表示形式,它更适合于低精度网络并与二进制/三进制神经网络兼容。 新的表示法基于logMel频谱图,并模拟了功率随时间的变化。 经过ResNet的测试,该表示产生的结果几乎与传统上在语音识别应用中使用的全精度MFCC一样准确。

7. Conclusion

在本文中,我们评估了音频特征精度对关键字发现应用检测质量的影响。 这些功能旨在与具有量化权重和激活量的神经网络一起使用,以减少能量需求。 已经提出了基于对数-梅尔频谱图的功率变化频谱图。 与代表传统log-Mel光谱图的8位图像相比,当在具有完全精确的权重和激活的ResNet上进行测试时,我们的表示导致几乎相同的精度(95.8%对96.8%)。 但是,它仅需要1个2位通道或2个1位通道,可以轻松地与二进制或三进制神经网络接口。 未来的工作将尝试在各种噪声条件下使用低精度网络测试这种表示形式。 同样,在实际的KWS任务中而不是在多类分类任务中测试此表示形式也将很有趣。

1. Introduction

近年来,语音识别作为一种消费电子产品已广受欢迎。许多设备(例如Google Home或Amazon Echo)都将其用作主要功能。用于检测语音的算法可能会根据手头任务的类型而有很大不同。例如,在大词汇量连续语音识别(LVCSR)任务中,语音被分解为基本单位,例如音素或字符。然后将语言模型和声学模型进行组合以预测发音的单词。相反,诸如关键字搜索(KWS)之类的简单任务只能检测一组特定的单词。无需将语音分解为音素,并且可以使用整个单词作为输入来训练算法。诸如Amazon Echo之类的系统在尝试检测诸如“ Alexa”之类的关键字时将执行KWS任务,然后在尝试理解语音请求时可能会执行LVCSR任务。

语音识别的兴起是由于深度学习的发展而发展起来的,神经学习的发展和普及。实际上,语音识别算法的大多数现代实现都使用深度神经网络(DNN)[1]。但是,提高语音检测的准确性是有代价的:DNN的计算量很大且耗能很大。典型的DNN可以包含数百万个必须存储在某种内存中的参数。快速的内存访问和数百万的乘法运算是其计算成本背后的主要因素[2]。功耗要求通常很高,以至于这些算法通常需要在远程服务器上运行。考虑到有限的电池寿命和智能手机的计算效率,这种设计选择是合理的。但是,由于不断收集数据并将其发送到专用服务器,因此使用云计算可能会引起隐私问题。还必须考虑可靠性问题,因为远程处理取决于连接的可靠性。语音识别算法将可以在智能手机或家用设备上本地运行。这可以通过减少其计算要求来完成,这是本文的主要目标之一。

已经提出了许多技术来减少计算需求。常用的方法是量化网络的权重和激活。通过将这些值修改为较短的位表示形式,可以大大降低内存访问成本。当权重和激活为二进制{0,1}或三进制{-1,0,1}时,不再需要乘法运算,因为可以使用组合逻辑执行卷积。 Courbariaux等。证明了当对二值化权重和数据集如MNIST和CIFAR-10进行激活时,有可能获得与全精度网络相当的结果[3] [4]。其他技术包括重量修剪,它消除了多余的神经元。通过这种技术,Srinivas等人。设法消除了85%的参数,然后在MNIST分类任务[5]上获得了大约1%的准确度下降。本文将重点讨论量化网络。

这种网络的挑战之一是为输入数据找到合适的表示。在BinaryNets [4]的情况下,输入图像用8位定点值表示。因此,第一卷积层具有8位输入。仅以下层接收二进制值。 XNOR-Nets [6]和改进的BinaryNets [7]也忽略了输入数据的量化。但是,具有二进制权重的单个卷积层可能无法提取输入图像中包含的所有潜在特征。直接降低输入图像的精度也可能破坏有用的信息。为了解决这个问题,本文将介绍一种可以由量化网络直接用于KWS的低精度数据表示。

首先,我们将降低代表语音特征的输入图像的精度,并查看精度如何受到影响。然后,我们将展示我们的新表示形式,该模型可以模拟功率随时间的变化。以下各节分为以下几节:第2节介绍了KWS领域的一些相关工作。第3节介绍了传统语音表示形式。第4节详细介绍了提出的算法以产生新的表示形式。第5节介绍了我们的测试设置。结果报告在第6节中。最后,第7节总结了这项工作并提出了未来的研究方向。

2. Related works

KWS算法的现代实现要么使用序列来序列化模型,例如基于长短期记忆(LSTM)的网络[8],因为它们可以捕获发声的时间进程,或者经过预处理就可以基于卷积神经网络(CNN)的模型[9]。输入可以被视为代表时间轴上声音的图像。其他变体包括ResNet,它是具有跳过连接的CNN [10]。在10个单词的分类任务中,Tang等人。使用ResNet [11]获得的准确率超过95%。邱林等。然后通过通过超参数优化生成许多尺寸减小的模型来改进相同的ResNet [12]。最精确的模型获得了96.8%的准确度,并且所需参数不到以前模型的一半。在两个实验中,都使用Google Speech Commands Dataset [13]训练和测试网络。该数据集包括65000个声音文件,其中包含30个不同的1秒话语,例如“是”,“否”,“向上”或“向下”。选择了10个单词,并将2个额外的类别添加到网络的softmax输出中:静音和随机噪声。本文将使用此ResNet和数据集来测试语音的不同预处理方法。
如前所述,大多数量化网络的实现都使用8位精度输入作为输入图像[3] [4] [6] [7]。第一个卷积使用二进制权重,并将位运算应用于输入图像。据我们所知,没有其他论文尝试将语音输入图像的精度降低到二进制或三进制值。诸如Zhang等人提出的KWS硬件实现,使用8位来表示输入图像[14]。

3. Background

3.1. Traditional speech representations
为了表示语音数据,传统算法,例如隐马尔可夫模型高斯混合模型(HMM-GMM),使用了梅尔频率倒谱系数(MFCC)[15]。 GMM需要去相关的输入才能正确地对数据建模。因此,离散余弦变换(DCT)能够解相关输入并用于计算MFCC。但是,随着DNN的引入,DNN可以提取在输入数据中发现的复杂相关性,不再需要DCT操作。只需使用对数-梅尔光谱系数就不会降低结果。因此,本文将重点介绍对数梅尔频谱图

3.2. Computing the log-Mel spectrogram and MFCCs
计算log-Mel频谱系数的步骤如下:a)将预加重滤波器应用于声波(通常以16 kHz采样); b)将波分为25-30 ms帧,每帧之间偏移10 ms; c)对每一帧进行零填充以获得等于2的幂的样本计数(通常为512); d)对每个帧应用汉明窗和实数FFT; e)在结果帧与每个Mel过滤器(通常为40个过滤器)之间执行点积运算; f)计算每个值的对数,得到40个系数。图1中详细说明了这些步骤。在本文中,Python库Librosa v0.6.2用于计算Mel频谱图[16]。强调前步骤不是预处理的一部分。采样率,窗口大小和滤波器数量可能因一种实现方式而异。要计算MFCC,必须简单地在对数梅尔频谱图的每一帧上应用DCT操作。
在这里插入图片描述

4. Proposed speech representations

在本文中,提出了两种不同的语音表示形式。第一个是对数梅尔频谱图的量化版本,第二个是幂变谱图。前者将在4.1节中详细说明,而后者将在4.2节中进行详细说明。功率变化谱图也细分为两个不同的部分,分别介绍1通道和2通道表示。

4.1. Reducing the precision of the log-Mel spectrogram
寻找低精度表示的第一个尝试是简单地降低log-Mel频谱图的精度。由于信号的功率已经以对数标度表示,因此使用线性量化器来分离不同强度的水平。

Google Speech Commands数据集中的每个发音均为1秒长。使用40个Mel滤镜(具有10 ms的帧偏移),得到的频谱图图像大小为40x101像素。可以在Tang等人制作的GitHub存储库中找到用于计算log-Mel频谱图的代码。 [11] [17]。与原始代码不同,我们使用了一个更宽的带通滤波器,覆盖了从0到8 kHz的频率。这提供了更好的结果。所有图像的最大值通常围绕相同的值delta幂旋转。因此,我们向数据添加了一个偏移量,以使每个像素值的范围从0到delta power(在本例中为20)。然后将图像重新缩放以覆盖0到255之间的值,并下移到最接近的整数,从而创建无符号的8位表示形式。根据所需的位宽,将忽略给定数量的最低有效位(LSB)。算法1中总结了这些计算。
在这里插入图片描述
4.2. Power-variation representation
降低log-Mel频谱图的精度会发现8位表示所包含的信息比需要的更多。但是,使用2位表示不是最佳解决方案。由于图像的一个好的部分的值平稳,因此大多数信息都是重复的(在与3x3滤镜卷积的情况下)。一个更有趣的表示形式将试图描述高原的轮廓,或者简单地描述两个时间框架之间的功率变化。计算差异的想法也受到许多语音识别系统中使用增量系数的启发。 Kumar等。提供的例子表明,与语音相比,噪声趋于平稳[18]。换句话说,测量声音功率的变化可以隔离重要的信息。

4.2.1. Ternary 1-channel representation
使用三元逻辑可以轻松表示两个时间范围之间的差异。在我们的例子中,我们将功率的增加等同于1,将功率的减少等同于-1,将恒定功率等同于0。首先,将数据重新映射为0到255之间的值,就像算法1一样。然后设置所有参考值(代表每个梅尔滤波器输出的40个值)到第一个数据时间帧。如果第二帧的值比参考值大某个阈值,则输出为1,并且更新参考值。如果这些值小于-1 *阈值,则输出为-1,并且参考值也会更新。对于所有后续帧重复此过程。该算法在算法2中有详细说明。对于我们的测试,阈值设置为12。此值是通过执行详尽搜索确定的。
在这里插入图片描述
4.2.2. Binary 2-channel representation
引入了第二种表示形式,将先前的图像分为2个通道。 本质上,功率的增加在第一通道中由{0,1}表示,在第二通道中由{0,1}表示。 这给出了纯二进制表示形式,从硬件的角度来看这很有趣,因为每个乘法运算都可以用一个逻辑门执行。

5. Experiments

使用Tang等人提出的ResNet架构对每个输入表示进行了测试。 [11]。 每个相应图层的特征图数量已更改,以匹配Qiu Lin等人的EdgeSpeechNet-A模型。 [12]。 该网络如图2所示。
在这里插入图片描述
照原样使用ResNet测试了四个量化的log-Mel谱图和三元功率变化谱图的分类精度。 Google语音命令数据集用于训练和测试[13]。 所有权重和激活都用浮点值表示。 在每种情况下,网络训练了26个时期。 大约12个时期的学习率设置为0.1。

然后,它每6个随后的时期减少10倍。 噪声和随机移位已添加到输入数据中。 进行了64个小批量的训练。与Tang等人的GitHub存储库的res15模型相比,所有其他网络超参数(特征图的数量除外)保持不变。 [11] [17]。 每个结果平均进行5次训练。 预处理和网络完全在NumPy和PyTorch中实现。 该网络在GeForce GTX 1060图形处理单元(GPU)上进行了培训。

6. Results

6.1. Low-precision log-Mel spectrogram
对数-梅尔频谱图的示例在图3中说明,表示分别量化为8、4、3和2位。 即使使用2位表示,图像似乎仍保留了其大部分特征。
在这里插入图片描述
量化输入的结果总结在表1中。EdgeSpeechNet-A模型使用全精度MFCC作为输入,声称的精度约为96.8%[12]。 8位对数梅尔频谱图表示法给出的结果大致相同。 同样,使用8位像素可提供非常详细的表示,如图3所示。实际上,直到我们达到3位时,精度才发生很大变化。 这可能表明,至少在尝试检测一组关键字时,这些图像中包含的许多信息都是不必要的。
在这里插入图片描述
6.2. Power-variation spectrogram
1通道功率变化频谱图的示例如图4所示。2通道等效功率(未显示)在一个通道中具有功率增加而在另一通道中具有功率降低。 功率变化谱图的准确性报告在表2中。与8位log-Mel谱图或MFCC相比,提议的表示形式的准确性仅下降了1%(95.8%对96.8%)。

对于最重要的情况,使用误报率(FAR)和误拒率(FRR)绘制了接收器的工作特性(ROC)曲线。 对于每个关键字,FAR和FRR在0到1的灵敏度阈值范围内计算。然后将曲线在固定FAR值上取平均值。 图5中显示了一些关键表示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Sure, here is an example Python code for Uplift model with low-rank regularization logistic regression for multiple correlated binary responses: ```python import numpy as np from sklearn.linear_model import LogisticRegression # define the Uplift model with low-rank regularization logistic regression class UpliftLowRankLogisticRegression: def __init__(self, rank=5, alpha=1.0): self.rank = rank self.alpha = alpha self.models = [] self.w = None def fit(self, X, y, t): # calculate the treatment and control groups X_treatment = X[t == 1] y_treatment = y[t == 1] X_control = X[t == 0] y_control = y[t == 0] # fit the logistic regression model for each response for i in range(y.shape[1]): model = LogisticRegression(penalty='l2', C=self.alpha) model.fit(np.hstack((X_treatment, y_treatment[:, i].reshape(-1, 1))), y_treatment[:, i]) self.models.append(model) # use SVD to learn the low-rank representation w U, S, Vt = np.linalg.svd(y_control - self.predict(X_control)) self.w = Vt[:self.rank].T def predict(self, X): # calculate the uplift score for each response uplift_scores = np.zeros((X.shape[0], len(self.models))) for i, model in enumerate(self.models): uplift_scores[:, i] = model.predict_proba(X)[:, 1] # calculate the predicted response for the control group y_control_pred = np.dot(X, self.w) # calculate the predicted response for the treatment group y_treatment_pred = y_control_pred + uplift_scores # return the predicted response matrix return np.vstack((y_control_pred, y_treatment_pred)) ``` The `UpliftLowRankLogisticRegression` class takes two hyperparameters: `rank` for the rank of the low-rank representation w and `alpha` for the regularization strength of logistic regression. In the `fit` method, the treatment and control groups are separated, and logistic regression models are fitted for each response using the treatment group. Then, SVD is used to learn the low-rank representation w from the predicted responses of the control group. In the `predict` method, the uplift scores for each response are calculated using the logistic regression models and added to the predicted responses of the control group to obtain the predicted responses of the treatment group. The predicted response matrix is returned by stacking the predicted responses of the control and treatment groups vertically.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值