我正在学习pytorch,我想知道在torch.nn.Embedding(n1, d1, padding_idx=0)中padding_idx属性是做什么的?我到处都找过了,就是找不到。你能举个例子来说明这一点吗?
发布于 2020-04-12 22:36:52
根据docs,每当遇到索引时,padding_idx都会用padding_idx处的嵌入向量(初始化为0)来填充输出。
这意味着,只要您有一个等于padding_idx的项,该索引处的嵌入层的输出将全为零。
这里有一个例子:假设你有1000个单词的词嵌入,每个50维,即num_embeddingss=1000,embedding_dim=50。那么torch.nn.Embedding的工作方式就像一个查找表(尽管查找表是可训练的):
emb_layer = torch.nn.Embedding(1000,50)
x = torch.LongTensor([[1,2,4,5],[4,3,2,9]])
y = emb_layer(x)y将是形状为2x4x50的张量。我希望你对这部分已经很清楚了。
现在如果我指定padding_idx=2,即
emb_layer = torch.nn.Embedding(1000,50, padding_idx=2)
x = torch.LongTensor([[1,2,4,5],[4,3,2,9]])
y = emb_layer(x)则输出仍为2x4x50,但(1,2)和(2,3)处的50维向量将全为零,因为x[1,2]和x[2,3]值为2,这等于padding_idx。您可以将其视为查找表中的第三个单词(因为查找表将是0索引的)没有用于训练。
发布于 2020-04-12 22:35:43
documentation对padding_idx的描述确实很糟糕。
基本上,它指定在调用期间传递的索引将表示“零向量”(这在NLP中非常常见,以防某些令牌丢失)。默认情况下,没有索引表示“零向量”,如下例所示:
import torch
embedding = torch.nn.Embedding(10, 3)
input = torch.LongTensor([[0, 1, 0, 5]])
print(embedding(input))将为您提供:
tensor([[[ 0.1280, -1.1390, -2.5007],
[ 0.3617, -0.9280, 1.2894],
[ 0.1280, -1.1390, -2.5007],
[-1.3135, -0.0229, 0.2451]]], grad_fn=<EmbeddingBackward>)如果您指定padding_idx=0,则每个值等于0的input (因此第0行和第二行)将像这样输出( zero-ed:embedding = torch.nn.Embedding(10, 3, padding_idx=0)):
tensor([[[ 0.0000, 0.0000, 0.0000],
[-0.4448, -0.2076, 1.1575],
[ 0.0000, 0.0000, 0.0000],
[ 1.3602, -0.6299, -0.5809]]], grad_fn=<EmbeddingBackward>如果指定padding_idx=5,最后一行将充满零,等等。
https://stackoverflow.com/questions/61172400
复制相似问题