【Pytorch】nn.Embedding函数详解

文章目录

  • [一. nn.Embedding 官方注解](#一. nn.Embedding 官方注解)

一. nn.Embedding 官方注解

Pytorch官方注解: https://docs.pytorch.org/docs/stable/generated/torch.nn.modules.sparse.Embedding.html

定义:

bash 复制代码
class torch.nn.modules.sparse.Embedding(
	num_embeddings, 
	embedding_dim, 
	padding_idx=None, 
	max_norm=None, 
	norm_type=2.0, 
	scale_grad_by_freq=False, 
	sparse=False, 
	_weight=None, 
	_freeze=False, 
	device=None, 
	dtype=None
)

一个简单的查找表,用于存储固定词典和大小的嵌入向量。

该模块通常用于存储词嵌入,并通过索引检索它们。该模块的输入是索引列表,输出是相应的词嵌入。

Parameters 参数 :

  • num_embeddings(int)------嵌入字典的大小, 所有输出的索引必须在 0, num_embeddings-1
  • embedding_dim(int)------每个嵌入向量的大小, 即词向量的维度(如 128,256,512)
  • padding_idx(int,可选)------ 若指定,则位于padding_idx的条目不会对梯度产生影响;因此,padding_idx处的嵌入向量在训练期间不会更新,即它会保持为固定的"填充"。对于新构建的嵌入层,padding_idx处的嵌入向量默认全为零,但可以更新为其他值以用作填充向量。该位置对应的嵌入向量不会产生梯度,训练过程中不会被更新,用于序列补齐,避免填充符号影响训练。
  • max_norm(float,可选)------若提供此参数,则每个范数大于max_norm的嵌入向量会被重新归一化,以使其范数等于max_norm。仅限制向量长度,不改变语义方向,用于防止梯度爆炸、训练不稳定。
  • norm_type (float, 可选)------用于计算max_norm选项的p范数中的p值。默认值为2
  • scale_grad_by_freq(bool,可选)------ 若提供该参数,将按小批量中单词频率的倒数来缩放梯度。默认值为False。词出现的越多梯度越小,词出现的越少,梯度越大, 避免高词频梯度过大,让低词频也能正常学习。
  • sparse(bool,可选)------如果为True,则相对于weight矩阵的梯度将是稀疏张量。有关稀疏梯度的更多详细信息,请参见注释。即只计算本次batch出现词的梯度,未出现词不占用显存、不存储梯度,大幅节省内存,提升速度。

Variables 变量 :

  • weight (张量) : 模块的可学习权重,形状为(num_embeddings,embedding_dim),初始值来自 N(0,1)

Shape形状:

  • Input (*):任意形状的IntTensor或LongTensor,包含要提取的索引
  • Output(*,H):其中 * 是输入形状,且 H = embedding_dim

注意事项:

请记住,只有有限数量的优化器支持稀疏梯度:目前是optim.SGD(CUDA和CPU)、optim.SparseAdam(CUDA和CPU)以及optim.Adagrad(CPU)

注意事项:

当 max_norm 不为 None 时,Embedding 的forward 方法会就地修改weight张量。由于梯度计算所需的张量不能就地修改,因此在调用Embedding的forward方法之前对Embedding.weight执行可微分操作时,若max_norm不为None,则需要克隆Embedding.weight,例如:

python 复制代码
n,d,m = 3,5,7
embedding = nn.Embedding(n, d, max_norm=1.0)
w = torch.tensor([1,2])
a = (
	embedding.weight.clone() @ W.t()
)
b = embedding(idx) @ W.t()
out = a.unsqueeze(0) + b.unsqueeze(1)
loss = out.sigmoid().prod()
loss.backward

Example 示例:

python 复制代码
>>> # an Embedding module containing 10 tensors of size 3
>>> embedding = nn.Embedding(10, 3)
>>> # a batch of 2 samples of 4 indices each
>>> input = torch.LongTensor([[1, 2, 4, 5], [4, 3, 2, 9]])
>>> embedding(input)
tensor([[[-0.0251, -1.6902,  0.7172],
         [-0.6431,  0.0748,  0.6969],
         [ 1.4970,  1.3448, -0.9685],
         [-0.3677, -2.7265, -0.1685]],

        [[ 1.4970,  1.3448, -0.9685],
         [ 0.4362, -0.4004,  0.9400],
         [-0.6431,  0.0748,  0.6969],
         [ 0.9124, -2.3616,  1.1151]]])

>>> # example with padding_idx
>>> embedding = nn.Embedding(10, 3, padding_idx=0)
>>> input = torch.LongTensor([[0, 2, 0, 5]])
>>> embedding(input)
tensor([[[ 0.0000,  0.0000,  0.0000],
         [ 0.1535, -2.0309,  0.9315],
         [ 0.0000,  0.0000,  0.0000],
         [-0.1655,  0.9897,  0.0635]]])

>>> # example of changing `pad` vector
>>> padding_idx = 0
>>> embedding = nn.Embedding(3, 3, padding_idx=padding_idx)
>>> embedding.weight

Parameter containing:
tensor([[ 0.0000,  0.0000,  0.0000],
        [-0.7895, -0.7089, -0.0364],
        [ 0.6778,  0.5803,  0.2678]], requires_grad=True)

>>> with torch.no_grad():
>>>    embedding.weight[padding_idx] = torch.ones(3)
>>> embedding.weight
Parameter containing:
tensor([[ 1.0000,  1.0000,  1.0000],
        [-0.7895, -0.7089, -0.0364],
        [ 0.6778,  0.5803,  0.2678]], requires_grad=True)
python 复制代码
classmethod from_pretrained(
	embeddings, 
	freeze=True, 
	padding_idx=None, 
	max_norm=None, 
	norm_type=2.0, 
	scale_grad_by_freq=False, 
	sparse=False
)

从给定的二维 FloatTensor 创建嵌入实例

Parameters 参数 :

  • embeddings (Tensor) ------包含嵌入层权重的浮点张量。第一维度作为num_embeddings传递给嵌入层,第二维度作为embedding_dim传递
  • freeze (bool, optional) ------ 如果为True,则张量在学习过程中不会更新。相当于embedding.weight.requires_grad = False。默认值:True
  • padding_idx (int, optional) ------如果指定,padding_idx处的条目不会对梯度产生影响;因此,padding_idx处的嵌入向量在训练期间不会更新,即它会保持为固定的"填充"
  • max_norm (float, optional) -- 参见模块初始化文档
  • norm_type(浮点数,可选参数)------ 详见模块初始化文档。默认值为 2
  • scale_grad_by_freq(布尔型,可选参数)------ 详见模块初始化文档。默认值为 False
  • sparse(布尔型,可选参数)------ 详见模块初始化文档

Example 示例:

python 复制代码
>>> # FloatTensor containing pretrained weights
>>> weight = torch.FloatTensor([[1, 2.3, 3], [4, 5.1, 6.3]])
>>> embedding = nn.Embedding.from_pretrained(weight)
>>> # Get embeddings for index 1
>>> input = torch.LongTensor([1])
>>> embedding(input)
tensor([[ 4.0000,  5.1000,  6.3000]])
相关推荐
IT_陈寒10 分钟前
Redis内存飙升的锅,原来是我没搞懂这个过期策略
前端·人工智能·后端
东坡肘子1 小时前
SPI 加入 Apple,Swift 迈向自举 -- 肘子的 Swift 周报 #142
人工智能·swiftui·swift
小和尚同志10 小时前
AI 自动化测试探索(二):Chrome-devtools MCP
人工智能·e2e·aigc
hboot10 小时前
AI工程师第四课 - 深度学习入门
pytorch·python·神经网络
冬奇Lab12 小时前
Workflow 系列(02):设计范式——四层架构、三种 Context 传递模式与确认门设计
人工智能·agent·工作流引擎
冬奇Lab12 小时前
每日一个开源项目(第145篇):Trellis - 把项目记忆、规范和任务上下文持久化进代码仓库
人工智能·开源·资讯
有道AI情报局12 小时前
Harness即产品
人工智能·agent
罗西的思考13 小时前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
IT_陈寒14 小时前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端
笃行35014 小时前
从零到上线:用 EdgeOne Makers + CodeBuddy 搭一个「对账核对员」AI Agent
人工智能