在不同时间步数的多个数据集上训练 LSTM

Training LSTM over multiple datasets of different timestep number

我是 LSTM 的新手,我什至很难直观地理解它们。

我将它们用于回归问题,我有大约 6000 个数据集,每个数据集约 450 个时间步长,每个时间步长有 11 个特征。目标值为 2d ~ [a,b] 并且它们对于单个数据集是相同的。训练后我想提供时间步长并预测 2d y 值。

示例: 数据集(6000 个中的 1 个)具有 ~450 个类型为 x = [1,2,3,4,5,6,7,8,9,10,11] 和目标值 y = [1,2] 的不同时间步长

我目前遇到的问题是了解 LSTM 在输入之间的相关性方面究竟学到了什么,如果我处理多个数据集,我应该准确地提供哪些数据以及以什么顺序提供?我对术语 batch_size 感到困惑,如果我有不同的序列,术语 seq_length 会发生什么......我是否将整个 450 个时间步作为序列传递?

我现在所做的是将所有数据合并到一个 csv 文件中并将它们传递给模型。由于内存问题,我不能 运行 它所以我将它减少到 5000 个时间步,

下面是我使用的 LSTM class

''' class LSTM(nn.Module):

def __init__(self, num_classes, input_size, hidden_size, num_layers):
    super(LSTM, self).__init__()
    
    self.num_classes = num_classes
    self.num_layers = num_layers
    self.input_size = input_size
    self.hidden_size = hidden_size
    self.seq_length = seq_length
    
    self.lstm = nn.LSTM(input_size=input_size, hidden_size=hidden_size,
                        num_layers=num_layers, batch_first=True)
    
    self.fc = nn.Linear(hidden_size, num_classes)

def forward(self, x):
    h_0 = Variable(torch.zeros(
        self.num_layers, x.size(0), self.hidden_size))
    
    c_0 = Variable(torch.zeros(
        self.num_layers, x.size(0), self.hidden_size))
    
    # Propagate input through LSTM
    ula, (h_out, _) = self.lstm(x, (h_0, c_0))

    h_out = h_out.view(-1, self.hidden_size)
    
    out = self.fc(h_out)
    
    return out, h_out

'''

我真的不需要技术答案..我真的很想知道有人能澄清在这种情况下发生了什么以及我应该如何处理它...我已经在网上搜索了数十篇帖子,但似乎我只是不明白,或者这不完全是我的情况。

我将尝试以解释词汇的方式来解释这一点。

LSTM 通常用于顺序数据,例如时间序列,其中您有多个时间步 t=t0...tN 的数据点 x_t。这里,N 将是序列长度 (=seq_length?)。现在这意味着对于 D 维数据,一个“数据集”或更准确地说,一个序列具有 N x D.

的形状

让我们现在假设 N 对所有序列都是相等的。这意味着,如果你有 B 个序列,你可以将它们堆叠成一个 B x N x D 张量——这将对应于 actual 数据集,它基本上是所有数据你用。这里,B 是你的批处理轴,基本上就是你堆叠独立序列的轴。如果您选择同时训练所有数据,您可以将完整的 B x N x D 数据集传递给模型。那么,您的批量大小将为 B(下注)

现在如果序列长度不相等,您可以做很多事情。首先,您应该问问自己是否要对完整序列进行训练。是否需要阅读完整的 N 个步骤来估计结果,还是只看 n < N 个步骤就足够了?如果是这种情况,您可以采样长度为 nb(您的新批量大小,您可以定义自己喜欢的大小)序列,其中 n < Nall 个序列。

如果序列的某些部分不足以估计结果,它会变得更加复杂。然后我会建议单独提供完整的序列,只训练单个序列。这基本上意味着 batchsize b=1,因为你不能堆叠序列,因为它们的长度成对不同。在这里,您将为模型提供 b x n x D 张量。

我不确定这是否是“标准程序”,但这就是我要解决的问题。

注意:在完整数据集上进行训练通常不是一个好的做法。通常,您希望从数据集中抽取 b < B 个随机批次,这会随机化您的训练。

LSTM 通过识别顺序模式(如果是轴,也可以将其视为基于时间的模式)来处理顺序数据,以便提供顺序输出(每个序列位置的一组输出,不是你的情况),或每个序列的输出(你的情况)。此信息通过内存 backbone(也称为恒定错误轮播)通过网络传递,它可以传递整个序列,甚至是双向的(尽管这在前向和反向传递之间是分开的)。

PyTorch 解释了它希望如何处理您的数据:

input: tensor of shape is (L,N,Hin) when batch_first=False or (N,L,Hin) is (N,L,H in) when batch_first=True containing the features of the input sequence. The input can also be a packed variable length sequence. See torch.nn.utils.rnn.pack_padded_sequence() or torch.nn.utils.rnn.pack_sequence() for details.

因此,当输入 RNN 模型时,您的数据应该是 3D 张量,但请注意,可变长度序列在 PyTorch 的 rnn.pack_sequence(或 pack_padded_sequence)功能中得到满足。这些将考虑可变长度,以便您的数据不受零填充的影响,这在您随机处理批次或推断单个序列时不会很好。

最后,批处理数据是一种一次处理多个数据点(在本例中为序列)的方法,以便通过一次对多个样本进行平均并联合反向传播损失来加速训练,同时采用相同数量的是时候(大致)作为单个数据点这样做了。序列在这方面很棘手,因为它们的长度不同是很常见的,但通常这是通过将序列零填充到批处理中的最大长度来处理的。