LSTM 的输出不会因不同的输入而改变
Output from LSTM not changing for different inputs
我在 PyTorch 中实现了一个 LSTM,如下所示。
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
LSTM 的初始权重是接近于 0 的小数,并且通过添加更多层,初始权重和偏差变得越来越小:所有权重和偏差都从 -sqrt(k) 初始化为 -sqrt(k),其中 k = 1/hidden_size (https://pytorch.org/docs/stable/nn.html#torch.nn.LSTM)
通过添加更多层,您可以有效地将输入乘以许多小数,因此输入的效果基本上为 0,只有后面层中的偏差才重要。
如果您使用 bias=False
尝试 LSTM,您会发现随着层数的增加,输出越来越接近 0。
我尝试将层数更改为较低的数字,但值有所不同,这是因为这些值一遍又一遍地乘以一个小数字,这降低了输入的重要性。
我使用 kaiming_normal
初始化了所有权重,它工作正常。
我在 PyTorch 中实现了一个 LSTM,如下所示。
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
LSTM 的初始权重是接近于 0 的小数,并且通过添加更多层,初始权重和偏差变得越来越小:所有权重和偏差都从 -sqrt(k) 初始化为 -sqrt(k),其中 k = 1/hidden_size (https://pytorch.org/docs/stable/nn.html#torch.nn.LSTM)
通过添加更多层,您可以有效地将输入乘以许多小数,因此输入的效果基本上为 0,只有后面层中的偏差才重要。
如果您使用 bias=False
尝试 LSTM,您会发现随着层数的增加,输出越来越接近 0。
我尝试将层数更改为较低的数字,但值有所不同,这是因为这些值一遍又一遍地乘以一个小数字,这降低了输入的重要性。
我使用 kaiming_normal
初始化了所有权重,它工作正常。