如何使用适配器自定义 Riva ASR 声学模型 (Conformer-CTC)#

本教程将引导您了解如何使用 NVIDIA NeMo 和适配器模块自定义 Riva ASR 声学模型 (Conformer-CTC)。

NVIDIA Riva 概述#

NVIDIA Riva 是一个 GPU 加速的 SDK,用于构建针对您的用例定制并提供实时性能的语音 AI 应用程序。
Riva 提供丰富的语音和自然语言理解 (NLU) 服务,例如

  • 自动语音识别 (ASR)

  • 文本到语音合成 (TTS)

  • 自然语言处理 (NLP) 服务集合,例如命名实体识别 (NER)、标点符号和意图分类。

在本教程中,我们将使用 NeMo 和适配器模块自定义 Riva ASR 声学模型 (Conformer)。
要了解 Riva ASR API 的基础知识,请参阅 使用 Python 入门 Riva ASR

有关 Riva 的更多信息,请参阅 Riva 开发者文档

神经模块 (NeMo)#

NVIDIA 神经模块 (NeMo) 工具包是一个开源框架,用于通过简单的 Python 界面构建、训练和微调 GPU 加速的语音 AI 和 NLU 模型。开发人员、研究人员和构建智能对话式 AI 应用程序和服务的软件合作伙伴可以自带数据来微调预训练模型,而无需经历从头开始训练模型的麻烦。

带有适配器的 ASR#

以下教程大量参考了 关于使用适配器进行 ASR 领域自适应的 NeMo 教程

我们建议并排打开这两个教程,以便通过使用目录有效地参考内容。

什么是适配器?#

适配器是可训练的神经网络模块,它们连接到预训练模型,这样我们就可以冻结原始模型的权重,而只训练适配器参数。这大大减少了自定义模型所需的数据量,同时限制了模型的词汇表不能更改。

简而言之,

  • 适配器模块在它们适配的每一层的输出上形成一个残差桥,这样模型的原始性能就不会丢失。

  • 模型的原始参数完全冻结,因此我们可以通过禁用所有适配器来恢复原始模型。

  • 我们只训练新的适配器参数(占参数总数的一小部分)。这允许使用极少量的数据和计算进行快速实验。


适配器是一个简单的概念,如下图所示。最简单的形式,它们是残差前馈层,将输入维度 (\(D\)) 压缩到小的瓶颈维度 (\(H\)),使得 \(R^D \text{->} R^H\),计算激活函数(例如 ReLU),最后使用另一个前馈层映射 \(R^H \text{->} R^D\)。然后将此输出通过残差连接添加到输入中。


适配器训练的优势和局限性#

适配器可以与有限的训练数据和计算预算一起使用,但是,它们限制了必须使用模型的原始词汇表。因此,不能使用新的字符集词汇表/分词器。

有关更多详细信息,请参阅 NeMo 教程适配器的优势适配器的局限性部分。

为适配器训练准备声学编码器#

预训练模型不会自动支持适配器模块,因此我们必须在创建模型之前准备声学编码器。此过程的步骤在 NeMo 教程准备“基础”模型部分中详细说明。

准备模型和数据集以进行适配#

在模型、数据加载器或优化方法的准备方面,微调和适配器训练之间几乎没有差异。

一个显着的区别是,无需更改预训练网络的词汇表,因此,无需构建新的分词器或更新字符词汇表。如果您的自定义数据集包含需要进行此类更改的标记(例如模型中不存在的标记),那么您需要预处理文本以删除此类标记,或者执行微调(这可能需要更多数据)。

另一个小的区别是频谱增强 (SpecAugment) 的使用。在微调期间,与模型使用数千小时的语音进行预训练时相比,数据量非常少,因此可能已使用 SpecAugment 来防止过拟合。对于适配器,我们建议首先禁用频谱增强,并尝试查看结果是否足够好,然后根据需要慢慢添加回去,以查看是否可以获得任何改进。

有关更多详细信息,请参阅 NeMo 教程设置模型的训练和评估部分,尤其是设置频谱增强部分。

创建和训练适配器#

NeMo 教程适配器:创建和准备部分详细介绍了如何为 LinearAdapter 创建配置对象,将其添加到预训练模型,然后冻结模型的原始参数以仅训练新参数。

所有这些只需几行代码,即可初始化您的模型,使其准备好在新语音数据上训练适配器。

评估模型#

由于适配器包含新参数并且本质上是动态的,因此可以在评估之前启用/禁用它们。NeMo 教程中的评估适配模型部分展示了如何加载模型、在模型中启用或禁用适配器、保存模型,然后使用一些数据对其进行评估。

适配器的训练方式是,如果禁用所有适配器,模型将恢复为预训练模型,这使您可以选择是在通用语音(使用原始预训练模型)上表现良好,还是在您的适配领域(启用适配器)上表现更好。

将模型导出到 Riva#

nemo2riva 命令行工具提供了将您的 .nemo 模型导出为可以使用 NVIDIA Riva 部署的格式的功能,NVIDIA Riva 是一个高性能应用程序框架,用于使用 GPU 的多模式对话式 AI 服务。nemo2riva 的 Python .whl 文件包含在 Riva Skills Quick Start 资源文件夹中。您还可以使用 pip 安装 nemo2riva,如 Conformer-CTC 微调教程中所示。

使用 nemo2riva,您可以按照 Riva 文档中的说明导出您训练的 NeMo 模型以在 Riva 中使用。

下一步是什么?#

您可以使用 NeMo 为您自己的应用程序构建自定义模型,或者您可以将自定义模型部署到 NVIDIA Riva