如何处理极长的 LSTM 序列长度?

Posted

技术标签:

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

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

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

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

【问题讨论】:

嘿,我正在研究质谱中的类似问题。你有进步吗? 【参考方案1】:

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

https://arxiv.org/abs/1904.10509

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

【讨论】:

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

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

【讨论】:

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

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

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

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

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

那么你问的这个问题

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

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

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

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

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

【讨论】:

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

以上是关于如何处理极长的 LSTM 序列长度?的主要内容,如果未能解决你的问题,请参考以下文章

LSTM 时间序列分类

Transformer-XL,处理超级长序列的Transformer

白白的(baibaide)

LSTM如何处理变长序列

#4139. 白白的(baibaide)

LSTM 批量大小和序列长度如何影响内存