2016-04-17 13:56:32 lihaitao000 阅读数 2856
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波
语音识别中基于规则的语言模型
一 语言模型的选择

语音识别一般分为两个阶段:
1)语音识别阶段:这个阶段利用语音的声学模型,把自然的声音信号转换为机器可以处理的数字表达的音节形式。
2)语音理解阶段:这个阶段把上阶段的结果即音节转换成汉字,这一阶段需使用语言模型的知识进行理解。
而在语音识别中最重要的一部就是建立语言模型,提高语音识别的准确率。
语言模型现在常用的一般可以分为两种:一种是基于大规模语料库的统计语言模型。这种方法的特点是适合处理大规模真实语料 , 数据准备的一致性好,鲁棒性强 , 但由于其实现受系统的空间和时间所限 , 因而只能反映语言的紧邻约束关系,无法处理语言的长距离递 归现象 。 
一种是基于规则的语言模型。这种方法是在对汉语词汇系统按语法语义进行分类 的基础上 , 通过确定 自然语言的词法 、 句法及语义关系 , 试图达到同音词的大范围的基本唯一识别 。 其特点是适于处理封闭语料 , 能够反映语言的长距离约束关系和递归现象 , 但这种方法的鲁棒性差 , 不适合处理开放性语料 , 知识表达的一致性不好 。
二 词汇分类体系的建立
词类的划分是 自然语言理解的基础 , 分类是人类认识事物 的一种结果 , 也是人类认识
事物的一 种手段 。 只有对汉语词汇进行系统的语法语义分类 , 才能对整个词汇系统有完
整 的认识 , 进行合理的属性标注 , 并在此基础上 , 建立完整系统的规则体系 , 这也会给实际工作带来极大的方便。
按语法进行分类 , 划分 比较简单 , 它和句法关系密切 , 只关心基本词性 , 基本上不关
心被表达知识的意义 。 
) 按语法进行划分 , 把词划分成十一大类 : 名词 、 动词 、 形容词 、 数词 、 量词 、 代词 、副词 、 介词 、 连词 、 助词和语气词 。
2 ) 在语法分类 的基础上 , 按照语义对名词类 、 形容词类 、 量词类 以及动词类进行更深层次的分类 , 分类时尽量考虑建立各种规则的需要 , 视具体情况 , 语义类可分到一
至六层
三 规则的表示
规则表示的是汉 语句子 内各成分之间的结合关系 , 包括语法和语义上的关系 。 规则由
产生式来表示 。 这样一 个规则体系就是一个产生式体系 。 上 下文无关文法最适合用来描述
自然语言 , 我们采用它来描述系统的产生式规则 。
在我们的系统中 , 用下列符号来表示各种语法语义成分 :
S 是起始符 , 代表整个句子 ;
N 、 V 、 A 、 D 、 M 为非终结符 , 分别代表名词 、 动词 、 形容词 、 副词和量词等语法类:
N P 花 、 N P 动物 、 N P 车 、 A P 花 、 A P 动物 、 A P 车 、 V 打 、 V 吃 、 · 一等为非终结符 ,
分别代表名词 、 形容词 、 动词词性的语义类 ;
戮 为终结符 , 表示汉语单词 。
四 规则的获取
规则的获取就是使计算机获得关于语言的知识 , 利角 这些知识来理解句子 , 以区别汉
字输入 中出现 的大量候选字 。 规则的获取同其他知识获取一样主要有两种途径 :
l ) 人工 编辑方式: 由人直接对语言知识进行编辑加工 , 形成规则 , 构成基本知识库 .
2 ) 机器 自动获取 : 使系统具有机器学习功能 , 在使用过程中, 根据经验不断学习 , 自
动获取规则 , 逐步完善和丰富知识库 .
我们首先采用人工编辑的方式获取规则以建立基本规则库 , 在此基础上使系统具有机
器学习 的功能
五 规则模型的实现
我 们 首先在拼音一汉字转换系统 中成功实现 了基于规则的语言模型 。 实现时先把各音节
的同音字归纳成一棵语法 、 语义树 , 根据 匹配规则在树 中选择满足条件 的汉字串作为音字
转换的结果 3 [ ] 。 设有这样一组规则 :
M + % 个十 N P 人一> N P 人
N P 人+ % 是+ N甲 人

S ( * )
我们输入拼音串 “ w o s i h i y g e b ig n ” , 系统将生成如图 1 所示的树结构


系统根据规则 ) 搜索此树 , 生成汉字 串: “ 我是一个兵 ” 。 ( *
单纯使用规则进行匹配存在这样 的问题 : 可 能有多个汉字 串对应该语义树 , 即存在多

个同音字或 同音词属于同一语义类 。 这种问题可 以用统计方法来解决


参考文献:哈尔滨工业大学计算机科学与工程系 《语音识别中基于规则的语言模型的研究》

2018-05-31 12:30:06 JosephPai 阅读数 3265
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波

1 从语音识别说起

语音识别是什么,通俗来说,就是输入音频,输出识别文字结果。基本方程如下
这里写图片描述
这里写图片描述: 识别结果
W:任一单词(以孤立词举例说明)
O:输入的语音序列(Observation Sequence)

上述方程的变换应用了Bayes Rule.

等式右边是两项乘积,P(W)来自语言模型(Language Model, LM), 常用的模型有 N-gram。 P(O | W)来自于声学模型(Acoustic Model, AM),传统的语音识别系统普遍采用的是基于GMM-HMM的声学模型,其中GMM用于对语音声学特征的分布进行建模,HMM则用于对语音信号的时序性进行建模。具体介绍网上有很多通俗易懂的文章,这里暂不赘述。本文重点讲解声学模型中的解码问题,暂不涉及语言模型。

2 计算P(O | W) —— 解码

P(O | W)可以继续分解如下
P(O | W) = P(A, O | W) 这里写图片描述
其中A表示状态序列,O表示观测序列,a表示转移概率,b表示观测概率
这里写图片描述

如图,上方是状态序列(state sequence)(HMM),下方是观测序列(observation sequence)。我们看到,states之间存在不同的转移方式,每个state针对observation也有不同generate方式。可以想象,通过组合,我们可以得到一个巨大的状态网络。而我们语音识别的任务,通俗来说就是从这个巨大的状态网络中搜索到最佳路径(partial path),也就是最大概率的路径,对应上面公式的argmax。这个搜索匹配的过程在语音识别中叫做解码(decode)。在众多路径中找到最佳路径,一种暴力方法是穷举,但是计算量大到不现实。目前应用的主流方法是Viterbi算法。

3 Viterbi算法

Viterbi算法的基础概括成下面三点:

  1. 如果概率最大的路径P(或者说是最短路径)经过某点a,那么这条路径上从起始点s到a的这一段子路径一定是s到a之间的最短路径。否则用s到a的最短路径来替换上述路径,便构成了一条比P更短的路径,矛盾。
  2. 从S到E的路径必定经过第i时刻的某个状态,假定第i时刻有k个状态,那么如果记录了从S到第i个状态的所有k个节点的最短路径,最终的最短路径必经过其中的一条。这样,在任何时刻,只需要考虑非常有限条最短路径即可。
  3. 结合上述两点,假定当我们从状态i进入状态i+1时,从S到状态i上各个节点的最短路径已经找到,并且记录在这些节点上,那么在计算从起点S到前一个状态i所有的k个结点的最短路径,以及从这k个节点到Xi+1,j的距离即可。

    这里写图片描述

上图是一个简单的四个状态HMM应用Viterbi算法的例子。
Viterbi算法的思想是典型的动态规划思想。动态规划相对穷举已经大大减少了计算量,然而面对巨大的网络,我们意识到还是有很多不必要的计算。有些路径的计算过程中概率已经很小,完全偏离了我们要的最佳路径,继续计算这样的路径显然是没有必要的。这个时候就需要剪枝(pruning),剪枝的Viterbi算法其中一个实现叫做Token Passing,著名的语音识别工具箱HTK的解码部分应用的就是这一概念模型。

4 Token Passing Approach

4.1 概念模型

假设每一个HMM的state可以保存一个或多个Token。Token是一个概念上的对象object,它可以在state之间进行传递,一般都是按照箭头指向的方向,所以也叫前传(propagate)。每一个Token携带着它所经过路径的打分score,这个分值一般是log量级的概率和(因为我们要找的是最大概率路径嘛,也就是最高分的路径。)Token的传递是以观测序列的generate为节拍进行。
你可以想象每一条路径都是一条贪吃蛇,token就是蛇的头部的那一节,身体部分就是他所经过的state路径。算法过程大致如下:

初始化(t=0):
    初始state(入口处)的Token的s=0
    其他state的Token的s=-inf
执行过程(t>0):
    复制若干数目Token,并将其传递至所有与该state连接的其他state中,并且对其值做如下操作:  
    在每个state中,比较所有token,留下分值最高的token,抛弃其他所有token(Viterbi剪枝过程)
终态(t=T):
    比较所有终态(final state)的Token,保留其中分数最高的token

该token对应的就是最佳路径的概率。

这里写图片描述

上图是一个Token Passing示意图,过段时间我计划做一个flash或者录一个小视频来更直观的演示这个过程。

4.2 孤立词识别(Isolated Word Recognition)

将Token Passing的思想应用到语音识别的解码过程中,我们首先从孤立词识别引入。一个英文单词音频一般分为三个音素,而一个音素又可以分为若干个状态,这些层级展开一个网络。他们之间的跳转符合隐马尔假设,所以可以应用Viterbi算法进行搜索解码。
单词级的HMM和音素级的HMM都可以直接套用上文的Token Passing模型,实现如下。
这里写图片描述
这里写图片描述

通过这一过程,我们对每一个单词都建立了一个HMM model,为后面的连续词识别奠定了基础。

4.3 连续识别(Connected Word Recognition 或 Continuous Speech Recognition)

连续识别的主要问题在于:

① 音频中词与词之间的分界线(boundary)不明确
② 音频序列中总的单词数目不能确定

应用Token Passing模型,我们可以以上文的孤立词识别为基础,将不同的孤立词模型组合成一个网络,构成复合的语句级别的HMM模型(sentence model),并进行下图所示的抽象。在interface右边是上文提到的孤立词级别的模式匹配模型,在interface右边是语句级别的连续识别匹配,这时候我们就可以不用关注单词级别的具体实现。

这里写图片描述

具体识别过程,即在上文提到的语句级复合HMM中继续应用Token Passing模型(因为我们的目标和之前一样,还是寻找最佳路径)。

这里写图片描述

此外,在连续词识别中,我们还需要对基础的Token Passing进行一些扩展。为了能够准确的记录我们识别出的句子所包含的单词,我们引入一个新的概念Word Link Record(WLR). 顾名思义,这是一条记录,里面存放着记录word link的指针。Token除了携带score信息,还要携带一个path identifier来记录上一个WLR。
在C/C++中,token的数据结构大概会是:

struct Token{
    double score;
    struct WRL *path_id;      
    }

在上面的Token Passing基础算法中,我们新增如下过程:

在时间 t ,对每一个完成单词级识别的token(从小网络传递到大网络) do:
    创建一个新的WLR
    WLR包含 <token内容(最大概率), 时间t, 记录路径的path id, 刚刚完成识别的单词model id>
    将token中的path id指向刚刚创建的这条新的WLR
end

这里写图片描述

如图所示,WLR构成的链表结构,记录了所有潜在的boundary信息。例如,t-3时刻很可能是单词two的结尾。
当到达T时刻整个句子识别结束后,我们再通过比较,得到得分最高的token,然后通过该token的path id以及WLR的链表结构可以轻松的回溯得出识别结果。

5 总结

以上就是应用Token Passing模型实现Viterbi算法的具体过程,该模型通俗易懂,有效的解决了连续词识别的问题。泛化能力强,实际上One Pass、Level Building等经典算法都可以看做Token Passing的特殊情况。且易于扩展,譬如我们可以通过保留多个token来评比多条路径(N-best)以提升识别效果。
本文为了做到尽量通俗,有诸多不严谨之处,欢迎批评指正。

Reference:
[1] Young S J, Russell N H, Thornton J H S. Token passing: a simple conceptual model for connected speech recognition systems[M]. Cambridge, UK: Cambridge University Engineering Department, 1989.
[2] Young S, Evermann G, Gales M, et al. The HTK book[J]. Cambridge university engineering department, 2002, 3: 175.
[3] University of Cambridge Engineering Part IIB & EIST Part II Module 4F11: Speech Processing Lecture 11: Continuous Speech Recognition
[4] SGN-24006 Analysis of Audio, Speech and Music Signals lec09
[5] speech.zone

2017-07-10 10:45:10 zhonglj0314 阅读数 3371
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波

本文是对最近学习的语音识别的一个总结,主要参考以下内容:

《解析深度学习——语音识别实践》

http://licstar.net/archives/328 词向量和语言模型

几篇论文,具体见参考文献


语音识别任务是把声音数据转换为文本,研究的主要目标是实现自然语言人机交互。在过去的几年里,语音识别领域的研究成为人们关注的热点,出现了众多新型

语音应用,例如语音搜索、虚拟语音助手(苹果的Siri)等。

语音识别任务的pipline

语音识别任务的输入是声音数据,首先要对原始的声音数据进行一系列的处理(短时傅里叶变换或取倒譜...),变成向量或矩阵的形式,称为特征序列。这个过程

是特征提取,最常用的是mfcc特征序列。这里就不深入学习了,只要知道这是语音识别的第一步。

然后,我们对这些特征序列数据建模。传统的语音识别方案中采用的是混合高斯分布建模。其实不仅仅在语音识别领域,还有很多工程和科学学科领域,高斯分

布是非常流行的。它的流行不仅来自其具有令人满意的计算特性,而且来自大数定理带来的可以近似很多自然出现的实际问题的能力。

混合高斯分布:

一个服从混合高斯分布的连续随机标量x,它的概率密度函数为:


其中          

推广到多变量的多元混合高斯分布,其联合概率密度函数为:


混合高斯分布最明显的特征是它的多模态(M>1,不同于高斯分布的单模态性质M=1。这使得混合高斯分布能够描述很多显示出多模态性质的数据(包括语音数

据),而单高斯分布则不适合。数据中的多模态性质可能来自多种潜在因素,每一个因素决定分布中一个特定的混合成分。

当语音数据经过特征提取,转换为特征序列之后,在忽略时序信息的条件下,混合高斯分布就是非常适合拟合这样的语音特征。也就是说,可以以帧为单位,用混

合高斯模型对语音特征进行建模。

如果考虑把语音顺序信息考虑进去,GMM便不再是一个好的模型,因为它不包含任何顺序信息。

这时,使用一类名叫隐马儿可夫模型(HiddenMarkov Model)来对时序信息进行建模。然而,当给定HMM的一个状态后,若要对属于该状态的语音特征向量

的概率分布进行建模,GMM仍然是一个好的模型。

所以传统的语音识别中,GMM+HMM作为声学模型。

语言模型


 语言模型其实就是看一句话是不是正常人说出来的。它可以用在很多地方,比如机器翻译、语音识别得到若干候选之后,可以利用语言模型挑一个尽量靠谱的结

果。在NLP的其它任务里也都能用到。
  语言模型形式化的描述就是给定一个字符串,看它是自然语言的概率P(w1,w2,,wt)
w1wt依次表示这句话中的各个词。有个很简单的推论是:


P(w1,w2,,wt)=P(w1)×P(w2|w1)×P(w3|w1,w2)××P(wt|w1,w2,,wt1)


  常用的语言模型都是在近似地求P(wt|w1,w2,,wt1)
。比如n-gram模型就是用P(wt|wtn+1,,wt1)近似表示前者。

语言模型经典之作:

训练语言模型的最经典之作,要数Bengio等人在2001年发表在NIPS上的文章《ANeural Probabilistic Language Model》。当然现在看的话,肯定是要看他在2003年投到JMLR上的同名论文了。

  Bengio用了一个三层的神经网络来构建语言模型,同样也是n-gram 模型。

图中最下方的wtn+1,,wt2,wt1就是前n1个词。现在需要根据这已知的n1个词预测下一个词wtC(w)表示词w所对应的词向量,整个模型中使用的是一套唯一的词向量,存在矩阵C(一个|V|×m的矩阵)中。其中|V|表示词表的大小(语料中的总词数),m表示词向量的维度。wC(w)的转化就是从矩阵中取出一行。


  网络的第一层(输入层)是将C(wtn+1),,C(wt2),C(wt1)n1个向量首尾相接拼起来,形成一个(n1)m维的向量,下面记为x

  网络的第二层(隐藏层)就如同普通的神经网络,直接使用d+Hx计算得到。d是一个偏置项。在此之后,使用tanh作为激活函数。


  网络的第三层(输出层)一共有|V|个节点,每个节点yi表示下一个词为 i的未归一化log概率。最后使用softmax激活函数将输出值y归一化成概率。最终,y

的计算公式为:

y=b+Wx+Utanh(d+Hx)

 式子中的U

一个|V|×h的矩阵)是隐藏层到输出层的参数,整个模型的多数计算集中在U和隐藏层的矩阵乘法中。后文的提到的3 个工作,都有对这一环节的简化,提升计算的速度。
  式子中还有一个矩阵W|V|×(n−1)m),这个矩阵包含了从输入层到输出层的直连边。直连边就是从输入层直接到输出层的一个线性变换,好像也是神经网络中的一种常用技巧(没有仔细考察过)。如果不需要直连边的话,将W置为0 就可以了。在最后的实验中,Bengio发现直连边虽然不能提升模型效果,但是可以少一半的迭代次数。同时他也猜想如果没有直连边,可能可以生成更好的词向量。

 现在万事俱备,用随机梯度下降法把这个模型优化出来就可以了。需要注意的是,一般神经网络的输入层只是一个输入值,而在这里,输入层x也是参数(存在C中),也是需要优化的。优化结束之后,词向量有了,语言模型也有了。

到此为止,就可以看懂语音识别的pipline


从概率角度理解语音识别

从概率角度理解语音识别任务的话,语音识别可以说是在尝试找到一个从语音到文本的最优的映射函数,使得错词率(WER)最小。

语音输入O,文本输出WW=F(O),找到F使得错词率(WER)最小


贝叶斯决策:比较不同词序列的后验概率,选择能够最大化后验概率P(W|O)的词序列作为语音识别系统的输出结果。

P(O|W),对应声学模型,用来评价语音观测样本值O和词序列W对应模型之间的匹配程度。

P(W),对应语言模型,用于表示在人类使用的自然语言中词序列W本身可能出现的概率。



声学模型的变迁

在深度学习的浪潮兴起之后DNN也应用在了语音识别领域中,主要是声学模型部分。


DNN+HMM作为声学模型


很快DNN+HMM+LM的模式被DN+LM的模式取代,利用深度神经网络实现端到端的语音识别系统。比较经典的论文:

[5] "DeepSpeech:Scaling up end-to-end speech recognition" & "Deepspeech 2: End-to-end speech recognition in english and mandarin."arXiv preprint arXiv:1512.02595 (2015). [pdf](Baidu Speech Recognition System) :star::star::star::star:

主要专注于提高嘈杂环境(例如,餐馆、汽车和公共交通)下的英语语音识别的准确率。DeepSpeech可以在嘈杂环境下实现接近80%的准确率,而其他商业版语音识别API最高识别率在65%左右。跟顶级的学术型语音识别模型(基于流行的数据集Hub500建模)相比也高出9个百分点。

Deep Speech的基础是某种递归神经网络(RNN),采用了端到端的深度学习模型。结构如图所示。


共五层,前三层是简单的DNN结构,第四层是双向RNN,第五层的输入是RNN的前向和后向单元,后面跟着softmax分类。网络输入是context特征,输出是char

训练准则是CTC,解码需要结合ngram语言模型。

DeepSpeech的成功主要得益于庞大的语音数据训练集。首先百度收集了9600个人长达7000小时语音数据,这些语音大多发生在安静的环境下。然后再将这些语音文件与包含有背景噪音的文件合成到一起,最后形成约10万小时的训练集。这些背景噪音包括了饭店、电视、自助餐厅以及汽车内、火车内等场景。另一方面,DeepSpeech的成功很大程度上要取决于规模庞大的基于GPU的深度学习基础设施。在论文中也有大量篇幅描述了优化模型训练的方法。

语音识别的最新进展:

[7]Anonline sequence-to-sequence model for noisy speech recognition

谷歌提出在线序列到序列语音识别系统。


[8]AttentionIs All You Need

attention机制.通常来说,主流序列传导模型大多基于RNNCNNGoogle此次推出的翻译框架—Transformer则完全舍弃了RNN/CNN结构,从自然语言本身的特性出发,实现了完全基于注意力机制的Transformer机器翻译网络架构。

[9]MultichannelEnd-to-end Speech Recognitio

attention-basedencoder-decoder framework 实现了cleanspeech的端到端的语音识别,本文是在其基础上进行扩展,加入了multichannelspeech enhancement,解决了噪音环境下的语音识别。

[10]OneModel To Learn Them All

[11]GAN在语音识别方面的尝试



总结和回顾:

语音识别经历了 GMM+HMM+LM ==DNN+HMM+LM ==DNN+LM的变迁。在实现深度神经网络端到端语音识别系统之后,人们在不断的尝试引入新型网络结

构、attention机制、多任务学习、GAN等技术来进一步提高语音识别特别是嘈杂环境下语音识别的准确率。

参考文献


[1]"Deep neural networks for acoustic modeling in speechrecognition: The shared views of four research groups."Hinton, Geoffrey, et al. IEEE Signal Processing Magazine 29.6 (2012):82-97. [pdf](Breakthrough in speech recognition):star::star::star::star:


深度神经网络替换传统的声学模型。


[2]"Speech recognition with deep recurrent neuralnetworks." Graves, Alex, Abdel-rahman Mohamed, andGeoffrey Hinton. 2013 IEEE international conference on acoustics,speech and signal processing. IEEE, 2013. [pdf](RNN):star::star::star:


[3] "TowardsEnd-To-End Speech Recognition with Recurrent Neural Networks."Graves, Alex, and Navdeep Jaitly. ICML. Vol. 14. 2014. [pdf]:star::star::star:

利用RNN实现端到端的语音识别。

[4] "Fastand accurate recurrent neural network acoustic models for speechrecognition."Sak, Haşim, et al. arXiv preprintarXiv:1507.06947 (2015). [pdf](Google Speech Recognition System) :star::star::star:

[5] "DeepSpeech:Scaling up end-to-end speech recognition" & "Deepspeech 2: End-to-end speech recognition in english and mandarin."arXiv preprint arXiv:1512.02595 (2015). [pdf](Baidu Speech Recognition System) :star::star::star::star:

[6] "AchievingHuman Parity in Conversational Speech Recognition." W.Xiong, J. Droppo, X. Huang, F. Seide, M. Seltzer, A. Stolcke, D. Yu,G. Zweig. arXiv preprint arXiv:1610.05256 (2016). [pdf](State-of-the-art in speech recognition, Microsoft):star::star::star::star:

[7] "Anonline sequence-to-sequence model for noisy speech recognition."

[8] "ANeural Probabilistic Language Model ."

[9]MultichannelEnd-to-end Speech Recognition

[10]OneModel To Learn Them All

[11]GAN在语音识别方面的尝试







2017-11-13 16:44:52 weixin_34087301 阅读数 19
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波

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

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

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

87e55b6cac934a64d7f72fbc9f999c02dd878968

2 语言模型

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

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

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

0f01a0d32ea1878e565f7ba67226e85243e8958b

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

59958116d46e5a125f59c4801441111d853ab66d

马尔可夫假设是,大致描述一下,给定时刻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

5c417dcbe7397d925df53947a693d9c6528725f8

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

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

82e06c8e9ac6e81ca3c391d429d084905753f6a3

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

80f4ff4960773bcaefe4857056fd8b3c04b2839d

除了直接压缩词表,也可以对词表进行聚类,比如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进行编码,则可以得到最短平均编码长度。

774f70fa30d20132e259b5d5ada6ae34f1abd272

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

1fb72d07af4e62becd4ce854485ef018f4207f7e

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

4 会议前沿

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

d418331114afb883b2ce3edceb283d1062d1703c

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

0a2daa5421c464a3a71aba21e374a8724c008fbb

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

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

a745955ba9b846d65fc10079fa16535150e69f90

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

268de7eaabbc571e1161fd97143f87342685823e

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

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

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

50ec87994d79519ab622e8b23adc30fefd81225b

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

63ae99d97e4345fd83e7f993005762edbf931ae8

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

b55e521f257b7ac0faba8595cdd2566b9ee938d1

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

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

18501f251fa8b0b831e2480afbd0fd1376758d51

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

91d8313e02b42661d410398724985596141740d5

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

eeebe5803c09512a97b39dbd3c778f63ae1fbb77

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

b7091ba16ae825695a5b00e9460d50ed7dd01921

这里个人觉得本文的这种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计算。

8d09b9d2660af50abce4a552454ab963004ed773

下面我们看看这篇文章是怎么一点一点压缩计算量的。首先是对于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

1d440873ef3d3537da3a1da9434c9ac562e75dd3

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

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

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

62bf278d35b19a3a9462a86fa5afbfd3f4e01926

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

a287366571a8f6d46382533fec4cd1adcc3c3b3c

c45b5133bd712a8a37acd952121f1f15b911dfc8

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

229bb0657ef2dd51099697ce482241e93013edcbd222ec027351c28c105311ee0d002d57d5862029

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

14ab6c2b9669e9a11a65af0fc058dabd818a2085

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

c12c86a26f283057b05304c758be03db2d230728

最后表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

2018-09-16 21:41:56 miner_zhu 阅读数 5676
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波

语言模型(language model, LM)在自然语言处理中占有重要的地位,尤其在基于统计模型的语音识别、机器翻译、汉语自动分词和句法分析等相关研究中得到了广泛应用。目前主要采用的是n元语法模型(n-gram model),这种模型构建简单、直接,但同时也因为数据缺乏而必须采取平滑(smoothing)算法。

接下来主要介绍n元语法的基本概念和几种常用的数据平滑方法

目录

n元语法

语言模型性能评价

数据平滑

1.加法平滑方法

2.古德-图灵(Good-Turing)估计法

3.Katz平滑法

4.Jelinek-Mercer平滑方法

5.Witten-Bell平滑方法

6.绝对减值法

7.Kneser-Ney平滑方法

算法总结

平滑方法的比较

语言模型自适应方法

1.基于缓存的语言模型

2.基于混合方法的语言模型

3.基于最大熵的语言模型


n元语法

 一个语言模型通常构建为字符串s的概率分布p(s),这里p(s)试图反映的是字符串s作为一个句子出现的频率。例如,在一个刻画口语的语言模型中,如果一个人所说的话语中每100个句子里大约有一句是Okay,则可以认为p(Okay)≈0.01。而对于句子“An apple ate the chicken”我们可以认为其概率为0,因为几乎没有人会说这样的句子。需要注意的是,与语言学中不同,语言模型与句子是否合乎语法是没有关系的,即使一个句子完全合乎语法逻辑,我们仍然可以认为它出现的概率接近为零。

对于一个由l个基元(“基元”可以为字、词或短语等,以后我们只用“词”来通指)构成的句子s=w1w2…wl,其概率计算公式可以表示为:

我们可以看到,产生第i(1≤i≤l)个词的概率是由已经产生的i-1个词w1w2…wi-1决定的。一般地,我们把前i-1个词w1w2…wi-1称为第i个词的“历史(history)”。在这种计算方法中,随着历史长度的增加,不同的历史数目按指数级增长。如果历史的长度为i-1,那么,就有Li-1种不同的历史(假设L为词汇集的大小),而我们必须考虑在所有Li-1种不同的历史情况下,产生第i个词的概率。这样的话,模型中就有Li个自由参数p(wi|w1,w2,…,wi-1)。这使我们基本不可能从训练数据中正确地估计出这些参数。

因此,为了解决这个问题,可以将历史w1w2…wi-1按照某个法则映射到等价类E(w1w2…wi-1),而等价类的数目远远小于不同历史的数目。如果假定:

那么,自由参数的数目就会大大地减少。有很多方法可以将历史划分成等价类,其中,一种比较实际的做法是,将两个历史Wi-n+2…Wi-1Wi和V、Vk-n+2…Vk-1Vk映射到同一个等价类,当且仅当这两个历史最近的n-1(1≤n≤l)个词相同,即如果E(w1w2…wi-1wi)=E(v1v2…vk-1vk),当且仅当(Wi-n+2…Wi-1Wi)=(Vk-n+2…Vk-1Vk)。

满足上述条件的语言模型称为 n 元语法或 n 元文法(n-gram)。通常情况下,n 的取值不能太大,否则,等价类太多,自由参数过多的问题仍然存在。在实际应用中,取n=3的情况较多。当n=1时,即出现在第i位上的词wi独立于历史时,一元文法被记作unigram,或uni-gram,或monogram;当n=2时,即出现在第i位上的词wi仅与它前面的一个历史词wi-1有关,二元文法模型被称为一阶马尔可夫链(Markov chain),记作bigram或bi-gram;当n=3时,即出现在第i位置上的词wi仅与它前面的两个历史词wi-2wi-1有关,三元文法模型被称为二阶马尔可夫链,记作trigram或tri-gram。

以二元语法模型为例,根据前面的解释,我们可以近似地认为,一个词的概率只依赖于它前面的一个词,那么,

为了使得p(wi|wi-1)对于i=1有意义,我们在句子开头加上一个句首标记〈BOS〉,即假设w0就是〈BOS〉。另外,为了使得所有的字符串的概率之和等于1,需要在句子结尾再放一个句尾标记EOS〉,并且使之包含在等式(5-3)的乘积中(如果不做这样的处理,所有给定长度的字符串的概率和为1,而所有字符串的概率和为无穷大)。例如,要计算概率p(Mark wrote a book),我们可以这样计算:

为了估计p(wi|wi-1)条件概率,可以简单地计算二元语法wi-1wi在某一文本中出现的频率,然后归一化。如果用c(wi-1wi)表示二元语法wi-1wi在给定文本中的出现次数,我们可以采用下面的计算公式:

用于构建语言模型的文本称为训练语料(training corpus)。对于n元语法模型,使用的训练语料的规模一般要有几百万个词。公式(5-4)用于估计p(wi|wi-1)的方法称为p(wi|wi-1)的最大似然估计(maximum likelihood estimation, MLE)。

语言模型性能评价

评价一个语言模型最常用的度量就是根据模型计算出的测试数据的概率,或者利用交叉熵(cross-entropy)和困惑度(perplexity)等派生测度。 

对于一个平滑过的概率为p的n元语法模型,用公式(5-5)计算句子p(s)的概率。对于句子(t1,t2,…,tlT)构成的测试集T,可以通过计算T中所有句子概率的乘积来计算测试集的概率p(T)

交叉熵的测度可以利用预测和压缩的关系来进行计算。当给定一个语言模型,文本T的概率为p(T),可以给出一个压缩算法,该算法用-log2p(T)个比特位来对文本T编码。模型p的困惑度PPT(T)是模型分配给测试集T中每一个词汇的概率的几何平均值的倒数。显然,交叉熵和困惑度越小越好,这是我们评估一个语言模型的基本准则。

数据平滑

在上面的例子中,如果依据给定的训练语料S计算句子DAVID READ A BOOK的概率,有p(DAVID READ A BOOK)=0。显然,这个结果不够准确,因为句子DAVID READ A BOOK总有出现的可能,其概率应该大于0。如果p(s)=0,那么, p(s|A)也必然是0,这个结果意味着在语音识别中,不管给定的语音信号多么清晰,字符串s也永远不可能成为转写结果。这样,一旦出现使得p(s)=0的字符串s,就会导致识别错误。在其他自然语言处理任务中也会出现类似的问题。因而,必须分配给所有可能出现的字符串一个非零的概率值来避免这种错误的发生。

平滑(smoothing)技术就是用来解决这类零概率问题的。术语“平滑”指的是为了产生更准确的概率(在式(5-4)和式(5-6)中)来调整最大似然估计的一种技术,也常称为数据平滑(data smoothing)。“平滑”处理的基本思想是“劫富济贫”,即提高低概率(如零概率),降低高概率,尽量使概率分布趋于均匀。

例如,对于二元语法来说,一种最简单的平滑技术就是假设每个二元语法出现的次数比实际出现的次数多一次,不妨将该处理方法称为加1法。

其中,V是所考虑的所有词汇的单词表,|V|为词汇表单词的个数。当然,如果V取无穷大,分母就是无穷大,所有的概率都趋于0。但实际上,词汇表总是有限的,可以大约固定在几万个或者几十万个。所有不在词汇表中的词可以映射为一个单个的区别于其他已知词汇的单词,通常将其称为未登录词或未知词。

数据平滑是语言模型中的核心问题。下面简要介绍一些主要的数据平滑方法。

1.加法平滑方法

在实际应用中最简单的平滑技术之一就是加法平滑方法(additive smoothing),这种方法在上个世纪前半叶由G.J.Lidstone, W.E.Johnson和H.Jeffreys等人提出和改进,其基本思想是使式(5-8)给出的方法通用化,不是假设每一个n元语法发生的次数比实际统计次数多一次,而是假设它比实际出现情况多发生δ次,0≤δ≤1,那么

2.古德-图灵(Good-Turing)估计法

Good-Turing估计法是很多平滑技术的核心。这种方法是1953年由I.J.Good引用图灵(Turing)的方法提出来的,其基本思路是:对于任何一个出现r次的n元语法,都假设它出现了r*次,这里 


其中,nr是训练语料中恰好出现r次的n元语法的数目。要把这个统计数转化为概率,只需要进行归一化处理:对于统计数为r的n元语法,其概率为

请注意: 

也就是说,N等于这个分布中最初的计数。这样,样本中所有事件的概率之和为
因此,有n1/N的概率剩余量可以分配给所有未见事件(r=0的事件)。

3.Katz平滑法

 Katz平滑方法通过加入高阶模型与低阶模型的结合,扩展了Good-Turing估计方法。

我们首先来说明一下二元语法模型的Katz对于一个出现次数为r=c的二元语法,使用如下公式计算修正的计数:

 也就是说,所有具有非零计数r的二元语法都根据折扣率dr被减值了,折扣率dr近似地等于,这个减值是由Good-Turing估计方法预测的。从非零计数中减去的计数量,根据低一阶的分布,即一元语法模型,被分配给了计数为零的二元语法。

折扣率dr可以按照如下办法计算:由于大的计数值是可靠的,因此它们不需要减值。尤其对于某些k,S.M.Katz取所有r>k情况下的dr=1,并且建议k=5。对于r≤k情况下的折扣率,减值率由用于全局二元语法分布的Good-Turing估计方法计算,即公式(5-10)中的nr表示在训练语料中恰好出现r次的二元语法的总数。dr的选择遵循如下约束条件:①最终折扣量与Good-Truing估计预测的减值量成比例;②全局二元语法分布中被折扣的计数总量等于根据Good-Turing估计应该分配给次数为零的二元语法的总数。

用类似的方法可定义高阶n元语法模型的Katz平滑算法。正如我们在式(5-12)中所看到的,二元语法模型是由一元语法模型定义的,那么,一般地,类似Jelinek-Mercer平滑方法,S.M.Katz的n元语法模型由Katz的n-1元语法模型定义。为结束递归,用最大似然估计的一元语法模型作为Katz的一元语法模型。

正如前面指出的,当使用Good-Turing估计时一般需要平滑nr,比如,对于那些值非常小的nr。然而,在Katz平滑方法中这种处理并不需要,因为只有当计数r≤k时才使用Good-Turing估计,而对于这些r值来说,nr一般是比较合理的。

Katz平滑方法属于后备(back-off)平滑方法。这种方法的中心思想是,当某一事件在样本中出现的频率大于k时,运用最大似然估计经过减值来估计其概率。当某一事件的频率小于k时,使用低阶的语法模型作为代替高阶语法模型的后备,而这种代替必须受归一化因子α的作用。对于这种方法的另一种解释是,根据低阶的语法模型分配由于减值而节省下来的剩余概率给未见事件,这比将剩余概率平均分配给未见事件要合理。

4.Jelinek-Mercer平滑方法

假定要在一批训练语料上构建二元语法模型,其中,有两对词的同
现次数为0:
c(SEND THE)=0
c(SEND THOU)=0
那么,按照加法平滑方法和Good-Turing估计方法可以得到:
p(THE|SEND)=p(THOU|SEND)
但是,直觉上我们认为应该有:
p(THE|SEND)>p(THOU|SEND)
因为冠词THE要比单词THOU出现的频率高得多。为了利用这种情况,一种处理办法是在二元语法模型中加入一个一元模型。我们知道一元模型实际上只反映文本中单词的频率,最大似然一元模型为

那么,可以按照下面的方法将二元文法模型和一元文法模型进行线性插值:
pinterp(wi|wi-1)=λpML(wi|wi-1)+(1-λ)pML(wi)
其中,0≤λ≤1。由于pML(THE|SEND)=pML(THOU|SEND)=0,根据假定pML(THE)≫pML(THOU),可以得到:
pinterp(THE|SEND)>pinterp(THOU|SEND)这正是我们希望得到的。
一般来讲,使用低阶的n元模型向高阶n元模型插值是有效的,因为当没有足够的语料估计高阶模型的概率时,低阶模型往往可以提供有用的信息。F.Jelinek和R.L.Mercer曾于1980年提出了通用的插值模型,而Peter F.Brown等人给出了实现这种插值的一种很好的办法:

式(5-13)的含义是:第n阶平滑模型可以递归地定义为n阶最大似然估计模型和n-1阶平滑模型之间的线性插值。为了结束递归,可以用最大似然分布作为平滑的1阶模型,或者用均匀分布作为平滑的0阶模型,给定一个固定的pML,可以使用Baum-Welch算法有效地搜索出,使某些数据的概率最大。为了得到有意义的结果,估计的语料应该与计算pML的语料不同。在留存插值方法(held-out interpolation)中,保留一部分训练语料来达到这个目的,这部分留存语料不参与计算pML。而F.Jelinek和R.L.Mercer提出了一种叫做删除插值法(deleted interpolation)或删除估计法(deleted estimation)的处理技术,训练语料的不同部分在训练pML或时作变换,从而使结果平均。

需要注意的是,对于不同的历史,最优的也不同。例如,对于出现过几千次的一段上下文,较高的λ值是比较合适的,因为高阶的分布是非常可靠的。而对于一个只出现过一次的历史,λ的值应较低。独立地训练每一个参数是不合适的,因为需要巨大规模的语料来精确地训练这么多独立的参数。为此,建议把划分成适当数量的几部分并令同一部分中所有的 具有相同的值,从而减少需要估计的独立参数的数量。根据分布中每个非零元素的平均统计值来分段,比使用值分段获得的效果要好。

5.Witten-Bell平滑方法

 Witten-Bell平滑方法可以认为是Jelinek-Mercer平滑算法的一个实例。特别地,n阶平滑模型被递归地定义为n阶最大似然模型和n-1阶平滑模型的线性插值,就像式(5-13)所描述的:

 为了引出Witten-Bell平滑方法,可以将式(5-13)解释为:使用高阶模型的概率为,使用低阶模型的概率为1-,如果在训练语料中对应的n元文法出现次数大于1,则使用高阶模型;否则,后退到低阶模型。这样处理似乎是合理的。

6.绝对减值法

绝对减值法(absolute discounting)类似于Jelinek-Mercer平滑算法,涉及高阶和低阶模型的插值问题。然而,这种方法不是采用将高阶最大似然分布乘以因子 的方法,而是通过从每个非零计数中减去一个固定值D≤1的方法来建立高阶分布。

为使概率分布之和等于1,取

其中,n1和n2是训练语料中分别出现一次和两次的n元语法模型的总数, n是被插值的高阶模型的阶数。
实际上,可以通过Good-Turing估计推导到绝对减值算法。Church and Gale(1991)根据实验指出,对于具有较大计数(r≥3)的n元语法模型,其Good-Turing减值(r-r*)的均值在很大程度上是关于r的常数。而且,等式(5-19)中的比例因子类似等式(5-16)中为Witten-Bell平滑算法给出的模拟因子,可以看作是对同一个值的近似,即出现在一个历史后面的新词的概率。

7.Kneser-Ney平滑方法

R.Kneser和H.Ney提出了一种扩展的绝对减值算法,用一种新的方式建立与高阶分布相结合的低阶分布。在前面的算法中,通常用平滑后的低阶最大似然分布作为低阶分布。然而,只有当高阶分布中具有极少的或没有计数时,低阶分布在组合模型中才是一个重要的因素。因此,在这种情况下,应最优化这些参数,以得到较好的性能。

例如,要在一批语料上建立一个二元文法模型,有一个非常普通的单词FRANCISCO,这个单词只出现在单词SAN的后面。由于
c(FRANCISCO)较大,因此,一元文法概率p(FRANCISCO)也会较大,像绝对减值算法等这类平滑算法就会相应地为出现在新的二元文法历史后面的单词FRANCISCO分配一个高的概率值。然而,从直观上说,这个概率值不应该很高,因为在训练语料中单词FRANCISCO只跟在唯一的历史后面。也就是说,单词FRANCISCO应该接受一个较小的一元文法概率,因为只有上一个词是SAN时这个单词才会出现。在这种情况下,二元文法概率模型可能表现更好。

以此类推,使用的一元文法的概率不应该与单词出现的次数成比例,而是与它前面的不同单词的数目成比例。我们可以设想按顺序遍历训练语料,在前面语料的基础上建立二元文法模型来预测现在的单词。那么,只要当前的二元文法没有在前面的语料中出现,一元文法的概率将会是影响当前二元文法概率的较大因素。如果一旦这种事件发生,就要给相应的一元文法分配一个计数,那么,分配给每个一元文法计数的数目就是它前面不同单词的数目。实际上,在Kneser-Ney平滑方法中,二元文法模型中的一元文法概率就是按这种方式计算的。然而,在文献中这种计算方法却是以完全不同的方式提出来的,其推导过程是,选择的低阶分布必须使得到的高阶平滑分布的边缘概率与训练语料的边缘概率相匹配。例如,对于二元文法模型,选择一个平滑的分布pKN,使其对所有的wi,满足一元文法边缘概率的约束条件:

等式(5-21)左边是平滑的二元文法分布pKN中wi的一元文法边缘概率,等式右边是训练语料中wi的一元文法频率。

Chen and Goodman(1998)提出了一种不同的推导方法。他们假设模型具有式(5-18)的形式:

这与R.Kneser和H.Ney在论文[Kneser and Ney,1995]中使用的形式不同,原文中使用的形式是:

这里,选择γ( )使分布之和等于1。也就是说,S.F.Chen等人对所有单词的低阶分布进行插值,而不是只对那些高阶分布中计数为零的单词插值。这样做的原因是因为它不但可以得到比原公式更清晰的推导过程,而且不需要近似。

算法总结

大多数平滑算法可以用下面的等式表示:

也就是说,如果n阶语言模型具有非零的计数,就使用分布α(wi|);否则,就后退到低阶分布psmooth(wi|),选择比例因子γ()使条件概率分布之和等于1。通常称符合这种框架的平滑算法为后备模型(back-off model)。前面介绍的Katz平滑算法是后备平滑算法的一个典型例子。

有些平滑算法采用高阶和低阶n元文法模型的线性插值,表达成等式,这些模型都可以写成公式(5-24)的形式。这种形式的模型称为插值模型(interpolated model)。

后备模型和插值模型的根本区别在于,在确定非零计数的n元文法的概率时,插值模型使用低阶分布的信息,而后备模型却不是这样。但不管是后备模型还是插值模型,都使用了低阶分布来确定计数为零的n元语法的概率。

Chen and Goodman(1998)使用等式(5-24)的符号概括了该式所代表的所有后备平滑算法,归纳成表5-2。

平滑方法的比较

前面介绍了语言模型中常用的一些平滑方法,包括加法平滑、Jelinek-Mercer平滑、Katz平滑、Witten-Bell平滑、绝对减值平滑和Kneser-Ney平滑,以及Church-Gale平滑和修正的Kneser-Ney平滑方法等。那么,现在的问题是这些平滑方法在实现效果上有什么差异?其平滑效果与数据量和参数设置有怎样的关系?对此,S.F.Chen和J.Goodman做了大量的对比实验,利用布朗语料、北美商务新闻语料、Switchboard语料和广播新闻语料,以测试语料的交叉熵和语音识别结果的词错误率(word error rate)为评价指标,对平滑方法做了全面系统的对比测试,得到了若干重要的结论,对实用语言模型的开发具有重要的参考价值。

在S.F.Chen和J.Goodman的对比实验中,采用留存插值方法(held-out interpolation)的Jelinek-Mercer平滑方法作为对比的基线算法(baseline)。根据他们的对比测试,不管训练语料规模多大,对于二元语法和三元语法而言,Kneser-Ney平滑方法和修正的Kneser-Ney平滑方法的效果都好于其他所有的平滑方法。一般情况下,Katz平滑方法和Jelinek-Mercer平滑方法也有较好的表现,但与Kneser-Ney平滑方法和修正的Kneser-Ney平滑方法相比稍有逊色。在稀疏数据的情况下,Jelinek-Mercer平滑方法优于Katz平滑方法;而在有大量数据的情况下,Katz平滑方法则优于Jelinek-Mercer平滑方法。插值的绝对减值平滑方法和后备的Witten-Bell平滑方法的表现最差。除了对于很小的数据集以外,插值的绝对减值平滑方法一般优于基线算法,而Witten-Bell平滑方法则表现较差,对于较小的数据集,该方法比基线算法差得多。对于大规模数据集而言,这两种方法都比基线算法优越得多,甚至可以与Katz平滑方法和Jelinek-Mercer平滑方法相匹敌。

S.F.Chen和J.Goodman的实验还表明,平滑方法的相对性能与训练语料的规模、n元语法模型的阶数和训练语料本身有较大的关系,其效果可能会随着这些因素的不同而出现很大的变化。例如,对于较小规模的训练语料来说,后备的Witten-Bell平滑方法表现很差,而对于大规模数据集来说,其平滑效果却极具竞争力。

根据S.F.Chen和J.Goodman的实验和分析,下列因素对于平滑算法的性能有一定的影响:

  • 影响最大的因素是采用修正的后备分布,例如Kneser-Ney平滑方法所采用的后备分布。这可能是Kneser-Ney平滑方法及其各种版本的平滑算法优于其他平滑方法的基本原因。
  • 绝对减值优于线性减值。正如前面指出的,对于较低的计数来说,理想的平均减值上升很快,而对于较大的计数,则变得比较平缓。 Good-Turing估计可以用于预测这些平均减值,甚至比绝对减值还好。
  • 从性能上来看,对于较低的非零计数,插值模型大大地优于后备模型,这是因为低阶模型在为较低计数的n元语法确定恰当的减值时提供了有价值的信息。
  • 增加算法的自由参数,并在留存数据上优化这些参数,可以改进算法的性能。

修正的Kneser-Ney平滑方法之所以获得了最好的平滑效果,就是得益于上述各方面因素的综合。 

语言模型自适应方法

在自然语言处理系统中,语言模型的性能好坏直接影响整个系统的性能。尽管语言模型的理论基础已比较完善,但在实际应用中常常会遇到一些难以处理的问题。其中,模型对跨领域的脆弱性(brittlenessacross domains)和独立性假设的无效性(false independence assumption)是两个最明显的问题。也就是说,一方面在训练语言模型时所采用的语料往往来自多种不同的领域,这些综合性语料难以反映不同领域之间在语言使用规律上的差异,而语言模型恰恰对于训练文本的类型、主题和风格等都十分敏感;另一方面,n元语言模型的独立性假设前提是一个文本中的当前词出现的概率只与它前面相邻的n-1个词相关,但这种假设在很多情况下是明显不成立的。另外,香农实验(Shannon-style experiments)表明,相对而言,人更容易运用特定领域的语言知识、常识和领域知识进行推理以提高语言模型的性能(预测文本的下一个成分)。因此,为了提高语言模型对语料的领域、主题、类型等因素的适应性,提出了自适应语言模型(adaptive language model)的概念。在随后的这些年里,人们相继提出了一系列的语言模型自适应方法,并进行了大量实践。

本节主要介绍三种语言模型自适应方法:基于缓存的语言模型(cache-based LM)、基于混合方法的语言模型(mixture-based LM)和基于最大熵的语言模型。

1.基于缓存的语言模型

基于缓存的语言模型自适应方法针对的问题是,在文本中刚刚出现过的一些词在后边的句子中再次出现的可能性往往较大,比标准的n元语法模型预测的概率要大。针对这种现象,cache-based自适应方法的基本思路是,语言模型通过n元语法的线性插值求得: 

插值系数λ可以通过EM算法求得。

常用的方法是,在缓存中保留前面的K个单词,每个词wi的概率(缓存概率)用其在缓存中出现的相对频率计算得出:

其中,Iε为指示器函数(indicator function)。如果ε表示的情况出现,则Iε=1;否则,Iε=0。
然而,这种方法有明显的缺陷。例如,缓存中一个词的重要性独立于该词与当前词的距离,这似乎是不合理的。人们希望越是临近的词,对缓存概率的贡献越大。研究表明,缓存中每个词对当前词的影响随着与该词距离的增大呈指数级衰减,因此,式(5-27)可以写成:

文献将式(5-27)称为“正常的基于缓存的语言模型(regular cache-based LM)”,而将式(5-28)称为“衰减的基于缓存的语言模型(decaying cache-based LM)”的实验表明,cache-based自适应方法减低了语言模型的困惑度,式(5-28)比式(5-27)对降低语言模型的困惑度效果更好。
黄非等(1999)提出了利用特定领域中少量自适应语料,在原词表中通过分离通用领域词汇和特定领域词汇,并自动检测词典外领域关键词实现词典自适应,然后结合基于缓存的方法实现语言模型的自适应方法。曲卫民等(2003)通过采用TF-IDF公式代替原有的简单频率统计法,建立基于记忆的扩展二元模型,并采用权重过滤法以节省模型计算量,实现了对基于缓存记忆的语言模型自适应方法的改进。张俊林等(2005)也对基于记忆的语言模型进行了扩展,利用汉语义类词典,将与缓存中所保留词汇语义上相近或者相关的词汇也引入缓存,在一定程度上提高了原有模型的性能。

2.基于混合方法的语言模型

基于混合方法的自适应语言模型针对的问题是,由于大规模训练语料本身是异源的(heterogenous),来自不同领域的语料无论在主题(topic)方面,还是在风格(style)方面,或者同时在这两方面都有一定的差异,而测试语料一般是同源的(homogeneous),因此,为了获得最佳性能,语言模型必须适应各种不同类型的语料对其性能的影响。 

基于混合方法的自适应语言模型的基本思想是,将语言模型划分成n个子模型M1,M2,…,Mn,整个语言模型的概率通过下面的线性插值公式计算得到:

其中,0≤λj≤1, 。λ值可以通过EM算法计算出来。

基于这种思想,该适应方法针对测试语料的实现过程包括下列步骤:

(1)    对训练语料按来源、主题或类型等(不妨按主题)聚类;
(2)    在模型运行时识别测试语料的主题或主题的集合;
(3)    确定适当的训练语料子集,并利用这些语料建立特定的语言模型;
(4)    利用针对各个语料子集的特定语言模型和线性插值公式(5-29),获得整个语言模型

根据实验,基于二元模型和110万词的语料进行训练,基于混合方法的自适应方法使语言模型的困惑度降低了10%。

3.基于最大熵的语言模型

上面介绍的两种语言模型自适应方法采用的思路都是分别建立各个子模型,然后,将子模型的输出组合起来。基于最大熵的语言模型却采用不同的实现思路,即通过结合不同信息源的信息构建一个语言模型。每个信息源提供一组关于模型参数的约束条件,在所有满足约束的模型中,选择熵最大的模型。

由于最大熵模型能够较好地将来自不同信息源的模型结合起来,获得性能较好的语言模型,因此,有些学者研究将基于主题的语言模型(topic-based LM)(主题条件约束)与n元语法模型相结合,用于对话语音识别、信息检索和隐含语义分析等 。

综上所述,语言模型的自适应方法是改进和提高语言模型性能的重要手段之一。由于语言模型广泛地应用于自然语言处理的各个方面,而其性能表现与语料本身的状况(领域、主题、风格等)以及选用的统计基元等密切相关,因此,其自适应方法也要针对具体问题和应用目的(机器翻译、信息检索、语义消歧等)综合考虑。

语音识别入门介绍

阅读数 626

没有更多推荐了,返回首页