【NLP】语音识别 — GMM, HMM
一、说明
在语音识别的深度学习(DL)时代之前,HMM和GMM是语音识别的两项必学技术。现在,有将HMM与深度学习相结合的混合系统,并且有些系统是免费的HMM。我们现在有更多的设计选择。然而,对于许多生成模型来说,HMM仍然很重要。但无论状态如何,语音识别都有助于我们更好地理解HMM和GMM在ML环境中的应用。所以停止长脸,让我们有时花在上面。
二、自动语音识别 (ASR)
让我们先了解一下高级概述。下图是语音识别的高级体系结构,它将HMM(隐马尔可夫模型)与语音识别联系起来。

从音频剪辑开始,我们滑动宽度为 25 毫秒、间隔 10 毫秒的窗口以提取 MFCC 特征。对于每个窗口框架,将提取 39 个 MFCC 参数。语音识别的主要目标是构建一个统计模型,从特征向量 X 序列推断文本序列 W(例如“猫坐在垫子上”)。
一种方法查找所有可能的单词序列(最大长度有限),并找到与输入声学特征最匹配的单词序列。

该模型依赖于构建语言模型 P(W)、发音词典模型和声学模型 P(X|W)(生成模型),如下所示。

从源代码修改
发音模型可以使用表格将单词转换为音素,或者语料库已经使用音素转录。声学模型是关于在给定一系列电话而不是单词的情况下对一系列特征向量进行建模。但我们将继续使用符号 p(X|W) 作为声学模型。只是要注意。
语言模型是关于单词序列的可能性。例如,“我看电影”比“我看电影”或“我看苹果”的可能性更大。它根据前面的单词预测下一个单词。如果我们用一阶马尔可夫链近似它,下一个单词将仅取决于当前单词。我们可以通过计算语料库中单词对的出现来估计它。

通过结合声学模型和语言模型,我们搜索具有最大可能性的文本序列。

这种方法听起来很间接,搜索看起来效率低下或不可能。但是p(X|W)在语音识别中建模要容易得多。可以使用高斯混合模型 (GMM) 对电话的特征分布进行建模。我们将通过训练数据来学习它。手机和相应可观测值之间的转换可以使用隐马尔可夫模型 (HMM) 进行建模。因此,如果我们能找到一种有效搜索电话序列的最佳方法,这听起来可能还不错。
HMM 模型由隐藏变量和可观察量组成。下面的顶部节点表示电话,底部节点表示相应的可观察量(音频功能)。水平箭头演示了电话序列中真实标签“她只是......”的过渡。

在语音识别中,可观察量可以用从相应的音频帧中提取的39个MFCC特征来表示。好消息是,使用此HMM模型,我们不需要逐个搜索电话序列。否则,复杂性会随着电话数量的增加呈指数级增长。使用维特比算法或其他HMM方法,我们可以在多项式时间内找到最佳序列。我们稍后会回到这个问题。
下图是自动语音识别 (ASR) 的可能实现。结合有关词典,声学模型和语言模型的信息,我们可以使用Viterbi解码器找到最佳的电话序列。

从源代码修改(O在这里与X相同)
让我们快速回顾一下,我们可以用HMM对声学模型P(X|W)进行建模。HMM 模型上的箭头将表示电话转换或指向可观察量的链接。为了对我们观察到的音频特征进行建模,我们从训练数据中学习GMM模型。因此,让我们先在一般背景下更多地了解HMM和GMM。
三、隐马尔可夫模型
马尔可夫链包含系统的所有可能状态以及从一个状态过渡到另一个状态的概率。

一阶马尔可夫链假设下一个状态仅取决于当前状态。为简单起见,我们通常将其称为马尔可夫链。

这个模型将更容易处理。然而,在许多 ML 系统中,并非所有状态都是可观察的,我们称这些状态为隐藏状态或内部状态。有些人可能会将它们视为输入的潜在因素。例如,要知道我是快乐还是悲伤可能并不容易。我的内部状态将是 {H 或 S}。但是我们可以从观察中得到一些提示。例如,当我高兴时,我有0.2的机会看电影,但当我悲伤时,这个机会上升到0.4。在给定内部状态的情况下观察可观测物的概率称为发射概率。从一个内部状态过渡到另一个内部状态的概率称为转移概率。

对于语音识别,可观察量是每个音频帧中的内容。我们可以使用 MFCC 参数来表示它。让我们看看我们可以用 HMM 做什么。
前向算法的可能性
HMM 由跃迁和发射概率建模。
给定学习了HMM模型,我们可以使用前向算法来计算观察的可能性。我们的目标是总结所有可能状态序列的观测概率:

但我们必须聪明地做到这一点。我们不能一次对所有可能的状态序列求和。它具有指数级的复杂性。
我们的策略将采用分而治之的方法。如果我们可以递归地表达计算,我们就可以将问题分解为中间步骤。在 HMM 中,我们使用时间 t-1 和/或 t+1 的结果来解决时间 t 的问题。下面的圆圈代表时间 t 时的 HMM 隐藏状态 j。因此,即使状态序列的数量随时间呈指数增长,如果我们能够随时间递归地表达计算,我们也可以线性求解它。

这是打破指数诅咒的动态编程的思想。在时间 t 处,截至时间 t 的观测概率为:

让我们将红色下划线的项重命名为t(j)(前向概率α并检查我们是否可以递归表示它。由于当前观测值仅取决于当前状态,因此α可以表示为:

所以它确实有一个递归关系。以下是使用递归计算给定模型 λ 的观测值可能性的步骤。我们不是单独对每个状态序列求和,而是计算从时间步长 1 到结束(时间 T)的α。如果有 k 个内部状态,则复杂度将仅为 O(k²T),而不是指数。

下面是一个示例,我们从左侧的初始状态分布开始。然后我们将α的值向右传播。我们计算每个状态的α,并为每个时间步重复此操作。

接下来,给定HMM模型,我们如何找到给定观察序列的内部状态。此过程称为解码。这对于语音识别尤其有趣。如果我们有一个音频剪辑,则内部状态代表电话。语音识别可以被视为在给定音频剪辑的情况下找到这些内部状态。
解码(查找内部状态 — 维特比算法)
同样,我们希望递归地表达我们的组件。给定时间 t 处的状态为 j,vt(j) 是观测序列与最优状态序列的联合概率。

因此,不仅可以完成,方程类似于前向算法,只是求和被最大函数替换。维特比算法不是在前向算法中对所有可能的状态序列求和,而是采用最可能的路径。

从源代码修改
查找最大化观测值可能性的内部状态类似于似然法。我们只是用最大函数替换求和。

在这个算法中,我们还记录了在时间t(上面的红色箭头)通向每个节点的最大路径,即我们回溯每个节点的最佳路径。例如,我们从 t=1 的快乐状态 H 过渡到 t=2 的快乐状态 H。

源
学习(鲍姆-韦尔奇算法/前向-后向算法)
现在,它涉及到困难的部分。我们如何学习HMM模型?这可以通过Baum-Welch算法(前向-后向算法)来完成,以学习跃迁和发射概率。这项任务听起来不可能完成,因为在我们的计算中,这两种概率都非常纠结。但从某种角度来看,如果我们知道状态占用概率(时间t的状态分布),我们就可以推导出发射概率和转移概率。如果我们知道这两个概率,我们可以推导出时间 t 的状态分布。这就是我们在EM算法中讨论的先有鸡还是先有蛋的问题。EM算法在迭代步骤中解决了这个问题。在每一步中,我们优化一个潜在变量,同时修复其他潜在变量。想象一下,每个迭代步骤都会改进解决方案。即使对于连续空间,我们的工作精度也有限,因此,需要探索和改进的是有限的状态。因此,如果我们保持迭代,解决方案将收敛。

因此,鲍姆-韦尔奇算法是EM算法的特例也就不足为奇了。
让我们熟悉以下新符号。

我们已经熟悉前向算法中的α(前向概率)。β(后向概率)是它在相反方向上的近亲(在给定时间 t 的状态 i 的情况下看到所有即将到来的观测值的概率)。我们可以递归地表达它,类似于α但方向相反(又名向后算法)。

要学习HMM模型,我们需要知道我们是什么状态才能最好地解释观察结果。这将是状态占领概率γ — 给定所有观测值的时间 t 的状态 i 的概率。
给定固定的HMM模型参数,我们可以应用前向和后向算法来计算观测值的α和β。γ可以通过简单地将α乘以β来计算,然后重新规范化它。

ξ 是在给定所有观测值的时间 t 之后从状态 i 过渡到 j 的概率。它可以通过类似α和β来计算。

直观地说,使用固定的HMM模型,我们使用给定的观测值细化状态占用概率(γ)和转移(ξ)。

鸡和蛋的部分来了。一旦细化了γ和ξ(θ₂)的分布,我们就可以对最佳跃迁和发射概率(θ₁:a,b)进行点估计。

我们修复一组参数以改进其他参数,并继续迭代,直到解决方案收敛。

EM 算法通常定义为:

在这里,E步建立了p(γ,ξ | x,a,b)。然后,M步长找到a,b,大致最大化下面的目标。

以下是该算法的回顾:

因此,给定训练数据中的所有观察结果,Baum-Welch 算法可以学习 HMM 模型。但是,请记住保持开放的心态。在语音识别中,问题要复杂得多,许多解决方案有时无法很好地扩展。
四、声学模型

从源代码修改
在 ASR 中,我们可以使用发音表为文本序列 Y 生成电话。接下来,我们需要为这些手机创建一个声学模型。
几十年来,人们对语音学的研究已经完成。专家可以通过直接读取频谱图来识别元音和辅音。

源
但是同样,我们需要一个更密集的声学模型表示,这样我们就可以确定给定手机P(X|phone)的音频特征向量X的可能性。
使用 MFCC,我们从音频帧中提取 39 个特征。让我们简化图片,并假设每帧只有一个特征。对于状态“sh”(电话),可以使用正态分布对此功能的值进行建模。

要将概念扩展到 39 个特征,我们只需要一个包含 39 个变量的多元正态分布。下图可视化了两个变量的二元正态分布。
以下是多元正态分布的定义。

其中 Σ 是测量变量之间相关性的协方差矩阵。MFCC 参数具有很好的属性。有相对独立的。因此,Σ的非对角线元素可以简单地设置为零。
但是,多维度思考太难了。因此,我们将坚持使用一维示例进行说明。观测特征 x 的似然 p(x| q) 将计算为它与正态分布 q 的峰值有多远:

给定不同的手机,我们可以计算相应的概率密度值,并将其归类为具有最高值的手机。为了学习这种高斯分布,我们可以简单地从训练数据点xi进行估计。

这些方程可以通过最大化训练数据的可能性来证明。

源
所以这个高斯模型很容易从训练数据中学习,并为我们提供了一个很好的P(x|μ,σ²)。在语音识别的背景下,我们可以学习每部手机的高斯模型(μ,σ²)。这用作可能性概率。这也充当HMM中的发射概率。
不幸的是,即使我们使用多元高斯分布,这个概念也是幼稚的。如果这是真的,学习外语口语会简单得多。这种可能性比单个峰值钟形曲线更复杂。为了解决这个问题,我们切换到高斯混合模型(GMM)。这允许分布是多模态的,即我们允许一个特征有几个可能的值。这提供了语音变体的灵活性。
例如,右侧的GMM将三个具有不同权重的高斯分布组合在一起,形成一个新的概率密度(3分量GMM)。该模型仍然非常密集,6 个高斯参数加上 3 个权重。
直观地,可以在m模式之一附近观察到特定手机的特征值。但某些值可能比其他值更有可能。因此,我们引入权重来指示哪些更有可能。当内部 HMM 状态为 j 时,观察到的特征向量的可能性为:

为了学习 GMM,例如对于 2 分量 GMM,我们馈送从训练数据中提取的特征以拟合这两个集群的参数。从概念上讲,我们从这些参数的初始或随机猜测开始。我们找到每个数据样本应属于哪个集群。然后我们根据关联的数据点重新计算聚类参数。

是的,我们将使用 EM 算法迭代解决方案,直到它收敛。在EM中,我们使用软赋值而不是硬赋值。对于硬分配,我们分配每个数据样本所属的特定集群(点估计)。在软赋值中,它将是一个概率分布。因此,样本有可能属于集群。然后,我们根据此软分配重新计算集群参数。由于我们已经多次介绍过这一点,因此我们不会详细说明如何进一步训练它。
回顾一下,给定一部手机,我们可以使用 GMM 学习可观察量的特征向量。这种概率分布允许我们计算给定电话 P(x|s) 的语音片段的可能性——这也是给定 HMM 内部状态的发射概率。
五、矢量量化
在整个过程中,我们尝试对声学信号的更密集表示进行建模。GMM是一种流行的方法。或者,在我们从语料库中提取一组训练的特征向量后,我们将这些特征分组到 k 个聚类中,比如使用 k 均值聚类。这将创建一个大小为 k 的代码本来编码音频帧。

k=3 表示二维数据
有了这个索引,我们可以开始使用它来训练 HMM。训练模型后,我们也可以使用它来解码音频剪辑。这种方法称为矢量量化,并用于早期研究。但与GMM相比,它不太受欢迎。因此,我们只是希望您意识到这一点。
六、反思
GMM 对给定手机的特征向量的观测概率分布进行建模。它提供了一种原则性方法来测量手机和我们观察到的音频帧之间的“距离”。
另一方面,HMM产生了一个关于状态如何过境和观察的原则模型。由于观测值的概率可以用HMM建模为:

方程源
其中 h 是隐藏状态(电话)。给定手机功能的可能性可以使用GMM建模。

相关文章:
【NLP】语音识别 — GMM, HMM
一、说明 在语音识别的深度学习(DL)时代之前,HMM和GMM是语音识别的两项必学技术。现在,有将HMM与深度学习相结合的混合系统,并且有些系统是免费的HMM。我们现在有更多的设计选择。然而,对于许多生成模型来说…...
中间件面试题
Redis相关面试题 此题是xx位面试题 (1)Redis Cluster,在一个请求过来的时候,数据分布在哪个节点, 使用的是有哪些算法? redis cluster 用不同的算法,就决定了数据如何分布到这些节点上去。 hash算法一致性hash算法hash slot算法(2)Redis为什么是高性能的? 基于内存…...
PHP使用Redis实战实录2:Redis扩展方法和PHP连接Redis的多种方案
PHP使用Redis实战实录系列 PHP使用Redis实战实录1:宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案PHP使用Redis实战实录2:Redis扩展方法和PHP连接Redis的多种方案 Redis扩展方法和PHP连接Redis的多种方案 一、Redis扩展方法二、php操作Redis语…...
【Docker】Docker应用部署之Docker容器安装Redis
目录 一、搜索Redis镜像 二、拉取Redis镜像 三、创建容器 四、测试使用 一、搜索Redis镜像 docker search redis 二、拉取Redis镜像 docker pull redis:版本号 # 拉取对应版本的redis镜像 eg: docker pull redis:5.0 三、创建容器 docker run -id --nameredis -p 6379:637…...
【C++】STL——list的介绍和使用、list增删查改函数的介绍和使用、push_back、pop_back
文章目录 1.list的使用2.list的增删查改函数(1)push_front 在list首元素前插入值为val的元素(2)pop_front 删除list中第一个元素(3)push_back 在list尾部插入值为val的元素(4)pop_ba…...
“RWEQ+”集成技术在土壤风蚀模拟与风蚀模数估算、变化归因分析中的实践
土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一,土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的首要过程。中国风蚀荒漠化面积达160.74104km2,占国土总面积的16.7%,严重影响这些地区的资源开发和社会经…...
ChatGPT在智能推送和个性化广告中的应用如何?
ChatGPT在智能推送和个性化广告领域具有广泛的应用潜力。智能推送和个性化广告是指根据用户的个性化需求和兴趣,精准地向用户推送相关的信息和广告内容。ChatGPT作为一种预训练的通用语言模型,具有强大的语言理解和生成能力,可以在智能推送和…...
科技的成就(四十八)
373、新的编程语言 Swift 2014 年 6 月 2 日,苹果在 WWDC 上发布了新的编程语言 Swift。Swift 由克里斯拉特纳在苹果内部主持开发,历时 4 年。它是一种支持多编程范式的可编译语言,其设计简单、高效、安全,用来开发 macOS/OS X、i…...
spring5高级49讲
文章目录 1、BeanFactory与ApplicationContext2、BeanFactory与ApplicationContext的容器实现BeanFactory的容器实现后处理器排序 ApplicationContext的容器实现 3、Bean的生命周期Bean后处理器 4、常见的Bean后处理器5、常见BeanFactory后处理器6、Aware和InitializingBean接口…...
MacOS本地安装Hadoop3
金翅大鹏盖世英,展翅金鹏盖世雄。 穿云燕子锡今鸽,踏雪无痕花云平。 ---------------- 本文密钥:338 ----------------- 本文描述了在macbook pro的macos上安装hadoop3的过程,也可以作为在任何类linux平台上安装hadoop3借鉴。 …...
十五章:使用类别峰值响应的弱监督实例分割
0.摘要 目前,使用图像级别标签而不是昂贵的像素级掩码进行弱监督实例分割的研究还未得到充分探索。本文通过利用类别峰值响应来实现一个分类网络,用于提取实例掩码,来解决这个具有挑战性的问题。只通过图像标签的监督下,完全卷积的…...
自然语言处理从入门到应用——LangChain:模型(Models)-[聊天模型(Chat Models):基础知识]
分类目录:《自然语言处理从入门到应用》总目录 聊天模型是语言模型的一种变体。虽然聊天模型在内部使用语言模型,但它们公开的接口略有不同。它们不是提供一个“输入文本,输出文本”的API,而是提供一个以“聊天消息”作为输入和输…...
Asp.Net 使用Log4Net (SQL Server)
Asp.Net 使用Log4Net (SQL Server) 1. 创建数据库表 首先,在你的SQL Server数据库中创建一个用于存储日志的表。以下是一个简单的表结构示例: CREATE TABLE [dbo].[Logs]([Id] [INT] IDENTITY(1,1) PRIMARY KEY,[Date] [DATETIME] NOT NULL,[Thread] …...
Vue2基础五、工程化开发
零、文章目录 Vue2基础五、工程化开发 1、工程化开发和脚手架 (1)开发 Vue 的两种方式 核心包传统开发模式:基于 html / css / js 文件,直接引入核心包,开发 Vue。工程化开发模式:基于构建工具…...
发现 ModStartCMS:构建梦想网站的全新选择
亲爱的网站开发者和内容创作者们, 在当今数字化的时代,网站已经成为展示品牌、传递信息和吸引目标受众的关键渠道。为了帮助您更高效地打造梦想中的网站,我们荣幸地向您介绍 ModStartCMS,这是一款基于 Laravel 的全新模块化内容管…...
大数据Flink(五十二):Flink中的批和流以及性能比较
文章目录 Flink中的批和流以及性能比较 一、Flink中的批和流...
【MySQL】MySQL索引、事务、用户管理
20岁的男生穷困潦倒,20岁的女生风华正茂,没有人会一直风华正茂,也没有人会一直穷困潦倒… 文章目录 一、MySQL索引特性(重点)1.磁盘、OS、MySQL,在进行数据IO时三者的关系2.索引的理解3.聚簇索引࿰…...
函数重载与引用
文章目录 一、函数重载1. 重载规则2.重载列子3.函数名修饰规则 二、引用1.本质2.特性1. 引用必须在定义时初始化2 . 一个变量可以有多个引用3 . 引用一旦引用一个实体,就不能引用其他实体 3.引用例子4.引用的权限5.效率比较6.指针跟引用的区别 一、函数重载 函数重…...
如何快速模拟一个后端 API
第一步:创建一个文件夹,用来存储你的数据 数据: {"todos": [{ "id": 1, "text": "学习html44", "done": false },{ "id": 2, "text": "学习css", "…...
DLA :pytorch添加算子
pytorch的C extension写法 这部分主要介绍如何在pytorch中添加自定义的算子,需要以下cuda基础。就总体的逻辑来说正向传播需要输入数据,反向传播需要输入数据和上一层的梯度,然后分别实现这两个kernel,将这两个kernerl绑定到pytorch即可。 a…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
