Alignment of HMM, CTC and RNN-T,对齐方式详解——语音信号处理学习(三)(选修二)

本文主要是介绍Alignment of HMM, CTC and RNN-T,对齐方式详解——语音信号处理学习(三)(选修二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考文献:

Speech Recognition (option) - Alignment of HMM, CTC and RNN-T哔哩哔哩bilibili

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

本次省略所有引用论文

 

目录

一、E2E 模型和 CTC、RNN-T 的区别

E2E 模型的思路

CTC、RNN-T 模型的思路

二、待解决的问题

三、对齐方式介绍

四、穷举方式

穷举 HMM

穷举 CTC

穷举 RNN-T

五、总结


一、E2E 模型和 CTC、RNN-T 的区别

E2E 模型的思路
  • 实际上,对于端对端模型来说,比如 LAS,它在解码的时候都是去寻找一个 token 序列,使得 P of Token Sequence Y given Acoustic features vectors X 最大。


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

  • 为什么这么说?我们来简单看一下 LAS 的结构,每一次我们都是输出一个概率分布,我们就可以将这个概率分布作为输出 token 的概率,因此将最后所有 token 的概率相乘,结果就是 P(Y|X)。

  • 当然,在解上面那个式子的时候,我们也并不是直接找出每一个概率分布中最大的 token,而是采用束搜索等策略去找最优解。而在训练过程中,我们也可以将训练目标带入上面的式子。假设 Y^hat 就是最终正确的结果,那么训练目标就是找一个最优的模型参数,来让P(Y^hat|X)越大越好。


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

CTC、RNN-T 模型的思路
  • 对于 CTC 和 RNN-T,由于 token 序列和声学特征序列的长度不同,直接计算 token 序列对应的声学特征序列的概率是做不到的。它们额外的需要对齐操作。

  • 以 CTC 为例,假设输出的 token 序列为 “ab”,声学特征序列有 4 个,由于二者长度不同,所以我们需要让 a 和 b 进行复制,或者在其中插入 ∅ 符号,让它的长度变得和输入的声学特征序列长度一致,才能计算P(Y|X)。

  • 因此实际上,CTC 和 RNN-T 只能计算某一种对齐方式的概率,而难以计算产生某一个 token 序列的概率。那我们应该怎么办?这里采取的解决方法是借鉴 HMM 的做法,将所有可能的对齐方式的概率都加起来,当作最终这个 token 序列的概率,公式如下。此外,训练和解码过程都可以参考之前端对端模型的方式。


    P(Y|X) = \sum_{h\in align(Y)} P(h|X)
     

二、待解决的问题

  1. 首先,我们应该如何穷举所有可能的对齐方式?实际上,CTC 和 RNN-T 与 HMM 的穷举方式相同。

  2. 其次,我们应该如何将所有对齐方式的概率进行相加?

  3. 然后,我们应该如何训练这些模型?HMM 采用的是 forward 算法,而 CTC 和 RNN-T 使用的是梯度下降法,那么对于很多个对齐方式加起来的概率结果,我们要怎样算梯度呢?

  4. 最后,我们应该如何进行推断与解码,去解决我们的目标式子呢?

三、对齐方式介绍

  • HMM,CTC 和 RNN-T 要做的对齐有相似的地方,也有不同。我们假设输入有 6 个声学特征向量(长度 T=6),以 character 为 token 单位(虽然对 HMM 来说这个单位还是太大了),输出是 "c", "a", "t"(长度 N=3)。

  • 对于 HMM 来说,它要做的事情就是将 cat 3个字母进行重复,让重复后的长度等于声学特征向量序列长度。

  • 对于 CTC 来说,它有两种方式,一种是对 cat 3个字母进行复制,也可以在其中插入 符号,最终使得长度等于声学特征向量序列长度。(参考它的推理过程,是将 ∅ 符号拿掉,将 ∅ 符号之间重复的字母缩减为一个字母)

  • 对于 RNN-T,则是在其中加入和声学特征向量序列长度相同个数的 ∅ 符号。

四、穷举方式

穷举 HMM
  • 我们应该如何穷举 HMM 的所有对齐方式呢?我们可以将刚刚讲述的 HMM 对齐方式转化为伪函数过程:

    • 这里, 字母 c 重复 t1 次,a 重复 t2 次,以此类推

    • 此外,由于必须出现所有的字母,所以 ti > 0。

  • 随后,我们就可以以此来绘制状态图(Trellis Graph),状态图如下:

    • 我们需要从左上的红点到右下的蓝点。

    • 走的方法可以是向右下走,也可以横着走。

    • 向右下走代表输出下一个字母,横着走代表复制当前的字母。、

  • 状态图可以很好地规避非法的对齐方式,非法的对齐方式是走不到终点的。

穷举 CTC
  • CTC 和 HMM 不同的地方在于,它还可以在其中插入 ∅ 符号,开头和结尾都可以插入,我们将这个过程转为伪函数如下:

    • 首先是开头就可以输出 ∅ 符号,也可以选择不输出

    • 其次就是每轮输出当前符号,和 ∅ 符号的数量

    • 并且 token 数量和 ∅ 数量加在一起需要等于声学特征向量序列长度。

  • 我们将状态图进行绘制,如下:

    • 我们需要从红点移动向2个蓝点的其中一个。

    • 开始出发的时候有两种选择,去 ∅ 行和去字母行。

    • 在字母行可以有三种选择:横走复制,右下走插入 ∅,走日即输出下一个字母。

  • 不过,如果一开始选择进入 ∅ 行,则走法与选择又会不一样:

    • 相比于在字母行,∅ 行只有两种选择。

    • 可以横走复制,可以右下走进入下一个 token,而不可以走日。

  • 因此我们说,CTC 在不同的 row 有不同的走法。最终的终点也有两种。

  • 我们举几个合法的对齐方式的例子,并绘制其状态图:

  • 不过,CTC 也有特殊的情况。参考 CTC 在推理时采取的策略,如果遇到 token 序列中前后两个 token 相同的话,我们在第一个相同的 token 行中就只有两种走法,比如下面这个输出 ”see“ 的例子:

    • 此时,在进入第一个 e 的行中,我们就只能有两种走法

    • 可以进行复制,可以插入 ∅ 行,但是不能直接跳到下一个 e 行

    • 如果直接进入下一个 e 行,那就代表连续输出两个 e,那么在推断时,CTC 就会将两个 e 融合在一起,最终只输出一个 e。

穷举 RNN-T
  • 在 RNN-T 中则是插入和声学特征向量序列长度相同的 ∅,也就是 T 个 ∅。我们弄清楚它的规则后(一个声学特征向量可以一直输出 token,让它看个爽,直到输出 ∅ 为止,表示看爽了可以进入下一个向量),就可以将伪代码写出:

    • 在 cat 三个字母中,我们有 4 个位置可以插入,并且由于 RNN-T 要判断是否结束,所以在 cat 最后的部分我们必须要插入 ∅,因为 RNN-T 看到 ∅ 就表示要进入下一个声学特征向量了

    • 每一次,我们都会输出第 n 个 token,并输出一定数量(cn)的 ∅。

    • 前几次可以选择不输出 ∅,但是最后一次 cN 必须输出 ∅。

    • cn 加起来的和必须要等于声学特征向量序列长度。

  • 我们将上述过程转化为状态图,为了保证最后一定以 ∅ 结尾,我们在最后一行的右方又多挖了一个格子:

    • 我们从左上方的蓝点,需要走到右下方的蓝点

    • 一共有两种走法,一种是横走,表示插入 ∅;还有一种是往下走,表示进入下一个 token。

    • 由此可见,最后一行向右多了个格子可以保证最后一步一定是横走插入 ∅。

  • 我们绘制了几条可能的对齐方式,也给了不合法的对齐方式(走出框外):

五、总结

  • 我们将每个模型的状态机图绘制而出进行比对:

    • HMM 从 c 开始,可以进行复制,也可以跳到下一个 token

    • CTC 可以从 ∅ 开始,也可以从 c 开始,也有两种结束方式(从 t 结束、从 ∅ 结束),可以进行复制,也可以选择去 ∅,也可以选择进入下一个 token。

    • RNN-T 则可以从 ∅ 或者 c 开始,不过最后一定以 ∅ 结束。并且每个token 进去以后就需要立马出来,而不可以再次生成当前的 token。

这篇关于Alignment of HMM, CTC and RNN-T,对齐方式详解——语音信号处理学习(三)(选修二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/435077

相关文章

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发