Как реализовать низкоразмерный слой встраивания в pytorch - PullRequest
3 голосов
/ 30 марта 2019

Я недавно прочитал статью о внедрении.

В уравнении (3) f является 4096X1 вектором. автор пытается сжать вектор до theta (вектор 20X1), используя матрицу встраивания E.

Уравнение простое theta = E*f

Мне было интересно, может ли он использовать pytorch для достижения этой цели, тогда в процессе обучения E можно выучить автоматически.

Как закончить отдых? Большое спасибо.

Демонстрационный код следующий:

import torch
from torch import nn

f = torch.randn(4096,1)

1 Ответ

1 голос
/ 30 марта 2019

Предполагая, что ваши входные векторы являются горячими, то есть там, где используются "встраиваемые слои", вы можете напрямую использовать встраивающий слой из факела, который работает выше, а также некоторые другие вещи.nn.Embeddings в качестве длинного тензора принять ненулевой индекс горячего вектора.Например: если вектор объектов равен

f = [[0,0,1], [1,0,0]]

, то для ввода nn.Embeddings будет

input = [2, 0]

Однако, какой запрос запрашивал OP вВопрос заключается в получении вложений путем умножения матриц, и ниже я рассмотрю это.Вы можете определить модуль для этого, как показано ниже.Поскольку param является экземпляром nn.Parameter, он будет зарегистрирован в качестве параметра и будет оптимизирован при вызове Адама или любого другого оптимизатора.

class Embedding(nn.Module):
    def __init__(self, input_dim, embedding_dim):
        super().__init__()
        self.param = torch.nn.Parameter(torch.randn(input_dim, embedding_dim))

    def forward(self, x):
        return torch.mm(x, self.param)

Если вы заметите, что это то же самое, что линейныйслой без смещения и немного другой инициализации.Поэтому вы можете добиться того же, используя линейный слой, как показано ниже.

self.embedding = nn.Linear(4096, 20, bias=False)
# change initial weights to normal[0,1] or whatever is required
embedding.weight.data = torch.randn_like(embedding.weight) 
...