Весовое суммирование вложений в pytorch - PullRequest
0 голосов
/ 26 октября 2019

У меня есть последовательность из 12 слов, которые я представляю, используя матрицу 12x256 (используя вложения слов). Давайте назовем их как . Я хочу принять это как вход и выход 1x256 вектор. Однако я не хочу использовать плотный слой (12x256) x 256. Вместо этого я хочу создать выходное вложение, используя взвешенное суммирование 12 вложений

, где w - это скаляры (таким образом, есть распределение веса).

Как я могу создать обучаемый в Pytorch? Я новичок и знаком только со стандартными модулями, такими как nn.Linear.

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Вы можете реализовать это с помощью 1D свертки с kernel_size = 1

import torch

batch_size=2

inputs = torch.randn(batch_size, 12, 256)
aggregation_layer = torch.nn.Conv1d(in_channels=12, out_channels=1, kernel_size=1)
weighted_sum = aggregation_layer(inputs)

Такая свертка будет иметь 12 параметров. Каждый параметр будет равен e_i в формуле, которую вы предоставили.

Другими словами, эта свертка будет превышать димецию размером 256 и суммировать ее с обучаемыми весами.

0 голосов
/ 26 октября 2019

Это должно сделать трюк для взвешенного среднего:

from torch import nn
import torch


class LinearWeightedAvg(nn.Module):
    def __init__(self, n_inputs):
        super(LinearWeightedAvg, self).__init__()
        self.weights = nn.ParameterList([nn.Parameter(torch.randn(1)) for i in range(n_inputs)])

    def forward(self, input):
        res = 0
        for emb_idx, emb in enumerate(input):
            res += emb * self.weights[emb_idx]
        return res


example_data = torch.rand(12, 256)
wa_layer = LinearWeightedAvg(12)
res = wa_layer(example_data)
print(res.shape)  

Ответ, вдохновленный предыдущим ответом, который я получил на форумах по pytorch:
https://discuss.pytorch.org/t/dense-layer-with-different-inputs-for-each-neuron/47348

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