Keras 批处理中的LSTM状态

Keras 批处理中的LSTM状态,keras,lstm,recurrent-neural-network,stateful,Keras,Lstm,Recurrent Neural Network,Stateful,我目前正在开发一个应用程序,在理解有状态LSTM概念时遇到了困难。为了使事情尽可能简单,序列具有相同的长度seq_length。据我所知,输入数据是形状(n_样本、序列长度、n_特征),然后我们对LSTM进行n_样本/M批量M培训,如下所示: 每批: 输入2D张量(seq_length,n_features),并为每个输入2D张量计算梯度 将这些梯度相加,得到批次上的总梯度 反向传播梯度并更新权重 在本教程的示例中,二维张量的馈送是按照大小seq_length的字母序列馈送,这些字母编码为长度n

我目前正在开发一个应用程序,在理解有状态LSTM概念时遇到了困难。为了使事情尽可能简单,序列具有相同的长度
seq_length
。据我所知,输入数据是形状
(n_样本、序列长度、n_特征)
,然后我们对LSTM进行
n_样本/M
批量
M
培训,如下所示:

每批:

  • 输入2D张量
    (seq_length,n_features)
    ,并为每个输入2D张量计算梯度
  • 将这些梯度相加,得到批次上的总梯度
  • 反向传播梯度并更新权重
  • 在本教程的示例中,二维张量的馈送是按照大小
    seq_length
    的字母序列馈送,这些字母编码为长度
    n_特征的向量。然而,本教程指出,在LSTMs的Keras实现中,在输入整个序列(2D张量)后,隐藏状态不会重置,而是在输入一批序列以使用更多上下文后重置


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

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

    为什么要保留前一个序列的隐藏状态并使用 它作为当前序列的初始隐藏状态,提高了 学习和我们测试集上的预测,因为“以前 已学习的“初始隐藏状态在创建时不可用” 预测

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

    此外,Keras的默认行为是在 每个历元的开始,以便在每个历元更改批处理上下文。 这种行为似乎与保持隐藏状态相矛盾 批处理上下文是随机的

    我还没有检查,但我假设当
    stateful=True
    时,只有批处理被洗牌,而不是其中的序列


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

    好的,我的坏消息我刚刚在keras文档中发现:我发现批次中第I个位置的样本的隐藏状态将作为下一批次第I个位置样本的输入隐藏状态。这是否意味着,如果我们想将隐藏状态从一个样本传递到另一个样本,我们必须使用大小为1的批次,从而执行在线梯度下降?有没有办法在一个大于1的批次中通过隐藏状态并对该批次执行梯度下降?我很想知道你是否正确。到目前为止,我一直被这样一个事实绊倒:如果批大小大于1,那么第一批的第一个元素的隐藏状态传递给第二批的第一个元素似乎没有意义,依此类推。。这也让我怀疑状态是否在批处理中传递,因为它与之前的方法相冲突。i、 e.第二批的第二个元素是从第一批的第二个元素还是从第二批的第一个元素继承状态?