Это действительно хороший вопрос! Слой встраивания PyTorch (то же самое относится и к Tensorflow) служит таблицей поиска только для извлечения вложений для каждого из входных данных, которые являются индексами. Рассмотрим следующий случай, у вас есть предложение, где каждое слово маркируется. Поэтому каждое слово в вашем предложении представлено уникальным целым числом (индексом). Если список индексов (слов) равен [1, 5, 9]
, и вы хотите закодировать каждое из слов с помощью 50
размерного вектора (встраивание), вы можете сделать следующее:
# The list of tokens
tokens = torch.tensor([0,5,9], dtype=torch.long)
# Define an embedding layer, where you know upfront that in total you
# have 10 distinct words, and you want each word to be encoded with
# a 50 dimensional vector
embedding = torch.nn.Embedding(num_embeddings=10, embedding_dim=50)
# Obtain the embeddings for each of the words in the sentence
embedded_words = embedding(tokens)
Сейчас, чтобы ответить на ваши вопросы:
Во время прямого прохода значения для каждого из токенов в вашем предложении будут получены аналогично тому, как работает индексирование Numpy. Поскольку в бэкэнде это дифференцируемая операция, во время обратного прохода (обучения) Pytorch собирается вычислить градиенты для каждого из вложений и соответствующим образом перенастроить их.
Весасами вложенияЭто хорошая вещь о матрице встраивания. Матрица встраивания слов на самом деле представляет собой матрицу весов, которую можно выучить во время обучения.
Фактической функции как таковой нет. Как мы определили выше, предложение уже разбито на токены (каждое слово представлено уникальным целым числом), и мы можем просто получить вложения для каждого из токенов в предложении.
НаконецКак я уже упоминал в примере с индексацией, давайте попробуем.
# Let us assume that we have a pre-trained embedding matrix
pretrained_embeddings = torch.rand(10, 50)
# We can initialize our embedding module from the embedding matrix
embedding = torch.nn.Embedding.from_pretrained(pretrained_embeddings)
# Some tokens
tokens = torch.tensor([0,5,9], dtype=torch.long)
# Token embeddings from the lookup table
lookup_embeddings = embedding(tokens)
# Token embeddings obtained with indexing
indexing_embeddings = pretrained_embeddings[tokens]
# Voila! They are the same
np.testing.assert_array_equal(lookup_embeddings.numpy(), indexing_embeddings.numpy())