如何在 Keras 中为截断 BPTT 准备序列预测

循环神经网络能够学习序列预测问题中跨多个时间步长的时间依赖性。

现代循环神经网络,如长短期记忆(LSTM)网络,采用反向传播算法的一种变体进行训练,称为时间反向传播。为了提高长序列预测问题的效率,该算法得到了进一步修改,被称为截断时间反向传播。

当使用截断时间反向传播训练像 LSTM 这样的循环神经网络时,一个重要的配置参数是确定用作输入的时间步长数量。也就是说,如何精确地将非常长的输入序列分割成子序列以获得最佳性能。

在这篇文章中,您将发现 6 种不同的方法,可以将非常长的输入序列分割开来,以便在 Python 中使用 Keras 和截断时间反向传播有效地训练循环神经网络。

阅读本文后,你将了解:

  • 什么是截断时间反向传播,以及它如何在 Python 深度学习库 Keras 中实现。
  • 输入时间步长数量的选择如何精确影响循环神经网络中的学习。
  • 您可以使用 6 种不同的技术来分割非常长的序列预测问题,以最好地利用截断时间反向传播训练算法。

用我的新书《Python 长短期记忆网络》启动您的项目,其中包括分步教程和所有示例的Python 源代码文件

让我们开始吧。

How to Prepare Sequence Prediction for Truncated Backpropagation Through Time in Keras

如何在 Keras 中为截断反向传播准备序列预测
图片由 Giò 拍摄,保留部分权利。

截断时间反向传播

反向传播是一种训练算法,用于更新神经网络中的权重,以最小化给定输入的预期输出与预测输出之间的误差。

对于存在观测之间顺序依赖性的序列预测问题,使用循环神经网络而不是经典的反馈神经网络。循环神经网络使用反向传播算法的一种变体进行训练,称为时间反向传播,简称 BPTT。

实际上,BPTT 展开循环神经网络,并沿着整个输入序列,一次一个时间步长地向后传播误差。然后用累积的梯度更新权重。

BPTT 在处理非常长的输入序列问题时训练循环神经网络可能会很慢。除了速度之外,在如此多的时间步长上累积梯度可能导致值缩小到零,或者值增长最终溢出或爆炸。

BPTT 的一种修改是限制反向传播中使用的时间步长数量,从而有效地估计用于更新权重的梯度,而不是完全计算它。

这种变体称为截断时间反向传播,简称 TBPTT。

TBPTT 训练算法有两个参数:

  • k1:定义向前传播时显示给网络的时间步长数量。
  • k2:定义在向后传播时估计梯度时要查看的时间步长数量。

因此,在考虑如何配置训练算法时,我们可以使用 TBPTT(k1, k2) 的表示法,其中 k1 = k2 = n,n 是经典非截断 BPTT 的输入序列长度。

TBPTT 配置对 RNN 序列模型的影响

像 LSTM 这样的现代循环神经网络可以使用其内部状态来记忆非常长的输入序列。例如,数千个时间步长。

这意味着 TBPTT 的配置不一定定义您通过选择时间步长数量来优化的网络的记忆。您可以选择何时重置网络的内部状态,这与用于更新网络权重的机制是分开的。

相反,TBPTT 参数的选择影响网络如何估计用于更新权重的误差梯度。更一般地说,该配置定义了网络在训练期间可能被视为对序列问题建模的时间步长数量。

我们可以将其正式表述为类似如下:

其中 yhat 是特定时间步长的输出,f(…) 是循环神经网络正在近似的关系,X(t) 是特定时间步长的观测值。

它在概念上与在时间序列问题上训练的多层感知器上的窗口大小,或者与 ARIMA 等线性时间序列模型的 p 和 q 参数相似(但在实践中却大相径庭)。TBPTT 定义了训练期间模型输入序列的范围。

需要 LSTM 帮助进行序列预测吗?

参加我的免费7天电子邮件课程,了解6种不同的LSTM架构(附代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

Keras 对 TBPTT 的实现

Keras 深度学习库提供了用于训练循环神经网络的 TBPTT 实现。

此实现比上面列出的通用版本更受限制。

具体来说,k1 和 k2 的值相等且固定。

  • TBPTT(k1, k2),其中 k1 = k2

这是通过训练像长短期记忆网络或 LSTM 这样的循环神经网络所需的固定大小的三维输入实现的。

LSTM 要求输入数据具有以下维度:样本、时间步长和特征。

此输入格式的第二个维度(时间步长)定义了用于序列预测问题中的前向和后向传播的时间步长数量。

因此,在 Keras 中为序列预测问题准备输入数据时,必须仔细选择指定的时间步长数量。

时间步长的选择将影响两个方面:

  • 前向传播过程中累积的内部状态。
  • 用于后向传播中更新权重的梯度估计。

请注意,默认情况下,网络内部状态在每个批次后都会重置,但通过使用所谓的有状态 LSTM 并手动调用重置操作,可以更明确地控制何时重置内部状态。

有关 Keras 中有状态 LSTM 的更多信息,请参阅以下文章:

在 Keras 中为 TBPTT 准备序列数据

您分割序列数据的方式将定义 BPTT 前向和后向传播中使用的时间步长数量。

因此,您必须仔细考虑如何准备训练数据。

本节列出了您可以考虑的 6 种技术。

1. 按原样使用数据

如果每个序列中的时间步长数量适中,例如几十个或几百个时间步长,您可以按原样使用输入序列。

对于 TBPTT,建议的实际限制约为 200 到 400 个时间步长。

如果您的序列数据小于或等于此范围,您可以将序列观测值重新塑形为输入数据的时间步长。

例如,如果您有 100 个 25 个时间步长的单变量序列集合,则可以将其重新塑形为 100 个样本、25 个时间步长和 1 个特征,即 [100, 25, 1]。

2. 朴素数据分割

如果您有很长的输入序列,例如数千个时间步长,您可能需要将长输入序列分解成多个连续的子序列。

这将需要使用 Keras 中的有状态 LSTM,以便内部状态在子序列的输入之间保持不变,并且只在真正的完整输入序列结束时重置。

例如,如果您有 100 个 50,000 个时间步长的输入序列,则每个输入序列可以分成 100 个 500 个时间步长的子序列。一个输入序列将变为 100 个样本,因此原始的 100 个样本将变为 10,000 个。Keras 的输入维度将是 10,000 个样本、500 个时间步长和 1 个特征,即 [10000, 500, 1]。需要注意在每个 100 个子序列之间保持状态,并在每个 100 个样本之后显式地或通过使用 100 的批大小来重置内部状态。

优选将完整序列整齐地分割成固定大小子序列的分割。完整序列因子(子序列长度)的选择是任意的,因此称为“朴素数据分割”。

将序列分割成子序列时,未考虑关于估计用于更新权重的误差梯度的合适时间步长数量的领域信息。

3. 领域特定数据分割

很难知道需要多少时间步长才能提供有用的误差梯度估计。

我们可以使用(上述)朴素方法快速获得模型,但模型可能远未优化。

或者,我们可以使用领域特定信息来估计模型在学习问题时相关的时步数。

例如,如果序列问题是回归时间序列,也许回顾自相关和偏自相关图可以为时间步长数量的选择提供信息。

如果序列问题是自然语言处理问题,输入序列可以按句子划分,然后填充到固定长度,或者根据领域中的平均句子长度进行划分。

广义地思考,并考虑您可以利用哪些特定于您领域的知识来将序列分割成有意义的块。

4. 系统数据分割(例如网格搜索)

您不必猜测合适的时间步长数量,而是可以系统地评估针对序列预测问题的一系列不同子序列长度。

您可以对每个子序列长度执行网格搜索,并采用平均性能最佳的配置。

如果您正在考虑这种方法,请注意以下几点:

  • 从完整序列长度的因子作为子序列长度开始。
  • 如果探索的子序列长度不是完整序列长度的因子,请使用填充和可能的掩码。
  • 考虑使用一个稍微过度设计的网络(更多记忆单元和更多训练 epoch),而不是解决问题所需的网络,以帮助排除网络容量作为实验的限制。
  • 对每个不同配置的多次运行(例如 30 次)取平均性能。

如果计算资源不是限制,那么建议对不同数量的时间步长进行系统研究。

5. 在 TBPTT(1, 1) 中大量依赖内部状态

您可以将序列预测问题重新表述为每个时间步长有一个输入和一个输出。

例如,如果您有 100 个 50 个时间步长的序列,则每个时间步长将成为一个新样本。这 100 个样本将变为 5,000 个。三维输入将变为 5,000 个样本、1 个时间步长和 1 个特征,即 [5000, 1, 1]。

同样,这将要求在序列的每个时间步长之间保留内部状态,并在每个实际序列(50 个样本)结束时重置内部状态。

这将把学习序列预测问题的负担放在循环神经网络的内部状态上。根据问题的类型,这可能超出网络的处理能力,预测问题可能无法学习。

个人经验表明,这种公式可能适用于需要序列记忆的预测问题,但在结果是过去观测值的复杂函数时表现不佳。

6. 分离前向和后向序列长度

Keras 深度学习库曾经支持截断时间反向传播的前向和后向传播的解耦时间步长数量。

本质上,k1 参数可以通过输入序列上的时间步长数量指定,k2 参数可以通过 LSTM 层上的“truncate_gradient”参数指定。

这已不再受支持,但有人希望将此功能重新添加到库中。尚不清楚确切的删除原因,尽管有证据表明是出于效率原因。

您可以在 Keras 中探索这种方法。一些想法包括:

  • 安装并使用支持“truncate_gradient”参数的旧版 Keras 库(大约 2015 年)。
  • 扩展 Keras 中的 LSTM 层实现,以支持“truncate_gradient”类型的行为。

也许有支持此行为的 Keras 第三方扩展。
如果您找到任何,请在下面的评论中告诉我。

总结

在这篇文章中,您了解了如何在 Python 深度学习库 Keras 中准备序列预测问题数据,以有效利用截断时间反向传播训练算法。

具体来说,你学到了:

  • 截断时间反向传播的工作原理及其在 Keras 中的实现方式。
  • 如何在 TBPTT 的背景下重新组织或分割具有非常长输入序列的数据。
  • 如何在 Keras 中系统地研究不同的 TBPTT 配置。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

立即开发用于序列预测的 LSTM!

Long Short-Term Memory Networks with Python

在几分钟内开发您自己的 LSTM 模型。

...只需几行python代码

在我的新电子书中探索如何实现
使用 Python 构建长短期记忆网络

它提供关于以下主题的自学教程
CNN LSTM、编码器-解码器 LSTM、生成模型、数据准备、进行预测等等...

最终将 LSTM 循环神经网络引入。
您的序列预测项目。

跳过学术理论。只看结果。

查看内容

对《如何在 Keras 中为截断 BPTT 准备序列预测》的 40 条回复

  1. Hans 2017 年 7 月 24 日晚上 10:08 #

    你好 Jason,感谢你精彩的教程!你能提供一个关于如何在 Keras 中使用 TBPTT 的简短示例吗?(我在 keras.optimizers 中没有找到它)

    • Jason Brownlee 2017 年 7 月 25 日上午 9:43 #

      您无需选择 BPTT,它是 Keras 训练所有 RNN 的基础。

      这有帮助吗?

      • Hans 2017 年 7 月 26 日凌晨 12:37 #

        是的,非常感谢!
        您能否提供一些关于训练算法和优化器之间关系的信息,以及 BPTT 的特定变体(标准/截断、在线/离线)?

        • Jason Brownlee 2017 年 7 月 26 日上午 8:00 #

          BPTT 确实涉及如何估计更新的梯度,例如更新权重时的方向和幅度。

          优化算法利用多次迭代的梯度来更新权重。

          • Hans 2017 年 8 月 2 日凌晨 12:40 #

            非常感谢您的清晰解释!

          • Jason Brownlee 2017 年 8 月 2 日上午 7:55 #

            不客气。

    • Naveen 2022 年 9 月 9 日上午 11:10 #

      如何在 Keras 的代码中实现这一点

  2. Vedhas 2018 年 2 月 24 日凌晨 2:01 #

    非常非常感谢这些教程!!!只是一个建议:在创建示例时,请务必不要重复数字。这里的段落一开始令人困惑,因为这里的 100 既指序列数量,也指子序列数量。我猜您的意思是这样??

    “例如,如果您有 100 个 25,000 个时间步长的输入序列,那么每个输入序列可以分成 50 个 500 个时间步长的子序列。一个输入序列将变为 50 个样本,因此原始的 100 个样本将变为 5,000 个。Keras 的输入维度将是 5,000 个样本、500 个时间步长和 1 个特征,即 [5000, 500, 1]。需要注意在每个 50 个子序列之间保持状态,并在每个 50 个样本之后显式地或通过使用 50 的批大小来重置内部状态。”(或者 100???)

    再次非常感谢!您能与世界分享您的知识真是太好了!

    • Jason Brownlee 2018 年 2 月 24 日上午 9:18 #

      谢谢,很好的建议。也许我需要更多的编辑!

  3. Willie Maddox 2018 年 3 月 7 日晚上 8:58 #

    朴素数据分割有点像所谓的“箱式”技术。所以

    [6, 1, 7, 5, 9, 2]

    将变成,

    [[6, 1, 7],
    [5, 9, 2]]

    但我见过人们使用另一种(第 7 种?)技术。“阶梯式”技术。

    [[6, 1, 7],
    [1, 7, 5],
    [7, 5, 9],
    [5, 9, 2]]

    那么,(1) 哪种 RNN 使用这种“阶梯式”技术?(2) 双重或三重计算梯度是否存在问题?例如,输入值 7 和 5 经过网络 3 次,但 6(和 2)只经过一次?

    谢谢。

    • Jason Brownlee 2018 年 3 月 8 日上午 6:25 #

      RNNs 通常很灵活,可以接受问题的各种框架。

      该模型旨在具有长输入序列,而不是多个重叠的短输入序列。对技能的具体影响将取决于数据集。

  4. Harry 2018 年 3 月 27 日上午 9:49 #

    @Jason
    非常感谢这篇详细的教程。

    我想问一个极端情况:
    假设我想训练一个非常大的序列(其长度未知),并且我想让模型遍历所有数据而无需通过 BPTT 计算损失(效率不是问题)。换句话说,正向传播的 k1 是固定的 (1, k1, n_inputs),但 k2 是根据输入动态变化的。
    您有什么建议如何在 Keras 中实现这一点。

  5. Pierre 2018 年 5 月 16 日凌晨 3:32 #

    嗨,Jason,
    您提到“需要在每个 100 个子序列中保留状态,并在每个 100 个样本后明确地或通过使用 100 的批大小重置内部状态。”我的理解是,批处理中的每个样本都是独立处理的,不仅在 Keras 中,而且在所有机器学习算法中都是如此。因此,批处理中的 100 个子序列中的每个子序列都将使用自己的状态进行处理,所以在我看来,它在有状态 LSTM 的框架中是行不通的。
    我想听听您对此的看法。

    顺便说一句,感谢您这个很棒的博客。

    祝好,

    ——皮埃尔

    • Jason Brownlee 2018 年 5 月 16 日上午 6:06 #

      RNNs 有状态,其他算法没有。

      状态默认在批次中的样本之间保留。

  6. M.Hamadan Ghani 2019 年 4 月 29 日中午 12:13 #

    “例如,如果您有 100 个 50 个时间步长的序列,则每个时间步长将成为一个新样本。这 100 个样本将变为 5,000 个。三维输入将变为 5,000 个样本、1 个时间步长和 1 个特征,即 [5000, 1, 1]。”

    但是如果我最初有 100 个标签(由 0 和 1 组成),即(单个序列的单个标签),我将使用命令“fit(train_data, train_labels, batch_size=25)”。现在,从原始的 100 个样本创建 5000 个样本后,我必须在处理完每 50 个样本后提供一个标签,因为每个原始样本现在都已分成 50 个样本。我不应该为每个样本提供标签。那么,我应该如何更改我的 fit 命令呢?
    假设“train_data”的形状为 (100,50,3) -> (样本数,时间步数,特征数),而 train_labels 的形状为 (100,)。

    提前谢谢你,Jason。

    • Jason Brownlee 2019 年 4 月 29 日下午 2:05 #

      是的,如果您有 100 个样本,这意味着您有 100 个输入和 100 个输出,您可以直接将它们提供给您的模型进行训练。

      • M.Hamadan Ghani 2019 年 4 月 29 日下午 2:42 #

        实际上,我想问的是,如果我有 100 个输入和每个输入一个标签(即总共 100 个标签),当我将我的 100 个输入分割成 5000 个输入时,我应该如何重塑我的标签?正如前面提到的(“例如,如果您有 100 个 50 个时间步长的序列,则每个时间步长将成为一个新样本”),原始的 100 个输入中的每个输入都有 50 个时间步长。现在,每 50 个输入对应于原始 100 个输入中的一个。

        • Jason Brownlee 2019 年 4 月 30 日上午 6:46 #

          您可以将其作为一对一问题尝试。

          另外,尝试将其建模为 seq2seq 问题,例如 50 步输入,然后 50 步输出。

  7. Simone 2019 年 5 月 29 日凌晨 1:52 #

    你好,感谢你的教程,真的很有帮助!
    我必须训练一个 LSTM 来拟合一个非线性动力学模型。我只有一条非常长的序列记录,代表系统运行,比如说 100,000 个时间步长。这是一个 SISO 过程,所以我有一个形状为 [100,000, 1] 的输入序列和一个形状为 [100,000, 1] 的输出序列。我将序列分成 100 个较小的序列,然后将这些序列再次分成 10 个序列。我的数据现在形状为 [100, 10, 100, 1],其中 data[0] 是第一次分割获得的 10 个较小的子序列中的第一个 10 个子序列。我重新排列数据,使 data[0] 中包含所有第一次分割获得的 10 个子序列中的第一个子序列,最终数据形状为 [10, 100, 100, 1]。(我知道这很难理解,抱歉)。我使用 data[0] 对网络进行正向和反向传播,我得到 data[0] 结束时的状态估计,并使用它来初始化状态,以便使用 data[1] 进行训练,data[1] 是第一次分割获得的序列中所有第二个子序列的集合。我可以使用估计的状态来初始化网络,因为数据中存在时间连续性,这样我也能够在一批序列上进行训练。

    在您的教程中,您说过使用序列长度为 1,我们将所有信息归因于网络状态。这或多或少是我需要的,因为在动态过程中,实际状态携带着描述它所需的所有信息。您认为我应该改变我的训练过程中的一些东西吗?

    非常感谢

    • Jason Brownlee 2019 年 5 月 29 日上午 8:49 #

      通常,我建议集思广益并尝试所有你能想到的——你会学到更多关于问题和方法的东西。

      在你的情况下,从线性方法和一些 MLP 或 CNNs 开始,并与 LSTM 进行比较,以确认它是否增加了任何价值,可能会很有趣。

      测试整个输入序列的动态 LSTM 看看它是否能带来任何好处也可能很有趣。

      更多想法在这里
      https://machinelearning.org.cn/start-here/#deep_learning_time_series

  8. Prayag Madhu 2019 年 7 月 3 日下午 5:53 #

    先生,您能解释一下如何在用 tensorflow 构建的 seq2seq 模型上应用 truncatedBPTT 吗?
    我想了解如何在解码器中的“嵌入输入”上应用截断。

    • Jason Brownlee 2019 年 7 月 4 日上午 7:40 #

      抱歉,我没有 tensorflow 中 BPTT 的示例。

  9. Laci 2019 年 9 月 13 日上午 9:31 #

    我使用了朴素数据分割,但我不太明白如何评估模型。测试数据仍然是完整长度的序列。我也应该分割测试序列吗?我只有在拥有完整序列时才需要预测。您能告诉我如何解决这个问题吗?

    另一个问题与双向 LSTM 有关。这种方法也能在那里使用吗?我的意思是,如果我有一个序列 [1,2,3,4,5,6] 并将其分割成 [1,2,3] 和 [4,5,6],那么反向顺序将是 [3,2,1][6,5,4],这不是我们想要的。我是否遗漏了什么?

    感谢您的帮助和时间。

  10. vijay G 2020 年 5 月 7 日上午 5:23 #

    嗨 Jason

    如果我理解正确,Keras 中没有 BPTT 和 TBPTT 这样的参数。

    无论是 TBPTT 还是 BPTT,我们唯一可以操作的参数是时间步长。

    这意味着要实现 TBPTT,

    1. 设计输入,使批次之间具有连续性。
    2. 确保您在下一个批次中不重置状态

    • Jason Brownlee 2020 年 5 月 7 日上午 6:57 #

      Keras 对 RNN 进行 BPTT,它没有提供执行 TBPTT 所需的控制。

      它更多地是关于输入序列的长度,用于计算误差和执行权重更新。

  11. Nathan Hanks 2021 年 3 月 20 日上午 8:52 #

    Jason - 感谢您所有这些精彩的文章。我有一个关于 LSTM 自编码器批次大小的问题。

    在另一篇文章中,我想您也提到了使用批次大小为 1 来充分利用 LSTM 的能力。

    我正在使用 LSTM 自编码器进行重建,我的时间序列都少于 400 个时间步长(带填充,以处理序列长度)。

    因此,既然我没有让序列跨越 2 个样本,那么批次大小为 1 似乎最适合我的框架,因为权重在每个批次之后都会重置,这正是我在尝试最小化重建误差时所关心的?我理解正确吗?

    但就像你说的,这会使学习过程不稳定,对吗?到目前为止,我发现使用 BatchNormalization 倾向于“稳定”学习过程,供您参考。这是否也是利用核和/或活动正则化器来帮助稳定学习过程的地方?

    • Jason Brownlee 2021 年 3 月 21 日上午 6:03 #

      听起来不错。

      也许与其他配置进行比较以确认您的预期。

  12. Ramy Hanna 2021 年 3 月 20 日上午 11:17 #

    嗨,Jason,

    我从朴素分割示例中得出结论:

    如果我们有一个大小为 100 个样本的批次,输入形状为 (10000,500,1),那么每 500 个时间步长(1 个样本)之后将进行 1 次反向传播。状态将累积到批次结束,然后状态将在新批次上重置。

    这是真的吗?我们需要将 stateful 参数设置为 True 才能在批次内保持状态累积吗?

    此致,
    拉米

    • Jason Brownlee 2021 年 3 月 21 日上午 6:05 #

      通常,状态在批次结束时重置。有状态允许您控制何时重置状态。

      • Ramy Hanna 2021 年 3 月 21 日上午 6:35 #

        谢谢你的回复。

        我对反向传播应用的频率真的很困惑,是每个样本还是一个批次?

        在 TF 文档中,批次大小声明了每个梯度更新的样本数量,这意味着 1 次更新/批次。
        在这里我理解,更新发生在样本大小(示例中为 500)之后,无论批次大小是多少。

        问题 1:您能澄清一下这一点吗?

        如果每次批次更新一次,那么将子序列批处理的好处是什么?它仍然是原始长序列的反向传播。

        提前感谢您的时间。

        • Jason Brownlee 2021 年 3 月 22 日上午 5:24 #

          是的,每批更新一次。

          是的,好处是在这些有意义的问题中对序列进行分组。

          • Ramy Hanna 2021 年 3 月 22 日上午 5:37 #

            序列被分组到一个批次中,但截断在哪里?
            它仍然是穿过一个长序列的反向传播。

            我的意思是,反向传播通过 100 个示例的批次,每个示例有 100 个时间步长,与反向传播通过 1 个示例但有 10000 个时间步长的批次有什么区别?

          • Jason Brownlee 2021 年 3 月 23 日凌晨 4:52 #

            在 Keras 中,k1==k2,所以我们无法控制反向传播截断与前向传播的比较(即前向和反向传播都遍历所有时间步长)。

            也许这篇关于展开的文章会有帮助
            https://machinelearning.org.cn/rnn-unrolling/

  13. Ramy Hanna 2021 年 3 月 23 日上午 6:19 #

    谢谢,Jason,感谢您的时间和解释。

    所以这意味着如果我们有一个形状为 (n,k,d) 的序列,
    其中 n:是子序列的数量(样本),
    在 Keras 中配置 NW 以实现 TBPTT(k,k) 的唯一方法是将 batch_size=1,同时保持 NW 有状态并在每个 epoch 后重置状态。
    如果无状态,则每个子序列(样本)都被视为一个独立的序列。

    这种情况将类似于迷你批次梯度下降学习,但保持跨批次有状态性。

    如果我错了,请纠正我好吗?

  14. Oliver 2021 年 12 月 17 日晚上 8:02 #

    根据我的理解,RNN 和 LSTM 相对于在时间序列上训练的窗口大小多层感知器的主要优势之一在于后者必须指定窗口大小。因此,我们明确提到了模式显示的范围。而在前者中,我理解我们不需要指定模式显示的位置,因此网络可以看到非常细微的模式。

    通过创建时间步长,我们是否限制了网络可以找到模式的范围?这在我看来是可能的,因为学习中的梯度一次只作用于数据的一个有限部分。

    然而,由于 LSTM 确实存储记忆,这种记忆可能会影响未来的学习,从而增加网络寻找模式的范围。

    所以如您所见,我不确定答案。我很乐意得到回复。

    P.S.:很棒的系列文章,非常感谢。

    • Adrian Tam
      Adrian Tam 2021 年 12 月 19 日下午 1:38 #

      从技术上讲你是对的,但在 Keras 中,你需要将输入层附加到 LSTM,因此你仍然需要提供窗口大小。

    • James Carmichael 2021 年 12 月 21 日上午 11:39 #

      你好 Oliver... 关于 LSTM 和内存存储,你是正确的。虽然这使得这种网络类型能够学习数据集的趋势和季节性,但请记住,对于较长的预测范围,训练可能会受到很大影响,在某些情况下,如果没有优化,甚至可能不会收敛。

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。