语音识别入门第七节:语言模型
- 统计语言模型
- N-gram语言模型与评价方法
- 平滑算法
- 拉普拉斯平滑
- 古德图灵平滑
- 插值与回退
- 卡茨平滑
- 克奈瑟-内平滑
- 语言模型的存储格式——APRA Format及工具包
- RNN语言模型
- 其他语言模型思想简介
- 大词汇量连续语音识别梳理
统计语言模型
一个统计语言模型包含一个有限集合VVV,和一个函数p(x1,x2,⋯,xn)p(x_1,x_2,\cdots,x_n)p(x1,x2,⋯,xn):
- 对于任意⟨x1,⋯,xn⟩∈v+,p(x1,x2,⋯,xn)≥0\left \langle x_1,\cdots,x_n \right \rangle \in v^+,p(x_1, x_2, \cdots, x_n)\ge 0⟨x1,⋯,xn⟩∈v+,p(x1,x2,⋯,xn)≥0
- ∑<x1,⋯,xn>∈v+p(x1,x2,⋯,xn)=1\sum_{<x_1,\cdots,x_n>\in v^+}p(x_1, x_2, \cdots, x_n)=1∑<x1,⋯,xn>∈v+p(x1,x2,⋯,xn)=1
也可以说统计语言模型是所有词序列上的一个概率分布。
统计语言模型可以给我们任意词序列的概率,也可以给定一个词序列,预测下一个最可能出现的词语。
语言模型中的一些常见术语:
- 有声停顿(fillers/filled pauses):没有实际意义的有声停顿。
- 截断(fragment):表示没有说完整。
- 词目(lemma):词语主干相同,如dogs和dog是一个词目。
- 词形(wordforms):完整的词语样子,如dogs和dog是两个词形。
- 型(type):语料库或字典中不同单词的数目。
- 例(token):语料中单词数目。
- 字典(vocabulary):语言模型的基本组件,规定了我们对哪些元素进行统计。
N-gram语言模型与评价方法
N-gram使用前N-1个词作为历史,估计当前(第N)个词。即P(w1∣w1i−1)=P(wi∣wi−N+1i−1)P(w_1|w_1^{i-1})=P(w_i|w_{i-N+1}^{i-1})P(w1∣w1i−1)=P(wi∣wi−N+1i−1)。
在进行N-gram模型估计时,最简单的方法就是最大似然方法,即P(wi∣wi−N+1i−1)=C(wi−N+1i−1wi)C(wi−N+1i−1)P(w_i|w_{i-N+1}^{i-1})=\frac{C(w_{i-N+1}^{i-1}w_i)}{C(w_{i-N+1}^{i-1})}P(wi∣wi−N+1i−1)=C(wi−N+1i−1)C(wi−N+1i−1wi)。
在ASR领域,习惯使用<s><s><s>和</s></s></s>来标记开头和结尾,没有在vocabulary中出现的词(OOV,out of vocabulary)一般标记为<UNK><UNK><UNK>。
在对N-gram语言模型进行测试评估时,通常分为根据应用实地测试(精确,但耗时耗力)和困惑度两种。
在测试集W=w1,w2,⋯,wNW=w_1,w_2,\cdots,w_NW=w1,w2,⋯,wN,困惑度就是用单词数归一化后的测试集概率:PP(W)=P(w1w2⋯wN)−1N=1P(w1w2⋯wN)N=∑i=1N1P(wi∣wi−N+1i−1)NPP(W)=P(w_1w_2\cdots w_N)^{-\frac{1}{N}}=\sqrt[N]{\frac{1}{P(w_1w_2\cdots w_N)}}=\sqrt[N]{\sum_{i=1}^{N}\frac{1}{P(w_i|w_{i-N+1}^{i-1})}}PP(W)=P(w1w2⋯wN)−N1=NP(w1w2⋯wN)1
平滑算法
由于语料的稀疏性,有些词序列找不到,它的概率就是0,此时可以使用平滑算法,将一部分看见的事件概率量分给未看见的事件。
拉普拉斯平滑
intuition:将每个计数加1,从而使得任何次序列都有计数。如P(wi)=C(wi)NP(w_i)=\frac{C(w_i)}{N}P(wi)=NC(wi),NNN为总token数,Plaplace(wi)=C(wi)+1N+VP_{laplace}(w_i)=\frac{C(w_i)+1}{N+V}Plaplace(wi)=N+VC(wi)+1,Plaplace(wi∣wi−1)=C(wi−1wi)+1C(wi−1+V)P_{laplace}(w_i|w_{i-1})=\frac{C(w_{i-1}w_i)+1}{C(w_{i-1}+V)}Plaplace(wi∣wi−1)=C(wi−1+V)C(wi−1wi)+1。
平滑算法中有两个非常重要的概念:
- 调整计数(adjusted count)——c∗c^*c∗:描述平滑算法仅对分子的影响,以拉普拉斯为例,ci∗=(ci+1)NN+Vc_i^*=(c_i+1)\frac{N}{N+V}ci∗=(ci+1)N+VN
- 相对打折折率(discount ratio)——dcd_cdc:打折计数和原计数的比率,dc=c∗cd_c=\frac{c^*}{c}dc=cc∗。
拉普拉斯平滑算法的缺点:对于比较稀疏的语料,会将原来计数较高的词序列,进行一个很严重的概率削减。
古德图灵平滑
齐夫定律:Given a large sample of words used, the frequency of any word is inversely proportional to its rank in the frequency table(自然语言语料库中,一个词出现的频率与它在频率表里的排名成反比)。也就是说,在语料库(语言)中,大部分词都是低频词,只有很少的常用词。
intuition:用你看见过一次的事情估计你从未看见的事情,并依次类推。
古德图灵平滑算法一般性的表示为:用你看见过c+1c+1c+1次的事情来估计你看见过ccc次的事情。
频率c出现的频数:Nc=∑x:count(x)=c1N_c=\sum_{x:count(x)=c}1Nc=∑x:count(x)=c1。
对于古德图灵平滑算法,其调整计数为:c∗=(c+1)Nc+1Ncc^*=(c+1)\frac{N_{c+1}}{N_c}c∗=(c+1)NcNc+1,其遗漏量为PGT∗(UnseenEvents)=N1NP_{GT}^*(Unseen Events)=\frac{N_1}{N}PGT∗(UnseenEvents)=NN1。
但是古德图灵平滑也有一个切实问题,如果一个词在预料中出现了N词,但是没有出现N+1次的词序列,难道这个概率变为0吗?在实际解决这个问题时,通常有两种方法:
- 当c>k(e.g.k=5)c>k(e.g. k=5)c>k(e.g.k=5)时,Nc≈acβN_c \approx ac^\betaNc≈acβ,其中α\alphaα和β\betaβ为参数,对NcN_cNc进行平滑。
- 认为c>kc>kc>k(katz建议k=5),认为技术可靠不进行打折。
{c∗=cc>kc∗=(c+1)Nc+1Nc−c(k+1)Nk+1N11−(k+1)Nk+1N11≤c≤k\left\{\begin{matrix} c^*=c &c>k \\ c^*=\frac{(c+1)\frac{N_{c+1}}{N_c}-c\frac{(k+1)N_{k+1}}{N_1} }{1-\frac{(k+1)N_{k+1}}{N_1} } &1\le c\le k \end{matrix}\right.⎩⎨⎧c∗=cc∗=1−N1(k+1)Nk+1(c+1)NcNc+1−cN1(k+1)Nk+1c>k1≤c≤k
插值与回退
插值与回退是两类平滑算法。
插值法Intuition:从所有N-grams估计中,把所有的概率估计进行混合。例如我们优化一个tri-gram模型,我们将tri-gram,bigram和unigram计数进行插值,完成单个语言模型内部的优化。
回退法Intuition:如果在估计一个高阶语言模型非零序列时,我们直接使用这个概率,当高阶语言模型我们需要查找的词序列不存在是,我们回退到低阶语言模型。
卡茨平滑
卡茨平滑算法是一种递归回退的算法。Intuition:若N阶语言模型存在,直接使用打折后的概率(常用古德图灵平滑算法进行打折), 若高阶语言模型不存在,则将打折节省出的概率量,依照N-1阶的语言模型进行分配,依此类推。
Pkatz(wi∣wi−N+1i−1)={p∗(wi∣wi−N+1i−1)C(wi−N+1i)>0α(wi−N+1i−1)Pkatz(wi∣wi−N+2i−1)otherwiseP_{katz}(w_i|w_{i-N+1}^{i-1})=\left\{\begin{matrix} p^*(w_i|w_{i-N+1}^{i-1}) &C(w_{i-N+1}^i)>0 \\ \alpha (w_{i-N+1}^{i-1})P_{katz}(w_i|w_{i-N+2}^{i-1}) &otherwise \end{matrix}\right.Pkatz(wi∣wi−N+1i−1)={p∗(wi∣wi−N+1i−1)α(wi−N+1i−1)Pkatz(wi∣wi−N+2i−1)C(wi−N+1i)>0otherwise
克奈瑟-内平滑
绝对折扣(克奈瑟-内平滑的一部分)
C(MLE) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
c*(GT) | 0.0000270 | 0.446 | 1.26 | 2.24 | 3.24 | 4.22 | 5.19 | 6.21 | 7.24 | 8.25 |
研究人员对“AP新闻专线”语料的bigram进行古德图灵打折后获得上表,发现,除0和1外,其他近似减0.75就可以了,因此,研究人员认为,我们是否可以直接对统计计数减去一个绝对值,用其作为调整计数,即:Pabsolute(wi∣wi−1)={C(wi−1wi)−DC(wi−1)C(wi−1wi)>0α(wi)P(wi)otherwiseP_{absolute}(w_i|w_{i-1})=\left\{\begin{matrix} \frac{C(w_{i-1}w_i)-D}{C(w_{i-1})} &C(w_{i-1}w_i)>0 \\ \alpha (w_i)P(w_i) &otherwise \end{matrix}\right.Pabsolute(wi∣wi−1)={C(wi−1)C(wi−1wi)−Dα(wi)P(wi)C(wi−1wi)>0otherwise,在实际应用中,0和1会特殊处理。
克奈瑟-内平滑Intuition:对于一个词,如果它的语料库中出现更多种不同上下文时,它可能应该有更高的概率。为了刻画这种想法,研究人员提出了接续概率:Pcontinuation(wi)=∣{wi−1:C(wi−1wi)>0}∣∑wi∣{wi−1:C(wi−1wi)>0}∣P_{continuation}(w_i)=\frac{| \{ w_{i-1}:C(w_{i-1}w_i)>0 \} | }{\sum _{w_i}| \{ w_{i-1}:C(w_{i-1}w_i)>0 \} | }Pcontinuation(wi)=∑wi∣{wi−1:C(wi−1wi)>0}∣∣{wi−1:C(wi−1wi)>0}∣
克奈瑟-内平滑就是将绝对值打折和接续概率进行一个有机的结合,它的回退式为:PKN(wi∣wi−1)={C(wi−1wi)−DC(wi−1)C(wi−1wi)>0α(wi)Pcontinuation(wi)otherwiseP_{KN}(w_i|w_{i-1})=\left\{\begin{matrix} \frac{C(w_{i-1}w_i)-D}{C(w_{i-1})} &C(w_{i-1}w_i)>0 \\ \alpha (w_i)P_{continuation}(w_i) &otherwise \end{matrix}\right.PKN(wi∣wi−1)={C(wi−1)C(wi−1wi)−Dα(wi)Pcontinuation(wi)C(wi−1wi)>0otherwise,插值式为:PKN(wi∣wi−1)=C(wi−1wi)−DC(wi−1)+β(wi)Pcontinuation(wi)=C(wi−1wi)−DC(wi−1)+β(wi)∣{wi−1:C(wi−1wi)>0}∣∑wi∣{wi−1:C(wi−1wi)>0}∣P_{KN}(w_i|w_{i-1}) =\frac{C(w_{i-1}w_i)-D}{C(w_{i-1})} + \beta (w_i)P_{continuation}(w_i) = \frac{C(w_{i-1}w_i)-D}{C(w_{i-1})}+\beta (w_i)\frac{|\{w_{i-1}:C(w_{i-1}w_i)>0\}|}{\sum _{w_i}|\{w_{i-1}:C(w_{i-1}w_i)>0\}|}PKN(wi∣wi−1)=C(wi−1)C(wi−1wi)−D+β(wi)Pcontinuation(wi)=C(wi−1)C(wi−1wi)−D+β(wi)∑wi∣{wi−1:C(wi−1wi)>0}∣∣{wi−1:C(wi−1wi)>0}∣
语言模型的存储格式——APRA Format及工具包
ARPA Format是N-gram的标准存储模式:是一个ASCII文件,在一个小标题后跟着一个表,列举出所有非零的N元语法概率。
每个N元语法条目中依次为:
- 折扣后对数概率(log10格式存储),如:log10P∗(wi∣wi−1)log_{10}P^*(w_i|w_{i-1})log10P∗(wi∣wi−1)
- 词序列 ,如:wi−1wiw_{i-1}w_iwi−1wi
- 回退权重(log10格式存储),如:logα(wi−1wi)log \alpha(w_{i-1}w_i)logα(wi−1wi)
常用工具包:
- SRILM(最常用):http://www.speech.sri.com/projects/srilm
- KenLM:https://github.com/kpu/kenlm
- KaldiLM:http://www.danielpovey.com/files/kaldi/kaldi_lm.tar.gz
- IRSTLM:https://github.com/irstlm-team
RNN语言模型
n-gram的问题是其捕捉句子中长期依赖的能力非常有限,而RNN语言模型恰好可以解决这个痛处。Tomac Mikolov最先将RNN引入语音识别工作中。而随着Deep Learn的发展,又出现了一些对历史记忆更好的模型,如LSTM、GRU等。对于RNN来说,最简单直观的输出是vocabulary size vector with softmax,但是这样会有输出维度过高等问题,而低频词袋法可以降低输出维度(取频率最高的N个词,并将剩余词放入一个词袋中)。
其他语言模型思想简介
基于类的N元语言模型:在语言学中,将具有同样语义的词归为一类是一种常见的解决数据稀疏的方法。受此启发,在语言模型中,根据词性分析,语义分析,或者特定任务时人为设计,我们可以将词和类别建立联系,通过类别信息,帮助我们提升语言模型建模性能。
缓存模型:如果一个词在句子中用到,那么它很可能被再次用到。
大词汇量连续语音识别梳理
在此专栏,我们学习了以下内容:
- 语言模型:建模word间的跳转概率。
- 字典:提供word到phone的映射,及语言模型建模元素。
- HMM:建模phone或triphone等基本单元发声过程。
- GMM:建模每个HMM状态的发射概率,即声学似然分。
- 决策树:triphone等建模单元绑定,解决数据稀疏问题。
- 前向后向算法:更新HMM参数。
- EM算法:更新GMM参数。
- Viterbi算法:解码或对齐。
- Embedding Training算法:更新GMM-HMM模型参数,即Viterbi Training。
- 特征提取:从音频获取MFCC、Fbank等特征。
- DNN:建模每帧观测的后验概率,后转化为似然概率,提供给每个HMM状态。
熟练掌握上述知识点,我们基本可以完成一个大词汇量连续语音识别系统。
语音识别入门第七节:语言模型相关推荐
- 语音识别入门第七节:语言模型(实战篇)
Ngrams计数: witten_bell平滑:
- 语音识别入门第五节:基于GMM-HMM的语音识别系统
目录 基于孤立词的GMM-HMM语音识别系统 训练 解码 基于单音素的GMM-HMM语音识别系统 音素/词典 训练 解码 基于三音素的GMM-HMM语音识别系统 三音素 决策树 基于孤立词的GMM-H ...
- <STC32G12K128入门第七节>ADC模数转换
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.ADC? 二.ADC寄存器配置 1.ADC_CONTR控制寄存器 2.ADCCFG配置寄存器 3.ADCTIM 时 ...
- Android零基础入门第1节:Android的前世今生
原文:Android零基础入门第1节:Android的前世今生 现在网上有很多各色Android资料了,但相对来说还是比较零散,Android覆盖的范围极广,最近刚好有机会全部拉通整理一遍,也保存起来 ...
- Android零基础入门第11节:简单几步带你飞,运行Android Studio工程
2019独角兽企业重金招聘Python工程师标准>>> 之前讲过Eclipse环境下的Android虚拟设备的创建和使用,现在既然升级了Android Studio开发工具,那么对应 ...
- Android零基础入门第30节:两分钟掌握FrameLayout帧布局
原文:Android零基础入门第30节:两分钟掌握FrameLayout帧布局 前面学习了线性布局.相对布局.表格布局,那么本期来学习第四种布局--FrameLayout帧布局. 一.认识FrameL ...
- Android零基础入门第25节:最简单最常用的LinearLayout线性布局
原文:Android零基础入门第25节:最简单最常用的LinearLayout线性布局 良好的布局设计对于UI界面至关重要,在前面也简单介绍过,目前Android中的布局主要有6种,创建的布局文件默认 ...
- Android零基础入门第44节:ListView数据动态更新
2019独角兽企业重金招聘Python工程师标准>>> 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据 ...
- Android零基础入门第38节:初识Adapter
2019独角兽企业重金招聘Python工程师标准>>> 在上一节一起了解了ListView的简单使用,那么本节继续来学习与ListView有着千丝万缕的Adapter. 一.了解MV ...
最新文章
- 关于excel导入到封装成工具类jar包和web版门店收银网络无法无法连接上的解决方法...
- jesd204b应用指南中文_Novation 发布 Summit 合成器中文用户指南
- 成都网络推广带大家了解一个好的标题需遵循的原则有哪些?
- 离线轻量级大数据平台Spark之读取CSV文件实例
- 网站搭建从零开始(三)域名解析
- 砥志研思SVM(一) 最优间隔分类器问题(上):硬间隔SVM
- MongoDB基础介绍安装与使用
- Windows Phone 7 开发 31 日谈——第25日:外部API
- Linux学习总结(25)——CentOS系统常识
- @所有技术人,快来翻开属于你的2021定制日历!
- 流行的JavaScript库 ——jQuery
- 【05】CC - 格式
- NYOJ975 - 关于521
- vijos 1071 01背包
- 儿童计算机编程课程,少儿编程基础课程介绍
- mysql中split_part_Postgresql之split_part()切割函数
- 京东区块链技术实践白皮书2020
- 串口发送数据,只接收到00的原因之一
- Ajax + $ajax
- 微信小程序之picker选择器获取值得两种方法
热门文章
- 【Vegas原创】word图片隐藏在文字里了的终极解决办法
- 软件开发之版本控制方式
- vs2013如何调用监视窗口实现调试(如何打断点、逐步调试、逐过程调试、退出调试、条件调试)
- 如何删除 顽固文件/文件夹
- 一个有潜在危险的要求。从客户端中检测到(ctl00$ $ $ contentplaceholder2submit1
- 网络空间开源威胁情报分析的人机优化策略研究
- 【统计学的学习方法论】
- 从 DP 到 DDP 到 apex
- 【翻译】利用加速度求解位置的算法——三轴传感器
- 本地计算机无法启动错误1068,Win7系统启动失败并提示错误1068的解决办法