【问题标题】:Training LSTM over multiple datasets of different timestep number在不同时间步数的多个数据集上训练 LSTM
【发布时间】:2022-01-05 09:29:50
【问题描述】:

我是使用 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 类

''' 类 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

'''

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

【问题讨论】:

    标签: python machine-learning pytorch lstm recurrent-neural-network


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 非常感谢您提供的快速且非常有启发性的定义。你把事情说得这么简单,以至于像我这样的傻瓜都能理解!因此,假设每个数据集正好有 450 个时间步,然后我处理 6000 x 450 x 11。根据经验,数据集包含 445-455 个时间步(我认为均匀分布的 100 或 200 个时间步就足够了)。根据您所说,我应该从采样数据集中训练我拥有的全部数据吗?假设 6000 x 400 x 11 所以 b = 6000, seq_length = 400, input_size = 11, output_size = 2(我应该从每个数据集中均匀地采样这 400 个吗?)
    • 恐怕没有明确的答案!就个人而言,我建议绝对对6000 进行采样并选择例如一个b=200。这意味着您从6000 序列的数据集中统一选择200 随机序列。关于在您的“时间轴”上进行采样,我想如果它甚至可以工作的话,它是特定于任务的。它可以双向进行。如果您假设一个长度为100 的切片足以表征长度为400 的序列,您还可以尝试随机均匀地对时间切片进行采样。 (在代码中,您将对定义切片的起点进行采样。)
    • 太棒了!批量输入是在 LSTM 内部完成的(我在输入中以某种方式定义了批量大小)还是在训练中迭代?因此,假设我们有 6000 个 450 个时间步长的序列。对于 b = 200,LSTM 输入将为 200 x 30 x 450 x 11 或 6000 x 450 x 11?
    • LSTM 输入将是b x n x D,所以200 x 450 x 11。批处理的要点是您不想一次提供所有数据。相反,您需要在每次训练迭代中使用不同的训练案例。这会使训练随机化,通常会带来更好的模型性能。
    【解决方案2】:

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

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

    输入:当 batch_first=False 或时,形状张量为 (L,N,Hin) (N,L,Hin) 当 batch_first=True 包含特征时是 (N,L,H in) 的输入序列。输入也可以是打包的可变长度 序列。请参阅 torch.nn.utils.rnn.pack_padded_sequence() 或 torch.nn.utils.rnn.pack_sequence() 了解详情。

    因此,当输入到 RNN 模型中时,您的数据应该是 3D 张量,尽管请注意 PyTorch 的 rnn.pack_sequence(或 pack_padded_sequence)功能提供了可变长度序列。这些将考虑可变长度,这样您的数据就不会受到零填充的影响,当您将批次打乱或推断单个序列时,这将不是一件好事。

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

    【讨论】:

    • 另一个很好的答案,谢谢 jhso!现在我在理论上已经基本涵盖了基本原理,我想知道如何实现它以及它需要什么预处理......您是否建议事先将所有序列设置为相同的长度(因为差异非常小删除 5 个时间步会比我认为的填充更可取)或使用 pytorch 库进行填充?
    • 使用 rnn.pack_sequences 功能,因为它可以处理可变长度序列。
    猜你喜欢
    • 2017-12-08
    • 2017-07-29
    • 2020-12-15
    • 2020-12-15
    • 1970-01-01
    • 2021-02-22
    • 2021-10-14
    • 2018-06-07
    • 2017-06-27
    相关资源
    最近更新 更多