【问题标题】:LSTM to Predict Pattern 010101... Understanding Hidden StateLSTM 预测模式 010101... 了解隐藏状态
【发布时间】:2021-03-05 17:14:17
【问题描述】:

我做了一个快速实验,看看我是否能理解 LSTM 中的 hidden state 的作用......

我试图让 LSTM 根据 XX[0] = 1 的输入序列预测 [1,0,1,0,1...] 的序列,其余为随机噪声。

X = [1, randFloat, randFloat, randFloat...]
label = [1, 0, 1, 0...]

在我的脑海中,模型会理解:

  1. 输入 X 没有任何意义,或者至少没有什么意义(因为它是噪音) - 所以它会在大部分情况下丢弃这些值
  2. 仅来自上一个序列/时间步长 nhidden state 将用于预测下一个时间步长 n+1... [1, 0, 1, 0...]
  3. 我还将X[0] = 1 设置为第一个首字母,试图引导网络在第一个项目上预测 1(确实如此)

所以,这没有用。理论上,不应该吗?谁能解释一下?

它基本上永远不会收敛,并且处于 01 之间猜测的风口浪尖


## Code
import os
import numpy as np
import torch

from torchvision import transforms
from torch import nn
from sklearn import preprocessing
from util import create_sequences
import torch.optim as optim

创建一些虚假数据

sequence_1 = torch.tensor(np.random.uniform(size=50)).float().detach()
sequence_1[0] = 1
sequence_2 = torch.tensor(np.random.uniform(size=50)).float().detach()
sequence_2[0] = 1

labels_1 = np.zeros(50)
labels_1[::2] = 1
labels_1 = torch.tensor(labels_1, dtype=torch.long)
labels_2 = labels_1.clone()

training_data = [sequence_1, sequence_2]
label_data = [labels_1, labels_2]

创建简单的 LSTM 模型

class LSTM(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        super(LSTM, self).__init__()
        self.lstm = nn.LSTM(input_dim, hidden_dim)
        self.fc = nn.Linear(hidden_dim, output_dim)

    def forward(self, seq):
        lstm_out, _ = self.lstm(seq.view(len(seq), 1, -1))
        out = self.fc(lstm_out.view(len(seq), -1))
        out = F.log_softmax(out, dim=1)
        return out

我们尝试过拟合数据集

INPUT_DIM = 1
HIDDEN_DIM = 6
model = LSTM(INPUT_DIM, HIDDEN_DIM, 2)

loss_function = nn.NLLLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)

for epoch in range(500):  
    for i, seq in enumerate(training_data): 
        labels = label_data[i]
        model.zero_grad()
        scores = model(seq)
        loss = loss_function(scores, labels)
        loss.backward()
        print(loss)
        
        optimizer.step()
        

with torch.no_grad():
    seq_d = training_data[0]
    tag_scores = model(seq_d)
    for score in tag_scores: 
        print(np.argmax(score))

【问题讨论】:

    标签: python keras pytorch lstm


    【解决方案1】:

    我会说这不是为了工作。

    该模型将始终尝试在其训练的数据(即sequence_1)中理解并找到模式,并使用labels_1“验证”它是否“找到”了它们。由于数据是随机的,模型无法找到模式。

    模型试图找到的模式不在标签中,而是在数据中,因此标签的排列方式并不重要。标签实际上从未穿过模型,所以NO

    如果可能,您在单个示例上对其进行了训练,那么肯定会。该模型将变得过拟合,并为您提供 1 和 0,并在其他示例中惨遭失败,否则无论大小如何,它都无法理解随机数据。

    隐藏状态

    仅使用前一个序列/时间步 n 的隐藏状态来预测下一个时间步 n+1... [1, 0, 1, 0...]

    关于隐藏状态,注意不是可训练的参数,它是对数据和参数执行一些操作的结果 ,表示输入数据决定了隐藏状态。

    隐藏状态的作用是保存模型从之前的时间步中提取的信息,并将其传递给下一个时间步或作为输出。对于 LSTM,它在通过之前会进行一些遗忘和更新。

    【讨论】:

      猜你喜欢
      • 2018-09-21
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 2021-06-30
      • 2019-03-15
      • 1970-01-01
      相关资源
      最近更新 更多