嵌入
- classtorch.nn.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)[源代码]
-
一个简单的查找表,用于存储固定大小字典的嵌入。
此模块常用于存储和通过索引检索词嵌入。其输入是一系列索引,输出是相应的词嵌入。
- 参数
-
-
num_embeddings (int) – 嵌入词典的大小
-
embedding_dim (int) – 表示每个嵌入向量大小的整数
-
padding_idx (int, 可选) – 如果指定了
padding_idx
,那么该索引位置的条目不会影响梯度计算;因此,在训练过程中,padding_idx
处的嵌入向量保持不变,作为固定的“填充”存在。对于新创建的 Embedding 对象,默认情况下padding_idx
位置处的嵌入向量为全零,但可以更新为其他值以用作填充向量。 -
max_norm (float, optional) – 如果提供,每个范数大于
max_norm
的嵌入向量将被重新规范化为范数max_norm
。 -
norm_type (float, optional) – 用于计算
max_norm
选项的p范数中的 p值。默认为2
。 -
scale_grad_by_freq (bool, 可选) – 如果设置,将通过最小批量中单词频率的逆来缩放梯度。默认值为
False
。 -
sparse (bool, 可选) – 如果为
True
,则关于weight
矩阵的梯度将是一个稀疏张量。有关稀疏梯度的更多详细信息,请参阅注意事项。
-
- 变量
-
weight (Tensor) – 模块的可学习权重,形状为 (num_embeddings, embedding_dim),初始化来自 $\mathcal{N}(0, 1)$ 分布。
- 形状:
-
-
输入: $(*)$,形状任意的 IntTensor 或 LongTensor,包含需要提取的索引。
-
输出为 $(*, H)$,其中 * 表示输入形状,$H=\text{embedding\_dim}$
-
注意
请注意,只有少数优化器支持稀疏梯度:目前包括
optim.SGD
(CUDA 和 CPU),optim.SparseAdam
(CUDA 和 CPU)以及optim.Adagrad
(CPU)。注意
当
max_norm
不为None
时,Embedding
的前向方法会就地修改weight
张量。由于用于梯度计算的张量不能就地修改,在调用Embedding
前向方法之前对Embedding.weight
进行可微操作时,需要在max_norm
不为None
时克隆Embedding.weight
。例如:n, d, m = 3, 5, 7 embedding = nn.Embedding(n, d, max_norm=1.0) W = torch.randn((m, d), requires_grad=True) idx = torch.tensor([1, 2]) a = embedding.weight.clone() @ W.t() # weight must be cloned for this to be differentiable b = embedding(idx) @ W.t() # modifies weight in-place out = (a.unsqueeze(0) + b.unsqueeze(1)) loss = out.sigmoid().prod() loss.backward()
示例:
>>> # 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)
- classmethodfrom_pretrained(embeddings, freeze=True, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False)[源代码]
-
根据给定的二维FloatTensor创建Embedding实例。
- 参数
-
-
embeddings (Tensor) – 包含 Embedding 权重的 FloatTensor。第一维和第二维分别对应于 Embedding 中的
num_embeddings
和embedding_dim
。 -
freeze (bool, optional) – 如果为
True
,张量在学习过程中不会被更新。等同于设置embedding.weight.requires_grad = False
。默认值:True
-
padding_idx (int, 可选) – 如果指定了
padding_idx
,则该索引位置的条目不会影响梯度计算;因此,在训练过程中,padding_idx
处的嵌入向量保持不变,即它作为一个固定的“填充”值。 -
max_norm (float, 可选) – 详情请参阅模块初始化文档。
-
norm_type (float, optional) – 请参阅模块初始化文档,默认值为
2
。 -
scale_grad_by_freq (bool, optional) – 详情请参阅模块初始化文档。默认值为
False
。 -
sparse (bool, 可选) – 有关详细信息,请参阅模块初始化文档。
-
示例:
>>> # 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]])