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/435707

相关文章

Mysql数据库聚簇索引与非聚簇索引举例详解

《Mysql数据库聚簇索引与非聚簇索引举例详解》在MySQL中聚簇索引和非聚簇索引是两种常见的索引结构,它们的主要区别在于数据的存储方式和索引的组织方式,:本文主要介绍Mysql数据库聚簇索引与非... 目录前言一、核心概念与本质区别二、聚簇索引(Clustered Index)1. 实现原理(以 Inno

使用python生成固定格式序号的方法详解

《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1