批次内的 LSTM 状态

H.M*_*.M. 4 stateful lstm keras recurrent-neural-network

我目前正在编写用于循环网络训练Keras 教程,但我无法理解有状态 LSTM 概念。为了使事情尽可能简单,序列具有相同的长度seq_length。据我所知,输入数据是有形状的(n_samples, seq_length, n_features),然后我们在n_samples/M批量大小上训练我们的 LSTM M,如下所示:

对于每批:

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

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

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

tao*_*oat 5

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

为什么保持先前序列的隐藏状态并将其用作我们当前序列的初始隐藏状态可以改善我们测试集的学习和预测,因为在进行预测时“先前学习”的初始隐藏状态将不可用?

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

此外,Keras 的默认行为是在每个 epoch 开始时打乱输入样本,以便在每个 epoch 更改批处理上下文。这种行为似乎与通过批处理保持隐藏状态相矛盾,因为批处理上下文是随机的。

我没有检查过,但我假设 when stateful=True,只有批次被洗牌 - 而不是其中的序列。

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

  • 好吧,我的坏处是我刚刚在 keras 文档中发现:https://keras.io/layers/recurrent/ 我发现批次中第 i 个位置的样本的隐藏状态将作为输入隐藏状态提供下一批中第 i 个位置的样本。这是否意味着如果我们想要将隐藏状态从一个样本传递到另一个样本,我们必须使用大小为 1 的批次,从而执行在线梯度下降?有没有办法在大小>1的批次中传递隐藏状态并对该批次执行梯度下降? (2认同)