我在RNNs / LSTM上经历了这个tutorial,而且我很难理解有状态的LSTM。我的问题如下:
在RNNs上的Keras文档中,我发现批处理中i
位置的样本的隐藏状态将作为{{1中的样本的输入隐藏状态。 - 下一批中的位置。这是否意味着如果我们想要将隐藏状态从样本传递到样本,我们必须使用大小为1的批次,因此执行在线梯度下降?有没有办法在一批大小> 1的情况下传递隐藏状态并在该批次上执行渐变下降?
在教程的段落中,有关一个字符到一个字符映射的状态LSTM'给出了一个代码,该代码使用i
和batch_size = 1
来学习预测字母表中字母的下一个字母。在代码的最后部分(第53行到完整代码的结尾),模型以随机字母开头进行测试(' K')并预测' B'然后给出' B'它预测了C'等等。除了' K'它似乎运作良好。但是,我尝试了下面的代码调整(最后一部分,我保留了52行及以上):
stateful = True
因此,如何将当前隐藏状态的先前隐藏状态保持为当前隐藏状态的初始隐藏状态,这有助于我们在测试过程中学习,如果我们从字母“K'例如,字母A到J之前不会被输入,并且初始隐藏状态不会与训练期间相同?
我想在整本书上训练我的LSTM以学习如何生成句子,也许也可以学习作者的风格,我怎样才能自然地训练我的LSTM文本(输入整个文本并让LSTM找出依赖关系)在这些词之间而不是必须“人为地”。从我自己创建批量句子来训练我的LSTM?我相信我应该使用有状态的LSTM可以帮助,但我不确定如何。
答案 0 :(得分:21)
在Keras中使用有状态LSTM意味着将使用Keras变量来存储和更新状态,实际上您可以随时检查状态向量的值(即,直到你打电话给reset_states()
)。另一方面,非状态模型在每次处理批处理时都将使用初始零状态,因此就好像您始终在reset_states()
,train_on_batch
之后调用test_on_batch
并且predict_on_batch
。有关状态被重用于有状态模型的下一批次的解释与非有状态有关;当然,状态将始终在批处理中流动,并且您不需要具有大小为1的批次才能实现。我看到两个有状态模型很有用的场景:
我同意字母表中RNN的例子在实践中看起来并不是很有用;只有当你从字母A开始时它才会起作用。如果你想学习从任何字母开始重现字母表,你需要用这种例子(字母表的子序列或旋转)训练网络。但我认为一个常规的前馈网络可以学习预测下一个字母表培训的字母,如(A,B),(B,C)等。我认为这个例子仅用于说明目的而不是其他任何目的
您可能已经阅读过它,但是热门帖子The Unreasonable Effectiveness of Recurrent Neural Networks显示了一些有趣的结果(尽管它并没有真正涉及实现细节)。我没有使用文本数据培训RNN的个人经验,但您可以研究多种方法。您可以构建基于字符的模型(如帖子中的模型),您可以一次输入和接收一个字符。更高级的方法是对文本进行一些预处理,并将它们转换为数字序列; Keras包括一些text preprocessing functions来做到这一点。将一个数字作为特征空间可能无法正常工作,因此您可以简单地将每个单词转换为具有单热编码的向量,或者更有趣的是,让网络为每个单词学习最佳向量表示,其中他们称之为en embedding。您可以进一步使用预处理并查看NLTK之类的内容,特别是如果您想删除停用词,标点符号等内容。最后,如果您有不同大小的序列(例如,您使用的是全文而不是固定大小的摘录,这对您来说可能重要或不重要),您需要更加小心并使用masking和/或sample weighting。根据确切的问题,您可以相应地设置培训。如果你想学习生成类似的文本,“Y”将类似于“X”(单热编码),只移动一个(或更多)位置(在这种情况下,您可能需要使用{{ 1}}和TimeDistributed layers)。如果您想确定autor,您的输出可能是softmax Dense layer。
希望有所帮助。