Chapter 9: Transformer 自监督过渡:Conformer、Transducer 与 SSL 微调
本章定位:这是从“传统深度学习”迈向“大模型时代”的关键枢纽。 你将学到:
- 架构:Conformer 如何成为统治级的声学编码器。
- 目标:为什么 Transducer (RNN-T) 击败了 AED 成为工业界流式首选。
- 范式:SSL(自监督学习)如何利用十万小时无标数据重塑 ASR。
- 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)虽然强大,但在语音处理上存在两个先天缺陷:
- 局部性缺失语音具有极强的局部相关性(如共振峰的连续性),CNN 提取这种特征极其高效,而 Transformer 需要大量数据才能学会关注“邻居”。
- 位置编码失效:传统的绝对位置编码(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)
- Macaron Net 风格:FFN 被拆成两个半步(Half-step)分别放在 Attention 的前后。实验证明这种结构比标准 Transformer(Attention -> FFN)收敛更稳。
- 相对位置编码 (Relative Positional Encoding):这是 Conformer 能处理长音频的关键。模型不再记住“第 5 帧”的绝对特征,而是学习“当前帧与前 5 帧”的相对关系。这使得模型具有了平移不变性。
- Swish 激活函数:全线替代 ReLU。它在负区间有非零梯度,更平滑,对深层网络训练更友好。
9.2.2 卷积模块 (Conv Module) 内部
这是 Conformer 的灵魂。它不是普通的 Conv2D,而是为了效率极致优化的 Depthwise Separable Conv:
- Pointwise Conv (1x1): 升维,增加通道数(GLU 门控机制)。
- Depthwise Conv (k): 逐通道卷积,计算量极小,负责捕捉局部上下文。
- Swish + BatchNorm: 标准化。
- 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。
核心优势
- 流式天然友好:它不需要像 AED 那样等整个句子结束才能解码(AED 的 Cross-Attention 需要全序列)。Transducer 是 Frame-synchronous 的。
- 极低的幻觉率: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 的逻辑:
- 输入音频波形。
- 随机 Mask 掉一部分时间片段。
- 让模型根据上下文猜测被 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 本章小结
- Conformer 是当前声学模型的标准答案,它用“三明治”结构解决了 Transformer 缺局部性、CNN 缺全局性的问题。
- Transducer (RNN-T) 凭借流式能力和联合优化机制,统治了端侧和即时通信场景。
- SSL (wav2vec2/HuBERT) 让我们不再依赖昂贵的标注数据,通过“完形填空”学到了通用的声学表征。
- 未来已来:这些 SSL 模型提取的特征或离散码,正是 MLLM 理解听觉世界的“神经信号”。
9.8 练习题
基础题
- 计算题:假设音频帧移为 10ms,下采样率为 4(即模型每输出一步对应原始 4 帧)。一段 10 秒的音频进入 Conformer Encoder 后,输出的序列长度 U 是多少?
- 概念辨析:在使用 wav2vec 2.0 进行微调时,为什么通常要加一个
LayerDrop机制? - Transducer:在 RNN-T 的 Joint Network 中,通常操作是单纯的相加(Add)还是拼接(Concat)?为什么现代实现倾向于使用简单的加法?
挑战题
- 架构设计:设计一个混合系统。场景是会议记录,要求:(1) 实时上屏(延迟<500ms),(2) 最终生成高精度纪要。你会如何组 Transducer, CTC 和 Attention-Decoder?提示:Two-pass decoding。
- SSL 深入:WavLM 论文中提到使用了 "Gated Relative Position Bias"。请解释这对于处理“重叠语音”(Overlap Speech)有什么潜在帮助?
- MLLM 桥接:如果你使用 HuBERT 的离散 token 作为 LLM 的输入,你会发现 token 序列非常长(50Hz 的帧率,10秒就是 500 token)。请提出两种缩短序列长度但不严重损失信息的策略。
点击查看参考答案
-
序列长度计算 * 总帧数 = 1000 帧。 * 下采样率为 4,输出 250 帧。
-
LayerDrop * 机制:在训练时随机跳过(Dropping)一些 Transformer 层。 * 目的:一种正则化手段,防止过深的网络过拟合;同时,它允许推理时根据算力需求剪裁层数(Structured Pruning),实现弹性部署。
-
Joint Network 操作 * 操作:现代实现(如 Pruned Transducer)倾向于 。 * 原因:加比拼接更省显存,且计算更快。在高维空间中,加法已经足够融合信息。
-
Two-pass Hybrid Design * First Pass (Streaming): 使用一个轻量级的流式 Transducer (Conformer-XS) 进行实时解码,结果直接上屏。 * Second Pass (Offline): 利用 First Pass 的中间结果或直接利用原始音频,使用一个大的非流式 Conformer-Large (CTC/AED 混合) 进行重打分 (Rescoring) 或重新解码。 * 关键:利用 Shared Encoder 的一部分层来减少计算重复。
-
Gated Relative Position Bias * 重叠语音意味着同一时刻有两个声源。普通的 Attention 可能会混淆它们。 * Gated Bias 允许模型根据当前的内容动态调整对位置的关注度,可能帮助模型“锁定”某一个说话人的相对位置模式,抑制另一个干扰源。
-
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)
-
Warmup 的生死攸关 * 现象: Conformer 训练刚开始 Loss 就变成 NaN,或者一直在震荡不下降。 * 原因: Transformer 结构没有归纳偏置,初始梯度非常大且不稳定。 * 解决: 必须使用 Warmup。前几千步(如 25000 steps)将学习率从 0 线性增加到 Peak,然后再衰减。不要一上来就给大 LR。
-
Transducer 的 Blank 陷阱 * 现象: 模型解码出来全是空(Blank),或者收敛极慢。 * 原因: 初始阶段,模型发现输出 Blank 是降低 Loss 最快的方法(因为 Blank 占绝大多数)。 * 解决: 初始化时给 Blank 的输出 logit 设置一个较小的偏置,或者限制 Blank 的连续输出长度(虽然现代 Loss 实现通常不需要手动干预,但需注意标签对应的 ID 是否正确映射)。
-
Relative PE 的坑 * 现象: 训练时 WER 很好,换个推理框架(比如转 ONNX/TensorRT)后全是乱码。 * 原因: 许多推理引擎对 Relative Position Encoding 的支持不完善,或者缓存(Cache)状态处理错误。 * 解决: 导出模型时,仔细检查是否支持 Cache-aware 的导出;或者在生产环境回退到 Rotary Embedding (RoPE) 等更通用的位置编码。
-
OOM (Out of Memory) 与显存碎片 * 现象: 音频长一点点就爆显存。 * 原因: PyTorch 的动态图机制处理变长音频时容易产生碎片;Transducer 的 4D Tensor 极大。 * 解决: * 对训练数据按时长排序(Bucket Batch Sampler),减少 Padding 浪费。 * 使用梯度累积(Gradient Accumulation)来模拟大 Batch。 * 开启
torch.cuda.empty_cache()(谨慎使用,影响速度) 或使用TORCH_CUDA_ALLOC_CONF调优。 -
多语种词表爆炸 * 现象: 做多语种 ASR,词表几万个,Softmax 层占了模型参数的一半。 * 解决: 使用 Byte-level BPE (如 BBPE) 或者使用 Shared Output Layer + Language Embedding。不要试图把所有汉字和生僻字都塞进 Output。