paddlespeech.s2t.modules.attention 模块
多头注意力层的定义。
- class paddlespeech.s2t.modules.attention.MultiHeadedAttention(n_head: int, n_feat: int, dropout_rate: float)[来源]
基础:
Layer多头注意力层。
方法
__call__(*inputs, **kwargs)将self作为一个函数调用。
add_parameter(name, parameter)添加一个参数实例。
add_sublayer(name, sublayer)添加一个子层实例。
apply(fn)递归地将
fn应用到每个子层(由.sublayers()返回)以及自身。buffers([include_sublayers])返回当前层及其子层中的所有缓冲区的列表。
children()返回一个迭代器,遍历直接子层。
clear_gradients()清除此层所有参数的梯度。
create_parameter(shape[, attr, dtype, ...])为该层创建参数。
create_tensor([name, persistable, dtype])为该层创建张量。
create_variable([name, persistable, dtype])为该层创建张量。
eval()将该层及其所有子层设置为评估模式。
extra_repr()该层的额外表示,您可以自定义实现自己的层。
forward(query, key, value[, mask, ...])计算缩放点积注意力。 参数: query (paddle.Tensor): 查询张量 (#batch, time1, size)。 key (paddle.Tensor): 键张量 (#batch, time2, size)。 value (paddle.Tensor): 值张量 (#batch, time2, size)。 mask (paddle.Tensor): 掩码张量 (#batch, 1, time2) 或 (#batch, time1, time2)。 1. 当在解码器与编码器之间应用交叉注意力时,输入的批次填充掩码形状为 (#batch, 1, T)。 2. 当应用编码器的自注意力时,掩码的形状为 (#batch, T, T)。 3. 当应用解码器的自注意力时,掩码的形状为 (#batch, L, L)。 4. 如果解码器中的不同位置看到编码器的不同块,例如 Mocha,传入的掩码可以具有 (#batch, L, T) 的形状。但在当前的 Wenet 中没有这种情况。 cache (paddle.Tensor): 缓存张量 (1, head, cache_t, d_k * 2), 其中 cache_t == chunk_size * num_decoding_left_chunks 并且 head * d_k == size 返回: paddle.Tensor: 输出张量 (#batch, time1, d_model)。 paddle.Tensor: 缓存张量 (1, head, cache_t + time1, d_k * 2) 其中 cache_t == chunk_size * num_decoding_left_chunks 并且 head * d_k == size。
forward_attention(value, scores[, mask, ...])计算注意力上下文向量。 参数: value (paddle.Tensor): 转换后的值,大小为 (#batch, n_head, time2, d_k)。 scores (paddle.Tensor): 注意力分数,大小为 (#batch, n_head, time1, time2)。 mask (paddle.Tensor): 掩码,大小为 (#batch, 1, time2) 或 (#batch, time1, time2),(0, 0, 0) 表示虚假掩码。 返回: paddle.Tensor: 经注意力分数加权的转换值 (#batch, time1, d_model) (#batch, time1, time2)。
forward_qkv(query, key, value)转换查询、键和值。参数: query (paddle.Tensor): 查询张量 (#batch, time1, size)。 key (paddle.Tensor): 键张量 (#batch, time2, size)。 value (paddle.Tensor): 值张量 (#batch, time2, size)。 返回: paddle.Tensor: 转换后的查询张量,大小 (#batch, n_head, time1, d_k)。 paddle.Tensor: 转换后的键张量,大小 (#batch, n_head, time2, d_k)。 paddle.Tensor: 转换后的值张量,大小 (#batch, n_head, time2, d_k)。
full_name()此层的完整名称,由 name_scope + "/" + MyLayer.__class__.__name__ 组成
load_dict(state_dict[, use_structured_name])从 state_dict 设置参数和可持久化缓存。
named_buffers([prefix, include_sublayers])返回一个迭代器,遍历层中的所有缓冲区,生成名称和张量的元组。
named_children()返回一个直接子层的迭代器,同时提供层的名称和层本身。
named_parameters([prefix, include_sublayers])返回一个迭代器,遍历层中的所有参数,生成名称和参数的元组。
named_sublayers([prefix, include_self, ...])返回Layer中所有子层的迭代器,生成名称和子层的元组。
parameters([include_sublayers])返回当前层及其子层的所有参数的列表。
register_buffer(name, tensor[, persistable])将一个张量注册为该层的缓冲区。
register_forward_post_hook(hook)为层注册一个前向后钩子。
register_forward_pre_hook(hook)为层注册一个前向预钩子。
set_dict(state_dict[, use_structured_name])从 state_dict 设置参数和可持久化的缓冲区。
set_state_dict(state_dict[, use_structured_name])从state_dict设置参数和持久化缓冲区。
state_dict([destination, include_sublayers, ...])获取当前层及其子层的所有参数和可持久化缓冲区。
sublayers([include_self])返回子层的列表。
to([device, dtype, blocking])通过给定的设备、数据类型和阻塞方式转换层的参数和缓冲区。
to_static_state_dict([destination, ...])获取当前层及其子层的所有参数和缓冲区。
train()将此层及其所有子层设置为训练模式。
向后
注册状态字典钩子
- forward(query: ~paddle.Tensor, key: ~paddle.Tensor, value: ~paddle.Tensor, mask: ~paddle.Tensor = Tensor(shape=[0, 0, 0], dtype=bool, place=Place(cpu), stop_gradient=True, []), pos_emb: ~paddle.Tensor = Tensor(shape=[0], dtype=float32, place=Place(cpu), stop_gradient=True, []), cache: ~paddle.Tensor = Tensor(shape=[0, 0, 0, 0], dtype=float32, place=Place(cpu), stop_gradient=True, [])) Tuple[Tensor, Tensor][来源]
计算缩放点积注意力。
参数:
query (paddle.Tensor): 查询张量 (#batch, time1, size). key (paddle.Tensor): 键张量 (#batch, time2, size). value (paddle.Tensor): 值张量 (#batch, time2, size). mask (paddle.Tensor): 掩码张量 (#batch, 1, time2) 或
(#batch, time1, time2). 1.当在解码器和编码器之间应用交叉注意力时,输入的批处理填充掩码形状为 (#batch, 1, T)。 2.当应用编码器的自注意力时,掩码的形状为 (#batch, T, T)。 3.当应用解码器的自注意力时,掩码的形状为 (#batch, L, L)。 4.如果解码器的不同位置看到编码器的不同块,例如 Mocha,传入的掩码可以是 (#batch, L, T) 形状。但在当前的 Wenet 中没有这样的情况。
- cache (paddle.Tensor): Cache tensor (1, head, cache_t, d_k * 2),
其中 cache_t == chunk_size * num_decoding_left_chunks 和 head * d_k == size
- Returns:
paddle.Tensor: 输出张量 (#batch, time1, d_model). paddle.Tensor: 缓存张量 (1, head, cache_t + time1, d_k * 2)
其中 cache_t == chunk_size * num_decoding_left_chunks 和 head * d_k == size
- forward_attention(value: ~paddle.Tensor, scores: ~paddle.Tensor, mask: ~paddle.Tensor = Tensor(shape=[0, 0, 0], dtype=bool, place=Place(cpu), stop_gradient=True, [])) Tensor[来源]
计算注意力上下文向量。
参数:
- value (paddle.Tensor): Transformed value, size
(#batch, n_head, time2, d_k).
- scores (paddle.Tensor): Attention score, size
(#batch, n_head, time1, time2).
- mask (paddle.Tensor): Mask, size (#batch, 1, time2) or
(#batch, time1, time2), (0, 0, 0) 意味着假掩码。
- Returns:
- paddle.Tensor: Transformed value (#batch, time1, d_model)
根据注意力得分加权 (#batch, time1, time2)。
- forward_qkv(query: Tensor, key: Tensor, value: Tensor) Tuple[Tensor, Tensor, Tensor][来源]
转换查询、键和值。
参数:query (paddle.Tensor): 查询张量 (#batch, time1, size). key (paddle.Tensor): 键张量 (#batch, time2, size). value (paddle.Tensor): 值张量 (#batch, time2, size).
- Returns:
- paddle.Tensor: Transformed query tensor, size
(#batch, n_head, time1, d_k).
- paddle.Tensor: Transformed key tensor, size
(#batch, n_head, time2, d_k).
- paddle.Tensor: Transformed value tensor, size
(#batch, n_head, time2, d_k).
- class paddlespeech.s2t.modules.attention.RelPositionMultiHeadedAttention(n_head, n_feat, dropout_rate, adaptive_scale=False, init_weights=False)[来源]
-
具有相对位置编码的多头注意力层。
方法
__call__(*inputs, **kwargs)将self作为一个函数调用。
add_parameter(name, parameter)添加一个参数实例。
add_sublayer(name, sublayer)添加一个子层实例。
apply(fn)递归地将
fn应用到每个子层(由.sublayers()返回)以及自身。buffers([include_sublayers])返回当前层及其子层中的所有缓冲区的列表。
children()返回一个迭代器,遍历直接子层。
clear_gradients()清除此层所有参数的梯度。
create_parameter(shape[, attr, dtype, ...])为该层创建参数。
create_tensor([name, persistable, dtype])为该层创建张量。
create_variable([name, persistable, dtype])为该层创建张量。
eval()将该层及其所有子层设置为评估模式。
extra_repr()该层的额外表示,您可以自定义实现自己的层。
forward(query, key, value[, mask, ...])计算“缩放点积注意力”,带有相对位置编码。参数: query (paddle.Tensor): 查询张量 (#batch, time1, size)。 key (paddle.Tensor): 键张量 (#batch, time2, size)。 value (paddle.Tensor): 值张量 (#batch, time2, size)。 mask (paddle.Tensor): 掩码张量 (#batch, 1, time2) 或 (#batch, time1, time2),(0, 0, 0)表示虚假掩码。 pos_emb (paddle.Tensor): 位置嵌入张量 (#batch, time2, size)。 cache (paddle.Tensor): 缓存张量 (1, head, cache_t, d_k * 2),其中 cache_t == chunk_size * num_decoding_left_chunks 和 head * d_k == size 返回: paddle.Tensor: 输出张量 (#batch, time1, d_model)。 paddle.Tensor: 缓存张量 (1, head, cache_t + time1, d_k * 2),其中 cache_t == chunk_size * num_decoding_left_chunks 和 head * d_k == size。
forward_attention(value, scores[, mask, ...])计算注意力上下文向量。 参数: value (paddle.Tensor): 转换后的值,大小 (#batch, n_head, time2, d_k)。 scores (paddle.Tensor): 注意力得分,大小 (#batch, n_head, time1, time2)。 mask (paddle.Tensor): 掩码,大小 (#batch, 1, time2) 或 (#batch, time1, time2),(0, 0, 0) 表示假掩码。 返回: paddle.Tensor: 转换后的值 (#batch, time1, d_model) 按照注意力得分加权 (#batch, time1, time2)。
forward_qkv(query, key, value)转换查询、键和值。参数: query (paddle.Tensor): 查询张量 (#batch, time1, size)。 key (paddle.Tensor): 键张量 (#batch, time2, size)。 value (paddle.Tensor): 值张量 (#batch, time2, size)。 返回: paddle.Tensor: 转换后的查询张量,大小 (#batch, n_head, time1, d_k)。 paddle.Tensor: 转换后的键张量,大小 (#batch, n_head, time2, d_k)。 paddle.Tensor: 转换后的值张量,大小 (#batch, n_head, time2, d_k)。
full_name()此层的完整名称,由 name_scope + "/" + MyLayer.__class__.__name__ 组成
load_dict(state_dict[, use_structured_name])从 state_dict 设置参数和可持久化缓存。
named_buffers([prefix, include_sublayers])返回一个迭代器,遍历层中的所有缓冲区,生成名称和张量的元组。
named_children()返回一个直接子层的迭代器,同时提供层的名称和层本身。
named_parameters([prefix, include_sublayers])返回一个迭代器,遍历层中的所有参数,生成名称和参数的元组。
named_sublayers([prefix, include_self, ...])返回Layer中所有子层的迭代器,生成名称和子层的元组。
parameters([include_sublayers])返回当前层及其子层的所有参数的列表。
register_buffer(name, tensor[, persistable])将一个张量注册为该层的缓冲区。
register_forward_post_hook(hook)为层注册一个前向后钩子。
register_forward_pre_hook(hook)为层注册一个前向预钩子。
rel_shift(x[, zero_triu])计算相对位置编码。 参数: x (paddle.Tensor): 输入张量 (batch, head, time1, time1)。 zero_triu (bool): 如果为真,返回矩阵的下三角部分。 返回: paddle.Tensor: 输出张量。(batch, head, time1, time1)。
set_dict(state_dict[, use_structured_name])从 state_dict 设置参数和可持久化的缓冲区。
set_state_dict(state_dict[, use_structured_name])从state_dict设置参数和持久化缓冲区。
state_dict([destination, include_sublayers, ...])获取当前层及其子层的所有参数和可持久化缓冲区。
sublayers([include_self])返回子层的列表。
to([device, dtype, blocking])通过给定的设备、数据类型和阻塞方式转换层的参数和缓冲区。
to_static_state_dict([destination, ...])获取当前层及其子层的所有参数和缓冲区。
train()将此层及其所有子层设置为训练模式。
向后
初始化权重
注册状态字典钩子
- forward(query: ~paddle.Tensor, key: ~paddle.Tensor, value: ~paddle.Tensor, mask: ~paddle.Tensor = Tensor(shape=[0, 0, 0], dtype=bool, place=Place(cpu), stop_gradient=True, []), pos_emb: ~paddle.Tensor = Tensor(shape=[0], dtype=float32, place=Place(cpu), stop_gradient=True, []), cache: ~paddle.Tensor = Tensor(shape=[0, 0, 0, 0], dtype=float32, place=Place(cpu), stop_gradient=True, [])) Tuple[Tensor, Tensor][来源]
计算 '缩放点积注意力' 及相对位置编码。
参数:query (paddle.Tensor): 查询张量 (#batch, time1, size). key (paddle.Tensor): 键张量 (#batch, time2, size). value (paddle.Tensor): 值张量 (#batch, time2, size). mask (paddle.Tensor): 掩码张量 (#batch, 1, time2) 或
(#batch, time1, time2), (0, 0, 0) 意味着假掩码。
- pos_emb (paddle.Tensor): Positional embedding tensor
(#batch, time2, size).
- cache (paddle.Tensor): Cache tensor (1, head, cache_t, d_k * 2),
其中 cache_t == chunk_size * num_decoding_left_chunks 和 head * d_k == size
- Returns:
paddle.Tensor: 输出张量 (#batch, time1, d_model). paddle.Tensor: 缓存张量 (1, head, cache_t + time1, d_k * 2)
其中 cache_t == chunk_size * num_decoding_left_chunks 和 head * d_k == size
- class paddlespeech.s2t.modules.attention.RoPERelPositionMultiHeadedAttention(n_head, n_feat, dropout_rate, adaptive_scale=False, init_weights=False)[来源]
-
具有RoPE相对位置编码的多头注意力层。
方法
__call__(*inputs, **kwargs)将self作为一个函数调用。
add_parameter(name, parameter)添加一个参数实例。
add_sublayer(name, sublayer)添加一个子层实例。
align(tensor, axes[, ndim])重新对齐tensor(批量版expand_dims) axes:原来的第i维对齐新tensor的第axes[i]维; ndim:新tensor的维度。
apply(fn)递归地将
fn应用到每个子层(由.sublayers()返回)以及自身。apply_rotary_position_embeddings(sinusoidal, ...)应用RoPE到tensors中 其中,sinusoidal.shape=[B, T, D],tensors为tensor的列表,而 tensor.shape=[B, T, ..., D], or (B,H,T,D/H)
buffers([include_sublayers])返回当前层及其子层中的所有缓冲区的列表。
children()返回一个迭代器,遍历直接子层。
clear_gradients()清除此层所有参数的梯度。
create_parameter(shape[, attr, dtype, ...])为该层创建参数。
create_tensor([name, persistable, dtype])为该层创建张量。
create_variable([name, persistable, dtype])为该层创建张量。
eval()将该层及其所有子层设置为评估模式。
extra_repr()该层的额外表示,您可以自定义实现自己的层。
forward(query, key, value[, mask, ...])计算“缩放点积注意力”带有相对位置编码。参考: https://github.com/facebookresearch/llama/blob/main/llama/model.py 参数: query (paddle.Tensor): 查询张量 (#batch, time1, size)。 key (paddle.Tensor): 键张量 (#batch, time2, size)。 value (paddle.Tensor): 值张量 (#batch, time2, size)。 mask (paddle.Tensor): 掩码张量 (#batch, 1, time2) 或 (#batch, time1, time2), (0, 0, 0) 表示假掩码。 pos_emb (paddle.Tensor): 位置嵌入张量 (#batch, time2, size)。 cache (paddle.Tensor): 缓存张量 (1, head, cache_t, d_k * 2),其中 cache_t == chunk_size * num_decoding_left_chunks 和 head * d_k == size 返回: paddle.Tensor: 输出张量 (#batch, time1, d_model)。 paddle.Tensor: 缓存张量 (1, head, cache_t + time1, d_k * 2) 其中 cache_t == chunk_size * num_decoding_left_chunks 和 head * d_k == size.
forward_attention(value, scores[, mask, ...])计算注意力上下文向量。 参数: value (paddle.Tensor): 转换后的值,大小 (#batch, n_head, time2, d_k)。 scores (paddle.Tensor): 注意力得分,大小 (#batch, n_head, time1, time2)。 mask (paddle.Tensor): 掩码,大小 (#batch, 1, time2) 或 (#batch, time1, time2),(0, 0, 0) 表示假掩码。 返回: paddle.Tensor: 转换后的值 (#batch, time1, d_model) 按照注意力得分加权 (#batch, time1, time2)。
forward_qkv(query, key, value)转换查询、关键字和值。参数: query (paddle.Tensor): 查询张量 (#batch, time1, size)。 key (paddle.Tensor): 关键字张量 (#batch, time2, size)。 value (paddle.Tensor): 值张量 (#batch, time2, size)。 返回: paddle.Tensor: 转换后的查询张量,大小 (#batch, n_head, time1, d_k)。 paddle.Tensor: 转换后的关键字张量,大小 (#batch, n_head, time2, d_k)。 paddle.Tensor: 转换后的值张量,大小 (#batch, n_head, time2, d_k)。
full_name()此层的完整名称,由 name_scope + "/" + MyLayer.__class__.__name__ 组成
load_dict(state_dict[, use_structured_name])从 state_dict 设置参数和可持久化缓存。
named_buffers([prefix, include_sublayers])返回一个迭代器,遍历层中的所有缓冲区,生成名称和张量的元组。
named_children()返回一个直接子层的迭代器,同时提供层的名称和层本身。
named_parameters([prefix, include_sublayers])返回一个迭代器,遍历层中的所有参数,生成名称和参数的元组。
named_sublayers([prefix, include_self, ...])返回Layer中所有子层的迭代器,生成名称和子层的元组。
parameters([include_sublayers])返回当前层及其子层的所有参数的列表。
register_buffer(name, tensor[, persistable])将一个张量注册为该层的缓冲区。
register_forward_post_hook(hook)为层注册一个前向后钩子。
register_forward_pre_hook(hook)为层注册一个前向预钩子。
set_dict(state_dict[, use_structured_name])从 state_dict 设置参数和可持久化的缓冲区。
set_state_dict(state_dict[, use_structured_name])从state_dict设置参数和持久化缓冲区。
state_dict([destination, include_sublayers, ...])获取当前层及其子层的所有参数和可持久化缓冲区。
sublayers([include_self])返回子层的列表。
to([device, dtype, blocking])通过给定的设备、数据类型和阻塞方式转换层的参数和缓冲区。
to_static_state_dict([destination, ...])获取当前层及其子层的所有参数和缓冲区。
train()将此层及其所有子层设置为训练模式。
向后
注册状态字典钩子
- align(tensor: Tensor, axes: List[int], ndim=None)[来源]
重新对齐tensor(批量版expand_dims) axes:原来的第i维对齐新tensor的第axes[i]维; ndim:新tensor的维度。
- apply_rotary_position_embeddings(sinusoidal, *tensors)[来源]
应用RoPE到tensors中 其中,sinusoidal.shape=[B, T, D],tensors为tensor的列表,而 tensor.shape=[B, T, ..., D], or (B,H,T,D/H)
- forward(query: ~paddle.Tensor, key: ~paddle.Tensor, value: ~paddle.Tensor, mask: ~paddle.Tensor = Tensor(shape=[0, 0, 0], dtype=bool, place=Place(cpu), stop_gradient=True, []), pos_emb: ~paddle.Tensor = Tensor(shape=[0], dtype=float32, place=Place(cpu), stop_gradient=True, []), cache: ~paddle.Tensor = Tensor(shape=[0, 0, 0, 0], dtype=float32, place=Place(cpu), stop_gradient=True, [])) Tuple[Tensor, Tensor][来源]
计算“缩放点积注意力”与相对位置编码。 参考: https://github.com/facebookresearch/llama/blob/main/llama/model.py 参数:
query (paddle.Tensor): 查询张量 (#batch, time1, size). key (paddle.Tensor): 键张量 (#batch, time2, size). value (paddle.Tensor): 值张量 (#batch, time2, size). mask (paddle.Tensor): 掩码张量 (#batch, 1, time2) 或
(#batch, time1, time2), (0, 0, 0) 意味着假掩码。
- pos_emb (paddle.Tensor): Positional embedding tensor
(#batch, time2, size).
- cache (paddle.Tensor): Cache tensor (1, head, cache_t, d_k * 2),
其中 cache_t == chunk_size * num_decoding_left_chunks 和 head * d_k == size
- Returns:
paddle.Tensor: 输出张量 (#batch, time1, d_model). paddle.Tensor: 缓存张量 (1, head, cache_t + time1, d_k * 2)
其中 cache_t == chunk_size * num_decoding_left_chunks 和 head * d_k == size