将时间序列数据提供给有状态 LSTM 的正确方法?

2023-11-23

假设我有一个整数序列:

0,1,2, ..

并希望根据最后 3 个整数来预测下一个整数,例如:

[0,1,2]->5, [3,4,5]->6, etc

假设我像这样设置模型:

batch_size=1
time_steps=3
model = Sequential()
model.add(LSTM(4, batch_input_shape=(batch_size, time_steps, 1), stateful=True))
model.add(Dense(1))

据我了解,模型具有以下结构(请原谅粗略的绘图):

enter image description here

第一个问题:我的理解正确吗?

注意我已经画了之前的状态C_{t-1}, h_{t-1}输入图片,因为指定时会暴露该图片stateful=True。在这个简单的“下一个整数预测”问题中,通过提供这些额外信息(只要先前的状态是由前 3 个整数产生的),性能应该会得到提高。

这引出了我的主要问题:这似乎是标准做法(例如参见这个博客文章时间序列生成器keras 预处理实用程序)的目的是在训练期间向模型提供一组交错的输入。

例如:

batch0: [[0, 1, 2]]
batch1: [[1, 2, 3]]
batch2: [[2, 3, 4]]
etc

这让我很困惑,因为这似乎需要第一个 Lstm 单元的输出(对应于第一个时间步)。看这个图:

从张量流docs:

stateful:布尔值(默认 False)。如果为真,则每个的最后状态 批次中索引 i 处的样本将用作初始状态 下一批中索引 i 的样本。

看来这种“内部”状态不可用,所有可用的都是最终状态。看这个图:

因此,如果我的理解是正确的(显然不是),那么我们在使用时是否应该向模型提供非重叠的样本窗口stateful=True? E.g.:

batch0: [[0, 1, 2]]
batch1: [[3, 4, 5]]
batch2: [[6, 7, 8]]
etc

答案是:取决于手头的问题。对于您的一步预测的情况 - 是的,您可以,但您不必这样做。但无论你是否这样做都会极大地影响学习。


批次与样本机制(“参见 AI”= 参见“附加信息”部分)

所有模型都将样本视为独立的例子;一批 32 个样品就像一次喂 1 个样品,32 次(有差异 - 参见 AI)。从模型的角度来看,数据被分为批次维度,batch_shape[0],以及特征尺寸,batch_shape[1:]- 两人“别说话”。两者之间的唯一关系是通过梯度(参见 AI)。


重叠批次与无重叠批次

也许理解它的最好方法是信息-基于。我将从时间序列二元分类开始,然后将其与预测联系起来:假设您有 10 分钟的 EEG 记录,每个记录 240000 个时间步长。任务:癫痫发作还是非癫痫发作?

  • 由于 240k 对于 RNN 来说太大了,我们使用 CNN 进行降维
  • 我们可以选择使用“滑动窗口”——即一次提供一个子段;我们使用 54k

取10个样品,成型(240000, 1)。怎么喂?

  1. (10, 54000, 1),包括所有样本,切片为sample[0:54000]; sample[54000:108000] ...
  2. (10, 54000, 1),包括所有样本,切片为sample[0:54000]; sample[1:54001] ...

以上两者你选哪一个?如果是 (2),那么您的神经网络永远不会将这 10 个样本的癫痫发作与非癫痫发作混淆。但它对任何其他样本也一无所知。即,它将严重过度拟合,因为信息它看到每次迭代几乎没有不同(1/54000 = 0.0019%) - 所以你基本上是在给它喂食同一批连续几次。现在假设(3):

  1. (10, 54000, 1),包括所有样本,切片为sample[0:54000]; sample[24000:81000] ...

合理很多;现在我们的窗口有 50% 的重叠,而不是 99.998%。


预测:重叠不好?

如果您正在进行一步预测,信息格局现在会发生变化:

  • 有可能,您的序列长度是从 240000 起的 faaar,因此任何类型的重叠都不会遭受“同一批次多次”的影响
  • 预测与分类根本不同,因为您提供的每个子样本的标签(下一个时间步)都不同;分类对整个序列使用一个

这极大地改变了你的损失函数,以及最小化它的“良好实践”:

  • 预测器必须对其稳健初始样本,特别是对于 LSTM - 因此我们通过滑动序列来训练每个这样的“开始”,如您所示
  • 由于标签随时间步长不同,损失函数随时间步长变化很大,因此过度拟合的风险要小得多

我应该怎么办?

首先,请确保您理解整篇文章,因为这里没有什么是真正的“可选”。然后,这是关于重叠与不重叠的关键,每批次:

  1. 一个样本发生了偏移:模型学会更好地预测每个起始步骤的前一步 - 含义:(1) LSTM 对初始细胞状态的鲁棒性; (2) LSTM 在落后 X 步的情况下可以很好地预测任何领先的步数
  2. 许多样品,移入later batch:模型不太可能“记住”训练集和过度拟合

你的目标:平衡两者; 1相对于2的主要优势是:

  • 2 可以通过制作模型来限制模型forget看到的样品
  • 1 允许模型提取更好的质量通过检查样本的多个起点和终点(标签)并相应地平均梯度来分析特征

我应该在预测中使用(2)吗?

  • 如果您的序列长度非常长,并且您可以负担得起“滑动窗口”,其长度约为 50%,也许可以,但这取决于数据的性质:信号(EEG)?是的。股票、天气?对此感到怀疑。
  • 多对多预测;更常见的是(2),在大序列或较长序列中。

LSTM 有状态:实际上可能对您的问题完全无用。

当 LSTM 无法一次处理整个序列,因此它被“分割”时,或者当需要从反向传播获得不同的梯度时,则使用有状态。对于前者,其想法是 - LSTM 在评估后者时考虑前一个序列:

  • t0=seq[0:50]; t1=seq[50:100]说得通;t0逻辑上导致t1
  • seq[0:50] --> seq[1:51]没有意义;t1并不因果地源自t0

换句话说:不要在不同批次的状态中重叠。同一批次是可以的,同样,独立性 - 样品之间没有“状态”。

何时使用有状态:当 LSTM 在评估下一批时受益于考虑上一批时。这can包括一步预测,但前提是您无法一次提供整个序列:

  • 期望:100 个时间步长。可以做:50个。所以我们设置t0, t1如上面的第一个项目符号所示。
  • Problem:以编程方式实现并不简单。您需要找到一种在不应用梯度的情况下向 LSTM 提供数据的方法 - 例如冻结重量或设置lr = 0.

LSTM 何时以及如何在有状态中“传递状态”?

  • When: only 批次间;样本是完全独立的
  • How:仅在 Keras 中批次样本到批次样本: stateful=True requires你指定batch_shape代替input_shape- 因为,Keras 构建batch_size编译时 LSTM 的不同状态

根据上述,您cannot做这个:

# sampleNM = sample N at timestep(s) M
batch1 = [sample10, sample20, sample30, sample40]
batch2 = [sample21, sample41, sample11, sample31]

这意味着21因果关系如下10- 并且会破坏训练。相反,做:

batch1 = [sample10, sample20, sample30, sample40]
batch2 = [sample11, sample21, sample31, sample41]

批次与样品:附加信息

“批次”是一组样本 - 1 或更大(假设此答案始终为后者) 。迭代数据的三种方法:批量梯度下降(一次整个数据集)、随机 GD(一次一个样本)和小批量 GD(中间)。 (然而,在实践中,我们也将最后一个 SGD 称为 SGD,并且仅与 BGD 进行区分 - 对于此答案假设如此。)差异:

  • SGD 实际上从未优化训练集的损失函数 - 只是其“近似值”;每个批次都是整个数据集的子集,计算的梯度仅与最小化损失有关该批次的。批量大小越大,其损失函数与训练集的损失函数就越相似。
  • 以上可以扩展到拟合批次与样本:样本是批次的近似值,或者是数据集的较差近似值
  • 首先拟合 16 个样本,然后再拟合 16 个样本not与一次安装 32 个相同 - 因为权重已更新中间,所以后半部分的模型输出将会改变
  • 事实上,选择 SGD 而不是 BGD 的主要原因不是计算限制,而是这是优越的, 大多数时候。简单解释一下:BGD 更容易过度拟合,而 SGD 通过探索更多样化的损失空间,在测试数据上收敛到更好的解决方案。

奖金图:


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将时间序列数据提供给有状态 LSTM 的正确方法? 的相关文章

随机推荐

  • AngularJS 导航在 tinymce 指令后不起作用

    我有一个我无法弄清楚的问题 但我确实有一个提示 在集成 TinyMCE 之前 主导航工作正常 例如链接 设置 分析 设置 如果您单击它们 它现在不起作用 这是我的js文件 var app htmleditor module angular
  • 导入错误:没有名为“util”的模块

    当我尝试导入模块时illustris python我收到错误 导入错误 没有名为 util 的模块 该模块util位于模块下面的目录中snapshot py需要它 所以我很困惑为什么Python看到一个模块 而不是另一个 我在下面包含了导入
  • 在 PhantomJS 上我不能包含 jQuery,如果没有 jQuery,我就无法发布表单数据

    我在 PhantomJS 中运行 jQuery 时遇到问题 我已经发现this答案 其中谈到评估函数内部没有可用的变量 但问题是关于节点模块 在我的示例中我只调用console log内部评估函数 我已经把这个问题放在GitHub 也有 以
  • 声明单一类型 - “使用”单一类型的等效项

    在 C 中我可以这样做 using IAnyType App Namespace Types IAnyType class BaseClass IAnyType 有等效的 Typescript 吗 BAD import IDialogOpt
  • 有没有办法将数据流式传输到 blob(或生成巨大的 blob)

    检查 MDN 我发现以前有BlobBuilder我可以打电话给blobBuilder append继续向 blob 添加数据 但根据 MDNBlobBuilder已被弃用 有利于Blob构造函数 不幸的是Blob构造函数在构造时需要内存中的
  • 当表中的数据发生更改时,SqlCacheDependency 如何知道何时与任何侦听器进行通信?

    我一直在做一些研究 我可以看到这个系统的大部分管道 但是我不确定 sql server 如何知道当表中的数据发生变化时何时向任何侦听器 应用程序 发送消息 我将首先解释我所理解的内容 直到我迷路为止 1 需要在数据库上启用Service B
  • Crystal Reports - 向存储过程添加新字段并使其在 IDE 中可用?

    我向存储过程添加了一个新字段 如何在不重置数据库专家中的数据源的情况下使其在 Crystal Reports 中可用 验证数据库有效 但是如果您使用设置数据源位置 在数据库 gt 设置数据源位置中找到 在过程更改后更新报告 打开 设置数据源
  • 在 python 中排序枚举值

    我希望能够安排枚举的顺序 有人建议如何解决这个问题吗 使用以下枚举元类 class EnumMeta type def new typ name bases attrs cls attrs cls choices for attr name
  • 使用 Trivy 扫描本地 docker 映像中的漏洞会导致未经授权

    我已将 docker 映像从私有存储库拉到本地 并尝试使用 trivy image 命令扫描本地映像 它正在拉取数据库 但显示访问本地映像时出现未经授权的错误 scan error unable to initialize a scanne
  • MySQL:仅在不在另一表中时才从一个表中选择电子邮件?

    我将构建一个名为 donotemail 的表 其中包含要求从我们的电子邮件列表中删除的人员的电子邮件地址 我有另一个名为 users 的表 其中包含电子邮件列 如何选择用户的所有电子邮件 但前提是电子邮件地址不在 donotemail 表中
  • R中的3层圆环图

    我正在尝试在 R 中重新创建此图像 但是我无法弄清楚如何将 3 层添加到圆环图 我找到的所有内容 例如 webr PieDonut 只允许2 使用ggplot我也无法重新创建它 MRE 是 library ggplot2 library w
  • Tensorflow - 无法将操作转换为张量

    我想计算操作输出和张量之间的成对欧几里得距离 我正在使用建议的代码here 这是我的代码的要点 Suppose logits has shape 32 128 logits tf get default graph get operatio
  • WPF 触发器

    我试图设置一个触发器 当我获得的单元格值是某种类型时显示文本块 我已经成功地在相同的情况下显示了图像 但在这种情况下我不需要图像 而是一些文本 已注释掉几行以便测试 尝试使其工作 注释掉的代码有效 其中的文本块 text xxx 没有 这是
  • 关于小型基于 C 的向量和矩阵库的建议 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我需要一个用于 2d 和 3d 向量以及 3x3 和 4x4 矩阵的轻量级库 在基础C中 这样我就不会重新发明轮子 有什么建议么 Meschach是一个纯 C 向量 矩阵库 明显小于
  • preg_replace() 会改变我的字符集吗?

    我有以下代码似乎正在改变我的字符集 html echo html result html preg replace s html echo html result 但是 当我使用 t n r f v 作为我的模式而不是特殊字符 s它工作正常
  • Bluemix 新手,新应用程序出现错误“主机已被占用”

    我是 Bluemix 的新手 按照以下步骤创建应用程序 使用您的 Bluemix 帐户登录 Bluemix 打开目录菜单 从运行时部分 单击 Liberty for Java 在应用程序字段中 指定您的应用程序的名称 输入姓名 单击创建按钮
  • 覆盖Android后退按钮

    关于我为什么尝试这样做的一些信息 我正在使用 ActivityGroups 从 tabHost 活动打开一个活动 并将该新活动保留在选项卡下 那部分我已经有了 但是 在该新活动中 如果我使用后退按钮 它会将我直接退出选项卡活动 因此我必须单
  • 没有 'owned by' 属性的 Postgres 序列在 Django 1.3 中不会返回 id

    最近从 Oracle 迁移到 Postgres 并从 Django 1 2 升级到 1 3 后 我们在将对象保存到数据库时开始遇到问题 当调用 save 时 不会返回 id 即使通过标准 django 管理面板保存标准 django aut
  • android:选择图库中的多个图像并启动隐式意图

    如何获取所有选定图像的图像路径或仅将它们显示在我的应用程序中 当用户在图库中选择图像并按共享按钮时 我可以启动隐式意图并将其显示在我的 imageView 中 如下所示 ImageView iv ImageView findViewById
  • 将时间序列数据提供给有状态 LSTM 的正确方法?

    假设我有一个整数序列 0 1 2 并希望根据最后 3 个整数来预测下一个整数 例如 0 1 2 gt 5 3 4 5 gt 6 etc 假设我像这样设置模型 batch size 1 time steps 3 model Sequentia