# 如何利用长短期记忆循环神经网络处理很长的序列

> 原文： [https://machinelearningmastery.com/handle-long-sequences-long-short-term-memory-recurrent-neural-networks/](https://machinelearningmastery.com/handle-long-sequences-long-short-term-memory-recurrent-neural-networks/)

长短期记忆或LSTM循环神经网络能够学习和记忆长输入序列。

如果您的问题为每个输入都有一个输出，如时间序列预测或文本转换，LSTM可以很好地工作。但是当你有很长的输入序列而只有一个或几个输出时，LSTM可能很难使用。

这通常称为序列标记或序列分类。

一些例子包括：

*   包含数千个单词的文件中的情感分类（自然语言处理）。
*   数千个时间步骤（医学）的脑电图痕迹的分类。
*   数千个DNA碱基对序列的编码或非编码基因的分类（生物信息学）。

当使用像LSTM这样的循环神经网络时，这些所谓的序列分类任务需要特殊处理。

在这篇文章中，您将发现6种方法来处理序列分类问题的很长序列。

让我们开始吧。

![How to Handle Very Long Sequences with Long Short-Term Memory Recurrent Neural Networks](img/6aab78f734f460fd40c6f74d9ee5c3a4.jpg)

如何使用长短期记忆循环神经网络处理很长的序列
照片由 [Justin Jensen](https://www.flickr.com/photos/justinjensen/8883963633/) ，保留一些权利。

## 1.按顺序使用序列

起点是按原样使用长序列数据而不做任何更改。

这可能导致训练时间非常长的问题。

更麻烦的是，尝试在非常长的输入序列上反向传播可能会导致梯度渐渐消失，反过来又会导致难以理解的模型。

对于大型LSTM模型，通常在实践中使用250-500时间步长的合理限制。

## 2.截断序列

处理很长序列的常用技术是简单地截断它们。

这可以通过从输入序列的开头或结尾有选择地删除时间步骤来完成。

这将允许您以丢失数据为代价强制序列处于可管理的长度。

截断输入序列的风险是，为了进行准确预测而对模型有价值的数据正在丢失。

## 3.总结序列

在一些问题域中，可以概括输入序列。

例如，在输入序列是单词的情况下，可以从输入序列中移除高于指定单词频率的所有单词（例如“和”，“该”等）。

这可以被构造为仅将观察结果保持在整个训练数据集中的排名频率高于某个固定值的位置。

总结可以导致将问题集中在输入序列的最显着部分上并且充分减少输入序列的长度。

## 4.随机采样

较不系统的方法可以是使用随机采样来总结序列。

可以从序列中选择随机时间步骤并将其从序列中移除，以便将它们减少到特定长度。

或者，可以选择随机连续子序列以在期望长度上构建新的采样序列，小心处理域所需的重叠或非重叠。

这种方法可能适用于没有明显方法来系统地减少序列长度的情况。

该方法还可以用作一种数据增强方案，以便从每个输入序列创建许多可能的不同输入序列。当可用的训练数据有限时，这些方法可以提高模型的鲁棒性。

## 5.使用截断反向传播

不是基于整个序列更新模型，而是可以从最后时间步骤的子集估计梯度。

这被称为[通过时间截断反向传播](http://machinelearningmastery.com/gentle-introduction-backpropagation-time/)，或简称为TBPTT。它可以显着加速长序列中LSTM等循环神经网络的学习过程。

这将允许所有序列作为输入提供并执行正向传递，但是仅使用最后几十或几百个时间步长来估计梯度并用于权重更新。

LSTM的一些现代实现允许您指定用于更新的时间步数，将用作输入序列的时间步长分开。例如：

*   [Theano](http://deeplearning.net/software/theano/library/scan.html) 中的“truncate_gradient”参数。

## 6.使用编解码器架构

您可以使用自编码器来学习长序列的新表示长度，然后使用解码器网络将编码表示解释为所需的输出。

这可能涉及无监督自编码器作为序列的预处理传递，或者用于自然语言翻译的更新近的[编解码器LSTM样式网络](http://machinelearningmastery.com/learn-add-numbers-seq2seq-recurrent-neural-networks/)。

同样，从非常长的序列中学习可能仍然存在困难，但是更复杂的架构可以提供额外的杠杆或技能，特别是如果与上述一种或多种技术结合使用。

## 荣誉提及和疯狂的想法

本节列出了一些未经过深思熟虑的其他想法。

*   探索将输入序列分成多个固定长度的子序列，并训练具有每个子序列的模型作为单独的特征（例如，并行输入序列）。
*   探索双向LSTM，其中对中的每个LSTM适合输入序列的一半，并且每个层的结果被合并。从2缩放到更多以适当地减少子序列的长度。
*   探索使用序列感知编码方案，投影方法甚至散列，以减少特定于域的方式中的时间步数。

你有自己的疯狂想法吗？
请在评论中告诉我。

## 进一步阅读

本节列出了一些用于进一步阅读序列分类问题的资源：

*   维基百科上的[序列标记](https://en.wikipedia.org/wiki/Sequence_labeling)。
*   [序列分类简介](http://dl.acm.org/citation.cfm?id=1882478)，2010

## 摘要

在这篇文章中，您发现了在训练像LSTM这样的复现神经网络时如何处理很长的序列。

具体来说，你学到了：

*   如何使用截断，摘要和随机采样来减少序列长度。
*   如何调整学习使用截断反向传播的时间。
*   如何调整网络架构以使用编解码器结构。

你有任何问题吗？
在评论中提出您的问题，我会尽力回答。