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)
3 Réponses :
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.
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.
J'ai initialisé tous les poids en utilisant kaiming_normal
et cela fonctionne bien.
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.