LSTM 批量大小和序列长度如何影响内存

Posted

技术标签:

【中文标题】LSTM 批量大小和序列长度如何影响内存【英文标题】:LSTM how batch size and sequence length affect memory 【发布时间】:2019-01-04 02:26:51 【问题描述】:

我有一个关于批量大小和序列长度的问题。假设我有 10 个不同的独立时间序列,每个长度为 100。

5 个是一个人在做一项活动,另外 5 个是一个人在做另一项活动。

我想创建一个 LSTM,它能够从每个序列中的第一个样本一直记住序列,并将我输入的测试样本分类到一个活动或另一个活动中。

现在,作为第一次尝试,假设我可以输入长度为 100 的测试样本。我该怎么做?我会创建一个 LSTM,然后一次性输入形状为 [10, 100, 1] 的数据吗?还是我会输入形状为 [1, 100, 1] 的数据 10 次?这里的问题是批处理是否会影响 LSTM 如何记忆过去的输入?我不希望 LSTM 在独立序列之间记住,但我确实希望它从每个时间序列的开头一直记住。

其次,假设我现在要对用于训练 LSTM 的序列进行分块。目标和以前一样。所以现在我将序列窗口化为 10 个块。我是否将每个序列作为 [10,10,1] 输入?如果我这样做,LSTM 会一直记住序列的时间动态吗?以这种方式进行 LSTM 是否类似于不将序列分块并提供完整长度的序列?

【问题讨论】:

【参考方案1】:

我可以回答您与批处理有关的部分问题。批处理的原因有两个。

    计算机批量做矩阵乘法效率更高。如果您在 CPU 上执行此操作,则部分效率来自能够缓存矩阵而不必从内存中重新加载它。在评估期间,批次中的序列不会相互干扰。就好像每一个都是单独计算的一样。 在训练期间,在一个批次中包含多个序列可减少梯度中的噪声。权重更新是通过平均批次中所有序列的梯度来计算的。拥有更多序列可以更可靠地估计将参数移动到哪个方向以改进损失函数。

【讨论】:

使用更大的batch size其实是not performing better!这是该领域的一个很大的误解。大型 mini batch 的原因主要是您只需在批处理后更新一次,而不是针对每个样本更新,这样可以节省一些计算时间。此外,SGD 的全部意义在于使用样本中的“噪声”来允许更大范围的可能解决方案。此外,批处理的主要计算优势仅在 GPU 上处理时可见,您必须在每次权重更新后进行复制。

以上是关于LSTM 批量大小和序列长度如何影响内存的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 中组合两个具有不同输入大小的 LSTM 层?

如何处理极长的 LSTM 序列长度?

时间序列分类:LSTM模型之处理变序列长度输入

当使用多个不同长度和多个特征的时间序列时,如何为 LSTM 准备数据?

具有可变长度序列的 RNN/LSTM 库,无需分桶或填充

用于可变长度序列的 LSTM 变分自动编码器