HMM(Hidden Markov Model)详解——语音信号处理学习(三)(选修一)

news2025/1/18 4:34:34

参考文献:

Speech Recognition (Option) - HMM哔哩哔哩bilibili

2020 年 3月 新番 李宏毅 人类语言处理 独家笔记 HMM - 6 - 知乎 (zhihu.com)

隐马尔可夫(HMM)的解码问题+维特比算法 - 知乎 (zhihu.com)

本次省略所有引用论文

目录

一、介绍

二、建模单位 States

State 由来

转移概率与发射概率

三、Alignment

四、深度学习下的 HMM

方法一:Tandem

方法二:DNN-HMM Hybrid

五、DNN 中 State Classifier 的训练方式


 

注意,本篇继承语音信号处理学习(三)课程后,属于语音识别任务选修部分,共三个章节。

 

让我们穿越回14年前,看看那时的人们在没有神经网络的情况下是如何做语音辨识的。你会发现,当前的技术中有借用HMM的很多思想。

一、介绍

  • 在过去,我们可以使用统计模型来做语音识别。给定输入语音序列 X,我们只需要找到最大概率的输出文字 Y 就可以了,也就是穷举所有可能的 Y,找到一个 Y* 使得 P(Y|X) 最大化。我们也把这个过程叫作解码(decode),公式如下:


    Y^* = \arg \max_Y{P(Y|X)}
     

  • 穷举需要非常好的演算法,这个问题太复杂。好在我们可以使用贝叶斯定理对其进行变换,变换后的公式如下。由于 P(X) 与我们的解码任务是无关的,因为不会随着 Y 变化而变化。所以我们只需要保留分子部分即可。


    \begin{aligned} Y^* & = \arg \max_Y{P(Y|X)} \\ & = \arg \max_Y{\frac{P(X|Y)P(Y)}{P(X)}} \\ & = \arg \max_Y{P(X|Y)P(Y)} \end{aligned}
     

  • 变换后,我们将式子的前半部分 P(X|Y) 称为 Acoustic Model,后面这项 P(Y) 称为 Language Model。而前者所经常使用的就是 HMM。我们看到,如果需要使用 HMM,就必须搭配 LM 来进行使用。而常规的 E2E 模型是直接解未变行的式子的,表面上看上去好像不需要 LM,实际上 E2E 模型加上 LM 后表现往往会好很多,这个可以参考之后对 LM 的讲解。

二、建模单位 States

State 由来
  • 在前面我们说过,语音识别模型中,目标 Y 是 Token 序列,然而,我们在 HMM 中会将目标 Token 序列转为 States 序列,用 S 来表示。State 是什么?它是由人定义的,比音素 Phoneme 还要小的单位。

  • 我们使用 what do you think 句子来举例,使用 phoneme 作为 token 单位的话,分解结果如下。不过,由于每个因素都会受到前后因素的影响,所以相同的因素 uw 说不定实际上发音会不同。所以我们会更加细分,采用 Tri-phone 来作为 token 单位,即当前音素加上前面的和后面的音素。

  • 而 State 就是比 Tri-phone 更小的单位,我们可以规定每个 Tri-phone 由 3 或者 5 个 state 构成。多少就取决于你所拥有的计算资源。而拆解出来的 State 也保留了发音顺序信息。

  • 既然我们需要计算给定 States 时,声学特征序列 X 的几率,那我们就需要弄清楚 State 是怎么产生出声学特征的。其实很简单,假设我们一共有3个 State,而 X 有 6 个 Vector,那么我们首先进入第一个 State,产生一些向量,足够了以后进入下一个 State,以此类推,依次走完就结束了。

转移概率与发射概率
  • 为了完成刚刚的过程,我们需要计算两个几率,一个是当前状态结束跳到下一个状态的几率,另一个就是当前状态生成对应声学特征的几率。二者我们分别称为 Transition Probability(转移概率) 和 Emission Probility(发射概率)。

    • Transition Probability:本次的 vector 是由状态 a 产生的,下一个 vector 是由状态 b 产生的概率。

    • Emission Probability:给定一个 State,产生某种 acoustic feature 的概率。我们认为,每一个状态所能发射的声学特征都有固定的概率分布,我们会用 GMM(Gaussian Mixture Model,高斯混合模型)来表示这个概率。

  • 而发射概率的计算也间接说明了我们为什么需要如此小的单位 State 作为建模单位。因为我们要假设每个状态发射出来的分布稳定。如果单位太大,很有可能其发射的声学特征分布就会变来变去。比如如果使用字符来作为单位,那就会出现这种情况:c 这个字母它的发音不是固定的。它在很多时候是发"ke",但它在h后面就发音"ch"。这样就不适合拿来当作HMM的状态。

  • 然而,发射概率也带来了一些问题,就是会有很多的 state。如果 phoneme 有30个,那么 Tri-phone 就会有 30×30×30个,一个 Tri-phone 又对应3个 state,最终的数量还得再乘一个 3。这就会可能出现这种情况,某一个 state 在整个语料库中只出现过一两次,那么就导致它的高斯混合分布很难计算。

  • 针对这种情况,过去就出现了一项关键技术,即 Tied-state,它假设某些 State 的发音是一样的,因此它们会共用同一个高斯混合分布。这样就可以减少使用的高斯混合模型的数量,也可以让出现很少的难以计算分布的 state 和其他 state 共用分布。这就好比你有两个命名不一样的指针,都指向了同样的内存。

  • 这样的技术发展到现在已经出现了最终形态:Subspace GMM。这其中,所有的State都共用同一个高斯混合模型。它实际上是一个高斯混合分布池(pool),里面有很多高斯混合分布。每一个State,就好比是一个网子,它去这个池子中捞几个高斯分布出来,当作自己要发射的高斯混合分布。所以每个State既有不同的高斯分布,又有相同的高斯分布。

    不过,这项技术是2010年发表的,现在已经不怎么用了。当初发表的时候还是非常轰动的。有趣的是,Hinton 在同年也在该论坛上发表了一篇关于深度学习的 ASR 的论文。但当时大家的注意力都在前一篇论文上,Hinton 的研究并没有受到很多重视。原因在于,它的表现当时不如最顶尖(state of the art)的相关技术。

三、Alignment

  • 假设我们已经知道了 Transition Probability 和 Emission Probability,然而我们还是计算不出来我们的目标概率 P(X|S),因为我们还缺少 Alignment。这是什么意思?就是我们还是不知道这些 vector 是对应到哪一个状态的。也就是说我们需要知道哪一个声学特征,是由哪一个状态产生的,才有办法用发射概率和转移概率去计算 P(X|S)。

  • 假设我们有3个状态 abc,6个向量 x1~6,我们需要得到状态于向量的对齐方式 h(即状态序列),比如 aabbcc,也就是 x1 x2 由状态 a 产生,以此类推。知道了对齐方式,我们就可以用两个概率计算目标概率了。现实中,也正因为我们不知道 Alignment,这个信息是隐藏的,所以 HMM 中的 Hidden 命名就此诞生。不同的状态序列,计算出的概率也就会不一样。

  • 那么我们是如何解决隐藏的 Alignment 信息问题的呢?我们选择穷举所有可能,把所有的状态序列的概率全都计算出来并加起来,最终的结果就是我们的目标概率 P(X|S)。这便是 HMM 在解码过程中在做的事情。当然,诸如 abccbc、abbbbb 这样的序列都是不算在内的,其原因是回跳和少状态。

    但是!!!注意,本人在查询相关资料的时候发现,可能 HMM 在解码中真正做的事情是 “穷举” 所有可能,找到它产生与观测X的声学特征概率最大,最一致的对齐方式。这里的 “穷举” 一般是使用一些动态规划算法(比如 Viterbi 算法)来有效地计算最可能的状态序列,即给定声学特征序列时最可能的隐藏状态序列,以获得最大概率的解码结果。

    不过我又看了一下,应该是对某一个状态序列,算他的概率的时候用的是所有对齐方式概率的加和,而要找概率最大的状态序列的时候,也就是解码生成结果时,使用的是动态规划算法。此说法有待考证。

    后续的结果:在学习 RNN-T 后,我认为 HMM 可能和 RNN-T 一样,在训练时是使用所有对齐方式的概率之和作为当前文本(token/state)的概率,而在训练时是采用概率最大的对齐方式的概率作为当前文本的概率。

    参考资料:隐马尔可夫(HMM)的解码问题+维特比算法 - 知乎 (zhihu.com)

四、深度学习下的 HMM

方法一:Tandem
  • HMM中没有深度学习。当深度学习崛起的时候,人们就开始思考怎么把深度学习用进去。最早的想法都是基于HMM的变体。

  • 第一个最常见的方法是Tandem。它在2009年就已经满街都是。它没有变动HMM的模型,而它的主要目的是给 HMM 提供质量更好的声学特征。怎么提供?之前的声学特征都是 MFCC,而 Tandem 则是训练一个基于深度神经网络的 State Classifier,它可以输入一个MFCC vector,来预测它属于哪一个状态的概率,输出就是其概率分布。我们将这个概率分布代替之前的声学特征,来作为 HMM 的新的输入。

  • 当然,我们也并不一定要拿 State Classifier 的输出作为声学特征,也可以取最后一个隐层或者瓶颈层的输出。

方法二:DNN-HMM Hybrid

Discriminative training 和 Generative Training 是机器学习中两种不同的训练方法,通常用于分类和生成模型。

  1. Discriminative Training

    • 定义:这种训练方法旨在学习数据的条件分布或决策边界,以便区分不同类别之间的差异。它主要关注于对输入数据进行标签分类的任务。这种方法专注于学习直接给出类别标签的条件概率分布,例如,在监督学习中学习从输入到标签的映射。

    • 示例:常见的例子包括支持向量机(SVM)、逻辑回归和神经网络等。

  2. Generative Training

    • 定义:这种训练方法专注于建模数据的生成分布,试图理解数据的产生方式。它不仅仅关注于分类任务,还试图模拟数据生成的过程。通过学习数据的分布模型,可以生成与原始数据相似的新数据。

    • 示例:典型的例子是生成对抗网络(GANs)、变分自编码器(VAEs)和隐马尔可夫模型(HMM)等。

这两种方法在目标和应用上有所不同。Discriminative training 更多关注于数据分类问题,寻找边界或条件概率,使得能够对输入数据进行准确分类。而 Generative Training 则关注于学习数据的生成过程,以便能够生成与原始数据相似的新样本,同时也可以应用于分类任务。

  • 原来的 HMM 中有个高斯混合模型,我们就想使用 DNN 来取代它。然而,高斯混合模型是给定一个 State,输出各声学特征的概率分布,也就是 P(x|a);刚刚讲的 State Classifier 却是给定一个声学特征向量,输出其属于各个状态的概率分布,也就是 P(a|x)。这二者似乎是相反的存在。

  • 不过,我们还是可以根据贝叶斯定理对其进行变换,变换公式如下:P(a) 可以从训练资料里统计而出,P(a|x) 则就是 DNN 的输出,P(x) 咱们不管。这样做的最大好处就是对原来的公式改动很少,实现了模组化管理。

  • 那么,为什么用 DNN 去计算 P(x|a) 要比高斯混合模型计算来的好呢?有的人认为,DNN 的训练过程是 Discriminative training,而原来的 HMM 则是 Generative Training,前者要更好。然而,事实上,虽然 HMM 是生成模型,但是它也可以使用 Discriminative training,并且也有很多人在 DNN 前做过相关研究了。也有人觉得他厉害之处在于 DNN 拥用有更多参数。但这小看了参数量也大起来时,GMM的表征能力,最终实际上 DNN 用的参数和 GMM-based HMM 使用的参数是差不多的。

  • 实际上,这篇论文的贡献在,它让所有的给定观测计算当前可能状态概率,都共用了一个模型。而不是像GMM那样,每一个 State 都需要有它们自己的 GMM,有着不同的 mean 和 variance。所以它是一个非常厉害的以数据作为驱动的状态标注的方法。

  • 那么,DNN 的效果如何呢?事实证明它非常强大。要知道,DNN 可以不是全连接层组成的那种网络,而是可以是任何类型的神经网络,比如 CNN,LSTM 等等。

五、DNN 中 State Classifier 的训练方式

  • 那么我们如何去训练 State Classifier 呢?它的输入是一个声学特征,输出是它是某个状态的概率。我们训练这个之前,需要知道每个声学特征和状态之间的对应关系。但实际中的标注数据都是没对齐的,只有声学特征和对应的文本。

  • 过去的做法是先训练一个 HMM-GMM,有了以后你就可以算出概率最大的 Alignment,有了对齐方式就可以去训练 State Classifier 了。

  • 不过这样也会有人担心,HMM-GMM 不是说表现不好吗,用它的结果来训练 DNN 是不是不太好?那么我们也可以用刚刚训练好的第一代 DNN 再替换 HMM-GMM,给出新的对齐序列,再用它来对 DNN 进行迭代,这样可以一直循环训练下去,一直到你满意为止。

  • 那这样做的结果咋样?很强!在2016年,微软就宣称,他们使用 DNN-HMM Hybrid 训练出来的模型结果已经可以与人类的能力相媲美,具体体现在人类的识别错误率和机器的识别错误率相当,而且人类识别错误率的计算是微软专门找专业听写人员进行测量的。

  • 2017年,IBM 公司用同样的方法再次减少了识别的错误率,不过,这一次人类识别率又降低了一些(找的人更厉害)。事实上,语音识别的公认错误率指标大概在5%左右,就已经很强了。专业听写人员就在这个水平。因为正确答案也是人标注的,也存在5%左右的错误率。模型能达到5%算是极限了。很难再往上提升了。

  • 实际生产中,因为要考虑到推断速度,端对端的深度学习模型并不多,除了谷歌的手机助理。大部分采用的都是混合模型。

  • 那么如何提高正确率呢?大家都用的混合模型,能做的事情就是不断加深 DNN 的深度。比如在微软公开的资料中,他们训练了一个49层的残差神经网络。输出有9000个状态类别,输出是一个向量,用的是Softmax作归一化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1269718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决uview中uni-popup弹出层不能设置高度问题

开发场景:点击条件筛选按钮,在弹出的popup框中让用户选择条件进行筛选 但是在iphone12/13pro展示是正常,但是切换至其他手机型号就填充满了整个屏幕,需要给这个弹窗设置一个固定的高度 iphone12/13pro与其他型号手机对比 一开始…

关于使用若依,并不会自动分页的解决方式

关于使用若依,并不会自动分页的解决方式 如果只是单纯的使用一次查询list,并不会触发这个bug 例如: 但是我们如果对里面的数据进行调整修改的话就会触发这个bug 例如: 此时可以看到我对数据进行了转换!!!,这时如果超出数据10条,实际我们拿到的永远是10条,具体原因这里就不展…

ora.LISTENER.lsnr状态为Not All Endpoints Registered

客户的监控反馈有个监听无法连接,登录环境检查发现ora.LISTENER.lsnr的状态为Not All Endpoints Registered,如下 [rootdb2 ~]# crsctl status res -t -------------------------------------------------------------------------------- NAME …

什么是requestIdleCallback?和requestAnimationFrame有什么区别?

什么是requestIdleCallback? 我们都知道React 16实现了新的调度策略(Fiber), 新的调度策略提到的异步、可中断,其实就是基于浏览器的 requestIdleCallback和requestAnimationFrame两个API。 在 JavaScript 中,requestIdleCallback 是一个用于执行回调函…

Go 谈论了解Go语言

一、引言 Go的历史回顾 Go语言(通常被称为Go或Golang)由Robert Griesemer、Rob Pike和Ken Thompson在2007年开始设计,并于2009年正式公开发布。这三位设计者都曾在贝尔实验室工作,拥有丰富的编程语言和操作系统研究经验。Go的诞生…

数据结构day6作业

初次进入len100;if(resuillen)不符合条件,执行resultcompetu_date(arr,--len),从此处开始递归. 直到len0: 此时len0; ---result0; ---return arr[0]1; 上一层len1; ---result1---执行语句return (result%2)?(result arr[len]):((result 1)*arr[len]);得到return 1arr[1]3 …

visionOS空间计算实战开发教程Day 10 照片墙

本例选择了《天空之城》的25张照片,组成5x5的照片墙)。首先我们在setupContentEntity方法中构建了一个纹理数组,将这25张照片添加到数组images中。其中封装了setup方法,借助于visionOS对沉浸式空间的支持,我们创建了三…

解决:ModuleNotFoundError: No module named ‘qt_material‘

解决:ModuleNotFoundError: No module named ‘qt_material’ 文章目录 解决:ModuleNotFoundError: No module named qt_material背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时,报错&…

基于asp.net 消防安全宣传网站设计与实现

目 录 1 绪论 1 1.1课题背景 1 1.2 目的和意义 1 1.3主要研究内容 1 1.4 组织结构 2 2 可行性分析 3 2.1技术可行性 3 2.2经济可行性 3 2.3操作可行性 3 2.4系统开发环境 4 3 需求分析 7 3.1性能分析 7 3.2业务流程分析 7 3.3数据流程分析 9 4 系统设计 11 4.1系统…

drawio 流程图以图片保存

随笔记录 目录 1. drawio 介绍 2. 绘制流程图以白底图片保存 2.1 流程图原始图​编辑 2.2 修改配置 2.3 流程图以图片保存 2.4 图片保存后效果展示 1. drawio 介绍 是一款非常强大的开源在线的流程图编辑器,支持绘制各种形式的图表,提供了 Web…

Leetcode2336 无限集中的最小数字

题目: 现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, ...] 。 实现 SmallestInfiniteSet 类: SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。int popSmallest() 移除 并返回该无限集中的最小整数。void addBack(int nu…

[node]Node.js事件

[node]Node.js事件 EventEmitter属性方法error 事件 实例应用简单实例onceremoveListenerlistenerCounterror 事件完整实例 继承 事件循环事件驱动程序 Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列 Node.js 里面的许多对象都会分发事件:一个 n…

从0开始学习JavaScript--JavaScript 单例模式

单例模式是一种常见的设计模式,它保证一个类仅有一个实例,并提供一个全局访问点。在 JavaScript 中,单例模式通常用于创建唯一的对象,以确保全局只有一个实例。本文将深入探讨单例模式的基本概念、实现方式,以及在实际…

linux 磁盘扩容初始化挂载 笔记

目录 说明环境信息前提条件 操作步骤 说明 linux 系统磁盘扩容步骤 环境信息 系统信息:Linux version 4.19.90-23.8.v2101.ky10.aarch64cpu信息:Kunpeng-920 、aarch64、64-bit、HiSilicon 前提条件 有未初始化的用户磁盘操作系统可以支持当前磁盘的…

【Spring系列】DeferredResult异步处理

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

VC++调试QT源码

环境:vs2017 qt 5.14.2 1:首先我们需要选择我们的源码路径 右键解决方案-》属性-》通用属性-》调试源文件-》在窗口内添加QT下载时的源码**.src文件夹**,这里最好把源码 D:\software\QT\path\5.14.2\Src 源文件里面的Src文件做一个备份出来…

从意义中恢复,而不是从数据包中恢复

从书报,录放机,电视机到智能手机,vr 眼镜,所有学习的,娱乐的工具或玩具,几乎都以光声诉诸视听,一块屏幕和一个喇叭。 视觉和听觉对任何动物都是收发信息的核心,诉诸视觉和听觉的光和…

达梦数据库使用

达梦数据库使用 📑前言 本文主要是【达梦数据库】——达梦数据库简单使用的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他…

运维知识点-openResty

openResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——实现广告缓存测试企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——OpenResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRes…