EmbeddingBag
- classtorch.nn.EmbeddingBag(num_embeddings, embedding_dim, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, mode='mean', sparse=False, _weight=None, include_last_offset=False, padding_idx=None, device=None, dtype=None)[源代码]
-
计算嵌入“袋”的总和或平均值,无需生成中间嵌入。
对于长度固定的数据包,不包含
per_sample_weights
参数,没有等于padding_idx
的索引,并且输入是二维数据时,该类然而,
EmbeddingBag
在时间和内存效率上比使用这些操作的链式调用要高得多。EmbeddingBag 还允许将每样本权重作为前向传递的参数。这会在执行由
mode
指定的加权缩减之前,对 Embedding 的输出进行缩放处理。如果传入了per_sample_weights
参数,则唯一支持的mode
是"sum"
,它会根据per_sample_weights
计算加权和。- 参数
-
-
num_embeddings (int) – 嵌入词典的大小
-
embedding_dim (int) – 表示每个嵌入向量大小的整数
-
max_norm (float, optional) – 如果提供,每个范数大于
max_norm
的嵌入向量将被重新规范化为范数max_norm
。 -
norm_type (float, optional) – 用于计算
max_norm
选项的p范数中的 p值。默认为2
。 -
scale_grad_by_freq (bool, 可选) – 如果提供,将通过最小批量中单词频率的逆数来缩放梯度。默认值为
False
。注意:当mode="max"
时,此选项不被支持。 -
mode (str, optional) –
"sum"
,"mean"
或"max"
。指定减少袋中元素的方式。"sum"
计算加权和,考虑per_sample_weights
参数。"mean"
计算袋中值的平均值,"max"
计算每个袋中的最大值。默认值:"mean"
-
sparse (bool, optional) – 如果为
True
,则关于weight
矩阵的梯度将是一个稀疏张量。更多关于稀疏梯度的信息,请参见注意事项部分。注意:当mode="max"
时,此选项不被支持。 -
include_last_offset (bool, 可选) – 如果为
True
,则offsets
将包含一个额外的元素,该元素等于indices 的大小。这与 CSR 格式一致。 -
padding_idx (int, 可选) – 如果指定了
padding_idx
,则该索引位置的条目不会影响梯度计算;因此,在训练过程中,padding_idx
处的嵌入向量保持不变。对于新创建的 EmbeddingBag,padding_idx
处的初始值为全零向量,但可以更新为其他填充向量。需要注意的是,padding_idx
位置的嵌入向量在缩减操作中会被忽略。
-
- 变量
-
weight (Tensor) – 模块的可学习权重,形状为(num_embeddings, embedding_dim),从正态分布$\mathcal{N}(0, 1)$初始化。
示例:
>>> # an EmbeddingBag module containing 10 tensors of size 3 >>> embedding_sum = nn.EmbeddingBag(10, 3, mode='sum') >>> # a batch of 2 samples of 4 indices each >>> input = torch.tensor([1, 2, 4, 5, 4, 3, 2, 9], dtype=torch.long) >>> offsets = torch.tensor([0, 4], dtype=torch.long) >>> embedding_sum(input, offsets) tensor([[-0.8861, -5.4350, -0.0523], [ 1.1306, -2.5798, -1.0044]]) >>> # Example with padding_idx >>> embedding_sum = nn.EmbeddingBag(10, 3, mode='sum', padding_idx=2) >>> input = torch.tensor([2, 2, 2, 2, 4, 3, 2, 9], dtype=torch.long) >>> offsets = torch.tensor([0, 4], dtype=torch.long) >>> embedding_sum(input, offsets) tensor([[ 0.0000, 0.0000, 0.0000], [-0.7082, 3.2145, -2.6251]]) >>> # An EmbeddingBag can be loaded from an Embedding like so >>> embedding = nn.Embedding(10, 3, padding_idx=2) >>> embedding_sum = nn.EmbeddingBag.from_pretrained( embedding.weight, padding_idx=embedding.padding_idx, mode='sum')
- forward(input, offsets=None, per_sample_weights=None)[源代码]
-
EmbeddingBag 的前向传播。
- 参数
- 返回值
-
张量的输出形状为 (B, embedding_dim)。
- 返回类型
注意
关于
input
和offsets
的几点说明:-
input
和offsets
必须是相同的类型,即要么都是int
,要么都是long
。 -
如果
input
是形状为(B, N)的2D张量,它将被视为包含B
个包(序列),每个包长度固定为N
。根据mode
参数,将返回B
个聚合后的值。offsets
在这种情况下会被忽略,并且必须设置为None
。 -
如果
input
是一个形状为 (N) 的一维张量,它会被视为多个包(序列)的连接。offsets
需要是一个包含每个包在input
中起始索引位置的一维张量。因此,对于形状为 (B) 的offsets
,input
将被视为包含B
个包。空包(即长度为0)返回的向量将用零填充。
- classmethodfrom_pretrained(embeddings, freeze=True, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, mode='mean', sparse=False, include_last_offset=False, padding_idx=None)[源代码]
-
使用给定的二维 FloatTensor 创建 EmbeddingBag 实例。
- 参数
-
-
embeddings (Tensor) – 包含 EmbeddingBag 权重的 FloatTensor。第一维被传递给 EmbeddingBag 作为 ‘num_embeddings’,第二维作为 ‘embedding_dim’。
-
freeze (bool, 可选) – 如果为
True
,张量在学习过程中不会被更新。这相当于设置embeddingbag.weight.requires_grad = False
。默认值:True
-
max_norm (float, 可选) – 请参阅模块初始化文档。默认值:
None
-
norm_type (float, optional) – 请参阅模块初始化文档,默认值为
2
。 -
scale_grad_by_freq (bool, optional) – 详情请参阅模块初始化文档。默认值为
False
。 -
mode (str, optional) – 请参阅模块初始化文档。默认值:
"mean"
-
sparse (bool, 可选) – 请参阅模块初始化文档。默认值:
False
。 -
include_last_offset (bool, optional) – 请参阅模块初始化文档。默认值:
False
。 -
padding_idx (int, optional) – 请参阅模块初始化文档。默认值:
None
。
-
- 返回类型
示例:
>>> # FloatTensor containing pretrained weights >>> weight = torch.FloatTensor([[1, 2.3, 3], [4, 5.1, 6.3]]) >>> embeddingbag = nn.EmbeddingBag.from_pretrained(weight) >>> # Get embeddings for index 1 >>> input = torch.LongTensor([[1, 0]]) >>> embeddingbag(input) tensor([[ 2.5000, 3.7000, 4.6500]])