nn.EmbeddingBag把offsets之间的进行归约,offsets从0开始

示例回顾

python 复制代码
import torch
import torch.nn as nn

# 定义嵌入字典的大小和嵌入维度
num_embeddings = 10
embedding_dim = 3

# 创建一个 nn.EmbeddingBag 实例
embedding_bag = nn.EmbeddingBag(num_embeddings, embedding_dim, mode='mean')

# 定义输入索引和偏移量
input_indices = torch.tensor([1, 2, 4, 5, 4, 3, 2, 9])
offsets = torch.tensor([0, 4])

# 计算嵌入并进行归约
output = embedding_bag(input_indices, offsets)

print("EmbeddingBag output:")
print(output)

解释

  1. 嵌入字典

    • num_embeddings = 10 表示嵌入字典的大小,即词汇表的大小。
    • embedding_dim = 3 表示每个嵌入向量的维度。
  2. 输入索引和偏移量

    • input_indices = torch.tensor([1, 2, 4, 5, 4, 3, 2, 9]) 是输入的索引张量,表示需要嵌入的词汇索引。
    • offsets = torch.tensor([0, 4]) 是偏移量张量,表示每个序列的起始位置。
  3. 嵌入向量

    • nn.EmbeddingBag 会根据 input_indices 从嵌入字典中查找对应的嵌入向量。

计算过程

假设嵌入字典中的嵌入向量如下(随机初始化):

复制代码
embedding_matrix = [
    [0.1, 0.2, 0.3],  # index 0
    [0.4, 0.5, 0.6],  # index 1
    [0.7, 0.8, 0.9],  # index 2
    [1.0, 1.1, 1.2],  # index 3
    [1.3, 1.4, 1.5],  # index 4
    [1.6, 1.7, 1.8],  # index 5
    [1.9, 2.0, 2.1],  # index 6
    [2.2, 2.3, 2.4],  # index 7
    [2.5, 2.6, 2.7],  # index 8
    [2.8, 2.9, 3.0]   # index 9
]

计算步骤

  1. 查找嵌入向量 - 对于 input_indices = [1, 2, 4, 5, 4, 3, 2, 9],查找对应的嵌入向量:

    复制代码
    [
      [0.4, 0.5, 0.6],  # index 1
      [0.7, 0.8, 0.9],  # index 2
      [1.3, 1.4, 1.5],  # index 4
      [1.6, 1.7, 1.8],  # index 5
      [1.3, 1.4, 1.5],  # index 4
      [1.0, 1.1, 1.2],  # index 3
      [0.7, 0.8, 0.9],  # index 2
      [2.8, 2.9, 3.0]   # index 9
    ]
  2. 应用偏移量

    • offsets = [0, 4] 表示两个序列的起始位置:
      • 第一个序列:input_indices[0:4] 对应的嵌入向量:

        复制代码
        [
          [0.4, 0.5, 0.6],  # index 1
          [0.7, 0.8, 0.9],  # index 2
          [1.3, 1.4, 1.5],  # index 4
          [1.6, 1.7, 1.8]   # index 5
        ]
      • 第二个序列:input_indices[4:8] 对应的嵌入向量:

        复制代码
        [
          [1.3, 1.4, 1.5],  # index 4
          [1.0, 1.1, 1.2],  # index 3
          [0.7, 0.8, 0.9],  # index 2
          [2.8, 2.9, 3.0]   # index 9
        ]
  3. 计算平均值

    • 对每个序列的嵌入向量进行平均计算:
      • 第一个序列的平均值:

        复制代码
        mean([
          [0.4, 0.5, 0.6],
          [0.7, 0.8, 0.9],
          [1.3, 1.4, 1.5],
          [1.6, 1.7, 1.8]
        ]) = [1.0, 1.1, 1.2]
      • 第二个序列的平均值:

        复制代码
        mean([
          [1.3, 1.4, 1.5],
          [1.0, 1.1, 1.2],
          [0.7, 0.8, 0.9],
          [2.8, 2.9, 3.0]
        ]) = [1.45, 1.55, 1.65]
  4. 输出结果

    • 最终输出的嵌入向量为:

      复制代码
      [
        [1.0, 1.1, 1.2],
        [1.45, 1.55, 1.65]
      ]

总结

nn.EmbeddingBag 中,mean 模式会对输入索引对应的嵌入向量进行平均计算。具体步骤如下:

  1. 根据输入索引查找对应的嵌入向量。
  2. 根据偏移量将输入索引分成多个序列。
  3. 对每个序列的嵌入向量进行平均计算。
  4. 输出归约后的嵌入向量。

通过这种方式,nn.EmbeddingBag 可以高效地处理变长序列的嵌入操作,并进行归约计算。

相关推荐
孟健3 小时前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞5 小时前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
曲幽7 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
敏编程11 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪12 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
程序员打怪兽12 小时前
详解Visual Transformer (ViT)网络模型
深度学习
databook12 小时前
ManimCE v0.20.1 发布:LaTeX 渲染修复与动画稳定性提升
python·动效
花酒锄作田1 天前
使用 pkgutil 实现动态插件系统
python
前端付豪1 天前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽1 天前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img