端到端语音识别
一.端到端语音识别的动机
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] X=[x1,x2,…,xn]。
- 线性变换:将输入序列通过线性变换,得到查询矩阵 Q Q Q、键矩阵 K K K 和值矩阵 V V V。
Q = X W Q , K = X W K , V = X W V Q=XW_Q,K=XW_K,V=XW_V Q=XWQ,K=XWK,V=XWV
其中, W Q W_Q WQ、 W K W_K WK 和 W V W_V WV 是可训练的权重矩阵。
- 计算注意力得分:
Attention Scores = Q K T d k \text{Attention Scores} = \frac{QK^T}{\sqrt{d_k}} Attention Scores=dkQKT
其中, d k d_k dk 是键向量的维度,用于缩放点积,防止值过大。
-
归一化:
Attention Weights = Softmax ( Q K T d k ) \text{Attention Weights} = \text{Softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right) Attention Weights=Softmax(dkQKT) -
加权求和:
C o n t e x t V e c t o r s = A t t e n t i o n W e i g h t s ⋅ V Context Vectors=Attention Weights⋅V ContextVectors=AttentionWeights⋅V
五.多头注意力(Multi-Head Attention)
为了进一步增强模型的能力,自注意力机制通常采用多头注意力机制(Multi-Head Attention)。具体做法是将查询、键和值向量分成多个头(多个子空间),分别计算注意力,然后将这些头的输出拼接起来。
1.头的分割:将查询、键、值向量分成
h
h
h 个头。
Q
i
=
X
W
Q
i
,
K
i
=
X
W
K
i
,
V
i
=
X
W
V
i
for
i
=
1
,
…
,
h
Q_i = XW_{Q_i}, \quad K_i = XW_{K_i}, \quad V_i = XW_{V_i} \quad \text{for} \quad i = 1, \dots, h
Qi=XWQi,Ki=XWKi,Vi=XWVifori=1,…,h
2.每个头的注意力计算:
Attention Weights
i
=
Softmax
(
Q
i
K
i
T
d
k
)
\text{Attention Weights}_i = \text{Softmax} \left( \frac{Q_iK_i^T}{\sqrt{d_k}} \right)
Attention Weightsi=Softmax(dkQiKiT)
Context Vectors i = Attention Weights i ⋅ V i \text{Context Vectors}_i = \text{Attention Weights}_i \cdot V_i Context Vectorsi=Attention Weightsi⋅Vi
3.拼接输出:将所有头的上下文向量拼接起来,进行线性变换。
Multi-Head Attention Output
=
Concat
(
Context Vectors
1
,
Context Vectors
2
,
…
,
Context Vectors
h
)
W
O
\text{Multi-Head Attention Output} = \\ \text{Concat}(\text{Context Vectors}_1, \text{Context Vectors}_2, \dots, \text{Context Vectors}_h)W_O
Multi-Head Attention Output=Concat(Context Vectors1,Context Vectors2,…,Context Vectorsh)WO
其中, W O W_O WO 是拼接后的线性变换矩阵。
六.Transformer
详见:动手学深度学习(Pytorch版)代码实践 -注意力机制-Transformer_pytorch注意力机制代码实现-CSDN博客
七.Speech Transformer
如何把Transformer应用于 端到端语音识别呢?
No big deal , just change input.
八.Connectionist Temporal Classification (CTC)
Connectionist Temporal Classification (CTC)是一种专为处理序列到序列任务而设计的损失函数和解码方法,特别适用于输入和输出序列长度不对齐的情况,例如语音识别和手写字符识别。
1. 核心思想
CTC的核心思想是通过允许网络在每个时间步生成一个输出符号或特殊的空白符号(blank token),来解决输入和输出序列长度不一致的问题。最终的输出序列是通过移除所有空白符号和重复的符号得到的。
2. CTC解码
- 空白符号:CTC引入一个特殊的空白符号 ∅ \varnothing ∅,用来表示非输出时刻。
- 重复符号处理:在CTC解码过程中,连续的重复符号被压缩为一个符号。例如,输出序列"aa–bb-“(其中”-“表示空白符号)将被解码为"ab”。
3. CTC损失函数
CTC损失函数计算输入序列与目标序列的对齐概率,允许多个可能的对齐方式。CTC通过动态规划计算所有可能对齐的总概率,从而优化模型参数。
CTC Loss
=
−
log
p
(
y
∣
x
)
\text{CTC Loss} = -\log p(y|x)
CTC Loss=−logp(y∣x)
其中, p ( y ∣ x ) p(y|x) p(y∣x) 表示给定输入序列 x x x 生成目标序列 y y y 的概率。
4. 优势
- 处理变长序列:CTC能够处理输入和输出序列长度不一致的情况,特别适合语音识别等任务。
- 无需精确对齐:CTC不需要在训练数据中提供精确的输入输出对齐信息,只需要提供目标序列即可。
- 实时解码:CTC可以在不进行后处理的情况下生成输出序列,适用于实时应用。
九.RNN-Transducer
RNN-Transducer (Recurrent Neural Network Transducer) 是一种用于端到端序列到序列建模的神经网络架构,特别适合处理输入和输出序列长度不对齐的问题。它是对Connectionist Temporal Classification (CTC) 的扩展,结合了序列建模和对齐的功能。
1. 核心组件
RNN-Transducer由三个主要组件组成:
-
编码器(Encoder):编码器将输入序列(如语音特征)转换为隐藏状态表示。通常使用RNN、LSTM或GRU等循环神经网络来实现。
-
预测网络(Prediction Network):预测网络根据先前已生成的输出符号序列生成隐藏状态表示。这个网络通常也是一个RNN。
-
联合网络(Joint Network):联合网络结合编码器和预测网络的隐藏状态,生成每个时间步的输出概
2.优势
- 处理变长序列:能够处理输入和输出序列长度不一致的问题。
- 联合对齐和建模:将对齐过程和序列建模结合在一起,提高了模型的灵活性和性能。
- 实时解码:适用于实时应用,可以在解码过程中生成输出序列。
3.RNN-T相比其他端到端模型的优点
流式语音识别:
- 实时处理:RNN-T能够在使用单向编码器时进行流式语音识别,这意味着它可以在获取到一帧输入时立即生成相应的输出。
- 逐帧解码:具体而言,RNN-T可以在每一帧输入数据到达时解码一步,而不需要等待整个输入序列结束。
与其他模型的对比:
- LAS(Listen, Attend and Spell):LAS模型依赖于注意力机制,需要在解码时访问整个输入序列,因此只能在整句话输入完成后才能进行解码。这限制了其在实时应用中的使用。
- Speech Transformer:类似于LAS,Speech Transformer也需要在解码时处理整个输入序列,因此也无法进行流式解码。
十.总结
1. 端到端语音识别的动机
端到端语音识别旨在简化传统ASR(Automatic Speech Recognition)的流程,通过将多个复杂的模块(如声学模型、语言模型、发音模型)整合到一个统一的神经网络中,从而简化训练和推理过程。
2. Sequence-to-Sequence & Attention
- Sequence-to-Sequence模型:这种模型使用编码器-解码器结构,将输入序列编码成固定长度的向量,再由解码器生成输出序列。
- Attention机制:引入注意力机制,使得解码器在生成每个输出符号时,可以动态地关注输入序列的不同部分,从而捕捉全局信息。
3. Listen, Attend and Spell (LAS)
- 优点:没有输出独立性假设,能够通过Attention机制捕捉输入序列的全局信息。
- 缺点:无法直接支持流式语音识别,因为LAS需要完整的输入序列才能开始解码;此外,RNN难以并行处理,训练速度较慢。
4. Speech Transformer
- 优点:自注意力机制(self-attention)易于并行处理,训练速度快,效果好。
- 缺点:对超参数有时非常敏感,需要仔细调参以获得最佳性能。
5. CTC (Connectionist Temporal Classification)
- 优点:适用于输入与输出具有单调关系的任务,无需对齐标注,能够直接处理变长序列。
- 缺点:输出独立性假设,即每个时间步的输出是独立的,可能导致性能限制;通常需要语言模型(LM)来提高性能。
6. RNN-Transducer
-
优点:天然支持流式语音识别,可以在每个时间步进行解码,适用于实时应用场景。
-
缺点:Loss计算不易实现,涉及复杂的动态规划算法;一般需要使用开源库来实现。
(Connectionist Temporal Classification) -
优点:适用于输入与输出具有单调关系的任务,无需对齐标注,能够直接处理变长序列。
-
缺点:输出独立性假设,即每个时间步的输出是独立的,可能导致性能限制;通常需要语言模型(LM)来提高性能。
6. RNN-Transducer
- 优点:天然支持流式语音识别,可以在每个时间步进行解码,适用于实时应用场景。
- 缺点:Loss计算不易实现,涉及复杂的动态规划算法;一般需要使用开源库来实现。