来自 Flashlight Text(Flashlight 机器学习框架的一部分)的业界领先速度的集束搜索(Beam search)解码功能,现已在 TorchAudio 中提供官方支持。它为构建在 PyTorch 之上的语音和文本应用带来了高性能的集束搜索及文本工具。目前的集成支持 CTC 风格的解码,但它可用于任何输出随时间步变化的标记级概率分布的建模设置。
集束搜索简要回顾
在语音和语言处理中,集束搜索是一种高效的贪婪算法,它能够将连续值(即概率或得分)序列转换为图或序列(即标记、词片段、单词)。该算法可以使用可选约束(如词典)、可选外部评分(如对有效序列进行评分的语言模型)以及针对特定序列的其他得分调整。
在接下来的示例中,我们将考虑一个标记集 {ϵ, a, b},其中 ϵ 是一个特殊标记,我们可以将其想象为表示单词之间的空格或语音中的停顿。此处及下文的图形均取自 Awni Hannun 在 distill.pub 上关于 CTC 和集束搜索的优秀文章。

通过类似贪婪的方法,集束搜索在给定现有标记序列的情况下考虑下一个可行的标记——在上面的示例中,a, b, b 是有效序列,而 a, b, a 则不是。我们在集束搜索的每一步,根据评分函数对每个可能的下一个标记进行排名。评分函数 (s) 通常看起来类似于

其中 ŷ 是潜在的路径/标记序列,x 是输入(P(ŷ|x) 表示模型随时间变化的预测值),𝛼 是语言模型概率的权重(P(y) 是语言模型下该序列的概率)。一些评分函数添加了 𝜷,它根据预测序列的长度 |ŷ| 来调整分数。该特定的评分函数被用于 FAIR 在端到端 ASR 方面的前期工作中,且评分函数有许多变体,可在不同的应用领域中有所不同。
对于给定的特定序列,为了评估该序列中下一个可行的标记(可能受到一组允许的单词或序列(如词典)的约束),集束搜索算法会通过添加每个候选标记对序列进行评分,并根据这些分数对候选标记进行排序。为了提高效率,且由于路径数量随标记集大小呈指数增长,算法只保留得分最高的 top-k 个候选者——k 代表集束宽度(beam size)。

集束搜索的进行方式还有许多细微差别:例如,相似的假设序列可以被“合并”。
评分函数可以进一步增强,以对标记插入或长/短单词进行加权或降权。使用更强大的外部语言模型进行评分,虽然会增加计算成本,但也能显著提高性能;这通常被称为语言模型融合(LM fusion)。解码时还有许多其他参数可以调整——这些在 TorchAudio 的文档中有详细说明,并在 TorchAudio 的 ASR 推理教程中进行了深入探讨。由于解码效率相当高,参数可以轻松进行扫描和调优。
多年来,集束搜索已在 ASR 领域被广泛使用,相关文献不胜枚举,并在 wav2vec 2.0 和 NVIDIA 的 NeMo 等强大且近期的系统成果中得到了应用。
为什么选择集束搜索?
集束搜索仍然是较重型解码方法(如 Google 投入研发并已实现端侧部署,且在通用基准测试中表现强劲的 RNN-Transducer)的有力竞争者。大规模的自回归文本模型也能从集束搜索中获益。除其他优势外,集束搜索提供了:
- 灵活的性能/延迟权衡——通过调整集束宽度和外部语言模型,用户可以牺牲延迟来换取准确性,或者以少量的延迟成本换取更精确的结果。在没有外部语言模型的情况下进行解码,可以在几乎不增加性能成本的情况下改善结果。
- 无需重新训练的可移植性——现有的神经模型可以从多种解码设置中获益,并与外部语言模型即插即用,无需训练或微调。
- 令人信服的复杂性/准确性权衡——将集束搜索添加到现有的建模流水线中只需增加极少的复杂性,即可提升性能。
性能基准测试
目前最常用的支持外部语言模型集成的集束搜索解码库包括 Kensho 的 pyctcdecode 和 NVIDIA 的 NeMo 工具包。我们使用在 100 小时音频上训练并基于官方 KenLM 3-gram 语言模型、在 LibriSpeech dev-other 数据集上评估的 wav2vec 2.0 基础模型,将 TorchAudio + Flashlight 解码器与上述工具进行了对比。基准测试在 Intel E5-2698 CPU 的单线程上运行。所有计算均在内存中进行——KenLM 内存映射功能被禁用,因为它未得到广泛支持。
在进行基准测试时,我们测量的是达到 WER(词错误率)所需的时间——由于解码算法实现的细微差别以及参数与解码速度之间复杂的联系,不同运行之间的超参数有所不同。为了公平评估性能,我们首先扫描出能够达到基准 WER 的参数,并尽可能最小化集束宽度。

预训练 wav2vec 2.0 模型在 Librispeech dev-other 上的解码性能。在低 WER 时,TorchAudio + Flashlight 解码器的性能提升了一个数量级。

跨解码器的“达到 WER 所需时间”结果(优先选择较小的集束宽度)。TorchAudio + Flashlight 解码器在较大的集束宽度和较低的 WER 下扩展性要好得多。
TorchAudio API 和使用方法
TorchAudio 提供了一个用于 CTC 集束搜索解码的 Python API,支持以下功能:
- 基于词典和无词典解码
- KenLM n-gram 语言模型集成
- 字符和词片段解码
- 示例预训练 LibriSpeech KenLM 模型及相应的词典和标记文件
- 各种可自定义的集束搜索参数(集束宽度、剪枝阈值、语言模型权重等)
要设置解码器,请使用工厂函数 torchaudio.models.decoder.ctc_decoder
from torchaudio.models.decoder import ctc_decoder, download_pretrained_files
files = download_pretrained_files("librispeech-4-gram")
decoder = ctc_decoder(
lexicon=files.lexicon,
tokens=files.tokens,
lm=files.lm,
nbest=1,
... additional optional customizable args ...
)
给定形状为 (batch, time, num_tokens) 的发射值(emissions),解码器将计算并返回一个批处理列表(List of batch Lists),其中每个列表由对应于发射值的 nbest 假设组成。每个假设可以进一步分解为标记、单词(如果提供了词典)、得分和时间步组件。
emissions = acoustic_model(waveforms) # (B, T, N)
batch_hypotheses = decoder(emissions) # List[List[CTCHypothesis]]
# transcript for a lexicon decoder
transcripts = [" ".join(hypo[0].words) for hypo in batch_hypotheses]
# transcript for a lexicon free decoder, splitting by sil token
batch_tokens = [decoder.idxs_to_tokens(hypo[0].tokens) for hypo in batch_hypotheses]
transcripts = ["".join(tokens) for tokens in batch_tokens]
请参阅文档了解更多 API 详情,并查看教程(ASR 推理解码)或示例 推理脚本以获取更多使用示例。
即将推出的改进
完整的 NNLM 支持——使用大型神经语言模型(例如 Transformer)进行解码在大规模应用下仍有待探索。该功能已在 Flashlight 中得到支持,我们计划在 TorchAudio 中加入支持,允许用户使用自定义的解码器兼容语言模型。自定义单词级语言模型已在 TorchAudio 的每日构建版(nightly build)中可用,并计划在 TorchAudio 0.13 中正式发布。
自回归/seq2seq 解码——Flashlight Text 也支持自回归模型的 序列到序列 (seq2seq) 解码,我们希望为其添加绑定,并将其加入到 TorchAudio 和 TorchText 中,同时提供高效的 GPU 实现。
更好的构建支持——为了从 Flashlight Text 的改进中受益,TorchAudio 将直接将 Flashlight Text 作为子模块,以便更轻松地向上游提交修改和改进。这已在 TorchAudio 的每日构建版中生效,并计划在 TorchAudio 0.13 中正式发布。
引用
如需引用该解码器,请使用以下方式:
@inproceedings{kahn2022flashlight,
title={Flashlight: Enabling innovation in tools for machine learning},
author={Kahn, Jacob D and Pratap, Vineel and Likhomanenko, Tatiana and Xu, Qiantong and Hannun, Awni and Cai, Jeff and Tomasello, Paden and Lee, Ann and Grave, Edouard and Avidov, Gilad and others},
booktitle={International Conference on Machine Learning},
pages={10557--10574},
year={2022},
organization={PMLR}
}
@inproceedings{yang2022torchaudio,
title={Torchaudio: Building blocks for audio and speech processing},
author={Yang, Yao-Yuan and Hira, Moto and Ni, Zhaoheng and Astafurov, Artyom and Chen, Caroline and Puhrsch, Christian and Pollack, David and Genzel, Dmitriy and Greenberg, Donny and Yang, Edward Z and others},
booktitle={ICASSP 2022-2022 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)},
pages={6982--6986},
year={2022},
organization={IEEE}
}