что делает padding_idx в nn.embeddings () - PullRequest
0 голосов
/ 12 апреля 2020

Я изучаю pytorch и мне интересно, что делает атрибут padding_idx в torch.nn.Embedding(n1, d1, padding_idx=0)? Я искал везде и не мог найти то, что я могу получить. Можете ли вы показать пример, чтобы проиллюстрировать это?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Согласно документам , padding_idx дополняет вывод вектором внедрения на padding_idx (инициализированном нулями) всякий раз, когда встречается с индексом.

Это означает, что там, где у вас есть элемент, равный padding_idx, на выходе слоя внедрения с этим индексом будут все нули.

Вот пример: скажем, у вас есть вложение слов по 1000 слов, каждое 50-мерное ie 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, ie

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, но 50-тёмный вектор в (1 , 2) и (2,3) будут все нули, так как значения x[1,2] и x[2,3] равны 2, что равно padding_idx. Вы можете думать о нем, как о 3-м слове в таблице поиска (поскольку таблица поиска будет иметь индексирование 0) не используется для обучения.

1 голос
/ 12 апреля 2020

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 каждые 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 последняя строка будет заполнена нулями et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...