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的索引,并且输入是二维数据时,该类

  • 使用mode="sum"等同于Embedding后跟torch.sum(dim=1)

  • 使用mode="mean"等同于Embedding后再进行torch.mean(dim=1)操作。

  • 使用mode="max"等同于先进行Embedding操作,再执行torch.max(dim=1)

然而,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 的前向传播。

参数
  • 输入 (Tensor) – 包含嵌入矩阵索引的张量包。

  • offsets (Tensor, 可选) – 仅在 input 是一维时使用。offsets 确定 input 中每个包(序列)的起始索引位置。

  • per_sample_weights (Tensor, 可选) – 一个包含浮点数或双精度权重的张量,或者为 None 表示所有权重都应被视为 1。如果指定了 per_sample_weights,则其形状必须与输入完全相同,并且在不为 None 的情况下,offsets 也应与其一致。此功能仅支持 mode='sum' 模式。

返回值

张量的输出形状为 (B, embedding_dim)

返回类型

Tensor

注意

关于 inputoffsets 的几点说明:

  • inputoffsets 必须是相同的类型,即要么都是 int,要么都是 long

  • 如果input是形状为(B, N)的2D张量,它将被视为包含B个包(序列),每个包长度固定为N。根据mode参数,将返回B个聚合后的值。offsets在这种情况下会被忽略,并且必须设置为None

  • 如果 input 是一个形状为 (N) 的一维张量,它会被视为多个包(序列)的连接。offsets 需要是一个包含每个包在 input 中起始索引位置的一维张量。因此,对于形状为 (B)offsetsinput 将被视为包含 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

返回类型

EmbeddingBag

示例:

>>> # 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]])
本页目录