#python #lstm #pytorch #recurrent-neural-network
#python #lstm #pytorch #рекуррентная нейронная сеть
Вопрос:
У меня есть 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]]]
Редактировать:
Я работаю в следующих конфигурациях —
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
Комментарии:
1. Я не могу воспроизвести это поведение. Когда я тестирую ваш код на PyTorch 1.0.0, я получаю два разных вывода. Я предлагаю попробовать это в другой системе с другой версией PyTorch.
2. Спасибо. Я попробую в другой версии и обновлю.
Ответ №1:
Начальные веса для 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 с добавлением большего количества слоев.
Ответ №2:
Я попытался изменить количество слоев на меньшее число, но значения отличаются, это потому, что значения снова и снова умножаются на небольшое число, что снижает значимость входных данных.
Ответ №3:
Я инициализировал все веса в using kaiming_normal
, и это работает нормально.