【问题标题】:State resetting in LSTMs during training and testing训练和测试期间 LSTM 中的状态重置
【发布时间】:2017-06-07 12:00:55
【问题描述】:
我正在尝试理解和实施 LSTM。我知道他们需要定义一个序列长度 T,并且训练是分批进行的。所以我们向网络输入了几个长度为 T 的序列。现在 LSTM 需要一个先前的状态作为输入,据我所知,它被初始化为零。我的问题是,每个序列后状态是否重置为零?比如我有一个序列1,状态向量在这个序列中结转,然后我把它归零用于下一个序列?还是将其带到下一个序列2?如果是,如何处理不相关的序列;例如,我有来自 2 个不同文本的样本,将状态从文本 1 传递到文本 2 是没有意义的;这在实践中是如何处理的?
关于测试时间,状态向量初始化为零并携带整个序列,还是在每个子序列后重置?
注意:我也在 Tensorflow 中添加了标签,因为这是我正在使用的框架,也许那里的人也可以帮助我。
【问题讨论】:
标签:
tensorflow
deep-learning
lstm
recurrent-neural-network
【解决方案1】:
这取决于你如何实现 RNN 的批处理。
从理论上讲,状态在处理数据序列时非常重要,因此如果整个数据序列没有完成,则不应重置状态。
因此,通常您需要在 epoch 结束时进行重置,而不应仅在一个批次循环结束时进行重置。
【解决方案2】:
在 Tensorflow 中,我 95% 确定每个序列的起始状态对于批次中的每个元素以及批次之间的每个元素都重置为零。 (5% 是因为“永不言败”规则 :)
编辑:
我可能应该详细说明。 Tensorflow 是如何工作的,它首先构建一个图表,然后将你的数据推送出去。当您查看您构建的循环图时,我相信您会看到它的头部(第一个状态)连接到零,这意味着每次通过图推送数据(例如通过 sess.run())时,它都会从零生成器获得一个新的零,因此如果忘记了它的旧状态来自以前的运行。