重要
您正在查看 NeMo 2.0 文档。此版本引入了 API 的重大更改和一个新库 NeMo Run。我们目前正在将所有功能从 NeMo 1.0 移植到 2.0。有关先前版本或 2.0 中尚不可用的功能的文档,请参阅 NeMo 24.07 文档。
神经模块#
NeMo 构建于神经模块之上,神经模块是神经网络的概念块,它接受类型化的输入并产生类型化的输出。这些模块通常表示数据层、编码器、解码器、语言模型、损失函数或组合激活的方法。NeMo 使组合和重用这些构建块变得容易,同时通过其神经类型系统提供一定程度的语义正确性检查。
注意
所有神经模块都继承自 ``torch.nn.Module``,因此与 PyTorch 生态系统兼容。
神经模块有 3 种类型
常规模块
数据集/可迭代数据集
损失函数
NeMo 中的每个神经模块都必须继承自 nemo.core.classes.module.NeuralModule 类。
- class nemo.core.classes.module.NeuralModule(*args: Any, **kwargs: Any)#
抽象类,提供所有 PyTorch 神经模块之间共享的接口。
每个神经模块都继承 nemo.core.classes.common.Typing
接口,并且需要为其输入和输出定义神经类型。这是通过定义两个属性来完成的:input_types
和 output_types
。每个属性应返回一个“端口名称”->“端口神经类型”对的有序字典。这是来自 ConvASREncoder
类的示例
@property
def input_types(self):
return OrderedDict(
{
"audio_signal": NeuralType(('B', 'D', 'T'), SpectrogramType()),
"length": NeuralType(tuple('B'), LengthsType()),
}
)
@property
def output_types(self):
return OrderedDict(
{
"outputs": NeuralType(('B', 'D', 'T'), AcousticEncodedRepresentation()),
"encoded_lengths": NeuralType(tuple('B'), LengthsType()),
}
)
@typecheck()
def forward(self, audio_signal, length=None):
...
- 上面的代码片段意味着
nemo.collections.asr.modules.conv_asr.ConvASREncoder
期望两个参数 第一个参数名为
audio_signal
,形状为[batch, dimension, time]
,元素表示频谱图值。第二个参数名为
length
,形状为[batch]
,元素表示相应信号的长度。
- 这也意味着
.forward(...)
和__call__(...)
方法各自产生两个输出 第一个输出形状为
[batch, dimension, time]
,但元素表示编码后的表示 (AcousticEncodedRepresentation
类)。第二个输出形状为
[batch]
,对应于它们的长度。
提示
在您的模块准备好供他人使用后,定义类型并将 @typecheck()
装饰器添加到您的 .forward()
方法是一个好习惯。
注意
.forward(...)
方法的输出将始终是 torch.Tensor
类型或张量容器,并且可以与任何其他 Pytorch 代码一起使用。类型信息附加到每个输出张量。如果将没有类型的张量传递给您的模块,它不会失败,但类型将不会被检查。因此,建议为您的所有模块定义输入/输出类型,从数据层开始,并将 @typecheck()
装饰器添加到它们。
注意
要临时禁用类型检查,您可以将您的代码括在 `with typecheck.disable_checks():`
语句中。
动态层冻结#
您可以通过在 config yaml 中指定冻结计划来选择性地冻结 Nemo 模型内的任何模块。冻结会停止对该模块的任何梯度更新,因此其权重在该步骤中不会更改。这对于对抗灾难性遗忘非常有用,例如在小数据集上微调大型预训练模型时。
默认方法是在前 N 个训练步骤中冻结模块,但您也可以为特定步骤范围启用冻结,例如,从步骤 20 到 100,甚至从某个 N 激活冻结直到训练结束。您也可以在整个训练过程中冻结模块。动态冻结是在训练步骤中指定的,而不是 epochs。
要启用冻结,请将以下内容添加到您的配置中
model:
...
freeze_updates:
enabled: true # set to false if you want to disable freezing
modules: # list all of the modules you want to have freezing logic for
encoder: 200 # module will be frozen for the first 200 training steps
decoder: [50, -1] # module will be frozen at step 50 and will remain frozen until training ends
joint: [10, 100] # module will be frozen between step 10 and step 100 (step >= 10 and step <= 100)
transcoder: -1 # module will be frozen for the entire training run