speechbrain.nnet.loss.transducer_loss 模块

Transducer 损失实现 (依赖于 numba)

作者
  • Abdelwahab Heba 2020

  • Titouan Parcollet 2023

摘要

Transducer

此类实现了使用前向-后向算法的 Transducer 损失计算,采用朴素实现:https://arxiv.org/pdf/1211.3711.pdf

TransducerLoss

此类实现了使用前向-后向算法的 Transducer 损失计算。

函数

cu_kernel_backward

使用 Numba cuda kernel 计算前向-后向算法的后向传播。

cu_kernel_compute_grad

使用 Numba cuda kernel 计算前向-后向算法的梯度。

cu_kernel_forward

使用 Numba cuda kernel 计算前向-后向算法的前向传播。

参考

speechbrain.nnet.loss.transducer_loss.cu_kernel_forward(log_probs, labels, alpha, log_p, T, U, blank, lock)[source]

使用 Numba cuda kernel 计算前向-后向算法的前向传播。采用朴素实现的序列转导:https://arxiv.org/pdf/1211.3711.pdf

参数:
  • log_probs (torch.Tensor) – 来自 Transducer 网络的 4D Tensor,形状为 (batch x TimeLength x LabelLength x outputDim)。

  • labels (torch.Tensor) – 2D Tensor,形状为 (batch x MaxSeqLabelLength),包含零填充的批次目标。

  • alpha (torch.Tensor) – 用于前向计算的 3D Tensor,形状为 (batch x TimeLength x LabelLength)。

  • log_p (torch.Tensor) – 用于前向成本计算的 1D Tensor,形状为 (batch)。

  • T (torch.Tensor) – 1D Tensor,形状为 (batch),包含每个目标的时间长度。

  • U (torch.Tensor) – 1D Tensor,形状为 (batch),包含每个目标的标签长度。

  • blank (int) – 空格符索引。

  • lock (torch.Tensor) – 用于并行计算的 2D Tensor,形状为 (batch x LabelLength),包含布尔值 (1-0) 锁。

speechbrain.nnet.loss.transducer_loss.cu_kernel_backward(log_probs, labels, beta, log_p, T, U, blank, lock)[source]

使用 Numba cuda kernel 计算前向-后向算法的后向传播。采用朴素实现的序列转导:https://arxiv.org/pdf/1211.3711.pdf

参数:
  • log_probs (torch.Tensor) – 来自 Transducer 网络的 4D Tensor,形状为 (batch x TimeLength x LabelLength x outputDim)。

  • labels (torch.Tensor) – 2D Tensor,形状为 (batch x MaxSeqLabelLength),包含零填充的批次目标。

  • beta (torch.Tensor) – 用于后向计算的 3D Tensor,形状为 (batch x TimeLength x LabelLength)。

  • log_p (torch.Tensor) – 用于后向成本计算的 1D Tensor,形状为 (batch)。

  • T (torch.Tensor) – 1D Tensor,形状为 (batch),包含每个目标的时间长度。

  • U (torch.Tensor) – 1D Tensor,形状为 (batch),包含每个目标的标签长度。

  • blank (int) – 空格符索引。

  • lock (torch.Tensor) – 用于并行计算的 2D Tensor,形状为 (batch x LabelLength),包含布尔值 (1-0) 锁。

speechbrain.nnet.loss.transducer_loss.cu_kernel_compute_grad(log_probs, labels, alpha, beta, grads, T, U, blank)[source]

使用 Numba cuda kernel 计算前向-后向算法的梯度。采用朴素实现的序列转导:https://arxiv.org/pdf/1211.3711.pdf

参数:
  • log_probs (torch.Tensor) – 来自 Transducer 网络的 4D Tensor,形状为 (batch x TimeLength x LabelLength x outputDim)。

  • labels (torch.Tensor) – 2D Tensor,形状为 (batch x MaxSeqLabelLength),包含零填充的批次目标。

  • alpha (torch.Tensor) – 用于后向计算的 3D Tensor,形状为 (batch x TimeLength x LabelLength)。

  • beta (torch.Tensor) – 用于后向计算的 3D Tensor,形状为 (batch x TimeLength x LabelLength)。

  • grads (torch.Tensor) – 用于后向计算的梯度。

  • T (torch.Tensor) – 1D Tensor,形状为 (batch),包含每个目标的时间长度。

  • U (torch.Tensor) – 1D Tensor,形状为 (batch),包含每个目标的标签长度。

  • blank (int) – 空格符索引。

class speechbrain.nnet.loss.transducer_loss.Transducer(*args, **kwargs)[source]

基类:Function

此类实现了使用前向-后向算法的 Transducer 损失计算,采用朴素实现:https://arxiv.org/pdf/1211.3711.pdf

此类使用 torch.autograd.Function。由于使用前向-后向算法,我们需要手动计算梯度。

此类别无法实例化,请参考 TransducerLoss 类

也可以直接使用 Transducer.apply 来使用此类

static forward(ctx, log_probs, labels, T, U, blank, reduction)[source]

计算 transducer 损失。

static backward(ctx, grad_output)[source]

transducer 损失的后向计算。

class speechbrain.nnet.loss.transducer_loss.TransducerLoss(blank=0, reduction='mean')[source]

基类:Module

此类实现了使用前向-后向算法的 Transducer 损失计算。采用朴素实现的序列转导:https://arxiv.org/pdf/1211.3711.pdf

TransducerLoss(nn.Module) 使用 Transducer(autograd.Function) 计算前向-后向损失和梯度。

输入张量必须在 CUDA 设备上。

参数:
  • blank (int) – 用作空格符的 Token。

  • reduction (str) – 要使用的归约类型,默认为 “mean”

示例

>>> import torch
>>> loss = TransducerLoss(blank=0)
>>> logits = torch.randn((1,2,3,5)).cuda().requires_grad_()
>>> labels = torch.Tensor([[1,2]]).cuda().int()
>>> act_length = torch.Tensor([2]).cuda().int()
>>> # U = label_length+1
>>> label_length = torch.Tensor([2]).cuda().int()
>>> l = loss(logits, labels, act_length, label_length)
>>> l.backward()
forward(logits, labels, T, U)[source]

计算 transducer 损失。