keras 何时重置 LSTM 状态?

Posted

技术标签:

【中文标题】keras 何时重置 LSTM 状态?【英文标题】:When does keras reset an LSTM state? 【发布时间】:2017-10-08 12:44:27 【问题描述】:

我阅读了各种有关它的文字,但似乎没有人回答这个非常基本的问题。总是模棱两可:

stateful = False LSTM 层中,keras 是否重置状态:

每个序列;或 每批?

假设我的 X_train 形状为 (1000,20,1),表示单个值的 20 个步骤的 1000 个序列。如果我做:

model.fit(X_train, y_train, batch_size=200, nb_epoch=15)

它会重置每个序列的状态(重置状态 1000 次)吗? 还是会为每批重置状态(重置状态 5 次)?

【问题讨论】:

关于这一点的阅读非常好:http://philipperemy.github.io/keras-stateful-lstm/ 根据我收集到的信息,批量重置每个序列(samples 用 keras 术语)的状态, 每批之后。 【参考方案1】:

似乎每个人都把它弄得太混乱了。 Keras LSTM 在每批后重置状态。

这是一个不错的博客:https://machinelearningmastery.com/understanding-stateful-lstm-recurrent-neural-networks-python-keras/

阅读此博客中的 LSTM State Within A BatchStateful LSTM for a One-Char to One-Char Mapping 主题。它显示了为什么它必须仅在批处理后重置它。

【讨论】:

如果stateful=False 为真,stateful=True 则为假。【参考方案2】:

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

首先,层中没有一个状态,而是批次中每个样本一个状态。这样一层有batch_size个并行状态。

有状态=假

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

带有10 sequences 的批处理将创建10 states,所有10 个状态在处理后都会自动重置。

下一个带有10 sequences 的批次将创建10 new states,在此批次处理后也会被重置

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

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

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

一种状态是:我现在在序列中的什么位置?是哪个时间步长?这个特定序列从开始到现在表现如何? 权重是:我对迄今为止看到的所有序列的一般行为了解多少?

有状态=真

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

带有10 sequences 的批处理将创建10 states,该10 states 将在批处理结束时保持不变。

带有10 sequences 的下一批(它必须是10,因为第一个是10)将重用之前创建的10 states

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

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

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

当你看到你达到了序列的总长度,然后你打电话给model.reset_states(),这意味着你将不再继续之前的序列,现在你将开始提供新的序列。

【讨论】:

你说的“第二批的10个序列只是在延续第一批的10个序列,好像根本没有中断一样”,我真的不明白。你能否提供一个简单的例子。另外,我不明白你为什么要写“10 个单独的序列,每个序列的长度为 14”。这是否意味着第二批的序列在时间上与第一批的序列相关联?谢谢 实际上,我不明白第二批的序列是如何通过国家的保护与第一批的序列联系起来的。如果您对此有任何(简单)数学,将不胜感激 状态只是一个矩阵,其中的数字代表层的内存。如果有数字,就有记忆。如果数字被重置,则没有内存。这是将一个序列步骤链接到另一个序列步骤的唯一方法(它们是否在同一批次中并不重要)。 我使用真实序列进行了测试,将它们切成两半并正确组织批次。然后我检查了结果,他们没问题。后来研究了源码,再次确认。并且可以通过在层中使用return_state=True 来检查状态。 (需要一个功能性 API 模型)——LSTMCell 的代码,在 call 方法中。状态为c,输出为o。 (github.com/keras-team/keras/blob/master/keras/layers/…) @Joseph_Marzbani,状态矩阵的“大小”包含“批量大小”。这意味着存在“批量大小”状态,每个输入序列一个。除了非常特定的自定义应用程序外,Keras 不会批量混合样本。数学上只有一个矩阵,但矩阵的每一行都与批次的一个样本相关。很少有操作混合这些样本。【参考方案3】:

扩展@Nassim_Ben 的答案,确实每个序列对于批次的每个实例都被认为是独立的。但是,您需要记住,RNN 的隐藏状态和单元记忆会被传递到下一个单元,持续 20 步。对于 20 个单元中的第一个单元,隐藏状态和单元记忆通常设置为零。

在第 20 个单元之后,并且在隐藏状态(仅,不是单元内存)被传递到 RNN 之上的层之后,状态被重置。我将假设它们在这里表示单元记忆和隐藏状态。

所以是的,它确实会为所有 1000 个实例重置,但是,考虑到您的 batch_size=200,它会重置 5 次,每个批次在通过这 20 个步骤传递信息后都会重置。希望您对此有所了解。

Here's 我在一个项目中遇到了同样的问题。特别注意单元格 15,它在单元格 11after 中的说明。我一直在附加字母,因为否则状态会被重置。

【讨论】:

【参考方案4】:

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

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

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

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

【讨论】:

所以,如果他们在stateful = False 中使用状态,就像他们对stateful = True 一样,我的意思是,批次中的每个样本都有不同的单独状态,然后在之后重置状态每个批次都等效于(在数字上)在每个样本之后重置状态(因为每个样本状态已经是一个单独的状态。整个问题是:如果我希望每个样本不干扰另一个样本的状态,stateful=False 就足够了还是我必须采取额外措施? 我认为我对默认模式的看法是错误的。 Nassim 的答案是正确的,并且状态不会在批次中的样本之间传播。在一个批次中,假设样本是独立的。因此,要回答您的问题,是的 stateful =False 就足够了。我会阅读更多内容并尽快更新我的答案。【参考方案5】:

在doc of the RNN code 你可以读到这个:

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

您可以将 RNN 层设置为“有状态”,这意味着状态 为一批中的样本计算的将被重新用作初始状态 用于下一批样品。这假设一对一的映射 不同连续批次的样本之间。

我知道这并不能直接回答您的问题,但对我来说,它证实了我的想法:当 LSTM 没有状态时,每次采样后都会重置状态。它们不是按批次工作的,批次中的想法是每个样本彼此独立。

因此,您的示例有 1000 次状态重置。

【讨论】:

以上是关于keras 何时重置 LSTM 状态?的主要内容,如果未能解决你的问题,请参考以下文章

将 Pytorch LSTM 的状态参数转换为 Keras LSTM

keras 有状态 LSTM

有状态 LSTM - 批次之间和批次内的隐藏状态转移 (Keras)

如何在Keras训练LSTM的初始状态?

Keras 如何处理单元格和隐藏状态(RNN、LSTM)的初始值以进行推理?

MLP初始化Keras中的LSTM细胞状态