在上一章中,我们了解到连接时序分类 (CTC) 如何使声学模型无需逐帧对齐即可进行训练。然而,CTC 在一个强条件独立性假设下运行:一个时间步的预测独立于其他时间步的预测。这种局限性使得模型无法捕捉输出序列中固有的语言结构。序列到序列 (Seq2Seq) 模型提供了一个更强大的架构,它直接对给定输入音频序列的整个输出文本序列的概率进行建模,$P(\text{文本} | \text{音频})$。这种方法能有效地在一个统一的结构中学习声学和语言模式。编码器-解码器架构任何 Seq2Seq 模型的核心是编码器-解码器架构。这种设计将输入处理任务与输出生成任务分离,为不同长度序列的映射提供了灵活的结构。编码器编码器的作用是处理整个音频特征输入序列(如对数梅尔频谱图),并将其信息压缩成一组高层次的表示。通常,编码器是一个多层循环神经网络 (RNN),常为双向长短期记忆 (BiLSTM) 网络。通过在前向和后向两个方向处理序列,BiLSTM 编码器在每个时间步生成一个隐藏状态,其中包含该点周围整个音频语境的信息。编码器的输出是一个隐藏状态向量序列,每个输入时间步对应一个。对于一个有 $T$ 帧的输入频谱图,编码器生成一个隐藏状态序列 $h_1, h_2, ..., h_T$。解码器解码器是一个自回归 RNN,它一次生成一个输出标记(一个标记可以是字符、词或子词单元)。它作为一个条件语言模型运作:给定编码后的音频和已经生成的标记序列,它预测转录本中的下一个标记。在生成过程的每一步,解码器接收两个主要输入:前一个生成的标记。从编码器隐藏状态导出的上下文向量。这种逐步生成会一直持续,直到解码器生成一个特殊的序列结束 (<eos>) 标记。digraph G { rankdir=TB; splines=ortho; node [shape=box, style="rounded,filled", fontname="helvetica", fontsize=10]; edge [fontname="helvetica", fontsize=9]; subgraph cluster_encoder { label="编码器"; style="rounded,filled"; fillcolor="#e9ecef"; color="#adb5bd"; node [fillcolor="#bac8ff", color="#4263eb"]; x1 [label="x₁\n(第1帧)"]; x2 [label="x₂\n(第2帧)"]; xT [label="x_T\n(第T帧)"]; enc1 [label="h₁"]; enc2 [label="h₂"]; encT [label="h_T"]; x1 -> enc1; x2 -> enc2; xT -> encT; enc1 -> enc2 [style=dashed]; dots_enc [shape=none, label="...", fillcolor=none]; enc2 -> dots_enc [style=dashed]; dots_enc -> encT [style=dashed]; } subgraph cluster_decoder { label="解码器"; style="rounded,filled"; fillcolor="#e9ecef"; color="#adb5bd"; node [fillcolor="#96f2d7", color="#0ca678"]; start [label="<sos>", shape=ellipse, fillcolor="#ffec99", color="#f59f00"]; dec1 [label="s₁"]; dec2 [label="s₂"]; dec_end [label="s_N"]; y1 [label="y₁", shape=ellipse, fillcolor="#d8f5a2", color="#74b816"]; y2 [label="y₂", shape=ellipse, fillcolor="#d8f5a2", color="#74b816"]; y_end [label="<eos>", shape=ellipse, fillcolor="#ffc9c9", color="#f03e3e"]; start -> dec1; dec1 -> y1; y1 -> dec2 [label="自回归\n输入", style=dashed]; dec1 -> dec2 [style=dashed]; dec2 -> y2; dots_dec [shape=none, label="...", fillcolor=none]; dec2 -> dots_dec [style=dashed]; dots_dec -> dec_end [style=dashed]; } subgraph cluster_attention { label="注意力机制"; style="invis"; c1 [label="上下文\n向量 c₁", shape=cylinder, fillcolor="#fcc2d7", color="#d6336c"]; c2 [label="上下文\n向量 c₂", shape=cylinder, fillcolor="#fcc2d7", color="#d6336c"]; } {enc1, enc2, encT} -> c1 [label="加权和", style=dotted, constraint=false]; c1 -> dec1; {enc1, enc2, encT} -> c2 [label="加权和", style=dotted, constraint=false]; c2 -> dec2; { rank=same; x1; x2; xT; } { rank=same; enc1; enc2; dots_enc; encT; } { rank=same; y1; y2; dots_dec; y_end; } }编码器将音频帧 ($x_1, ..., x_T$) 处理为隐藏状态 ($h_1, ..., h_T$)。在每个解码步骤中,注意力机制从所有编码器状态生成一个上下文向量 ($c_t$)。解码器使用此上下文和前一个生成的标记 ($y_{t-1}$) 来生成下一个标记 ($y_t$)。早期的 Seq2Seq 模型试图将所有编码器隐藏状态压缩成一个单一的、固定大小的上下文向量。这造成了信息瓶颈,因为一个单一的向量难以保留长音频片段中的所有必要细节。在上一节中介绍的注意力机制,通过允许解码器动态地“回顾”所有编码器隐藏状态并在生成过程的每一步专注于最相关的部分,直接解决了这个问题。Seq2Seq 模型训练Seq2Seq 模型进行端到端训练,以最大化给定音频的真实转录文本的概率。损失函数通常是分类交叉熵,在每个解码器时间步计算,然后对整个序列求平均。稳定和加速这些模型训练的一种常用技术是教师强制。在训练期间,我们不是将解码器自身(可能不正确)在之前步骤的预测作为当前步骤的输入,而是输入参考转录本中的真实标记。这可以防止模型累积其自身错误,并帮助它更有效地学习音频和文本之间的对齐。然而,它也造成了训练(输入总是正确)和推断(模型必须依赖自己的预测)之间的一种差异,这个问题被称为暴露偏差。推断与解码在推断过程中,没有真实值来引导解码器。模型必须根据自己的预测生成整个输出序列。寻找最可能的序列需要一种搜索算法。贪婪搜索: 在每一步,这种简单的算法选择概率最高的单个标记,并将其作为下一步的输入。它速度快,但通常产生次优结果,因为早期的错误选择无法纠正。束搜索: 一种更有效的方法,它在每一步跟踪 $k$ 个最可能的局部序列(“束”)。它考察搜索空间中更大的部分,通常比贪婪搜索产生更准确的转录。我们将在下一章更详细地介绍束搜索。优点与局限性对于许多 ASR 任务,Seq2Seq 模型相较于基于 CTC 的方法来说是一个重要的进步。优点:端到端训练: 它们直接将音频映射到文本,无需预先对齐的数据或独立的声学和语言建模组件。语境感知: 自回归解码器自然地作为语言模型运作,学习输出标记之间的依赖关系,并生成更流畅、更连贯的文本。灵活性: 它们可以处理音频和转录文本之间的非单调对齐,例如,当说话者自我纠正时(“我想要一张飞往……嗯,我是说,一张去波士顿的火车票”)。局限性:不适合流式处理: 标准编码器需要处理整个音频序列后解码器才能开始。这使得基本架构不适合需要说话者未完成讲话就开始转录的实时应用。计算成本: 相比非自回归模型,解码器的顺序、逐步生成特性在推断时可能较慢。潜在错误: 像其他生成模型一样,它们有时会陷入循环、重复短语,或“幻觉”出音频中不存在的文本,尤其是在输入非常长或超出其适用范围时。这些模型是许多现代架构的开端。在下一节中,我们将介绍一个用于 ASR 的具体且有影响力的 Seq2Seq 模型:听、注意、拼写 (LAS)。