keras何时重置LSTM状态?

Dan*_*ler 29 lstm keras keras-layer

我读了很多关于它的文章,似乎没有人回答这个非常基本的问题.它总是含糊不清:

stateful = FalseLSTM层中,keras会在以下情况后重置状态:

  • 每个序列; 要么
  • 每批?

假设我的X_train形状为(1000,20,1),意味着单个值的20个步骤的1000个序列.如果我做:

model.fit(X_train, y_train, batch_size=200, nb_epoch=15)
Run Code Online (Sandbox Code Playgroud)

它会重置每个序列的状态(重置状态1000次)吗?
或者它会重置每个批次的状态(重置状态5次)?

Dan*_*ler 43

通过一些测试,我得到了以下结论,这是根据文档和Nassim的答案:

首先,图层中没有单个状态,但批次中每个样本一个状态.batch_size在这样的层中存在并行状态.

有状态= FALSE

在一种stateful=False情况下,所有状态在每批之后一起重置.

  • 10 sequences将创建一个批处理10 states,并且所有10个状态在处理后自动重置.

  • 10 sequences将创建下一批,10 new states也将在处理完该批次后重置

如果所有这些序列都有length (timesteps) = 7,那么这两批的实际结果是:

20个单独的序列,每个序列长度为7

没有序列是相关的.但当然:权重(不是状态)对于图层来说是唯一的,并且将表示图层从所有序列中学到的内容.

  • 一个州是:我现在在一个序列中的哪个位置?这是什么时间步骤?从开始到现在,这个特定的序列是如何表现的?
  • 权重是:我对目前所见的所有序列的一般行为了解多少?

有状态=真

在这种情况下,也存在相同数量的并行状态,但它们根本不会被重置.

  • 10 sequences将创建的批处理10 states将保留在批处理结束时.

  • 下一批10 sequences(它必须是10,因为第一批是10)将重复使用10 states之前创建的相同批次.

实际结果是:第二批中的10个序列只是继续第一批的10个序列,就好像根本没有中断一样.

如果每个序列都有length (timesteps) = 7,那么实际意义是:

10个单独的序列,每个序列长度为14

当你看到你达到了序列的总长度时model.reset_states(),你就会调用,这意味着你不再继续前面的序列,现在你将开始提供新的序列.

  • 我真的不明白你说:“第二批的10个序列只是继续第一批的10个序列,好像根本没有中断”。你能提供一个简单的例子吗?另外,我不明白你为什么要写“10 个单独的序列,每个序列的长度为 14”。这是否意味着第二批的序列与第一批的序列在时间上相关联?谢谢 (2认同)
  • 状态只是一个矩阵,其中的数字代表层的内存。如果有数字,就有记忆。如果数字被重置,则没有记忆。这是将一个序列步骤链接到另一个序列步骤的唯一方法(它们是否在同一批次中并不重要)。 (2认同)
  • 我通过使用真实序列进行测试,将它们切成两半并正确组织批次。然后我检查了结果,他们没问题。后来研究了一下源码,再次确认。并且可以通过在层中使用 `return_state=True` 来检查状态。(需要一个功能性的 API 模型)——`LSTMCell` 的代码,在 `call` 方法中。状态是`c`,输出是`o`。(https://github.com/keras-team/keras/blob/master/keras/layers/recurrent.py#L1847) (2认同)

art*_*mis 10

在 Keras 中,有两种维护状态的模式:1)默认模式(stateful = False),每批后重置状态。AFAIK 状态仍将在批次内的不同样本之间保持。因此,对于您的示例状态将在每个时期重置 5 次。

2) 状态永远不会重置的有状态模式。在新纪元之前重置状态取决于用户,但 Keras 本身不会重置状态。在这种模式下,状态从一个批次的样本“i”传播到下一批的样本“i”。通常建议在每个 epoch 之后重置状态,因为状态可能会增长太久并变得不稳定。但是,根据我对小数据集(20,000-40,000 个样本)的经验,在一个 epoch 之后重置或不重置状态对最终结果没有太大影响。对于更大的数据集,它可能会有所作为。

如果您的模式跨越 100 多个时间步长,则有状态模型将非常有用。否则默认模式就足够了。根据我的经验,将批量大小设置为大致相当于数据中模式的大小(时间步长)也有帮助。

有状态的设置一开始可能很难掌握。人们会期望状态在一批的最后一个样本到下一批的第一个样本之间转移。但是状态实际上是在相同编号的样本之间跨批次传播的。作者有两个选择,他们选择了后者。在此处阅读有关内容。另请参阅有关有状态 RNN的相关Keras FAQ部分

  • 我认为我对默认模式的看法是错误的。Nassim 的答案是正确的,并且状态不会在批次中的样本之间传播。在一个批次中,假设样本是独立的。因此,要回答您的问题, yes stateful =False 就足够了。我会尽快阅读更多内容并更新我的答案。 (2认同)

Nas*_*Ben 6

RNN代码文档中,您可以阅读:

关于在RNN中使用有状态的注意事项:

您可以将RNN图层设置为"有状态",这意味着为一个批次中的样本计算的状态将重新用作下一批中样本的初始状态.这假设在不同连续批次中的样本之间进行一对一映射.

我知道这并没有直接回答你的问题,但对我来说它证实了我的想法:当LSTM不是有状态时,状态会在每个样本后重置.它们不按批次工作,批量生产的想法是每个样品彼此独立.

因此,您可以为示例重置1000次状态.