端到端语音识别
一.端到端语音识别的动机
1.传统语音识别语言模型训练
2.传统语音识别缺点
- 流程复杂且繁琐: 传统的语音识别系统涉及的流程非常多且复杂,从数据准备、模型训练到最终的系统集成,每个步骤都需要仔细处理。
- 入门门槛高: 要掌握语音识别技术,特别是传统方法,对学习者的要求很高,需要掌握大量的基础知识和相关技术。
- 多模型结构: 传统的语音识别系统通常包含三个主要模型:声学模型、语言模型和发音模型。每个模型需要单独训练,并且相互配合才能实现语音识别功能。
- 模型翻倍问题: 如果使用区分性训练方法,这些模型的训练复杂度将翻倍,因为需要进行更多的训练和调优工作,以确保模型能够区分不同的语音特征。
- 专业知识需求: 针对特定语言定义发音字典和音素集需要大量的专业知识。这项工作不仅需要深入理解该语言的发音规则,还需要耗费大量时间进行手工制作和验证。
- 耗时的定义和调试: 发音字典和音素集的定义过程非常耗时。为了保证语音识别系统的准确性,这些资源需要经过反复的定义、测试和调整。
3.什么是端到端语音识别?
使用单个序列到序列模型,直接将输入声学特征序列映射到文本。
输入特征
目前,端到端语音识别系统常用的输入特征是滤波器组频谱(filterbank,简称 fbank)。fbank 特征的处理过程包括以下几个步骤:
- 预加重:对原始语音信号进行预加重,以增强高频成分,改善信号的频谱特性。
- 分帧:将语音信号分成多个小的帧,每帧通常为20-40毫秒,以便进行短时分析。
- 加窗:对每个帧应用窗函数(如汉明窗),以减少频谱泄漏现象。
- 短时傅里叶变换(STFT):对每个加窗后的帧进行短时傅里叶变换,得到频谱图。
- Mel 滤波:应用 Mel 滤波器组,将频谱图转换为 Mel 频率尺度。
- 去均值:对滤波后的特征进行去均值处理,以减少噪声和冗余信息。
通常,一个 fbank 向量对应10毫秒的语音信号,因此一段十秒的语音可以生成大约1000个 fbank 向量来描述该语音。除了 fbank,梅尔频率倒谱系数(MFCC)以及原始波形(raw waveform)也在一些研究论文中被用作输入特征。然而,目前主流的方法仍然以 fbank 作为主要输入特征。
输出特征
端到端语音识别系统的输出可以是多种形式,包括:
- 字母:将语音转换为字母序列,适用于拼音文字和某些特定应用场景。
- 子词(subword):将语音转换为子词序列,这种方法在处理未登录词(OOV)和词汇丰富的语言时具有优势。
- 词:将语音直接转换为词序列,这种方法适用于词汇量较为固定和受限的应用场景。
二.Sequence-to-Sequence
该模型广泛应用于机器翻译和语音识别等任务。其主要优点在于输入和输出序列不需要等长,并且两者的长度都是可变的。
1.模型结构
该模型采用了序列到序列(Sequence-to-Sequence,简称 seq2seq)结构,包含两个循环神经网络(RNN),分别用于编码和解码:
- 编码器(Encoder):编码器网络将输入序列转换为一系列的隐状态表示。这些隐状态总结了输入序列中的信息,并将其传递给解码器。
- 解码器(Decoder):解码器网络利用编码器传递的隐状态逐步生成输出序列。解码过程一直持续到生成特殊的结束符(END)为止,从而实现变长的输出。
2.信息传递与瓶颈(橙色方框标记所示)
在传统的 seq2seq 模型中,编码器和解码器之间的信息传递依赖于编码器最后一个时刻的隐状态。这个隐状态被用作解码器的初始状态,从而指导生成输出序列。然而,这种方法存在明显的瓶颈:
- 信息丢失:如果输入序列较长,编码器最后一个隐状态可能无法有效地包含整个输入序列的全部信息,从而导致信息丢失和翻译准确性的下降。
三.Attention机制
为了缓解上述瓶颈问题,可以引入注意力机制(Attention)。注意力机制的核心思想是让解码器在生成每个输出时刻,可以动态地“关注”输入序列的不同部分,而不是仅仅依赖编码器的最后一个隐状态。具体而言:
- 动态权重:解码器在生成每个输出时,通过计算与输入序列各个时刻隐状态的相似度,分配不同的权重。
- 加权求和:这些权重用于对输入序列的隐状态进行加权求和,从而生成一个上下文向量,提供给解码器使用。
- 灵活聚焦:解码器可以根据当前生成的输出动态调整对输入序列的关注点,从而更精确地捕捉输入序列中的关键信息。
通过注意力机制,seq2seq 模型能够更有效地处理长序列输入,使得输出的每一步可以只关注部分输入,提高翻译和识别的准确性和鲁棒性。
四.自注意力机制(Self-Attention)
自注意力机制(Self-Attention)是一种在深度学习中广泛应用的技术,特别是在处理序列数据(如自然语言处理、语音识别等)方面。它的核心思想是让序列中的每个元素都能够关注序列中所有其他元素,从而捕捉到全局信息。下面是对自注意力机制的详细介绍:
1. 概念与基本原理
自注意力机制的目的是为序列中的每个元素分配一个上下文向量,该向量是序列中所有其他元素的加权求和。具体步骤如下:
图片注释:K 和 V 一般是同一个向量或矩阵 , 当K、Q、V 是同一个向量或矩阵时,即是self-attention
-
查询(Query)、键(Key)和值(Value)向量:对于序列中的每个元素,通过线性变换生成查询向量 Q Q Q、键向量 K K K 和值向量 V V V。这三个向量用于计算注意力权重和最终的上下文表示。
-
计算注意力得分:通过计算查询向量 Q Q Q 和键向量 K K K 之间的点积,得到注意力得分。这些得分反映了序列中一个元素对其他元素的关注程度。
A t t e n t i o n S c o r e = Q ⋅ K T Attention Score = Q \cdot K^T AttentionScore=Q⋅KT -
归一化注意力得分:将注意力得分通过 Softmax 函数归一化,使得得分总和为1,表示不同元素之间的权重分布。
A t t e n t i o n W e i g h t s = Softmax ( Q ⋅ K T ) Attention Weights= \text{Softmax}(Q \cdot K^T) AttentionWeights=Softmax(Q⋅KT) -
加权求和值向量:使用归一化后的注意力权重对值向量 V V V 进行加权求和,得到每个元素的上下文表示。
C o n t e x t V e c t o r = A t t e n t i o n W e i g h t s ⋅ V Context Vector=Attention Weights⋅V ContextVector=AttentionWeights⋅V
2. 计算过程
以一个长度为 n n n 的序列为例,自注意力机制的计算过程如下:
- 输入表示:输入序列表示为 X = [ x 1 , x 2 , … , x n ] X = [x_1, x_2, \dots, x_n]