speechbrain.lobes.models.transformer.Conformer 模块

Conformer 实现。

作者

  • Jianyuan Zhong 2020

  • Samuele Cornell 2021

  • Sylvain de Langen 2023

  • Shucong Zhang 2024

摘要

ConformerDecoder

此类实现了 Transformer 解码器。

ConformerDecoderLayer

这是 Conformer 编码器层的实现。

ConformerEncoder

此类实现了 Conformer 编码器。

ConformerEncoderLayer

这是 Conformer 编码器层的实现。

ConformerEncoderLayerStreamingContext

ConformerEncoderLayer 的流式元数据和状态。

ConformerEncoderStreamingContext

ConformerEncoder 的流式元数据和状态。

ConvolutionModule

这是 Conformer 中卷积模块的实现。

参考

class speechbrain.lobes.models.transformer.Conformer.ConformerEncoderLayerStreamingContext(mha_left_context_size: int, mha_left_context: Tensor | None = None, dcconv_left_context: Tensor | None = None)[source]

基类:object

ConformerEncoderLayer 的流式元数据和状态。

多头注意力和动态分块卷积需要保存一些左上下文,这些上下文将作为左填充插入。

请参阅 ConvolutionModule 文档了解更多详细信息。

mha_left_context_size: int

对于此层,指定应保存多少输入帧。通常,所有层使用相同的值,但可以修改。

mha_left_context: Tensor | None = None

插入到当前块左侧作为多头注意力输入的左上下文。它可以是 None (如果我们处理第一个块) 或 <= mha_left_context_size,因为对于前几个块,可能没有足够的左上下文可用于填充。

dcconv_left_context: Tensor | None = None

根据动态分块卷积方法,插入到卷积左侧的左上下文。

mha_left_context 不同,这里的帧数固定,从卷积模块的核大小推断得出。

class speechbrain.lobes.models.transformer.Conformer.ConformerEncoderStreamingContext(dynchunktrain_config: DynChunkTrainConfig, layers: List[ConformerEncoderLayerStreamingContext])[source]

基类:object

ConformerEncoder 的流式元数据和状态。

dynchunktrain_config: DynChunkTrainConfig

包含块大小和上下文大小信息的动态分块训练配置。

layers: List[ConformerEncoderLayerStreamingContext]

编码器每一层的流式元数据和状态。

class speechbrain.lobes.models.transformer.Conformer.ConvolutionModule(input_size, kernel_size=31, bias=True, activation=<class 'speechbrain.nnet.activations.Swish'>, dropout=0.0, causal=False, dilation=1)[source]

基类:Module

这是 Conformer 中卷积模块的实现。

参数:
  • input_size (int) – 输入嵌入维度的期望大小。

  • kernel_size (int, 可选) – 非瓶颈卷积层的核大小。

  • bias (bool, 可选) – 是否在非瓶颈卷积层中使用偏置。

  • activation (torch.nn.Module) – 非瓶颈卷积层后使用的激活函数。

  • dropout (float, 可选) – Dropout 比率。

  • causal (bool, 可选) – 卷积是否应为因果的。

  • dilation (int, 可选) – 非瓶颈卷积层的膨胀系数。

示例

>>> import torch
>>> x = torch.rand((8, 60, 512))
>>> net = ConvolutionModule(512, 3)
>>> output = net(x)
>>> output.shape
torch.Size([8, 60, 512])
forward(x: Tensor, mask: Tensor | None = None, dynchunktrain_config: DynChunkTrainConfig | None = None)[source]

将卷积应用于输入张量 x

参数:
  • x (torch.Tensor) – 卷积模块的输入张量。

  • mask (torch.Tensor, 可选) – 如果指定,使用 masked_fill_ 应用于卷积输出的掩码。

  • dynchunktrain_config (DynChunkTrainConfig, 可选) – 如果指定,则使模块支持动态分块卷积 (DCConv),其实现方式类似于 Dynamic Chunk Convolution for Unified Streaming and Non-Streaming Conformer ASR。这允许掩码未来的帧,同时比完全因果卷积保持更好的准确性,但会稍微牺牲速度。这仅应用于训练 (或者,如果您知道自己在做什么,可用于推断时的掩码评估),因为推断时应使用流式前向传播函数。

返回:

out – 输出张量。

返回类型:

torch.Tensor

class speechbrain.lobes.models.transformer.Conformer.ConformerEncoderLayer(d_model, d_ffn, nhead, kernel_size=31, kdim=None, vdim=None, activation=<class 'speechbrain.nnet.activations.Swish'>, bias=True, dropout=0.0, causal=False, attention_type='RelPosMHAXL')[source]

基类:Module

这是 Conformer 编码器层的实现。

参数:
  • d_model (int) – 输入嵌入的期望大小。

  • d_ffn (int) – 自注意力前馈层的隐藏大小。

  • nhead (int) – 注意力头数。

  • kernel_size (int, 可选) – 卷积模型的核大小。

  • kdim (int, 可选) – 键的维度。

  • vdim (int, 可选) – 值的维度。

  • activation (torch.nn.Module) – 在每个 Conformer 层中使用的激活函数。

  • bias (bool, 可选) – 是否使用卷积模块。

  • dropout (int, 可选) – 编码器的 Dropout。

  • causal (bool, 可选) – 卷积是否应为因果的。

  • attention_type (str, 可选) – 注意力层类型,例如 regularMHA 表示普通多头注意力。

示例

>>> import torch
>>> x = torch.rand((8, 60, 512))
>>> pos_embs = torch.rand((1, 2*60-1, 512))
>>> net = ConformerEncoderLayer(d_ffn=512, nhead=8, d_model=512, kernel_size=3)
>>> output = net(x, pos_embs=pos_embs)
>>> output[0].shape
torch.Size([8, 60, 512])
forward(x, src_mask: Tensor | None = None, src_key_padding_mask: Tensor | None = None, pos_embs: Tensor | None = None, dynchunktrain_config: DynChunkTrainConfig | None = None)[source]
参数:
  • src (torch.Tensor) – 编码器层的输入序列。

  • src_mask (torch.Tensor, 可选) – src 序列的掩码。

  • src_key_padding_mask (torch.Tensor, 可选) – 每批次 src 键的掩码。

  • pos_embs (torch.Tensor, torch.nn.Module, 可选) – 包含输入序列位置嵌入的模块或张量

  • dynchunktrain_config (可选[DynChunkTrainConfig]) – 用于流式处理的动态分块训练配置对象,特别是在此处用于将动态分块卷积应用于卷积模块。

forward_streaming(x, context: ConformerEncoderLayerStreamingContext, pos_embs: Tensor | None = None)[source]

Conformer 层流式前向传播 (通常用于动态分块训练的模型),用于推断时。依赖于由 make_streaming_context 初始化的可变上下文对象,该对象应在不同块之间使用。由 ConformerEncoder.forward_streaming 调用。

参数:
  • x (torch.Tensor) – 此层的输入张量。只要上下文一致,就支持批处理。

  • context (ConformerEncoderStreamingContext) – 可变流式上下文;在调用之间应传递同一个对象。

  • pos_embs (torch.Tensor, 可选) – 位置嵌入,如果使用的话。

返回:

  • x (torch.Tensor) – 输出张量。

  • self_attn (list) – 自注意力值列表。

make_streaming_context(mha_left_context_size: int)[source]

为此编码层创建一个空白流式上下文。

参数:

mha_left_context_size (int) – 流式传输时应保存并用作当前块左上下文的左帧数

返回类型:

ConformerEncoderLayerStreamingContext

class speechbrain.lobes.models.transformer.Conformer.ConformerEncoder(num_layers, d_model, d_ffn, nhead, kernel_size=31, kdim=None, vdim=None, activation=<class 'speechbrain.nnet.activations.Swish'>, bias=True, dropout=0.0, causal=False, attention_type='RelPosMHAXL', output_hidden_states=False, layerdrop_prob=0.0)[source]

基类:Module

此类实现了 Conformer 编码器。

参数:
  • num_layers (int) – 层数。

  • d_model (int) – 嵌入维度大小。

  • d_ffn (int) – 自注意力前馈层的隐藏大小。

  • nhead (int) – 注意力头数。

  • kernel_size (int, 可选) – 卷积模型的核大小。

  • kdim (int, 可选) – 键的维度。

  • vdim (int, 可选) – 值的维度。

  • activation (torch.nn.Module) – 在每个 Conformer 层中使用的激活函数。

  • bias (bool, 可选) – 是否使用卷积模块。

  • dropout (int, 可选) – 编码器的 Dropout。

  • causal (bool, 可选) – 卷积是否应为因果的。

  • attention_type (str, 可选) – 注意力层类型,例如 regulaMHA 表示普通多头注意力。

  • output_hidden_states (bool, 可选) – 模型是否应将隐藏状态作为张量列表输出。

  • layerdrop_prob (float) – 丢弃整个层的概率。

示例

>>> import torch
>>> x = torch.rand((8, 60, 512))
>>> pos_emb = torch.rand((1, 2*60-1, 512))
>>> net = ConformerEncoder(1, 512, 512, 8)
>>> output, _ = net(x, pos_embs=pos_emb)
>>> output.shape
torch.Size([8, 60, 512])
>>> import torch
>>> from speechbrain.lobes.models.transformer.Conformer import ConformerEncoder
>>> x = torch.rand((8, 60, 512)); pos_emb = torch.rand((1, 2*60-1, 512));
>>> net = ConformerEncoder(4, 512, 512, 8, output_hidden_states=True)
>>> output, _, hs = net(x, pos_embs=pos_emb)
>>> hs[0].shape
torch.Size([8, 60, 512])
forward(src, src_mask: Tensor | None = None, src_key_padding_mask: Tensor | None = None, pos_embs: Tensor | None = None, dynchunktrain_config: DynChunkTrainConfig | None = None)[source]
参数:
  • src (torch.Tensor) – 编码器层的输入序列。

  • src_mask (torch.Tensor, 可选) – src 序列的掩码。

  • src_key_padding_mask (torch.Tensor, 可选) – 每批次 src 键的掩码。

  • pos_embs (torch.Tensor, torch.nn.Module,) – 包含输入序列位置嵌入的模块或张量。如果给定自定义 pos_embs,则其形状需要为 (1, 2*S-1, E),其中 S 是序列长度,E 是嵌入维度。

  • dynchunktrain_config (可选[DynChunkTrainConfig]) – 用于流式处理的动态分块训练配置对象,特别是在此处用于将动态分块卷积应用于卷积模块。

返回:

  • output (torch.Tensor) – Conformer 的输出。

  • attention_lst (list) – 注意力值。

  • hidden_state_lst (list, 可选) – 编码器隐藏层的输出。仅当 output_hidden_states 设置为 true 时有效。

forward_streaming(src: Tensor, context: ConformerEncoderStreamingContext, pos_embs: Tensor | None = None)[source]

Conformer 流式前向传播 (通常用于动态分块训练的模型),用于推断时。依赖于由 make_streaming_context 初始化的可变上下文对象,该对象应在不同块之间使用。

参数:
  • src (torch.Tensor) – 输入张量。只要上下文一致,就支持批处理。

  • context (ConformerEncoderStreamingContext) – 可变流式上下文;在调用之间应传递同一个对象。

  • pos_embs (torch.Tensor, 可选) – 位置嵌入,如果使用的话。

返回:

  • output (torch.Tensor) – 流式 Conformer 的输出。

  • attention_lst (list) – 注意力值。

make_streaming_context(dynchunktrain_config: DynChunkTrainConfig)[source]

为编码器创建一个空白流式上下文。

参数:

dynchunktrain_config (可选[DynChunkTrainConfig]) – 用于流式处理的动态分块训练配置对象

返回类型:

ConformerEncoderStreamingContext

class speechbrain.lobes.models.transformer.Conformer.ConformerDecoderLayer(d_model, d_ffn, nhead, kernel_size, kdim=None, vdim=None, activation=<class 'speechbrain.nnet.activations.Swish'>, bias=True, dropout=0.0, causal=True, attention_type='RelPosMHAXL')[source]

基类:Module

这是 Conformer 编码器层的实现。

参数:
  • d_model (int) – 输入嵌入的期望大小。

  • d_ffn (int) – 自注意力前馈层的隐藏大小。

  • nhead (int) – 注意力头数。

  • kernel_size (int, 可选) – 卷积模型的核大小。

  • kdim (int, 可选) – 键的维度。

  • vdim (int, 可选) – 值的维度。

  • activation (torch.nn.Module, 可选) – 在每个 Conformer 层中使用的激活函数。

  • bias (bool, 可选) – 是否使用卷积模块。

  • dropout (int, 可选) – 编码器的 Dropout。

  • causal (bool, 可选) – 卷积是否应为因果的。

  • attention_type (str, 可选) – 注意力层类型,例如 regularMHA 表示普通多头注意力。

示例

>>> import torch
>>> x = torch.rand((8, 60, 512))
>>> pos_embs = torch.rand((1, 2*60-1, 512))
>>> net = ConformerEncoderLayer(d_ffn=512, nhead=8, d_model=512, kernel_size=3)
>>> output = net(x, pos_embs=pos_embs)
>>> output[0].shape
torch.Size([8, 60, 512])
forward(tgt, memory, tgt_mask=None, memory_mask=None, tgt_key_padding_mask=None, memory_key_padding_mask=None, pos_embs_tgt=None, pos_embs_src=None)[source]
参数:
  • tgt (torch.Tensor) – 解码器层的输入序列。

  • memory (torch.Tensor) – 来自编码器最后一层的序列。

  • tgt_mask (torch.Tensor, 可选, 可选) – tgt 序列的掩码。

  • memory_mask (torch.Tensor, 可选) – memory 序列的掩码。

  • tgt_key_padding_mask (torch.Tensor, 可选) – 每批次 tgt 键的掩码。

  • memory_key_padding_mask (torch.Tensor, 可选) – 每批次 memory 键的掩码。

  • pos_embs_tgt (torch.Tensor, torch.nn.Module, 可选) – 包含每个注意力层目标序列位置嵌入的模块或张量。

  • pos_embs_src (torch.Tensor, torch.nn.Module, 可选) – 包含每个注意力层源序列位置嵌入的模块或张量。

返回:

  • x (torch.Tensor) – 输出张量

  • self_attn (torch.Tensor)

  • self_attn (torch.Tensor) – 自注意力张量

class speechbrain.lobes.models.transformer.Conformer.ConformerDecoder(num_layers, nhead, d_ffn, d_model, kdim=None, vdim=None, dropout=0.0, activation=<class 'speechbrain.nnet.activations.Swish'>, kernel_size=3, bias=True, causal=True, attention_type='RelPosMHAXL')[source]

基类:Module

此类实现了 Transformer 解码器。

参数:
  • num_layers (int) – 层数。

  • nhead (int) – 注意力头数。

  • d_ffn (int) – 自注意力前馈层的隐藏大小。

  • d_model (int) – 嵌入维度大小。

  • kdim (int, 可选) – 键的维度。

  • vdim (int, 可选) – 值的维度。

  • dropout (float, 可选) – Dropout 比率。

  • activation (torch.nn.Module, 可选) – 非瓶颈卷积层后使用的激活函数。

  • kernel_size (int, 可选) – 卷积层的核大小。

  • bias (bool, 可选) – 是否使用卷积模块。

  • causal (bool, 可选) – 卷积是否应为因果的。

  • attention_type (str, 可选) – 注意力层类型,例如 regularMHA 表示普通多头注意力。

示例

>>> src = torch.rand((8, 60, 512))
>>> tgt = torch.rand((8, 60, 512))
>>> net = ConformerDecoder(1, 8, 1024, 512, attention_type="regularMHA")
>>> output, _, _ = net(tgt, src)
>>> output.shape
torch.Size([8, 60, 512])
forward(tgt, memory, tgt_mask=None, memory_mask=None, tgt_key_padding_mask=None, memory_key_padding_mask=None, pos_embs_tgt=None, pos_embs_src=None)[source]
参数:
  • tgt (torch.Tensor) – 解码器层的输入序列。

  • memory (torch.Tensor) – 来自编码器最后一层的序列。

  • tgt_mask (torch.Tensor, 可选, 可选) – tgt 序列的掩码。

  • memory_mask (torch.Tensor, 可选) – memory 序列的掩码。

  • tgt_key_padding_mask (torch.Tensor, 可选) – 每批次 tgt 键的掩码。

  • memory_key_padding_mask (torch.Tensor, 可选) – 每批次 memory 键的掩码。

  • pos_embs_tgt (torch.Tensor, torch.nn.Module, 可选) – 包含每个注意力层目标序列位置嵌入的模块或张量。

  • pos_embs_src (torch.Tensor, torch.nn.Module, 可选) – 包含每个注意力层源序列位置嵌入的模块或张量。

返回:

  • output (torch.Tensor) – Conformer 解码器输出。

  • self_attns (list) – 自注意力位置。

  • multihead_attns (list) – 多头注意力位置。