背景介绍
语音识别系统将语音信号转换为文本序列,HMM-DNN时代,语音识别框架有三个重要的组件:
-
HMM-DNN声学模型 -
语言模型(ngram) -
基于WFST的BeamSearch解码算法
目前主流的端到端网络中,仍然离不开语言模型+WFST解码技术,尤其在实际生产环境中,该技术是解决特定badcase的有效手段。下图分别是:传统asr和端到端asr的流程图
为什么需要语言模型?
语言模型在语音识别整个流程中的作用抽象来讲是根据某一或多个领域的语言表达习惯给解码空间引入只是约束,限制解码搜索空间的大小,以便在合理的计算时间内得到有意义的文字序列。
为什么语言模型会限制解码搜索空间大小,加快语音识别解码速度呢?
假设在一个小语言语言系统中只有“我爱中国”3个词语,如果没有任何的语言表达习惯限制,那这3个词语一共可以构成 种表达, 其中N是一句话的词数。假设强制说话时候每句话字数不超过20,将会产生5230176601种语言表达。如果要对这个语言进行语音识别,解码时仅考虑词语序列的不同组合就有5230176601个路径待搜索。而现实中,高级文明的文字符号有成千上万个,不加任何限制的语言表达可能接近无穷,解码器根本不可能在有限时间内得到识别结果。
如果加入了语言模型的信息,就会剔除那些不符合语言表达习惯的路径,限制搜索空间的大小,使得解码时间可接受。如此,语音识别技术才可进入商用产品的视角中。
本文主要介绍ngram语言模型的基础知识,并手撕计算一个ngram模型。WFST的解码算法在后续的文章中更新。
ngram理论知识
算法原理
在语音识别技术出现早期,研究人员用各式各样的模板来表示语言表达习惯,但人类的语言是不断发展的,新的词汇和句式一直在出现。比如一些网络热词:尊嘟假嘟、绝绝子等。 因此衍生出一些问题:
-
如何能不断更换句法模板,跟上语言变化的节奏? -
新句式的文本是很容易获取到,能否通过这些文本数据自动学习句法规则呢?
答案是肯定的,统计语言模型应运而生,ngram是其中代表性的技术,也是目前主流的方法。
统计语言模型通过概率P(词序列)来衡量这个词序列与语言表达习惯的符合程度,P(词序列)越低,表示在解码过程中代表这个词序列的搜索路径越应该被舍弃。计算公式如下:
以 表示 的历史信息 , 如果不对的长度加以限制的话,,根本无法估计。
为了解决这个问题,对上面的概率公式引入阶马尔可夫假设:假设的出现概率只依赖于部分历史信息,于其他任何信息是相互独立的。这就是ngram语言模型的原理。修改后的公式如下:
常情况下n=1,2,3。对于再高阶的4-gram,5-gram就很少见,因为需要非常大的语料才能训练充分高阶的语言模型,而且模型本身的体积也会非常大(占内存)。
-
当n=1时为unigram:当前词的概率分布与历史信息无关 -
当n=2时为bigram:当前词的概率分布只和前一个词有关 -
当n=3时为trigram:当前词的概率分布只和前两个词有关
数据平滑
ngram概率计算一般由训练语料的最大似然估计得到,以3-gram为例:
如果句式(词1词2词3)在训练语料中从未出现过,而现实中其实是有这种表达形式存在的。怎么估算这个3gram的概率 答案是, 将训练语料中出现过的句式的概率拿出一部分分配给未出现过。一般会采用两种方式处理:
-
"人人平等", 将所有的句式都加上一定数量的count,例如:additive平滑 -
"劫富济贫", 将训练语料中出现频繁的句式的count拿出一部分,给count=0的句式。例如:good-turing平滑
数据平滑的目的有两个:一个是使所有的N-gram概率之和为1,使所有的n-gram概率都不为0。它的本质,是重新分配整个概率空间,使已经出现过的n-gram的概率降低,补充给未曾出现过的n-gram。
上述平滑方式得到的模型表现通常不太好,因为它们对所有未在训练语料中出现过的句式“一视同仁”,分配相同的概率,比如:如果在训练预料中“学习 语音” “学习 余音”count都是0,那么最终得到一样的概率。但直觉上,前者应该被分配更高的概率。解决这个问题的方式是引入低阶grammar信息,重新分配概率。即:插值和回退。
-
线性插值平滑(Interpolation smoothing)基本思想就是利用低元N-grams模型对高元N-grams模型进行线性插值。
-
回退算法(Katz smoothing)又称为 Back-off 回退。当有足够计数时,使用N元语法;否则使用 ,, , bigrams, unigrams。
其中 和 为归一化参数,保证 。 一般选择为 0 ,也可以选其它的值。
插值和回退最大的区别在于count>0的这部分grammar概率处理:插值为这部分grammar融入了低阶信息,而回退不会融入低阶信息,直接取最大似然估计得出概率。
插值和回退技术通常和additive平滑或者goog-turing平滑共同使用。
平滑算法有多个,例如:witten-bell、jelinek-mercer-interpolate、katz backoff、Kneser-Ney Smoothing等。目前通常情况下(不考虑prune得很极致的情况),性能最优的是改进的Kneser-Ney Smoothing算法。
模型评估
训练一个ngram语言模型,如何衡量它对语言表达习惯约束的准确性呢? 有一个直观的思路是:给定一个高质量的句子,好的模型生成这个句子的概率会比较高。于是有研究人员顺着这条思路提出了困惑度。 困惑度(Perplexity)是一种衡量语言模型预测样本的好坏的指标,常用于自然语言处理中。
在理想情况下,如果模型对每个单词的预测都是完美的,则困惑度为 1。通常情况下,困惑度会大于 1,困惑度值越小表示模型预测能力越好。
手把手计算ngram语言模型
以下语料作为训练语料,手撕一个bigram语言模型,采用修正的 Kneser-Ney 平滑方法。
#Inputfile:/var/test_corpus.txt#Tokencount:6#Smoothing:ModifiedKneser-Neydatangram1=6ngram2=71-grams:-0.89085555<unk>00<s>-0.22184873-0.89085555</s>0-0.46488678中国0-0.69896996爱-0.30103-0.69896996我-0.301032-grams:-0.89085555中国</s>-0.50267535爱</s>-0.24850096我</s>-0.44889864<s>中国-0.37527603爱中国-0.56863624<s>爱-0.6575773<s>我end
通过对比,手撕的结果和kenlm计算的结果一致。
至此,了解了ngram的原理,并手撕ngram模型,知道如何从训练数据得到apra文件。下篇文章会介绍几种常用的ngram工具,从实战角度学习ngram。
参考
-
https://zhuanlan.zhihu.com/p/63884335 -
Heafield K, Pouzyrevsky I, Clark J H, et al. Scalable Modified Kneser-Ney Language Model Estimation[C]// Meeting of the Association for Computational Linguistics. 2013:690-696. -
https://zhuanlan.zhihu.com/p/273606445