2
votes

La sortie de LSTM ne change pas pour différentes entrées

J'ai un LSTM implémenté dans PyTorch comme ci-dessous.

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

Je crée simplement un réseau LSTM et y passe deux entrées aléatoires. Les sorties n'ont pas de sens car peu importe ce que sont random_data1 et random_data2 , out1 et out2 sont toujours identiques . Cela n'a aucun sens pour moi car les entrées aléatoires multipliées par des poids aléatoires devraient donner des sorties différentes.

Cela ne semble pas être le cas si j'utilise moins de couches cachées. Avec num_layers = 2 , cet effet semble être nul. Et à mesure que vous l'augmentez, out1 et out2 ne cessent de se rapprocher. Cela n'a pas de sens pour moi car avec plus de couches du LSTM empilées les unes sur les autres, nous multiplions l'entrée avec plus de nombre de poids aléatoires qui devraient amplifier les différences dans l'entrée et donner une sortie très différente. P >

Quelqu'un peut-il expliquer ce comportement? Y a-t-il un problème avec mon implémentation?

Dans une exécution particulière, random_data1 est

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

random_data2 code> est

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

out1 est

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

out2 est

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

MODIFIER: J'utilise les configurations suivantes -

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)


2 commentaires

Je ne peux pas reproduire ce comportement. Lorsque je teste votre code sur PyTorch 1.0.0, j'obtiens deux sorties différentes. Je suggère de l'essayer sur un système différent avec une autre version de PyTorch.


Je vous remercie. Je vais essayer dans une version différente et mettre à jour.


3 Réponses :


4
votes

Les poids initiaux pour LSTM sont de petits nombres proches de 0, et en ajoutant plus de couches, les poids et biais initiaux deviennent plus petits: tous les poids et biais sont initialisés de -sqrt (k) à -sqrt (k), où k = 1 / hidden_size ( https://pytorch.org/docs/stable /nn.html#torch.nn.LSTM )

En ajoutant plus de couches, vous multipliez efficacement l'entrée par de nombreux petits nombres, donc l'effet de l'entrée est fondamentalement 0 et seuls les biais dans les couches ultérieures comptent.

Si vous essayez LSTM avec bias = False , vous verrez cette sortie se rapprocher de plus en plus de 0 en ajoutant plus de couches.


0 commentaires

2
votes

J'ai essayé de changer le nombre de calques en un nombre inférieur et les valeurs diffèrent, c'est parce que les valeurs sont multipliées par un petit nombre encore et encore, ce qui réduit l'importance de l'entrée.


0 commentaires

0
votes

J'ai initialisé tous les poids en utilisant kaiming_normal et cela fonctionne bien.


0 commentaires