【问题标题】:LSTM state within a batch批次内的 LSTM 状态
【发布时间】:2017-05-28 17:56:52
【问题描述】:

我目前正在研究Keras tutorial for recurrent network training,但我无法理解有状态的 LSTM 概念。为了使事情尽可能简单,序列具有相同的长度seq_length。据我所知,输入数据的形状为(n_samples, seq_length, n_features),然后我们在n_samples/M 大小为M 的批次上训练我们的LSTM,如下所示:

对于每个批次:

  1. 输入二维张量 (seq_length, n_features) 并为每个输入二维张量计算梯度
  2. 将这些梯度相加得到批次的总梯度
  3. 反向传播梯度并更新权重

在本教程的示例中,输入二维张量是输入大小为 seq_length 的字母序列,这些字母编码为长度为 n_features 的向量。但是,教程说在 LSTM 的 Keras 实现中,隐藏状态不会在输入整个序列(2D 张量)后重置,而是在输入一批序列以使用更多上下文后重置。

为什么保留前一个序列的隐藏状态并将其用作我们当前序列的初始隐藏状态会改善我们测试集的学习和预测,因为“以前学习的”初始隐藏状态在以下情况下将不可用做出预测?此外,Keras 的默认行为是在每个 epoch 开始时打乱输入样本,以便在每个 epoch 更改批处理上下文。这种行为似乎与通过批处理保持隐藏状态相矛盾,因为批处理上下文是随机的。

【问题讨论】:

    标签: keras lstm recurrent-neural-network stateful


    【解决方案1】:

    默认情况下,Keras 中的 LSTM 不是有状态的 - 每个序列都以新重置的状态开始。通过在循环层中设置stateful=True,批处理中的连续输入不会重置网络状态。这假设序列实际上是连续的,这意味着在(非常非正式的)意义上,您正在训练长度为 batch_size * seq_length 的序列。

    为什么要保持前一个序列的隐藏状态并使用 它作为我们当前序列的初始隐藏状态改进了 学习和我们测试集上的预测,因为“以前 学习”初始隐藏状态在制作时将不可用 预测?

    理论上,它可以改善学习,因为较长的上下文可以教会网络有关分布的信息,这些信息在对单独较短的序列进行测试时仍然相关。如果网络正在学习某种概率分布,则该分布应该适用于不同的序列长度。

    此外,Keras 的默认行为是在 每个时期的开始,因此批处理上下文在每个时期都发生变化。 这种行为似乎与保持隐藏状态相矛盾 一个批次,因为批次上下文是随机的。

    我还没有检查,但我假设当stateful=True 时,只有批次被打乱 - 而不是其中的序列。

    一般来说,当我们给网络一些初始状态时,我们并不意味着它是一个普遍更好的起点。这只是意味着网络可以在训练时将来自先前序列的信息考虑在内。

    【讨论】:

    • 好吧,我刚在 keras 文档中发现的错误:keras.io/layers/recurrent 我发现批次中第 i 个位置的样本的隐藏状态将作为输入隐藏状态提供给在下一批中的第 i 个位置采样。这是否意味着如果我们想将隐藏状态从一个样本传递到另一个样本,我们必须使用大小为 1 的批次,从而执行在线梯度下降?有没有办法在大小>1的批次中传递隐藏状态并对该批次执行梯度下降?
    • 很想知道您是否正确。到目前为止,我一直在纠结这样一个事实,即如果您的 batch_size > 1,那么将第一批第一个元素的隐藏状态传递给第二批的第一个元素似乎没有任何意义等等..也让我质疑状态是否在批次中传递,因为它会与先前的方法相冲突。即第二批的第二个元素是从第一批的第二个元素还是第二批的第一个元素继承状态?
    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 2016-11-09
    • 2020-02-03
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多