Shortcuts

EmbeddingBag

class torch.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的索引,并且使用2D输入,此类

  • 使用 mode="sum" 等同于先进行 Embedding 然后再进行 torch.sum(dim=1)

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

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

然而,EmbeddingBag 比使用这些操作的链式组合要高效得多,无论是时间还是内存方面。

EmbeddingBag 还支持在向前传递时作为参数的每个样本权重。这会在执行加权缩减之前缩放嵌入的输出,缩减方式由 mode 指定。如果传递了 per_sample_weights,则唯一支持的 mode"sum",它根据 per_sample_weights 计算加权和。

Parameters
  • num_embeddings (int) – 嵌入字典的大小

  • embedding_dim (int) – 每个嵌入向量的大小

  • max_norm (浮点数, 可选) – 如果给出,每个范数大于 max_norm 的嵌入向量将被重新归一化,使其范数为 max_norm

  • norm_type (float, 可选) – 用于 max_norm 选项的 p-范数的 p 值。默认值为 2

  • scale_grad_by_freq (布尔值, 可选) – 如果给出,这将按小批量中单词的频率的倒数来缩放梯度。默认值为 False。 注意:当 mode="max" 时,此选项不受支持。

  • 模式 (字符串, 可选) – "sum", "mean""max"。指定减少袋子的方式。 "sum" 计算加权和,考虑 per_sample_weights"mean" 计算袋子中值的平均值, "max" 计算每个袋子的最大值。 默认值:"mean"

  • sparse (布尔值, 可选) – 如果 True,相对于 weight 矩阵的梯度将是一个稀疏张量。有关稀疏梯度的更多详细信息,请参阅注释。注意:当 mode="max" 时,此选项不受支持。

  • include_last_offset (布尔值, 可选) – 如果 True, offsets 有一个额外的元素,其中最后一个元素 相当于 indices 的大小。这与 CSR 格式相匹配。

  • padding_idx (int, 可选) – 如果指定,padding_idx 处的条目不会对梯度做出贡献;因此,在训练期间,padding_idx 处的嵌入向量不会更新,即它保持为固定的“填充”。对于新构造的 EmbeddingBag,padding_idx 处的嵌入向量将默认为全零,但可以更新为另一个值以用作填充向量。请注意,padding_idx 处的嵌入向量不参与归约。

Variables

权重 (张量) – 模块的可学习权重,形状为 (num_embeddings, embedding_dim)N(0,1)\mathcal{N}(0, 1) 初始化。

示例:

>>> # 一个包含10个大小为3的张量的EmbeddingBag模块
>>> embedding_sum = nn.EmbeddingBag(10, 3, mode='sum')
>>> # 一个包含2个样本的批次,每个样本有4个索引
>>> 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]])

>>> # 带有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]])

>>> # 可以从Embedding加载EmbeddingBag,如下所示
>>> 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 的前向传播。

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

  • 偏移量 (张量, 可选) – 仅在 输入 为1D时使用。偏移量 决定了每个包(序列)在 输入 中的起始索引位置。

  • per_sample_weights (Tensor, 可选) – 一个浮点数/双精度权重的张量,或者为None 以表示所有权重应被视为1。如果指定,per_sample_weights 必须与输入具有完全相同的形状,并且如果这些形状不为None,则被视为具有相同的 offsets。仅支持mode='sum'

Returns

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

Return type

张量

注意

关于inputoffsets的几点说明:

  • inputoffsets 必须是相同类型,可以是 int 或 long

  • 如果 input 是形状为 (B, N) 的二维数组,它将被视为 B 个袋子(序列),每个袋子的固定长度为 N,并且这将返回以某种方式聚合的 B 个值,具体取决于 mode。在这种情况下,offsets 被忽略,并且需要为 None

  • 如果 input 是形状为 (N) 的一维数据,它将被视为多个包(序列)的连接。offsets 需要是一个一维张量,包含每个包在 input 中的起始索引位置。因此,对于形状为 (B)offsetsinput 将被视为包含 B 个包。空包(即长度为0)将返回用零填充的向量。

classmethod from_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 实例。

Parameters
  • embeddings (张量) – 包含EmbeddingBag权重的FloatTensor。 第一个维度作为‘num_embeddings’传递给EmbeddingBag,第二个维度作为‘embedding_dim’。

  • 冻结 (布尔值, 可选) – 如果 True,张量在学习过程中不会更新。 等同于 embeddingbag.weight.requires_grad = False。默认值: True

  • max_norm (浮点数, 可选) – 请参阅模块初始化文档。默认值: None

  • norm_type (float, 可选) – 请参阅模块初始化文档。默认值为 2

  • scale_grad_by_freq (布尔值, 可选) – 请参阅模块初始化文档。默认值为 False

  • 模式 (字符串, 可选) – 请参阅模块初始化文档。默认值: "mean"

  • 稀疏 (布尔值, 可选) – 参见模块初始化文档。默认值: False

  • include_last_offset (bool, 可选) – 请参阅模块初始化文档。默认值: False

  • padding_idx (int, 可选) – 请参阅模块初始化文档。默认值:None

Return type

嵌入包

示例:

>>> # 包含预训练权重的FloatTensor
>>> weight = torch.FloatTensor([[1, 2.3, 3], [4, 5.1, 6.3]])
>>> embeddingbag = nn.EmbeddingBag.from_pretrained(weight)
>>> # 获取索引1的嵌入
>>> input = torch.LongTensor([[1, 0]])
>>> embeddingbag(input)
tensor([[ 2.5000,  3.7000,  4.6500]])
优云智算