INTERSPEECH 2017系列 | 语音识别之语言模型技术

编者:今年的INTERSPEECH820日至24日在瑞典的斯德哥尔摩顺利召开,众多的高校研究机构和著名的公司纷纷在本次会议上介绍了各自最新的技术、系统和相关产品,而阿里巴巴集团作为钻石赞助商也派出了强大的阵容前往现场。从1025日开始,阿里iDST语音团队和云栖社区将共同打造一系列语音技术分享会,旨在为大家分享INTERSPEECH2017会议上语音技术各个方面的进展。第二期分享的主题是语音识别之语言模型技术视频回顾请戳这里),以下是本次分享的主要内容。
1
语音识别技术

随着iPHONE 4Ssiri的出现,越来越多的民用语音识别出现在大家眼前。现在市面上各种语音输入法、语音机器人层出不穷。下图是去年阿里云栖大会,基于iDST语音技术的ET机器人。现在市面上漫山遍野的智能音箱大战,其中也包含语音识别技术。

INTERSPEECH 2017系列 | 语音识别之语言模型技术
语音识别技术,通俗讲叫语音转文字,speech-to-text,是将观测得到的语音输入信号,转化成与之对应的文本序列的过程。传统语音识别系统如下图所示,包括特征提取、声学模型、语言模型和解码器四部分,通过特征提取将原始音频信号分帧加窗,转化成有利于机器进行识别得声学特征,经由声学模型获得该帧的声学模型得分,配合语言模型获得对应的语言模型得分,通过解码器在可能的文本空间中搜索,获得最可能的文本序列,作为结果输出。这里语言模型的作用是在路径搜索过程中辅助声学模型,判断文本路径的可能性。其中一个作用是同音消歧,即找到相同发音的目标文本序列。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

2 语言模型

语言模型,顾名思义,对语言进行建模的模型。语言表达可以看作一串字符序列,不同的字符序列组合代表不同的含义,字符的单位可以是字或者词。语言模型的任务,可以看作是给定字符序列,如何估计该序列的概率,或者说,如何估计该序列的合理性。

P(上海 工人 师傅 力量)>P(上海 工人 食腐 力量)

拿这句话做个例子。比如到底应该是“工人师傅有力量”,还是“工人食腐有力量”,哪句话更合适。我们容易判断左边这句的概率大一点,工人师傅。于是我们希望通过语言模型的建模,可以给出符合人类预期的概率分配。就像这句,工人师傅的概率,大于工人食腐的概率。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

根据条件概率的公式,我们很容易推出一句话的概率应该符合各个词条件概率的连乘,也就是链式法则。比如“上海的工人师傅有力量“,通过分词分成上海、的、工人、师傅、有、力量六个词,于是这句话(不考虑句首句尾)的概率就可以根据链式法则计算了,上海的概率,乘以”上海“后面跟”的“的概率,也就是上海条件下”的“的概率,再乘以”上海的“后面跟”工人“的概率,再乘以”上海的工人”后面出现“师傅“的概率,以此类推,一直到上海的工人师傅有,后面跟力量的概率。对于这种条件概率,也很容易通过朴素地计算词频的方式计算出来。然而我们发现,实际计算中,当句子比较长的时候,可能的组合数实在太多,实际操作中难以进行计算,于是人们就开始想着怎么简化问题,比如马尔可夫假设。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

马尔可夫假设是,大致描述一下,给定时刻t的状态的条件下,则时刻t+1的状态与t-1及之前时刻的状态条件独立。比如一阶情况,假设在给定W(k-1)的情况下,W(k)和W(k-2)及以前的状态(也就是词),条件独立。我们可以理解为W(k)只与W(k-1)相关,计算的时候不考虑W(k-2)的影响,只与前面一个词有关,于是事情就变得简单了,以前计算上海的工人师傅有这一大长串后面出现力量的概率,很麻烦,现在只需要计算后面力量的概率。

对于高阶版本,也是一个道理,比如假设只与前面N-1个词有关,于是W(1)W(k-1)这一长串后面跟W(k)的概率转化成了W(k-N+1)W(k-N+2)W(k-1)后面跟W(k)的概率,就只需要计算一个N元组W(k-N+1)W(k)的词频,以及一个N-1元组W(k-N+1)一直到W(k-1)的词频,两者作比求得。这种通过马尔可夫假设简化计算、通过N元组词频计算得到条件概率的模型,叫做N元组模型,或者N元文法模型,英文N-Gram Model

INTERSPEECH 2017系列 | 语音识别之语言模型技术

总结一下N元文法模型:通过马尔可夫假设简化了模型结构和计算,通过数数的方式计算,通过查找的方式使用。它计算简单(数数),计算速度快(查表)。有超过三十年的历史,性能稳定可靠,经得起检验。但限于词频计数的计算,它比较稀疏,依赖平滑算法,但对于没见过的组合(unseen data)它的泛化能力还是不太好;而且限于马尔可夫假设,其可用的历史信息有限,只与前N-1个词有关,再长就影响不到了。前段时间深度学习火了几年,于是大家都在想能不能用神经网络做点什么,于是人们开始尝试用神经网络替代N元文法模型。

首先是全连接神经网络,最早经得起检验的模型。内部实值节点,连续空间建模,于是比数数流拥有了更好的泛化性,训练得到Projection层作为词向量,也被发现具有不错的语义相关性。但FCNN, fully-connected NN全连接神经网络,结构并没有比ngram模型用更长的历史信息,依然跟前面N-1个词相关。于是大家就开始用理论历史信息无限长的递归结构的RNN,递归神经网络,来对语言进行建模。理论上无穷长的历史信息,实际上人们通过LSTMlong short-term memory或者GRU这种改进结构来弥补梯度衰减的问题,于是获得了还挺明显的提升。实际应用的时候有以下几个问题吧,节点数多,除了占空间,就是训练和测试的计算量都很大,然后对训练数据也比较敏感。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

词表的大小是影响模型的关键因素,比如一个100w词的词表,对应100w的输入/输出节点,如果recurrent层有1000个节点,那光输出层的权重就有10的九次方量级,算起来可是个大工程,于是压缩词典尺寸成了一个最直接的解决方案,很多时候压缩词典尺寸会造成性能损失,其实真正制约速度性能的主要是输出层节点,所以一个折中的解决方案就是仅压缩输出层词表,输入选用一个大点的词表。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

除了直接压缩词表,也可以对词表进行聚类,比如100w词表聚成1000个类,每个类别1000个词,于是就把100w的输出变成了2000的两个softmax,大幅提升了速度;第三种方法是瓶颈层,就是输出或输入增加瓶颈层来削减节点数量,但输出softmax的计算量不减,而且节点数过少对性能还是有很大影响的,分层输出Hierarchical Softmax是个树状结构,通过对输出层类别进行树状结构的聚类(或者叫编码),这样只有标签节点对应的路径需要计算,但CPU上实现还好,这种结构在树节点串行运算,不太适合GPU这种低主频高并发的计算架构,而且同数据量情况下性能衰减还是挺严重的。前段时间刚刚出来的文章,LightRNN,通过类似聚类的方式,利用embedding的思想,把词表映射到一个实值矩阵上,实际输出只需要矩阵的行加矩阵的列,计算量大概也能开个方。和节点数多一起造成计算量大的一个原因就是softmax输出,需要计算所有的节点求个和,然后得到分母。若是这个分母能保持一个常数,实际计算的时候就只算需要的节点,在测试环节就快的多了。于是就有了正则项相关的方法,variance regularization,如果训练速度可以接受的话,这种方法在基本不损失模型正确性的情况下可以大幅提升前向计算速度;如果训练的时候也想提速,还可以考虑基于采样,sampling,的方法,比如NCEIS importance samplingblack sampling等,本质上就是说,在训练的时候不计算全部节点,只计算正样本(也就是标签为1的节点),以及部分通过某种分布采样的到的负样本,避免高输出造成的计算缓慢。速度上提升还是很明显的。

3 评价指标

语言模型一般通过混淆度,英文Perplexity,简称PPL或者PP值,来评价语言模型性能。

首先我们知道熵,可以表达一组分布的最短平均编码长度,比如一个标签的值符合一组分布p1 p2 pn,出现第i个值得概率是pi,那如果我们对第i个值按负的以二为底pi的对数个bit进行编码,则可以得到最短平均编码长度。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

现在有一篇文档,或者说我们的测试集,S,每一句是Sj,我们可以根据模型算得其总概率为P(向量S),于是要达到理论最优,其编码位数应该是负的以2为底PS)的对数,我们除以总词数Nw,得到文档的平均最短编码长度。为了计算简便,以此二的平均编码位数次方,作为PPL,展开之后就是最下面的公式,每个词概率连乘后,开Nw次方。一般几十几百不等,偶尔上千吧,对应平均编码位数在610这一块。编码位数越少,对应匹配度越高,也就是PPL越小,我们认为模型越好

INTERSPEECH 2017系列 | 语音识别之语言模型技术

因为是语音识别中的一部分,为语音识别服务,所以最终的评价指标,往往是语音识别常用的评价体系,叫做符号错误率。错误包含三种,插入错误,删除错误,替换错误。通过找到最小化三种错误的一组匹配,来计算实际的错误率,是三种错误总数,除以总符号数。例如上面这个例子,上海的工人师傅有力量,被识别成了上海工人食腐有的是力量,这里左边的红字“的”,属于删除错误;“师傅”被错误识别成“食腐“,属于替换错误;多出来的右边的”的”、“是”,属于插入错误。错误一共有2+1+25处,原句10个字,所以错误率是50% 。对于中文,我们一般使用字错误率,对于英文,我们一般使用词错误率。

4 会议前沿

接下来是Interspeech2017会议的,语音识别中语言模型的研究进展。分为以下四个方面,模型优化相关的、数据和其它信息自适应相关的、解码过程相关的,以及分析类的文章。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

首先是模型优化相关的,直接从模型入手,包含以上这几篇文章,比如使用更新的模型结构,残差网络、更大广度的CNN、双向RNN等;或者更好的训练方式,比如基于BatchNCE训练、谷歌的稀疏非负矩阵语言模型SNM LM参数估计等。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

然后是adaptation,也就是自适应相关的文章。实际业务中我们也会碰倒类似问题,比如我们用大量数据训练了一个通用模型,这是有业务需求说,我们需要做某一个domain的识别,可不可以帮我们优化一下,这个domain的数据不是很多。

这种时候就需要自适应相关的方法了,将通用的大模型,通过少量数据,或者其它信息(比如这里有knowledge graph的),自适应到某一特定领域。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

第三部分是解码部分。如何将各种花样地语言模型用于语音识别。比如传说中的NNLM,基于神经网络的语言模型,刚刚说的全连接NN或者RNN结构的语言模型,其计算量是远大于N-Gram这种可以查表操作的模型的。语音识别的解码工作是一个很复杂的搜索,有很大的计算量和很高的实时性要求,如果每一次查表操作都替换成一次神经网络输出的计算,不好好优化一下可能会非常慢。这里就有一些语言模型解码这块的优化工作,包含以上三篇文章。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

最后是一篇分析类的文章,分析现在的语言模型技术,和人类之间的差距。文中估计的人类对于一般文本的理解,对应的PPL14左右,与目前语言模型技术有较大差距,预测至少需要10-20甚至更多年,机器才能在语言模型领域达到人类的认知。

总览完这些,我们就挑两篇文章一起看一下吧。

第一篇,题目是Empirical Exploration of Novel Architectures and Objectives for Language Models,对比了LSTM-RNN和文章提出的一种广度更大的CNN,在单任务传统交叉熵(也就是CE)准则下和多任务学习(multitask learning)下的性能对比。文章的contribution有两点,尝试了一个更大广度的CNN,一个是用了multitask learning

INTERSPEECH 2017系列 | 语音识别之语言模型技术

LSTM-RNN的两个基线系统,包括word-levelcharacter-level两个建模尺度。模型比较基本,对于word-levelembedding上面两层LSTM,对于character-level,尺度更细,于是加了一层LSTM以更好地刻画。输出都是word。两种尺度和LSTM-RNN的建模之前的工作中都有,所以只算是基线系统,这里没有创新。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

这里是作者proposeword-level DCC。这里为了增加对更长时的信息进行建模,使用了一个更大时间尺度的CNN,这里为了建模的效果,它没有采取一整个大卷积窗,而是分层合并的方式,比如左边这个例子,不是传统的对wanted to be able这四个单词一次卷积,而是分为wanted tobe able两个组,分别卷积,然后再卷一层的方式。右边做了一点小改进,就是又增加了一级1x2的卷积,word-DCC加一个additional的卷积层。传统CNN在英文上往往采用character-level的建模,以发挥CNN的优势,对较细的尺度进行建模,同时利用窗长和多层卷积的优势,在保证计算效率的前提下,提高时间尺度的长度;这里更加侧重时间尺度的长度,而不是更细的粒度。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

第二个contribution是用了multi-task learning。很经典的训练策略,通过加入额外的secondary task,来提升primary task(也就是主task)的性能。当然很多时候两个task互相帮助。合并的优化目标按照左边这个公式,两个交叉熵准则按权相加,按照两个task的相关性选择一个合适的lamda参数。新的task意味着额外的信息量,同时也是一种正则,对于抑制过拟合有帮助。对于数据有限的任务,multi-task learning尤为有效。这里采用了单词的类别分类作为一个task,类别是灰度聚类的到的,先聚类,再把聚类结果用于分类。没有直接增加人为设计的准则,自己对自己提升,也可以看成一种boost

实验在三个数据集展开,分别是Broadcast Newsswitchboardcallhome三个语音识别的常用8k采样英文数据集。其中swtichboardcallhome都是电话对话,放在后面说,我们先来看broadcast news

INTERSPEECH 2017系列 | 语音识别之语言模型技术

上表是混淆度PPL,下表两种不同AM情况下的WER。左边表中word-level LSTM RNN明显好过其它模型,其中Multitask learning训练的LSTM-RNN获得最低的PPL96.47;其次是character-levelLSTM,最后是CNN,其中多一个卷积层的Word-DCC+C,就是最下面两个结果,比没有这个卷积层还是有点用的。Multitask learning在这个量级的数据下面还是有一定帮助的,或多或少都看到一点提升。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

这个结果也是比较符合预期,LSTM-RNN作为经典的模型,在大多数情况还是非常优异的,只是因为其recurrent结构,它的训练速度相比CNN还是慢了一些。上面的表格是语音识别的词错误率结果,使用了两种声学模型,一种是差一些的GMM模型,一种是比较好的CNN声学模型。结果一样符合预期,word-levelLSTM-RNN + multitask learning训练获得单模型最优,与CNNcharacter-level LSTM合并后又小幅提升了一点。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

第二个实验在两个电话对话数据库上进行,就是刚刚提到的switchboard SWB callhome CH。相比上一个实验测试不同的AM,这个实验加强了基础LM,使用了N-Gram模型+一个modelM,一个准神经网络模型,这里不详述了。对于这种更强的基线LM,几个模型的相对提升下降了一些,但总体趋势与之前一致,还是word-level LSTM-RNN + multitask learning效果最好。右边的WER在两个测试集上进行,趋势基本一致,三个模型融合相比最优的单个模型又小幅提升了一点。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

这里个人觉得本文的这种CNN应该尝试character-level的建模,发挥CNN的优势,和LSTM长时信息形成互补。

刚刚是一篇模型结构、训练准则的探究,实际应用中,之前说过,基于神经网络的语言模型比基于查表的N-Gram模型计算量大了很多,在实际系统中很难实时运算,往往采用重打分的模式做rerank。这里有一篇工程性强一些的文章,针对几个影响速度的点,结合了几种优化方式,做到了NNLM的准实时one-pass解码。特色在于用N-Gram模型查表的计算量,做到NNLM的计算。

Contribution包含以下几点,加速100倍以上,做到准实时计算;

其中使用了NCE训练的unnormalized NNLM解决输出问题;

通过预计算存储和缓存解决隐层节点输出;

通过PReLUMaxout激活函数替代tanh

几个技术都不是新技术,但本文把它们用到一起,达到了比较好的效果。

模型结构如下图所示,n-1个词的输入,每个输入按1-hot编码,通过shared weights映射到E维的embeddingn-1E维的embedding拼在一起作为隐层输入,经过隐层线性映射到维度H,这里的affine映射耗时(n-1)*E*H;隐层节点通过双曲正切函数tanh的映射,耗时T_n,也就是HTanh的计算时间;输出层共计V个节点,也就是输出词典的sizeV,包括一个H*Vaffine projection和一个节点数为Vsoftmax计算。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

下面我们看看这篇文章是怎么一点一点压缩计算量的。首先是对于hidden layeraffine projection计算,一个(n-1)*E维映射到H维的矩阵乘法。这个输入特征(n-1)*E维,可以看作n-1E维的子矩阵,每个矩阵分别有一个E->H的映射,届时再把这n-1H维的向量加在一起,就是整个过程了。而这个过程中,词表是有限的,E维向量就是有限的,n-1个位置的E->H的映射也就是有限的,我们本来要存VE维的embeddingV是词表size,这里可以认为需要存储V(n-1)*Hembedding就可以免去刚刚说的E->H的映射了,于是隐层affine计算的时间就从n-1乘以E乘以H,降低到(n-1)*H次加法运算

当然,存储成本从V*E,变到V * n-1 * H,增加了n-1 * H / E倍。比如H1024E128n5,则增加了4*8=32倍。

解决完affine transform,第二步就是激活函数。我们知道双曲正切函数,就是tanh函数,泰勒需要展开到好多阶,单CPU计算代价还是比较大的。文章中替换成了PReLUParametric ReLU),一个参数可学习的ReLU函数,以及尝试了maxout。两个激活函数计算量都是比较低的,这样激活函数的时间Tn也就压缩到kTmax(H)kH维向量取max的时间。

第三步是cache策略,对于一组n-1个词的词序列 w1 w2 w(n-1),当我们计算过它的值之后,可以把输入的词序列和输出的概率都存下来放到缓存中,当计算的时候就可以直接拿出来用,避免复杂的计算。这也是常见的工程技巧,假设命中率为1-p,则计算时间可以进一步压缩为p

INTERSPEECH 2017系列 | 语音识别之语言模型技术

我们的目标是计算一个词序列的概率,其实对于每个输入词,我只需要计算它后面一个词的输出概率,而不是全词典的输出概率。但softmax函数,需要计算分母,用于归一化整个概率和为1,所有节点的值都需要被计算一遍。对于较大的词典,也就是V较大的时候,比如100w,计算量还是很大的。这里我们把分母的求和看做一个整体Zc,我们想要是Zc是个常数就好了。

本文引入了Noise Contrastive Estimation,噪声对比估计,NCE的训练准则,通过对噪声(负样本)进行采样,把一个多类分类问题,转化成每个类别的二类分类问题。一方面训练的时候不需要计算全部输出,只需要计算采样的噪声和目标节点,节省训练开销;一方面测试的时候,分母Zc可以趋近于一个常数,从而只需要计算目标节点的输出,节省测试开销。

于是通过NCE训练,输出层计算量也压缩到只有H量级了。系统中每个步骤的计算,都如下表压缩到一个很低的量级。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

下面是实验结果。这里用的数据集跟之前比较相似,用了switchboardbroadcast news两个测试集,分别记作swbbn。首先看看识别率。对于上表,用的是6-元文法模型,识别率分别从7.0降到6.6,以及10.9降到10.0,降幅都是很乐观的,识别率性能有保证。对于ModelM,提升小一些,但也相对比较稳定。

INTERSPEECH 2017系列 | 语音识别之语言模型技术

INTERSPEECH 2017系列 | 语音识别之语言模型技术

性能问题不大,这篇文章主要看速度。首先是表4precompute策略和cache策略,分别加速50倍和15-50倍。其中Broadcast newsswitchboard用的embedding数不一样,所以加速倍数不一样。但总体都有不少于100倍的提升,switchboard因为embedding数较大,更有225倍速的提升。

INTERSPEECH 2017系列 | 语音识别之语言模型技术INTERSPEECH 2017系列 | 语音识别之语言模型技术

然后表5是激活函数的提升,maxout在保证性能的前提下提速1.9倍,prelu性能稍降,6.66.7,但提速3.6倍,届时需要tradeoff一下;

INTERSPEECH 2017系列 | 语音识别之语言模型技术

6cachememory消耗,显然这里对cache的消耗还是大幅提升的,这里cachesize和命中率也是需要tradeoff一下;

INTERSPEECH 2017系列 | 语音识别之语言模型技术

最后表7是整体的提升,将5.62RTFreal time factor,实时率,整体优化到1.04,趋近ngram1.01。实际系统中ngram模型的rtf还可以继续优化到远小于1,对应的NNLM也是可以提供one-pass实时识别服务的。

4 总结
本届INTERSPEECH的论文中,语言模型的文章有很多。对这些文章的调研有助于了解目前实际产品中的性能水平,技术细节,很有借鉴意义。通过本文的介绍,希望大家能对语音识别中的语言模型技术有一定的了解。

注:
下期主题:语音合成技术
时间:11月15日晚7:30
嘉宾:阿里巴巴iDST算法专家,卢恒
报名链接:https://yq.aliyun.com/webinar/play/340

上一篇:C++设计模式3-适配器模式Adapter-不兼容结构的接口协调


下一篇:[流媒体]实例解析MMS流媒体协议,下载LiveMediaVideo[3]