首页 文章

批次中的LSTM状态

提问于
浏览
3

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

对于每批:

  • 输入2D张量 (seq_length, n_features) 并为每个输入2D张量计算梯度

  • 对这些渐变求和以获得批次上的总梯度

  • 反向传播渐变并更新权重

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

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

1 回答

  • 2

    默认情况下,Keras中的LSTM不具有状态 - 每个序列都以新重置状态开始 . 通过在重复图层中设置 stateful=True ,批量中的连续输入将在长度为 batch_size * seq_length 的序列上进行训练 .

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

    从理论上讲,它可以改善学习,因为较长的上下文可以向网络传授有关分布的信息,这些信息在测试单独较短的序列时仍然是相关的 . 如果网络正在学习一些概率分布,那么该分布应该保持不同的序列长度 .

    此外,Keras的默认行为是在每个纪元开始时对输入样本进行混洗,以便在每个时期更改批处理上下文 . 由于批处理上下文是随机的,因此这种行为似乎与通过批处理保持隐藏状态相矛盾 .

    我没有检查过,但我认为当 stateful=True 时,只有批次被洗牌 - 而不是其中的序列 .

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

相关问题