RNN-T Training,RNN-T模型训练详解——语音信号处理学习(三)(选修三)

参考文献:

Speech Recognition (option) - RNN-T Training哔哩哔哩bilibili

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

本次省略所有引用论文

目录

一、如何将 Alignment 概率加和

对齐方式概率如何计算

概率加和计算原理

概率加和计算方式

二、RNN-T 的模型训练

模型训练思路

偏微分计算-1-展开变形

偏微分计算-2-第一个偏微分求解

偏微分计算-3-第二个偏微分求解

三、RNN-T 的模型测试(推理/解码)

目标函数的近似

实际操作

四、总结——LAS、CTC、RNN-T 模型比较


 

一、如何将 Alignment 概率加和

对齐方式概率如何计算
  • 想要知道如何将所有的对齐方式的概率相加,我们就需要知道一条对齐方式的概率是怎么计算的。由于 HMM、CTC 和 RNN-T 的概率计算方式在本质上是一样的,因此我们下面的实验与计算全都基于 RNN-T。

  • 我们将一个 alignment 通过状态图的方式表现出,实际上,需要计算这个 alignment 的概率,只需要将所有位置的概率进行连乘就行。比如h = ∅c∅∅a∅t∅∅。P(h|X) 就等于每个位置的发射概率和转移概率的连乘,也就是第一次输出 ∅ 的概率,乘以给定 ∅,输出 c 的概率,乘以给定 ∅c,输出 ∅ 的概率……

  • 我们将整个过程落实到实际操作当中去看看。首先,我们需要回顾 RNN-T 的架构。RNN-T 的一大神奇之处在于,它单独训练了一个 RNN,将已输出的 token 当作输入,去影响 RNN-T 接下来的输出。

  • 我们使用 h 表示经过 encoder 的声学特征向量,图中上半部分蓝色的方块表示单独训练的 RNN。在起始阶段,没有产生任何的 token,我们就输入一个 <BOS (Begin of Sentence)>,让它产生 l0。我们把编码产生的h1,与l0一起输入给解码器,让它产生一个概率 p_{1,0}。这里的下标表示的意思为:输入第一个声学特征向量(1),没产生任何 token 时(0),RNN-T 产生出的概率分布。

  • 那么 ∅ 落在句首的概率就可以计算了,也就是从 p_{1,0} 中采样出 ∅ 的概率。

  • 接下来我们需要计算有了 ∅ 以后产生 c 的概率。值得一提的是,刚刚产生的 ∅ 对我们的 RNN 并没有什么影响。因为 RNN 只吃产生的 token。不过,产生的 ∅ 会对 Encoder 产生影响,这代表当前的隐藏层向量已经被读完了,没啥价值了,需要切换下一个向量。

  • 因此在下一步计算过程中,我们将 h2 和之前的 l0 一起输入编码器,输出得到概率 p_{2,0}。那么产生 c 的概率也就好算了,就是从概率分布 p_{2,0} 中采样得到 c 的概率。

  • 接下来该计算有 ∅c 后产生 ∅ 的概率。由于我们刚刚输出了 token c,RNN 就会受到影响,输入 token c 以后产生 l1,而 Encoder 不变,因为它没有看到 ∅,所以不需要更换向量。因此我们最终将 l1 和 h2 丢给解码器,得到新的概率分布 p_{2,1},从中我们可以得到我们需要的概率。

  • 按照上面的过程,我们一直反复下去,最终我们就可以算出所有需要的概率,我们将所有的概率相乘,就是我们最终想得到的这一个 alignment 的概率。

概率加和计算原理
  • 那么我们是怎么计算所有对齐方式的概率加和的呢?这就要归功于我们刚刚所说的 RNN-T 的神奇之处:使用单独的 RNN 来表示 token 之间的关系,而忽略 ∅ 的影响。这在后续的训练中大有帮助。

  • 我们看下图,实际上下图中的每一个格子都可以对应到一个概率分布,由于刚刚定义的概率分布的下标分别表示读到的声学特征向量以及已输出的token数量,那么格子对应的概率分布就显而易见。比如图中给出了 p_{4,2} 的概率分布的格子,这就表示我们已经读到 x4,并且前边已经输出了两个 token ca。

  • 而对于 p_{4,2},需要计算之后产生 ∅ 或者 t 的概率都可以从中得到。

  • 神奇之处在于,每一个格子代表的概率分布实际上都是固定的,它们不会受到如何走到当前格子的走法的影响,因为就其输入来说,无论怎么走,输入的都是 h4 和 l2。

概率加和计算方式
  • HMM 采用的是 forward 和 backward 算法来计算所有对齐方式的概率分数。而实际上,RNN-T 和 HMM 所用的方法也是一模一样的。

  • 我们新定义一个变量 α_{i,j},其表示已经读取了 i 个的声学特征向量,输出 j 个 token 的所有对齐方式的概率分数之和。比如 α_{4,2},就是由读取 4 个声学特征向量,输出 2 个 token 的所有 Alignment 的分数相加之和。

  • 那么 α_{4,2} 有没有方法计算呢?有。我们可以通过 α_{4,1} 和 α_{3,2} 进行计算。事实上,在变成 α_{4,2} 之前,有两种可能,一种是读了 4 个声学特征向量,输出一个 token 了,准备输出下一个;还有一种可能是已经读了 3 个声学特征向量,产生了两个 token,准备读取下一个声学特征向量(产生 ∅ )。假设我们的 α_{4,1} 和 α_{3,2} 已经计算出来了,则结合之前定义的 p_{i, j},我们可以有:


    \alpha_{4,2} = \alpha_{4,1}p_{4,1}(a) + \alpha_{3,2}p_{3,2}(\varnothing)
     

  • 也就是 α_{4,1} 代表的所有 alignment 乘上之后产生 token a 的概率,加上 α_{3,2} 代表的所有 alignment 乘上之后产生 ∅ 的概率。

  • 根据上面的式子,我们就可以得到一个基于动态规划的递推式,这样就能从左上角开始,一直算出最后一个格子的分数总和了。

二、RNN-T 的模型训练

我们刚刚讲述了如何去穷举所有的对齐方式进行概率总分计算,不过这一切都需要基于我们已经有了训练好的 RNN-T 的基础上。所以本节我们来了解一下如何训练 RNN-T。

模型训练思路
  • 首先我们要明确我们的训练目标。假设 Y_hat 是我们的 Ground Truth,也就是正确的识别文本,那么也就是说我们希望学习到一组参数 θ,使得 Y_hat 的概率越大越好:


    \theta^* = \arg\max_\theta \log P_\theta(\widehat{Y}|X)
     

  • 那么我们如何 optimize 这个函数呢?当然是使用梯度下降法进行。所以我们下一个要解决的问题就是如何求取函数对参数求偏微分。


    \frac{\partial P(\widehat{Y}|X)}{\partial \theta} = ?
     

偏微分计算-1-展开变形
  • 我们将概率求解函数展开,它就像我们上面所说,是由一堆对齐概率加和而成的。而每一个对齐概率又是由某些概率相乘而得到的。

  • 哪些概率?是由从起点到终点的某条路径上的每一个箭头所代表的概率,也就是在某个状态下产生某一个 token 的概率相乘得到的。因此,由这一系列所有的箭头相乘,然后相加,就最终得到了我们的概率。

  • 而这些产生某一个 token 的概率又受到模型参数 θ 的影响,目标概率又受到这些小概率的影响,所以我们可以先计算某个小概率对 θ 的偏微分,然后再计算目标概率对这些小概率的偏微分,和之前的相乘,然后再计算下一个小概率对 θ 的偏微分,乘上目标概率对小概率的偏微分……以此类推,最终将所有结果加和,就可以得到我们的目标式子,即:

偏微分计算-2-第一个偏微分求解
  • 好的,经过上面的变形,现在压力给到了如何计算小概率,即每个箭头代表的概率,对参数 θ 的偏微分。

  • 我们以 p_{4,1}(a) 对 θ 的偏微分的计算作为例子。


    \frac{\partial p_{4,1}(a)}{\partial \theta} = ?
     

  • 其计算方式,或者说训练方式其实和普通模型一样,还是采用经典的 BPTT(Backpropagation Through Time,反向传播通过时间)时序的反向传播。一开始最右边的结果计算和标签的损失,反向传播传到编码器,再传到上面的解码器 RNN。

偏微分计算-3-第二个偏微分求解
  • 第一个偏微分式子可以解了,下面压力来到了第二个偏微分式子上,也就是目标概率对每个箭头概率的偏微分。我们以计算对 p_{4,1} 的偏微分为例,公式如下:


    \frac{\partial P(\widehat{Y}|X)}{\partial p_{4,1}(a)} = ?
     

  • 首先,我们要把包含 p_{4,1} 的对齐方式和不包含 p_{4,1} 的对齐方式分开算:


    P(\widehat{Y}|X) = \sum_{h\space with\space p_{4,1}(a)}P(h|x) + \sum_{h\space without\space p_{4,1}(a)}P(h|x)
     

  • 由于第二项是没有 p_{4,1} 的,因此当做偏微分的时候,第二项就消失了。而第一项我们知道,是由很多箭头概率相乘相加得到的。既然有 p_{4,1},我们就可以将它提取出来,如下图

  • 这样偏微分后就只剩提取出 p_{4,1} 之后的 other 了。并且我们还可以把 other 写成 P/p,然后再把这个 1/p 提出来,就可以了。

  • 所以,问题就被转化成了计算带有 p_{4,1} 的对齐方式的概率之和。我们应该如何计算呢?此时,我们可以再引入另一个辅助变量 β_{i,j},它与α_{i,j}很像,它表示从第 i 个声学特征开始且输出到第 j 个 token,在当前位置到结束的所有对齐方式分数之和。

  • β_{4,2} 如图所示,它表示已经产生了4个声学特征和输出两个 token 的情况下,在当前位置走到结尾为止的所有路径的分数总和。β_{i,j} 刚好是 α_{i,j} 的反过来。前面 α_{i,j} 对应着 HMM 的正向传播算法,这里 β_{i,j} 对应着 HMM 的反向传播算法。通过动态规划算法,于是我们有递推式,β_{i,j} = β_{i+1,j}p_{i,j} + β_{i,j+1}p_{i,j}。

  • 有了递推式以后,我们就可以将所有点的 β 值全部计算出来。而有了 α 和 β 的值以后,我们就可以计算带有 p_{4,1} 的对齐方式的概率之和了。 我们看下图:所有从起始位置到 (4,1) 的候选对齐路径的分数和 α_{4,1} 乘上 p_{4,1}(a) 后,再乘上所有从位置 (4,2) 到终点的候选对齐路径的分数和 β_{4,2},这就是所有包含 p_{4,1}(a) 的分数总和。

  • 我们将式子带入,并乘上系数,p_{4,1}(a) 得到约分,最终的偏微分结果就是 α_{4,1}β_{4,2}。

  • 因此带入最终的式子后,就能计算全部候选对齐的得分对模型参数的梯度。然后反向传播更新模型参数进行训练。我们就可以进行正常训练了。

三、RNN-T 的模型测试(推理/解码)

目标函数的近似
  • 训练好模型了以后,我们就可以进行模型的使用了。我们的目标函数如下,也就是找到一个 Y,使得 P of Y given X 达到最大值,这个 Y 就是模型语音辨识的结果。


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

  • 这实际上不是一个简单的问题。理想状态下我们需要穷举所有的 Y,来计算概率,然而别说穷举不容易实现,就连计算概率都是大量的对齐方式概率相加之和,就更不容易了。

  • 所以我们采用一些近似估计的方法,首先就是对 “将所有对齐方式概率加和作为分数” 这一条进行近似。我们不把所有的候选对齐分数加起来,而是选取每一个Y中,分数最高的那个对齐方式的概率作为分数。不过,这个近似需要基于这样一个事实:概率最大的对齐方式要比其他的对齐方式要大很多。那事实真的是这样吗?(老师:反正我信了)

  • 我们将概率最大的对齐方式记作 h*,然后用 h* 进行 inverse,找到其对应的 Y*,就是最终解码的结果啦。计算 P of h given X 的方式我们在之前都有讲过,这里在图中呈现回顾一下,不再用文字赘述。

实际操作
  • 实际中要怎么找一个概率最高的对齐方式呢?RNN-T 每一个时间步都会跑出一个概率分布。我们把每个概率分布中,概率最大的那个 token 取出来,就是 h* 的一个近似。不过,每次都取概率分布中概率最大的,不见得会使得整个对齐方式的概率是最大的(原因距离可以看束搜索 Beam Search 讲解)。不过没有关系,我们照样可以采用 Beam Search 的方法来得到更准确的结果。

四、总结——LAS、CTC、RNN-T 模型比较

  • 我们看下面这张表。在解码部分,LAS 和 RNN-T 会考虑前面的时序对当前时序的影响。而 CTC 并不会考虑之前的时间步已经生成出来的token。所以 LAS 和 RNN-T 在解码部分是相对比较强的。

  • 在对齐部分,CTC 和 RNN-T 都是需要考虑对齐的。而因为中间的注意力层,LAS不用显式地考虑对齐,而是采用 soft alignment,使用注意力机制来找出语音和文字之间的关系。

  • 在训练部分,LAS 只需要直接训练就行,而 CTC 和 RNN-T 则需要将所有的对齐方式概率相加,比较麻烦。

  • 对于语音识别模型,在线识别(实时识别)也是一个很重要的功能,使用者一边说一边就能跑出语音辨识的结果。对于 LAS,由于注意力一次要看全部,也就是需要等语者说完才能进行推理,因此 LAS 不能在线识别。而 CTC 和 RNN-T 都是可以的,之前有说过,Pixel 的语音助手就是使用 RNN-T 进行语音识别的。

 

 

课程也告一段落啦,我之后会将所有的语音学习内容整合成一个pdf,欢迎大家下载~如果觉得csdn上下载不方便,也可以找我私聊联系~

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

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

相关文章

什么是PDM图纸管理系统?PDM图纸管理系统主要功能有哪些?

PDM (Product Data Management) 图纸管理系统 是用于管理企业内部图纸和相关文件的软件系统。它提供了一个集中存储、组织和跟踪图纸和文件的平台&#xff0c;以确保团队成员能够轻松访问、共享和更新所需的工程设计和制造数据。 彩虹PDM系统|PDM产品数据管理系统|BOM管理|工艺…

代码浅析DLIO(三)---子图构建

0. 简介 我们刚刚了解过DLIO的整个流程&#xff0c;我们发现相比于Point-LIO而言&#xff0c;这个方法更适合我们去学习理解&#xff0c;同时官方给出的结果来看DLIO的结果明显好于现在的主流方法&#xff0c;当然指的一提的是&#xff0c;这个DLIO是必须需要六轴IMU的&#x…

问题记录-maven依赖升级或替换(简单版)

问题背景 项目被检测到有高危漏洞&#xff0c;需要对部分jar进行升级。以一个jar为例记录一下升级过程。 1 找到高危漏洞的包 如果装了maven helper插件则可以在下面查看当前模块依赖包 2 使用maven命令 执行下面这个命令&#xff0c;会将当前项目的信息打印出来&#xff0c;…

基于MYSQL+Tomcat+Eclipse开发的超市订单管理系统

基于MYSQLTomcatEclipse开发的超市订单管理系统 项目介绍&#x1f481;&#x1f3fb; 该系统运行需要基于JDK7来进行运行 超市订单管理系统是一款针对超市订单进行管理的软件&#xff0c;旨在提高订单处理效率&#xff0c;降低管理成本。该系统包括以下功能模块&#xff1a; 系…

Java后端开发——SpringMVC商品管理程序

Java后端开发——SpringMVC商品管理程序 今日目标 Spring MVC框架介绍掌握SpringMVC的核心类的原理及配置掌握SpringMVC的常用注解掌握SpringMVC的增删改查编程 Spring MVC框架介绍 Spring MVC&#xff08;Model-View-Controller&#xff09;是一个基于Java的开源框架&#x…

记一次:Python的学习笔记一

前言&#xff1a;之前学习的Python笔记&#xff0c;已经过去很多年了&#xff0c;不久前重新翻了出来练习练习。不完善的地方在缝缝补补 一、环境搭建 1.1、Python的win环境安装 0、python-3.12.0软件安装&#xff1a;Win11环境搭建python-3.12.0-amd64 这里小小注意一下&a…

NoSql非关系型数据库

前言&#xff1a;Nosql not only sql&#xff0c;意即“不仅仅是sql”&#xff0c;泛指非关系型数据库。这些类型的数据存储不需要固定的模式&#xff08;当然也有固定的模式&#xff09;&#xff0c;无需多余的操作就可以横向扩展。NoSql数据库中的数据是使用聚合模型来进行处…

基于Java SSM框架实现实现四六级英语报名系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现四六级英语报名系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个高校四六级报名管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作…

U-boot(七):U-boot移植

本文主要探讨基于210官方U-boot源码移植。 移植基础 tar -jxvf android_uboot_smdkv210.tar.bz2cd u-boot-samsung-devrm -rf onenand_ipl onenand_bl1 lib_avr32 lib_blackfin lib_i386 lib_m68k lib_mips lib_microblaze lib_nios lib_nios2 lib_ppc lib_sh lib_sparccd bo…

pycharm怎么同时打开2个项目?

pycharm怎么同时打开2个项目&#xff1f;当使用vue等前端的时候&#xff0c;后台也需要同时用pycharm打开操作&#xff0c;怎么用pycharm同时打开前后端呢&#xff1f; 当我们第一次用pycharm的时候&#xff0c;新建一个项目&#xff0c;习惯选择此窗口&#xff0c;而且勾选不再…

【Linux】OpenSSH 命令注入漏洞(CVE-2020-15778)(iptables屏蔽22端口方式)

背景 漏洞名称&#xff1a;OpenSSH 命令注入漏洞(CVE-2020-15778) 详细描述&#xff1a;OpenSSH&#xff08;OpenBSD Secure Shell&#xff09;是OpenBSD计划组的一套用于安全访问远程计算机的连接工具。该工具是SSH协议的开源实现&#xff0c;支持对所有的传输进行加密&#…

基于Java SSM框架实现高校二手交易平台系统项目【项目源码+论文说明】

基于java的SSM框架实现高校二手交易平台系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个高校二手交易平台&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将…

在氮化镓和AlGaN上的湿式数字蚀刻

引言 由于其独特的材料特性&#xff0c;III族氮化物半导体广泛应用于电力、高频电子和固态照明等领域。加热的四甲基氢氧化铵(TMAH)和KOH3处理的取向相关蚀刻已经被用于去除III族氮化物材料中干法蚀刻引起的损伤&#xff0c;并缩小垂直结构。 不幸的是&#xff0c;由于化学蚀…

【Node.js】笔记整理 3 -npm

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

Linux常用命令——badblocks命令

在线Linux命令查询工具 badblocks 查找磁盘中损坏的区块 补充说明 badblock命令用于查找磁盘中损坏的区块。 硬盘是一个损耗设备&#xff0c;当使用一段时间后可能会出现坏道等物理故障。电脑硬盘出现坏道后&#xff0c;如果不及时更换或进行技术处理&#xff0c;坏道就会越…

山人求道篇:一、交易系统与现代战争

声明&#xff1a; 本人不进行任何投资建议&#xff0c;也不出售任何包括策略、算法的程序代码。 仅作为个人的2023年开发心路总结&#xff0c;有任何异议可以在评论区留言&#xff0c;可以讨论&#xff0c;如果你杠&#xff0c;那就是你对。 这世上有很多条路&#xff0c;每个…

零基础自学编程,中文编程工具下载,中文编程工具构件之弹出菜单构件简介

一、前言&#xff1a; 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之弹出菜单构件简介 编程系统化教程链接 https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家分享一款中文编程工具&#xff0c;零基础…

VSCode编译多个文件

打开tasks.json文件&#xff0c;找到"$ {file}“这一行。然后在其后面添加你想要编译的文件即可。 比如我这里是想要编译当前文件夹下的所有.cpp文件&#xff0c;那么我就直接把”$ {file}"给注释掉了&#xff0c;然后再使用通配符来代表所有.cpp文件。 最后解释以下…

Git——使用Git进行程序开发

主要介绍个人开发提交记录的主要流程&#xff0c;包括以下内容&#xff1a; 索引- 提交的暂存区。查看工作的状态和内部变更。如何读取用于描述变更的已扩展统一diff格式。支持查询和交互的提交&#xff0c;修改提交。创建、显示和选择&#xff08;切换&#xff09;分支。切换…

ruoyi-vue 整合EMQX接收MQTT协议数据

EMQX安装完成后&#xff0c;需要搭建客户端进行接收数据进一步对数据处理&#xff0c;下面介绍基于若依分离版开源框架来整合EMQX方法。 1.application.yml 添加代码 mqtt:hostUrl: tcp://localhost:1883username: devpassword: devclient-id: MQTT-CLIENT-DEVcleanSession: …