【问题标题】:How to handle extremely long LSTM sequence length?如何处理极长的 LSTM 序列长度?
【发布时间】:2017-11-12 16:19:55
【问题描述】:

我有一些数据以非常高的速率(每秒数百次)进行采样。这导致任何给定实例的平均序列长度很大(约 90,000 个样本)。这整个序列只有一个标签。我正在尝试使用 LSTM 神经网络将新序列分类为这些标签之一(多类分类)。

但是,使用具有如此大序列长度的 LSTM 会导致网络非常大。

有哪些方法可以有效地“分块”这些序列,以便我可以减少神经网络的序列长度,同时仍保留整个实例中捕获的信息?

【问题讨论】:

  • 嘿,我正在研究质谱中的类似问题。你有进步吗?

标签: neural-network lstm


【解决方案1】:

三年后,我们似乎开始着手解决这类问题:稀疏变换器。

https://arxiv.org/abs/1904.10509

https://openai.com/blog/sparse-transformer/

【讨论】:

  • 你能解释一下解决方案的要点吗?
【解决方案2】:

这篇文章是很久以前的,但我想我会在这里插话。对于您正在处理的这个特定问题(具有局部性、合成性和平稳性的一维连续值信号),我强烈推荐使用 CNN 卷积神经网络方法,而不是使用 LSTM。

【讨论】:

  • 谢谢@xgaox。这篇文章确实是很久以前的,现在我也会用 CNN 来解决这个问题。但是,仅此一项并不能解决序列过长的问题。
【解决方案3】:

当序列非常长时,RNN 可能会面临梯度消失和梯度爆炸的问题。

有方法。您首先需要了解的是为什么我们需要尝试上述方法?这是因为由于上述问题,反向传播会变得非常困难。

是的,LSTM 的引入大大减少了这一点,但当它太长时,你仍然会面临这样的问题。

所以一种方法是剪裁渐变。这意味着您设置了渐变的上限。参考这个stackoverflow question

那么你问的这个问题

有哪些方法可以有效地“分块”这些序列?

一种方法是随时间截断反向传播。有多种方法可以实现这个截断的 BPTT。简单的想法是

  1. 仅计算给定时间步数的梯度 这意味着如果您的序列是 200 个时间步长并且您只给出 10 个时间步长,它只会计算 10 个时间步长的梯度,然后将该 10 个时间步长中存储的内存值传递给下一个序列(作为初始单元状态)。这个方法是什么tensorflow using to calculate truncated BPTT.

2.获取完整序列,仅从选定时间块的某些给定时间步长反向传播梯度。这是一个连续的方式

这是我找到的最好的文章,它解释了这些截断的 BPTT 方法。很容易。参考这个Styles of Truncated Backpropagation

【讨论】:

  • 谢谢!使用这些方法,我还能用大约 90,000 个 LSTM 层构建网络吗?这就是我目前的问题所在,因为我不相信这会在合理的时间内进行训练。
  • 理论上是的!你可以。但实际上这并不容易。一件事是训练时间。另一个问题是,当您有这么多长连接时,它们往往会随着时间步长而丢失内存。
  • 我认为您的回答对于处理一般 RNN 问题是有效的。但是,我在这个问题中的问题只是关于一个网络,当展开时,它会非常大并且需要很长时间来训练。相反,我将我的序列分解为带有单独标签的更小的子序列。
  • BPTT 链接已失效。你能发布更新或参考吗?
猜你喜欢
  • 2018-09-30
  • 2018-12-08
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 2018-08-29
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多