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

参考文献:

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.mfbz.cn/a/202794.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB中imbothat函数用法

目录 语法 说明 示例 使用底帽和顶帽滤波增强对比度 imbothat函数的功能是对图像进行底帽滤波。 语法 J imbothat(I,SE) J imbothat(I,nhood) 说明 J imbothat(I,SE) 使用结构元素 SE 对灰度或二值图像 I 执行形态学底帽滤波。底帽滤波计算图像的形态学闭运算&#…

从零开始,轻松打造个人化Chrome浏览器插件

说在前面 在我日常开发以及娱乐生活中,浏览器是我使用频率较高的一个应用,当我大学拥有第一部电脑开始,之后不论电脑换成什么,以及使用的是什么系统,我的首选浏览器都是Chrome,不仅仅是因为其速度快&#x…

Redis中的缓存穿透、雪崩、击穿(详细)

目录 一、概念 1. 缓存穿透(Cache Penetration) 解决方案: 2. 缓存雪崩(Cache Avalanche) 解决方案: 3. 缓存击穿(Cache Breakdown) 解决方案: 二、三者出现的根本原…

dbeaver连接amabri-hbase

目录 尝试过程 解决之道 总结 尝试过程 注意此章节为记录试错过程,无需跟随操作,仅作试错记录。真正操作方法请看“解决之道”章节 环境ambari安装的hbase2.1.6 使用apche phoenix默认驱动配置 备注:Apache Phoenix 是一个开源的、基于…

Amazon CodeWhisperer 使用体验

文章作者:STRIVE Amazon CodeWhisperer 是最新的代码生成工具,支持多种编程语言,如 java,js,Python 等,能减少开发人员手敲代码时间,提升工作效率。PS:本人是一名 CodeWhisperer 业余爱好者 亚马逊云科技开发者社区为开…

文件中找TopK问题

目录 1.解题思路2.创建一个文件并在文件中写入数据3.为什么要建立小堆而不建立大堆?4.如何在现有的数据中建立适合的大堆?5.代码实现 1.解题思路 TopK问题即是在众多数据中找出前K大的值,则可以根据堆的性质来实现,但在使用堆之前…

R语言gWQS包在加权分位数和回归模型的应用

在流行病学研究中,相较于单一因素的暴露,多因素同时暴露的情况更为常见。传统模型在评价多因素联合暴露时存在数据维度高、多重共线性等问题. WQS 回归模型的基本原理是通过分位数间距及加权的方法,将多种研究因素的效应综合成为一个指数&…

华为云cce负载配置时间同步

华为云cce将负载配置好之后,发现里面的时间与真实时间不同步,差了12小时,怎么办? 这时候就需要配置时间同步了。 华为云cce里面通过配置数据存储的路径来解决这个问题的,配置后,需要重启负载。 新建负载…

python实验3 石头剪刀布游戏

实验3:石头剪刀布游戏 一、实验目的二、知识要点图三、实验1. 石头剪刀布2. 实现大侠个人信息 一、实验目的 了解3类基本组合数据类型。理解列表概念并掌握Python中列表的使用。理解字典概念并掌握Python中字典的使用。运用jieba库进行中文分词并进行文本词频统计。…

JSON.stringify方法详解 后端接受JSON数据格式

1、方法定义:JSON.stringify(value, replacer, space) 参数说明: value:js对象 replacer:替换对象,可以是一个方法、对象或数组,将value按照替换规则展示。 space:填充参数,可以是数…

Protocol handler start failed

背景 上一次启动项目还好好的,关闭项目重新打开时,报错了! 报错提示 英文:Protocol handler start failed 翻译:协议处理程序启动失败 原因 端口被其他程用了,导致端口冲突。 解决方案 打开任务管理…

深入理解Java中的String、StringBuilder和StringBuffer(每天一个技术点,第一天)

大家好,我是你们的博主每天一个技术点。今天,我们将探讨Java中的一个重要主题:String、StringBuilder和StringBuffer。这些类在Java编程中无处不在,但它们之间的区别和用法可能并不是所有人都清楚。所以,让我们深入了解…

10分钟的时间,带你彻底搞懂JavaScript数据类型转换

前言 📫 大家好,我是南木元元,热衷分享有趣实用的文章,希望大家多多支持,一起进步! 🍅 个人主页:南木元元 目录 JS数据类型 3种转换类型 ToBoolean ToString ToNumber 对象转原…

Flutter加固原理及加密处理

​ 引言 为了保护Flutter应用免受潜在的漏洞和攻击威胁,加固是必不可少的措施之一。Flutter加固原理主要包括代码混淆、数据加密、安全存储、反调试与反分析、动态加载和安全通信等多个方面。通过综合运用这些措施,可以提高Flutter应用的安全性&#xf…

【UE】热成像效果

效果 步骤 1. 新建一个空白项目,勾选“光线追踪”选项 2. 添加一个第一人称游戏内容包到项目 3. 打开第一人称角色蓝图“BP_FirstPersonCharacter”,添加一个后期处理组件 在事件图表中设置通过按键N来切换不同的后期处理效果 将后期处理设置引脚提升为…

golang—kafka架构原理快速入门以及自测环境搭建(docker单节点部署)

kafka Apache Kafka 是一个分布式的流处理平台。它具有以下特点: 支持消息的发布和订阅,类似于 RabbtMQ、ActiveMQ 等消息队列支持数据实时处理能保证消息的可靠性投递支持消息的持久化存储,并通过多副本分布式的存储方案来保证消息的容错高…

SaaS模式C/S检验科LIS系统源码

适用于医院检验科实际需要的管理系统, 实现检验业务全流程的计算机管理。从检验申请、标本编号、联机采集、中文报告单的生成与打印、质控图的绘制和数据的检索与备份。通过将所有仪器自身提供的端口与科室LIS系统中的工作站点连接,实现与医院HIS系统的对接。 通过门诊医生和住…

TEMU和SHEIN平台的卖家了解测评吗?

最近越来越多的商家都入驻了temu和shein平台,为了让自己的产品能更具有优势,就会用到测评来做一些产品销量和评论,那么测评应该怎么做呢? 测评就是卖家通过测评平台,社区,红人等等这些联系国外的买家&…

el-select多选框,数据拼接

将多选框数据 按照逗号拼接为字符串 getTagIds(data, type) {if (type "array") {let array data.join(",")return array} else {let string data.split(",");return string}}, 在调用这个方法时需要,另外传一个字符串type,以此来…

面试篇之微服务(一)

目录 概览 1.什么是微服务? 2.微服务带来了哪些挑战? 3.现在有哪些流行的微服务解决方案? 这三种方案有什么区别吗? 4.说下微服务有哪些组件? 注册中心 5.注册中心是用来干什么的? 6.SpringCloud可…
最新文章