在上一节lesson中主要总结了HMM在声学模型中的用法,本小节主要总结语言模型相关的内容。在语音识别领域,语言模型评估的是一句话到底有多像一句人话,在语音识别、拼写纠错、机器翻译、音字转换都有许多应用。

1.语言模型简介

语言模型P(W)实际上提供了训练集中的语言约束,通过计算一句话或词序列出现的概率来帮助选择正确的候选。举例来讲就是,比如说了一句"The computer is listening",由于存在很多音的confuse,会导致像"they come tutor list sunny"也有可能正确,我们需要让机器知道正确的词序列,于是就是让机器会统计这句话出现的机率,不太可能是一句话的候选概率将会比较低。

在详细介绍语言模型之前,还需要一些预备知识,比如信息熵。在第5节中总结过信息熵的相关知识。

信息熵的上限是

,下限是0。假设language source,如果别人给你手机发英文文本消息,假设英文字母是一个个显示地话,每看到一个字母能够带给你多少信息,这个是可以通过计算每个字母的信息量得到的。所有的英文字母加标点符号是小于
的,则每符号的平均信息量也就是信息熵
不会超过6bits information;假设消息是以word依次显示地话,假设常用的英文单词是30000个,则信息熵
不会超过15 bits information。

假设language source,如果别人给你手机发普通话语音消息,假设你是一个syllable(音节)一个音节地听,中文一共有

个音节(包括tone),则信息熵
不会超过6bits information每音节,如果不包括tone(400个音节)的话信息熵
不会超过9bits information每音节;假设是以字为单位的话,基于常用字8000字的假设,则信息熵
不会超过13bits information每字。

1.1 信息熵与混淆度(Entropy and Perplexity)

之前总结过,N-gram是在语言模型中最核心的建模方法。N-gram只依赖于前面n-1个word。

假设一句话进入语音识别系统,这句话是由很多word构成的,每个word都是以一定概率存在的,有高有低。计算第一个word的概率只能通过unigram进行计算,通过计算第1个word的信息熵可以得知第1个word的选词之难度,信息熵可以描述为概率分布之间的分散程度或者集中程度(越分散熵越大),表明了选词的难度(越难熵越大)。假设第1个word计算出来的信息熵为10bits,这与1024个单词以均匀分布的方式计算得到的信息熵是一样的,所以该单词的几率可以等价为

。其中,混淆度是计算公式为
,也就是1024。在这里我们将1024称为branching factor estimate。也就是通过计算第1个word的难度可以得知选word之难度就等同于从1024个单词中选1个的难度。假设已经有了第1个word了,第2个word就可以采用bi-gram进行,但是仍然会有词库大小那么多机率,由于第1个word已经知道了,所以该单词的选取的难度会小一些,则信息熵稍微会小一点(集中一点),假设计算出来的信息熵是9bits,则该单词的选题难度就等同于从以均匀分布的方式分布的512个单词选1个的难度。依次类推,第三个word可以采用trigram,选词难度会进一步降低....

语言模型P(W)实际上计算一句话或一词序列出现的概率,计算公式可以表达为:

,在上述的例子中
,
,依次类推。那我平均猜一次能够看到该可能的几率是多少呢,采用几何平均计算,得到是一个小于1的分数取倒数就可以得到平均的可能性。图中的312代表的是我每一次猜这句话的难度与从312个句子里面选1个的难度是相等的。

我们将求得的average braching facotor这个指标当做语言模型的度量标准(perplexity,简称PPL),代表的是选词在多少个里面取一个的难度。我们希望这个PPL越低越好,越低表明模型的预测能力越好。训练集上的PPL代表模型与训练数据的匹配程度,测试集上的PPL代表模型预测新数据的泛化能力。将上面PPL计算可以表示为:

其中

是测试集所有的word数目,
代表的是依赖前面的word。

在语言模型里面,我们用训练集(train corpus)来训练一个语言模型,我们拿测试集(test corpus)来测试语言模型的性能。

举个简单的示例:

图中所示domain specific指的是用各类的数据分别训练各类的模型,比如说用政治新闻训练政治新闻的语言模型,再用政治新闻测训练的政治新闻的模型。我们会发现图中的cultures新闻的复杂度是比较高的,因为政治新闻覆盖面比较广,主题会有很多,句型种类比较多。体育新闻主题比较少,内容比较简单,所以语言模型在比较少的数据集上也能训练一个不错的模型。general domain是将所有类别的数据组合起来训练一个比较大的model,在测试的时候分别拿各类别的数据进行测试,会发现语言模型的性能有所下降,主要是由于不同domain的词组相互干扰导致。这个图表明在语言模型中,似乎是越是单一并且集中主题的语料库,由于有着比较特定的distribution,训练的语言模型越好

有些课本上会写道:The Perplexity is a kind “Cross-Entropy” when the true statistical characteristics of the test corpus D is incorrectly estimated as

by the language model,下面针对这句话做一个解释。

之前介绍过KL散度的概念,是衡量两个分布的相似性的。

,有人也会称KL散度为交叉熵(cross entropy),利用Jensen不等式知道
,左边是信息熵计算公式,也有一部分人不等式右面的称为交叉熵。根据大数定律,我们可以知道

其中红色框统计的是测试集里面的概率,蓝色框统计的是训练集得到的统计。

2. 语言模型的平滑(Smoothing)

训练数据通常不能覆盖所有的词语,所以在词频统计的结果中,一定会出现大量的零(稀疏),从而导致识别的结果出现错误。比如p(Jason immediately standas up)=0,为什么呢?因为在语料库中p( immediately | Jason)=0,在语料库中Jason和immediately可能分别出现很多次,但是就是没有出现Jason immediately这样的搭配,就将该句子的概率判为0这是不合理的。为了解决数据稀疏的问题,我们要对所统计的结果进行平滑操作,也就是将非0机率的事件给所有的event,即使预料库中并不含有该event,在没有出现在预料库的词语赋予一个比较小的概率值,但是所有event出现的概率和为1,所以核心思想可以总结为多退少补。有几种具体的平滑做法,接下来分别介绍。

2.1 Add-one smoothing

思想:所有的events的出现次数都加1.

举个例子:,在bigram中,

实验效果不是特别理想,在某些情况下回表现的比较好,有些会变差。

2.2 back-off Smoothing

back-off意为回退,也就是说ngram计算出来的概率为0,我们可以可以回退到n-1gram。如果ngram计算的比较大,那n-1 gram计算的不会小,实验效果不错。

2.3 Interpolation Smoothing

对于非0的events将ngram和n-1 gram的概率内插一下效果会更好一点。

这种思想也可以用将special domain的语言模型和一个background的语言模型进行内插,比如继续用上面讲的例子,我们将用体育新闻和所有类别新闻的语言模型做内插会好一些。或者说可以将一个general domain的语言模型adapt到一个special domain中去。

2.4 Good-Turing

来源:1953年Good在Turing的指导下提出的一种概率估计方法。

举个例子:在钓鱼的时候,总共调到了6种鱼,1号鱼钓到了10 条,2号鱼调到了3条,3号鱼钓到了2条,4、5、6号鱼掉到了 分别调到了1条,总共18条鱼。根据掉到的18条鱼来估计海里的所有的鱼的种类的distribution。可能海里游1000种鱼,只钓到了6种,其余994种是不知道的,如何估计994种的鱼的机率?我们可能会用3/18来表示,为什么?因为出现1次的物种的概率是3种,也就是

(出现1次的种类是3),代表的是在他们这3种鱼被钓起来的时候也算是新的种类。将剩下的5/18重新分配给6种鱼。这是该算法的设想。

基本思想:假设样本总数为

,
是样本中刚好出现
次的事件(这里为ngram)数目,
为折扣后的次数。在假设中,
代表的是出现1次的gram数,
代表的是出现2次的gram数目,以此类推。根据假设,依次类推,所以有:
,得到
,这里面可以计算一个折扣率

也就是说出现的1次的所有的概率之和送给0次的,0次所有的events(gram数)再进行平均分配;出现2次的所有概率之和送给1次的,1次所有的events(gram数)再进行平均分配;出现3次的所有概率之和送给2次的,2次的所有events(gram数)平分这些概率(),依次类推。

但是该算法存在缺点:

  • 平均分配真的合理吗?仔细想想不太合理,举个例子:C(burnish the)=C(burnish thou)=0,很明显,P(the|burnish)>P(thou|burnish),因为P(the)>P(thou)。
  • 出现次数最多的events的概率变没了,因为他所有的概率送给次高频了。在实际应用中,越高频越重要。

2.5 Katz Smoothing

是基于Good-Turing的一个改进,克服了Good-Turing的两个缺点。

基本思想:在统计中相信可信(出现次数比较高)的统计数据,这部分的概率不做改变,而对不可信(出现次数比较低)的统计数据进行打折处理,同时将折扣出来的那一小部分概率给予未看见的事件。

具体来说可以分为3种情况:

  • 对于频率超过一定阈值的词(或设定一定的次数

    ),根据大数定理,它的最大似然估计的结果就很接近于真实概率,此时它们的概率估计就是它们在语料库中的相对频率,

    不做改变

  • 对于频率小于一定阈值的词,由于它的统计数据比较少,那么最大似然估计就跟真实概率没有关系,是不可信的,换句话说,就是最大似然估计的结果既有可能接近概率也有可能和概率相差很大,为了避免过高地估计概率,或者说为了减小风险提高可靠性,就对这样的估计进行打折处理,而且是出现次数越少,折扣越多。要满足
    ,其中折扣率
    是和Good-Turing计算一样;
  • 对于未看见的词,也给予一个比较小的概率,具体就是把第二种情况打折的概率分给未出现的词。这样所有词的概率估计都很平滑了。具体怎么分,不是平均分配,是根据n-1阶的概率来按比例分配。

举个例子:Bi-gram

Katz效果非常好,一般用其做平滑做的比较多。

3. Class-based Language Modeling(类语言模型)

N-gram模型的一个很大缺点就是它把所有的词都看成完全不同的东西。因此,对于某一个词,模型需要足够多的训练数据才能比较准确的估计其概率。但是人类不是这样使用语言的。我们知道’Tuesday’和’Wednesday’在句法和语义上都有某种类似的属性。即使训练数据中可能没有出现过’store open Tuesday’,但是因为训练数据中出现过’store open Wednesday’,所以我们还是能够给前者比较高的概率。也就是说,我们需要考虑词的这种相似性。

类语言模型可以根据语言或者文法把类似的词进行聚类,组成词类,在构建语言模型的时候使用词类标签来替代词。

所以原先关于词的trigram可以写成词类(词群)的trigram. 下面公式中

代表的是
所属的那个词类,
。也就是看到前面两个词类的几率,我能得到下一个词类的几率,在基础上能看到该词的一个概率。这种方法更适用于ngram数目比较少、不可靠的情况,

这对于unseen data和不可靠数据起到了一定的平滑效果,并且该方法和低阶的语言模型互补。这种方式参数比较少。

这种方式在Limited domian应用效果不错:比如基于人类规则的一些订票业务。

那怎么得到词类的主要有两种方法:利用先验知识或者数据驱动。

那么怎么得到词类呢?一种是利用先验知识,通常是应用的领域知识。比如我们为一个旅行的app做一个语言模型,我们需要识别目的城市的名字(比如’Tahiti’, ‘Oslo’)、航班信息以及周几(周一到周日)。不管训练数据多大,它也不可能出现所有的城市和航班信息。因此我们可以根据先验知识平均的认为每个城市的类成员概率都是一样,也可以根据城市的热度来按比例的分配这个概率(而不是训练数据的概率)。有的实体是两个及其以上的词,比如’Los Angeles’,这是需要修改类语言模型,读者可以参考Word-Phrase-Entity Language Models: Getting More Mileage out of N-grams。
另一种方法就是纯数据驱动的方法,而不需要人或者领域的知识。比如我们可以先定义多少个类别,然后搜索所有的词和类别的映射关系(每一种映射就是一种聚类),然后找出PPL最小的那种聚类。当然穷举的计算复杂度是不可行的,有一些算法来解决计算的问题,读者可以参考Class-Based n-gram Models of Natural Language。

再说两个数据驱动的例子:

例子1:刚开始所有的词都当做1类,然后任意两个词进行合并,如果该词的合并会使语言模型的perplexity降低的话合并为1个,不断迭代,知道模型的性能不在提高就停止。

例子2:把出现在该词前面的全部历史数据用决策树对其进行分类,利用专家知识构建question set。

链接:

http://fancyerii.github.io/dev287x/lm/#%E7%B1%BBclass-based%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B​fancyerii.github.ioDigital Speech Processing courses​speech.ee.ntu.edu.tw

语言 双线性内插_数位语音信号处理概论 Lesson6 语言模型相关推荐

  1. python语音信号处理_现代语音信号处理笔记 (一)

    本系列笔记对胡航老师的现代语音信号处理这本书的语音处理部分进行总结,包含语音信号处理基础.语音信号分析.语音编码三部分.一开始以为三部分总结到一篇文章里就可以了,但写着写着发现事情并没有那么简单... ...

  2. 语言 双线性内插_合资插混间的实力较量,微蓝6 PHEV和卡罗拉双擎E+谁更值得选...

    伴随着国内新能源市场的日趋明朗,再考虑到经济实用性以及上牌等问题,越来越多的消费者关注起新能源汽车.这其中,插电混动车型不仅具有更长的续航里程,而且可以享受到诸如免摇号.送牌照等种种利好(北京除外), ...

  3. mysql 重置密码语音_数字语音信号处理学习笔记语音信号的同态处理(2)

    5.4 复倒谱和倒谱 定义 设信号x(n)的z变换为X(z) = z[x(n)],其对数为: (1) 那么 的逆z变换可写成: (2) 取 (1)式则有 (3) 于是式子(2)则可以写成 (4) 则式 ...

  4. NLP判断语言情绪_网易严选nlp预训练语言模型的应用

    随着2018年底bert的发布,预训练(pre-train)成为nlp领域最为热门的方向之一,大规模的无监督语料加上少量有标注的语料成为了nlp模型的标配.本文将介绍几种常见的语言模型的基本原理和使用 ...

  5. 语音信号处理_书单 | 语音研究进阶指南

    作为人类最自然的交流方式,"听"和"说"包括了人类大脑皮层从听觉感知到语言处理和理解,再到声音生成这个"神奇"的认知过程.语音领域的探索和研 ...

  6. VS语音信号处理(2) C语言分段读取WAV语音文件语音数据

    VS语音信号处理(2) C语言分段读取WAV语音文件语音数据 前言 一. 工程实现 二. 结果 三. 小结 前言 语音识别相关算法一般在MATLAB上进行仿真验证与实验,在工程上一般还是在VS中进行实 ...

  7. VS语音信号处理(6) C语言调用SoundTouch进行变速不变调工程实例

    VS语音信号处理(6) C语言调用SoundTouch进行变速不变调工程实例 前言 一. 源码下载即链接库准备 二. 工程编译准备 三. 例程实现 四. 小结 前言 语音识别相关算法一般在MATLAB ...

  8. 语音信号处理 c语言,语音信号处理(毕业设计论文).doc

    语音信号处理(毕业设计论文) 摘 要 语音信号处理是研究用数字信号处理技术和语音学知识对语音信号进行处理的新兴的学科,是目前发展最为迅速的信息科学研究领域的核心技术之一.通过语音传递信息是人类最重要. ...

  9. 学习笔记:《数字媒体技术概论》-4/10 数字语音信号处理技术及应用-中国大学慕课公开课

    目录 4-数字语音信号处理技术及应用 4.1-数字语音的基本概念 4.2-数字语音技术主要研究方向 4.3-语音识别 4.4-声纹识别与语音合成 声纹识别 4-数字语音信号处理技术及应用 4.1-数字 ...

最新文章

  1. haproxy + keepalived 安装配置
  2. 自由自在珍珠奶茶让奶茶文化更加多元
  3. 如何debug 右键菜单执行逻辑 - Test BSP Application page implementation
  4. 类的6个默认成员函数:构造函数、析构函数、拷贝构造函数、重载运算符、三/五法则
  5. Springboot与Spring的关系
  6. LeetCode-150-Evaluate Reverse Polish Notation
  7. 什么是spooling技术 他有哪几部分组成_气调保鲜冷库有哪几部分组成?
  8. Tomcat 7 的domain域名配置,Tomcat 修改JSESSIONID
  9. 软件开发,网站建设,性价比高的PLC仿真软件。
  10. 办公室计算机收不到主机打印机,图文详解电脑怎么连接办公室打印机 一招教你搞定!...
  11. CAD图层的使用小技巧
  12. 三款EDA工具,AD、PADS与Allegro的简单介绍
  13. python程序实例下载_Python经典实例
  14. 学习笔记之js中导出表格到excel详解+源码
  15. 前端学习之路(1)———表格的增行和减行
  16. Python学习周报
  17. 区块链改革(链改)全国行动委员会第一次会议胜利召开
  18. 徐荣谦《养好脾和肺 宝宝不积食不咳嗽长大个》【01】小儿常见病
  19. Win32编程基础知识(包括对程序的分析)
  20. 关于在线评论有用性的论文研读笔记---10篇

热门文章

  1. 前端之BOM和DOM
  2. [置顶] 如何把你的笔记本电脑变成一个Wi-Fi路由器在Windows 7 8?
  3. hive学习08天-一次hvie面试题
  4. Mybatis逆向工程使用方法
  5. 差分数组|小a的轰炸游戏-牛客317E
  6. Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程)...
  7. ExtJs radiogroup form.loadRecord方法无法赋值正确解决办法
  8. .net安全编程 阅读笔记(二)
  9. CVPR 2020 中的群组活动识别
  10. 性能比拼!超详细的Tengine GEMM矩阵乘法汇编教程