在LSTM中处理较长的时间步序列

时间:2019-03-18 09:20:52

标签: python tensorflow machine-learning keras lstm

我正在尝试使用LSTM来预测有关时间步序列的信息。

我的数据看起来像这样:我有几个相对较长的序列(> 100000个时间步长)的不同样本,并且我试图解决一个N类分类问题,其中每个样本都被标记为不同的ID。现在,我试图了解如何正确准备数据,以便LSTM可以分别对每个样本进行训练。

在最基本的情况下,我只是将每个样本完全馈入网络:

this.countries[i]['countryCode']

train_data的形状为(4,100000,1)。

但是周围的许多博客文章(例如here)都告诉我,在很长的序列上训练LSTM可能会损害训练。因此,我不了解如何根据LSTM内部状态正确分割数据。

我可以将每个100000个长序列拆分为500个长子序列,然后我的数据将具有以下形状:(800,500,1)。但是我能告诉LSTM仍然理解较大的序列吗(保持相同较大序列的子序列之间的内部状态,并在切换到新序列时重新初始化它)?

如果有人可以对此过程有所了解,我会很高兴!

1 个答案:

答案 0 :(得分:0)

问题已经存在了一段时间。不知道您是否仍然对我谦虚的两分钱感兴趣。关于LSTM的事情就是这样,尽管设计得很优雅,但它仍然遭受梯度消失和/或爆炸梯度的困扰。为单元状态添加一个遗忘门可缓解此问题,因为当遗忘门输出0时,反向传播过程将在该门处停止向后“流动”。但是,这并不意味着当您将无限长的序列输入LSTM时,LSTM就不会出现爆炸/消失的梯度。只需想象一下这样的情况:忘记门连续输出1次50次,并且使用BPTT进行的最后一次输出的梯度看起来与原始RNN非常相似,因为门是“关闭”的。

为什么会这样?因为您最初的参数集可能不是最佳的。而且还因为较长的序列需要BPTT花费更多的时间步长,因此发生这种情况的机会更高。您可以尝试对分段数据子集进行LSTM训练。