Выход из LSTM не меняется для разных входов - PullRequest
1 голос
/ 13 марта 2019

У меня есть LSTM, реализованный в PyTorch, как показано ниже.

import numpy as np

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable

class LSTM(nn.Module):
    """
    Defines an LSTM.
    """

    def __init__(self, input_dim, hidden_dim, output_dim, num_layers):

        super(LSTM, self).__init__()

        self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True)

    def forward(self, input_data):

        lstm_out_pre, _ = self.lstm(input_data)
        return lstm_out_pre

model = LSTM(input_dim=2, hidden_dim=2, output_dim=1, num_layers=8)

random_data1 = torch.Tensor(np.random.standard_normal(size=(1, 5, 2)))
random_data2 = torch.Tensor(np.random.standard_normal(size=(1, 5, 2)))

out1 = model(random_data1).detach().numpy()
out2 = model(random_data2).detach().numpy()

print(out1)
print(out2)

Я просто создаю сеть LSTM и передаю в нее два случайных входа. Выводы не имеют смысла, потому что независимо от того, что random_data1 и random_data2, out1 и out2 всегда одинаковы. Это не имеет никакого смысла для меня, поскольку случайные входные данные, умноженные на случайные веса, должны давать разные выходные данные.

Похоже, это не тот случай, если я использую меньшее количество скрытых слоев. С num_layers=2 этот эффект кажется нулевым. И когда вы его увеличиваете, out1 и out2 продолжают сближаться. Это не имеет смысла для меня, потому что с большим количеством слоев LSTM, наложенных друг на друга, мы умножаем входные данные на большее количество случайных весов, которые должны увеличивать различия во входных данных и давать очень разные выходные данные.

Может кто-нибудь объяснить, пожалуйста, это поведение? Что-то не так с моей реализацией?

В одном конкретном прогоне random_data1 равен

tensor([[[-2.1247, -0.1857],
         [ 0.0633, -0.1089],
         [-0.6460, -0.1079],
         [-0.2451,  0.9908],
         [ 0.4027,  0.3619]]])

random_data2 является

tensor([[[-0.9725,  1.2400],
         [-0.4309, -0.7264],
         [ 0.5053, -0.9404],
         [-0.6050,  0.9021],
         [ 1.4355,  0.5596]]])

out1 является

[[[0.12221643 0.11449362]
  [0.18342148 0.1620608 ]
  [0.2154751  0.18075559]
  [0.23373817 0.18768947]
  [0.24482158 0.18987371]]]

out2 - это

[[[0.12221643 0.11449362]
  [0.18342148 0.1620608 ]
  [0.2154751  0.18075559]
  [0.23373817 0.18768945]
  [0.24482158 0.18987371]]]

EDIT: Я работаю на следующих конфигурациях -

PyTorch - 1.0.1.post2 
Python - 3.6.8 with GCC 7.3.0 
OS - Pop!_OS 18.04 (Ubuntu 18.04, more-or-less) 
CUDA - 9.1.85
Nvidia driver - 410.78

Ответы [ 2 ]

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

Я попытался изменить количество слоев на меньшее число, и значения отличаются, это потому, что значения умножаются на небольшое число снова и снова, что уменьшает значимость ввода.

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

Начальные веса для LSTM - это небольшие числа, близкие к 0, и при добавлении большего количества слоев начальные веса и смещения становятся меньше: все веса и смещения инициализируются от -sqrt (k) до -sqrt (k), где k= 1 / hidden_size (https://pytorch.org/docs/stable/nn.html#torch.nn.LSTM)

Добавляя больше слоев, вы эффективно умножаете ввод на множество небольших чисел, поэтому эффект от ввода в основном равен 0 и имеют значение только смещения в более поздних слоях.

Если вы попробуете LSTM с bias=False, вы увидите, что вывод становится все ближе и ближе к 0 с добавлением большего количества слоев.

...