Chapter 9: Transformer 自监督过渡:Conformer、Transducer 与 SSL 微调

本章定位:这是从“传统深度学习”迈向“大模型时代”的关键枢纽。 你将学到

  1. 架构:Conformer 如何成为统治级的声学编码器。
  2. 目标:为什么 Transducer (RNN-T) 击败了 AED 成为工业界流式首选。
  3. 范式:SSL(自监督学习)如何利用十万小时无标数据重塑 ASR。
  4. MLLM 前奏:本章的 SSL 模型如何摇身一变,成为多模态大模型的“耳朵”。

9.1 开篇:从“特征工程”到“规模法则”

在 Chapter 7 和 8 中,我们看到工程师们像搭积木一样精心设计网络:用 CNN 抓取频域纹理,用 LSTM 记忆时间依赖。然而,随着 Transformer 在 NLP 领域的爆发,语音领域迎来了一次“暴力美学”与“归纳偏置”的完美融合

这一时期的核心矛盾是:标注数据太贵,而无标数据太便宜。 传统的监督训练(Supervised Learning)往往在 1万小时数据后遭遇边际效应递减。而本章介绍的 自监督学习(SSL) 范式,证明了模型容量(Model Size)与无标数据量(Unlabeled Data)可以遵循 Scaling Law(规模法则),将 WER(词错误率)推向新低。

现在的 ASR 开发范式已经变成:“下载一个巨大的预训练底座(Foundation Model) -> 用少量业务数据微调(Fine-tuning)”


9.2 架构进化:Conformer 详解

Transformer 的全局注意力(Global Self-Attention)虽然强大,但在语音处理上存在两个先天缺陷:

  1. 局部性缺失语音具有极强的局部相关性(如共振峰的连续性),CNN 提取这种特征极其高效,而 Transformer 需要大量数据才能学会关注“邻居”。
  2. 位置编码失效:传统的绝对位置编码(Absolute PE)难以处理推理时变长的音频(训练 10秒,推理 1小时)。

Conformer (Convolution-augmented Transformer) 应运而生,它提出了经典的“三明治结构”

9.2.1 Conformer Block 的解剖学

一个标准的 Conformer Block 包含四个主要模块,顺序如下:

Input
  ↓
[ Feed Forward Module 1 (1/2 expansion) ]  <-- 第一片面包
  ↓
[ Multi-Head Self Attention (Relative PE) ] <-- 蔬菜(全局视野)
  ↓
[ Convolution Module ]                      <-- 肉饼(局部特征核心)
  ↓
[ Feed Forward Module 2 (1/2 expansion) ]  <-- 第二片面包
  ↓
[ Layer Norm ]
  ↓
Output

关键设计决策 (Rule of Thumb)

  1. Macaron Net 风格:FFN 被拆成两个半步(Half-step)分别放在 Attention 的前后。实验证明这种结构比标准 Transformer(Attention -> FFN)收敛更稳。
  2. 相对位置编码 (Relative Positional Encoding):这是 Conformer 能处理长音频的关键。模型不再记住“第 5 帧”的绝对特征,而是学习“当前帧与前 5 帧”的相对关系。这使得模型具有了平移不变性
  3. Swish 激活函数:全线替代 ReLU。它在负区间有非零梯度,更平滑,对深层网络训练更友好。

9.2.2 卷积模块 (Conv Module) 内部

这是 Conformer 的灵魂。它不是普通的 Conv2D,而是为了效率极致优化的 Depthwise Separable Conv

  1. Pointwise Conv (1x1): 升维,增加通道数(GLU 门控机制)。
  2. Depthwise Conv (k): 逐通道卷积,计算量极小,负责捕捉局部上下文。
  3. Swish + BatchNorm: 标准化。
  4. Pointwise Conv (1x1): 降维回原通道。

注意:这里使用的是 BatchNorm 而不是 LayerNorm,这是因为卷积层对 Batch 统计量更敏感,且有助于平滑梯度。


9.3 训练目标谱系:CTC, AED 与 Transducer

有了强力的 Encoder(Conformer),我们需要一个 Loss Function 来把声学特征映射到文本。

9.3.1 Transducer (RNN-T): 工业界的绝对王者

虽然 AED (Attention Encoder-Decoder) 在学术界很火,但工业界(Google, Apple, XiaoMi 等)的设备端 ASR 几乎清一色是 Transducer

核心优势

  1. 流式天然友好:它不需要像 AED 那样等整个句子结束才能解码(AED 的 Cross-Attention 需要全序列)。Transducer 是 Frame-synchronous 的。
  2. 极低的幻觉率:AED 容易在静音段“脑补”文字,Transducer 对齐约束更强,不易发疯。

结构图解

Transducer 由三部分组成:

  • Encoder (AM): 处理声学特征 X(如 Conformer)。
  • Predictor (LM): 处理历史预测的 token y_{<u}。注意,现代 Transducer 往往使用无状态(Stateless)的 Predictor(仅 Embedding 或 简单 Conv),因为 Conformer Encoder 已经够强了,弱化 LM 可以减少为了“通顺”而忽略“发音”的错误。
  • Joint Network: 融合 AM 和 LM 的特征。

格点游走 (Lattice Walk)

训练过程可以看作在一个网格上找路径:

  • 横轴:时间 t (Acoustic frames)
  • 纵轴:文本长度 u (Label tokens)
  • 动作
  • Blank: 保持当前文本不变,时间步 t→t+1(向右走)。
  • Token: 输出一个字,文本长度 u→u+1,时间步不变(向上走)。

Gotcha: Transducer 的显存消耗巨大,因为要计算 T×U×V 的 4D 张量(V 是词表大小)。Pruned Transducer (如 k2/icefall) 通过只计算对角线附近的路径,将内存消耗降到了原来的 1/10 甚至更低。


9.4 SSL 自监督学习:从 wav2vec 2.0 到 WavLM

这是连接 ASR 与 MLLM 的桥梁。我们不再教模型“这句话是什么字”,而是教它“这段声音是什么”。

9.4.1 核心逻辑:完形填空 (Masked Prediction)

所有主流 SSL 模型都遵循类似 BERT 的逻辑:

  1. 输入音频波形。
  2. 随机 Mask 掉一部分时间片段。
  3. 让模型根据上下文猜测被 Mask 掉的内容。

区别在于“猜什么”(Target 是什么):

9.4.2 家族进化史

| 模型 | 核心机制 | 预测目标 (Target) | 优势 | 劣势 |

模型 核心机制 预测目标 (Target) 优势 劣势
wav2vec 2.0 对比学习 (Contrastive) 量化后的 Latent Vector 开创性工作,不用伪标签 训练不稳定,需负采样
HuBERT 掩码预测 (Classification) K-means 聚类中心 (Cluster ID) 训练极其稳定,语义性强 需要迭代(先聚类再训练再聚类)
WavLM 掩码预测 + 去噪 Cluster ID 全能王:ASR + 说话人 + 情感 训练数据构造复杂 (Mixup)
data2vec 蒸馏 (Distillation) Teacher 模型的层输出 统一了模态 (CV/NLP/Speech) 收敛较慢

9.4.3 为什么 HuBERT/WavLM 会产生“Token”?

这是一个至重要的概念。 HuBERT 的输出并不是连续的向量,而是对音频帧进行了离散化 (Discretization)

  • 它把连续的语音空间切分成了 K 个簇(例如 500 或 2000 个)。
  • 每一帧音频都有一个对应的 Cluster ID。
  • 这实际上就是把语音变成了“外星语言”的文字。MLLM 正是利用这些 Discrete Tokens 来“读”语音的。

9.5 多语种与微调策略

当你下载了一个 300M 参数的 WavLM-Large,如何用在你的 50 小时客家话数据上?

9.5.1 冻结 vs 全量微调

  • Feature Freeze: 冻结 Conformer 的前 N-1 层,只训练最后一层和 Output Layer。适合数据极少(<10小时)的情况,防止过拟合。
  • Full Finetuning: 全量解冻。适合数据较多(>100小时)。但要注意学习率必须很小(通常比预训练时小 1-2 个数量级),否则会破坏预训练特征(Catastrophic Forgetting)。

9.5.2 Parameter-Efficient Fine-Tuning (PEFT)

借鉴 NLP语音界也开始大规模使用 Adapter:

  • LoRA (Low-Rank Adaptation): 在 Attention 的 W_q/W_v 等矩阵旁路增加低秩矩阵。
  • Adapter Layer: 在 FFN 之后插入小型的 MLP 层。
  • 价值: 你可以为一个底座模型挂载 100 个不同的“语言包”,每个包只有 10MB,而不是存 100 个大模型。

9.6 MLLM 时代的连接:Speech Foundation Model

本章的内容是 Chapter 16 (MLLM) 的地基。现在的多模态模型(如 GPT-4o, Gemini)处理语音的方式主要有两种,都依赖本章知识:

路线 A:连续特征投影 (End-to-End / Encoder-Decoder)

  • 架构: Audio Encoder (WavLM/Whisper) -> Projector (Linear/Q-Former) -> LLM (Llama/Qwen)
  • 原理: 使用本章的 Conformer/SSL 模型提取连续的 Feature,通过一个投影层把维度对齐(例如从 1024 维映射到 LLM 的 4096 维),直接当做 Embedding 喂给 LLM。
  • Chapter 9 的贡献: Audio Encoder 的质量决定了 LLM 能听到多少细节。如果 Encoder 也是基于 WavLM 的,LLM 就能感知情绪;如果是 Whisper Encoder,则主要感知语义。

路线 B:离散 Token (Speech Tokenizer)

  • 架构: Audio -> Quantizer (HuBERT/Encodec) -> Discrete Tokens -> LLM
  • 原理: 把语音彻底变成整数序列(Token IDs)。LLM 像处理文本一样处理这些 ID。
  • Chapter 9 的贡献: HuBERT 的 K-means 聚类思想是这一切的起源。现代的 SpeechTokenizer 只是把 K-means 换成了更高级的 VQ-VAE (Vector Quantized VAE)。

关键洞察: 以前我们用 ASR 输出文字给 LLM(丢失了语气、语速、对象)。 现在我们用 SSL 模型输出 Speech Tokens 给 LLM(保留了全信息)。 ASR 正在变成一种“降维的语音压缩”技术。


9.7 本章小结

  1. Conformer 是当前声学模型的标准答案,它用“三明治”结构解决了 Transformer 缺局部性、CNN 缺全局性的问题。
  2. Transducer (RNN-T) 凭借流式能力和联合优化机制,统治了端侧和即时通信场景。
  3. SSL (wav2vec2/HuBERT) 让我们不再依赖昂贵的标注数据,通过“完形填空”学到了通用的声学表征。
  4. 未来已来:这些 SSL 模型提取的特征或离散码,正是 MLLM 理解听觉世界的“神经信号”。

9.8 练习题

基础题

  1. 计算题:假设音频帧移为 10ms,下采样率为 4(即模型每输出一步对应原始 4 帧)。一段 10 秒的音频进入 Conformer Encoder 后,输出的序列长度 U 是多少?
  2. 概念辨析:在使用 wav2vec 2.0 进行微调时,为什么通常要加一个 LayerDrop 机制?
  3. Transducer:在 RNN-T 的 Joint Network 中,通常操作是单纯的相加(Add)还是拼接(Concat)?为什么现代实现倾向于使用简单的加法?

挑战题

  1. 架构设计:设计一个混合系统。场景是会议记录,要求:(1) 实时上屏(延迟<500ms),(2) 最终生成高精度纪要。你会如何组 Transducer, CTC 和 Attention-Decoder?提示:Two-pass decoding。
  2. SSL 深入:WavLM 论文中提到使用了 "Gated Relative Position Bias"。请解释这对于处理“重叠语音”(Overlap Speech)有什么潜在帮助?
  3. MLLM 桥接:如果你使用 HuBERT 的离散 token 作为 LLM 的输入,你会发现 token 序列非常长(50Hz 的帧率,10秒就是 500 token)。请提出两种缩短序列长度但不严重损失信息的策略。
点击查看参考答案
  1. 序列长度计算 * 总帧数 = 1000 帧。 * 下采样率为 4,输出 250 帧。

  2. LayerDrop * 机制:在训练时随机跳过(Dropping)一些 Transformer 层。 * 目的:一种正则化手段,防止过深的网络过拟合;同时,它允许推理时根据算力需求剪裁层数(Structured Pruning),实现弹性部署。

  3. Joint Network 操作 * 操作:现代实现(如 Pruned Transducer)倾向于 。 * 原因:加比拼接更省显存,且计算更快。在高维空间中,加法已经足够融合信息。

  4. Two-pass Hybrid Design * First Pass (Streaming): 使用一个轻量级的流式 Transducer (Conformer-XS) 进行实时解码,结果直接上屏。 * Second Pass (Offline): 利用 First Pass 的中间结果或直接利用原始音频,使用一个大的非流式 Conformer-Large (CTC/AED 混合) 进行重打分 (Rescoring) 或重新解码。 * 关键:利用 Shared Encoder 的一部分层来减少计算重复。

  5. Gated Relative Position Bias * 重叠语音意味着同一时刻有两个声源。普通的 Attention 可能会混淆它们。 * Gated Bias 允许模型根据当前的内容动态调整对位置的关注度,可能帮助模型“锁定”某一个说话人的相对位置模式,抑制另一个干扰源。

  6. Token 缩短策略 * 策略 A (BPE): 对 HuBERT 的离散 ID 再做一次 BPE (Byte Pair Encoding),就像处理文本一样,把常见 ID 组合(如 [12, 55, 12])合并成一个新 token。 * 策略 B (CNN Downsampling): 在进入 LLM 之前,加一层步长为 2 或 4 的 1D-Convolution 适配器,强制压缩时序。 * 策略 C (Dedup): 去除连续重复的 token(Run-length encoding),因为语音中有大量稳态元音是重复的。


9.9 常见陷阱与调试 (Gotchas)

  1. Warmup 的生死攸关 * 现象: Conformer 训练刚开始 Loss 就变成 NaN,或者一直在震荡不下降。 * 原因: Transformer 结构没有归纳偏置,初始梯度非常大且不稳定。 * 解决: 必须使用 Warmup。前几千步(如 25000 steps)将学习率从 0 线性增加到 Peak,然后再衰减。不要一上来就给大 LR。

  2. Transducer 的 Blank 陷阱 * 现象: 模型解码出来全是空(Blank),或者收敛极慢。 * 原因: 初始阶段,模型发现输出 Blank 是降低 Loss 最快的方法(因为 Blank 占绝大多数)。 * 解决: 初始化时给 Blank 的输出 logit 设置一个较小的偏置,或者限制 Blank 的连续输出长度(虽然现代 Loss 实现通常不需要手动干预,但需注意标签对应的 ID 是否正确映射)。

  3. Relative PE 的坑 * 现象: 训练时 WER 很好,换个推理框架(比如转 ONNX/TensorRT)后全是乱码。 * 原因: 许多推理引擎对 Relative Position Encoding 的支持不完善,或者缓存(Cache)状态处理错误。 * 解决: 导出模型时,仔细检查是否支持 Cache-aware 的导出;或者在生产环境回退到 Rotary Embedding (RoPE) 等更通用的位置编码。

  4. OOM (Out of Memory) 与显存碎片 * 现象: 音频长一点点就爆显存。 * 原因: PyTorch 的动态图机制处理变长音频时容易产生碎片;Transducer 的 4D Tensor 极大。 * 解决: * 对训练数据按时长排序(Bucket Batch Sampler),减少 Padding 浪费。 * 使用梯度累积(Gradient Accumulation)来模拟大 Batch。 * 开启 torch.cuda.empty_cache() (谨慎使用,影响速度) 或使用 TORCH_CUDA_ALLOC_CONF 调优。

  5. 多语种词表爆炸 * 现象: 做多语种 ASR,词表几万个,Softmax 层占了模型参数的一半。 * 解决: 使用 Byte-level BPE (如 BBPE) 或者使用 Shared Output Layer + Language Embedding。不要试图把所有汉字和生僻字都塞进 Output。