神经网络

LSTM复发性神经网络——如何教网络记住过去

视觉的解释与双向长期短期记忆LSTM例子来解决“多对多”序列问题

长短期记忆(LSTM)神经网络。作者形象。

介绍

标准的递归神经网络(RNNs)患有短期记忆消失由于梯度问题出现在处理时间序列数据。

RNNs的幸运的是,我们有更高级的版本,可以保留重要的信息从早些时候的部分序列和推动这一进程向前发展。两个著名的版本长短期记忆(LSTM)封闭的复发性单位(格勒乌)

在这篇文章中,我关注的结构LSTM并为您提供一个详细的Python示例供您使用。

内容

  • LSTM坐在宇宙机器学习哪里?
  • 什么使LSTM不同于标准RNNs和LSTM是如何工作的呢?
  • Python示例向您展示如何构建一个完整的和训练自己的LSTM模型

LSTM坐在宇宙机器学习哪里?

下面的图是我尝试分类最常见的机器学习算法。

While我们经常使用神经网络监督的方式标记的训练数据,我认为他们独特的机器学习方法应该得到一个单独的类别。

因此,我的图显示神经网络(NNs)分支宇宙从机器学习的核心。复发性神经网络占领NNs和控制算法的一个分支如标准RNNs LSTMs,天鹤座。

下面的图是互动,所以请点击不同的类别扩大并揭示更多

机器学习算法的分类。交互式图表创建的作者

如果你喜欢科学和机器学习的数据,请订阅得到一个电子邮件与我的新文章。

什么使LSTM不同于标准RNNs和LSTM是如何工作的呢?

让我们快速回顾一下一个简单的开始RNN结构。RNN由类似于前馈多层神经网络的输入层、隐层(s)和输出层。

递归神经网络结构的一个图表。
递归神经网络结构的一个图表。
标准的递归神经网络架构。图像中作者

然而,RNN包含复发性单位在其隐层,它允许算法过程序列数据。它通过反复地从先前的一个隐藏的状态步伐并结合当前的输入。

步伐——单处理的输入通过周期性的单位。步伐的数量等于序列的长度。

你可以找到一个标准RNNs在我的详细解释前一篇文章如果需要的话。

RNN LSTM不同于标准如何?

我们知道RNNs利用复发性单位学习序列数据。LSTMs也是如此。然而,发生在复发性单位两者之间有很大的不同。

简化的复发性单元图中的一个标准RNN(重量和偏见不是如图所示),我们注意到只有两个主要操作:结合前面的隐藏状态与新输入和传递通过激活功能:

标准RNN的单位。图像中作者

在步伐t计算隐藏的状态后,它是传回的单位并结合输入步伐t + 1来计算新步伐t + 1隐藏状态。这个过程重复t + 2, t + 3,…, t + n到预定义的数量(n)的步伐。

与此同时,盖茨LSTM采用各种决定哪些信息是保留还是删除。同时,它增加了一个细胞状态就像LSTM的长期记忆。让我们仔细看看。

LSTM是如何工作的呢?

LSTM复发RNN的单位比这要复杂得多,它可以提高学习,但是需要更多的计算资源。

LSTM复发性单位。图像中作者

让我们浏览一下简化图(重量和偏见没有显示)学习如何LSTM复发单元处理信息。

  1. 隐藏的状态和新的投入从先前的步伐——隐藏的状态(h_t-1)和输入的电流步伐(x_t)结合之前的副本通过各种门。
  2. 忘记门——这门控制哪些信息应该被遗忘。自乙状结肠函数范围在0和1之间,它集值细胞状态应该丢弃(乘以0),记得(乘以1),或部分记得(乘以一个值在0和1之间)。
  3. 输入门有助于识别重要元素需要被添加到细胞状态。注意,输入门得到的结果乘以细胞状态的候选人,只有认为重要的信息输入门被添加到细胞状态。
  4. 更新细胞状态——首先,前面的细胞状态(c_t-1)乘以忘记门的结果。然后我们添加新信息(输入门×细胞状态的候选人)获得最新的细胞状态(c_t)。
  5. 更新隐藏状态- - - - - -最后一部分是更新隐藏状态。最新的细胞状态(c_t)通过tanh激活函数,乘以结果输出的门。

最后,最新的细胞状态(c_t)和隐藏的状态(h_t)回到复发性单位,和在t + 1步伐过程重复。循环持续进行直到我们到达结束序列。

Python示例向您展示如何构建一个完整的和训练自己的LSTM模型

我们可以使用LSTMs在四个不同的方面:

  • 一对一的理论上可行,但考虑到一个项目不是一个序列,你不会得到任何LSTMs提供的好处。因此,最好使用一个前馈神经网络在这种情况下。
  • 多对一——使用一个序列值来预测未来值。你可以找到一个Python示例在我这种类型的设置RNN的文章
  • 一对多——使用一个值来预测的序列值。
  • 多对多——使用的序列值来预测未来值的序列。现在我们将构建一个多对多的LSTM。

设置

得到以下数据和库:

让我们导入所有库:

上面的代码输出包版本我用这个例子:

Tensorflow / Keras: 2.7.0
熊猫:1.3.4
numpy: 1.21.4
sklearn: 1.0.1
情节:5.4.0

接下来,下载并摄取澳大利亚天气数据(来源:Kaggle)。我们只摄取列的一个子集,因为我们对我们的模型不需要整个数据集。

同时,我们执行一些简单的数据操纵和派生出一些新的变量:Year-Month和平均温度。

的一个片段Kaggle澳大利亚天气数据做了一些调整。图像中作者

目前,我们有一个值为每个位置和温度记录日期。然而,每日温度波动使预测更加困难。让我们计算每月平均和转置数据行和Year-Months列位置。

月平均温度的位置和月。图像中作者

由于我们处理现实生活中的数据时,我们注意到三个月(2011 - 04、2012 - 12和2013 - 02)是完全从dataframe失踪。因此,我们转嫁值失踪几个月前和随后通过平均月。

最后,我们可以画出一个图表的数据。

月平均温度。图像中作者

图显示所有位置开始,但我却选择了四个(堪培拉,达尔文,黄金海岸,和山Ginini)显示在上面的图像。

注意的平均温度,以及变异,不同的位置。我们可以培训地点的模型更好的精度,或者我们可以训练一个通用模型,可以预测每个区域的温度。

在这个例子中,我将训练我们LSTM模型在一个位置(堪培拉)。如果你有兴趣在一个通用模型,别担心,我将解决它在封闭在我的下一篇文章中反复出现的单位(格勒乌)。订阅不要错过它!

培训和评估LSTM模型

这里有一些事情要突出在我们开始之前。

  • 我们将使用18个月序列来预测未来18个月的平均温度。你可以调整你的喜欢,但要小心,不会有足够的数据序列的长度超出了23个月。
  • 我们将把数据分割成两个独立的dataframes—一个用于培训,另一个用于验证(没时间了验证)。
  • 因为我们正在创造一个多对多预测模型,我们需要使用一个稍微复杂encoder-decoder配置。编码器和译码器都是隐藏LSTM层,信息传递从一个到另一个通过重复向量层。
  • 一个重复向量是必要的,当我们想要不同长度的序列,例如,18个月的序列来预测未来12个月。它确保我们提供合适的形状一个译码器层。但是,如果您的输入和输出序列长度相同的是在我的例子中,那么你也可以选择集return_sequences = True在编码器层和删除重复向量。
  • 注意,我们添加了一个双向包装LSTM层。它允许我们火车模型在两个方向上,有时会产生更好的结果。然而,它的使用可选的。
  • 同时,我们需要使用一个时间分布包装器在输出层预测输出分别为每一个步伐。
  • 最后,请注意,我使用了任何范围的数据在这个例子中,因为它会取得更好的结果比与扩展数据模型训练(MinMaxScaler)。你可以找到缩放和们在Jupyter笔记本在GitHub库版本(链接的文章)

首先,让我们定义一个helper函数重塑LSTMs所需的数据到一个三维数组。

接下来,我们火车LSTM神经网络超过1000时代和显示一个总结与评价指标模型。你可以跟随我的代码中的注释理解每一步。

上面的代码打印以下总结和评价指标为我们LSTM神经网络(请注意,您的结果可能不同由于神经网络训练的随机性质):

LSTM神经网络的性能。图像中作者

现在让我们绘制结果的图表来比较实际值和预测值。

实际温度与LSTM神经网络预测温度
实际温度与LSTM神经网络预测温度
LSTM神经网络预测与实绩。图像中作者

看起来我们在寻求相对成功的预测平均温度在堪培拉。看看你是否能得到更好的结果,不同的澳大利亚城市!

最后的评论

我真诚地希望你喜欢读这篇文章,获得一些新的知识。

你可以找到完整的Jupyter代码在我的笔记本上GitHub库。感觉感觉用它来构建自己的LSTM神经网络,和不要犹豫联系如果你有任何问题或建议。

干杯!
扫罗Dobilas

阐明数据科学和机器学习|加入https://solclover.com/membership|连接www.linkedin.com/in/saulius-dobilas| Twitter @SolClover

Baidu
map