首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >padding_idx在nn.embeddings()中做什么?

padding_idx在nn.embeddings()中做什么?
EN

Stack Overflow用户
提问于 2020-04-12 21:44:21
回答 2查看 6.3K关注 0票数 6

我正在学习pytorch,我想知道在torch.nn.Embedding(n1, d1, padding_idx=0)padding_idx属性是做什么的?我到处都找过了,就是找不到。你能举个例子来说明这一点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-12 22:36:52

根据docs,每当遇到索引时,padding_idx都会用padding_idx处的嵌入向量(初始化为0)来填充输出。

这意味着,只要您有一个等于padding_idx的项,该索引处的嵌入层的输出将全为零。

这里有一个例子:假设你有1000个单词的词嵌入,每个50维,即num_embeddingss=1000embedding_dim=50。那么torch.nn.Embedding的工作方式就像一个查找表(尽管查找表是可训练的):

代码语言:javascript
复制
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,即

代码语言:javascript
复制
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索引的)没有用于训练。

票数 9
EN

Stack Overflow用户

发布于 2020-04-12 22:35:43

documentationpadding_idx的描述确实很糟糕。

基本上,它指定在调用期间传递的索引将表示“零向量”(这在NLP中非常常见,以防某些令牌丢失)。默认情况下,没有索引表示“零向量”,如下例所示:

代码语言:javascript
复制
import torch

embedding = torch.nn.Embedding(10, 3)
input = torch.LongTensor([[0, 1, 0, 5]])
print(embedding(input))

将为您提供:

代码语言:javascript
复制
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,则每个值等于0input (因此第0行和第二行)将像这样输出( zero-edembedding = torch.nn.Embedding(10, 3, padding_idx=0)):

代码语言:javascript
复制
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,最后一行将充满零,等等。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61172400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档