神经网络

RNN:循环神经网络-如何成功地在Python中建模顺序数据

一个对rnn的可视化解释和一步一步的使用Keras和Tensorflow Python库构建它们的指南

复发性神经网络。图像中作者

介绍

建模和预测顺序数据需要不同于标准回归或分类的方法。幸运的是,有一种称为循环神经网络(RNNs)的特殊类型的神经网络是专门为此目的设计的。

在这篇文章中,我将介绍RNN的结构,并给出一个完整的示例,说明如何在Python中使用Keras和Tensorflow构建一个简单的RNN。

如果你不熟悉神经网络的基本结构,你可能更喜欢熟悉自己前馈而且深前馈得到第一名。

内容

  • 看看机器学习的世界
  • 循环神经网络的架构
  • 如何构建和训练你自己的RNN的Python示例

看看机器学习的世界

虽然神经网络最常被用在带有标签的训练数据的监督方式下,我觉得他们独特的机器学习方法值得一个单独的类别。

循环神经网络有自己的子分支,由简单rnn、长、短期记忆(LSTMs)和门控循环单元(gru)组成。

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

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

如果你喜欢数据科学和机器学习,请订阅收到我的新文章的邮件。

循环神经网络(RNNs)的结构

首先,让我们回想一下典型的前馈神经网络是什么样的。注意,它可以包含任意数量的输入节点、隐藏节点和输出节点。下面的2-3-2结构纯粹是为了说明。

简单的前馈神经网络结构。图像中作者

接下来,如果我们看看RNN,我们会注意到一个轻微的区别。RNN内部的隐藏单元有一个内置的反馈循环,使信息可以多次传回到同一个节点。这些隐藏单元通常被称为复发性单位

简单的循环神经网络结构。图像中作者

循环单元处理预定义数量的信息步伐,每次通过激活函数传递一个隐藏状态和特定时间步长的输入。

步伐-单处理输入通过循环单元。例如,如果你只有一个时间步,那么你的输入只会被处理一次(相当于一个普通的隐藏节点)。如果您有七个时间步,那么您的输入将被处理七次。

下图展示了循环单元内部的反馈循环:

在时间步t的循环单元操作作者

注意,在初始时间步中,隐藏状态h0初始化为0。接下来,输出(一个隐藏的状态ht + 1返回给一个循环单元,并与以下输入一起再次处理:

在时间步t+1重复的单元操作。图像中作者

该过程重复进行,直到达到指定的时间步数。

让我们把所有这些联系在一起,看看一个简单的RNN有一个输入、一个隐藏节点(包含三个时间步)和一个输出会是什么样子。

循环单元的展开。图像中作者

为了帮助更详细地解释发生了什么,让我们看一个简单的例子。

假设你想根据过去三天的气温序列来预测明天的气温。然后:

  • 输入-虽然你可能只有一个输入节点,你必须传递三个数字序列作为你的输入,因为这是循环层所需要的,例如[x0, x1, x2],…,[x_{n-2}, x_{n-1}, x_{n}]。
  • 复发性层-在一个典型的前馈神经网络中,隐藏节点有两个参数:权重和偏差。然而,一个循环层有三个参数优化:输入的权重,隐藏单元的权重和偏差。注意,即使您有10个时间步,它仍然是3个参数。
  • 培训-使用反向传播算法训练一个典型的前馈神经网络。同时,训练RNN使用稍微修改的反向传播版本,其中包括时间展开来训练网络的权值。该算法以计算梯度向量为基础,称为反向传播的时间BPTT为短。

现在您已经熟悉了简单RNN的体系结构,让我们看一个Python示例。

如何构建和训练你自己的RNN的Python示例

设置

我们需要以下数据和库:

让我们导入所有的库:

上面的代码打印本例中使用的包版本:

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

接下来,我们下载并摄取澳大利亚的天气数据(来源:Kaggle).我们还执行一些简单的数据操作,并导出一个新的变量(中位温度)供我们使用。

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

考虑到数据包含澳大利亚多个地点的天气信息,让我们选择一个城市(堪培拉),并在图表上绘制日平均温度。

堪培拉的日平均气温。图像中作者

循环神经网络(RNN)的训练与评价

在我们训练和评估我们的循环神经网络之前,我们需要创建一个函数,它将帮助我们重新塑造数据,以遵循所需的格式。

上面的函数可以为任意数量的时间步重新构造数据。例如,我使用7个时间步(即,7天的温度序列来预测第二天的气温),它将像这样分割数据:

说明如何为RNN重新构造顺序数据。图像中作者

现在我们可以训练和评估我们的RNN。对于这个例子,我们使用了一个非常简单的神经网络,它有四层,每层只有一个节点。您可以通过添加额外的层、节点或更改激活函数来进行试验。

示例中使用的RNN结构。图像中作者

我对下面的代码进行了广泛的注释,以便让您清楚地了解每个部分的作用。因此,我不会在文章正文中重复同样的内容。

上面的代码打印出我们的循环神经网络的总结和评估指标如下:

循环神经网络性能。图像中作者

现在让我们在图表上绘制结果,并比较实际值和预测值。注意,我们使用inverse_transform函数将目标和预测从缩放(我们在训练RNN之前使用MinMaxScaler)转换为原始值范围。

RNN模型对试验数据的预测。图像中作者

以上结果适用于测试数据集。这个预测看起来相当准确,但请记住,我们在每种情况下使用7个先前的数据点,只预测下一个数据点。因此,如果我们试图预测未来的多个点,这个特定模型的结果将会非常不准确,正如我将在后面的示例中演示的那样。

利用RNN进行预测

您还记得,在上述模型的训练和预测过程中,我们将序列中的每8个观测作为我们的目标。但是,如果我们想使用模型为数据框架中的每个项目(天)生成预测呢?下面的代码就是这样做的:

由于我们将模型预测添加到原始数据框架中,我们可以使用它来绘制结果。

RNN模型对整个数据样本的预测。图像中作者

还是那句话,很不错的结果记住我们只预测了未来一天的温度。

如果我们试图预测未来365天的气温,每次只预测一天会怎么样?我们将尝试通过在我们的7天序列中不断添加新的预测,同时从序列中删除最老的预测。

最后,我们重用前一步中的图表绘制代码来显示过去两年的结果+未来365天的预测。

替换:
x=dfCan['Date']→x=dfCan2['Date'][-730:] #
y=dfCan['MedTemp']→y=dfCan2['MedTemp'][-730:] #用于第一次跟踪
y=dfCan['MedTemp_prediction']→y=dfCan2['MedTemp_prediction'][-730:] #用于第二次跟踪
RNN模型对未来365天的预测。图像中作者

我们可以看到使用现有的RNN模型的时间超过天+ 1预测是不明智的。之所以会有这样的结果,是因为我们设计它只是为了提前一天进行预测,而且部分受到了rnn相对“短记忆”的影响。

在接下来的文章中,我将分析循环神经网络的更高级版本,例如长、短期记忆而且门控循环单位(GRU)所以别忘了订阅不要错过他们。

最后的评论

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

请使用本文提供的代码来构建您自己的循环神经网络。你可以在我的GitHub库

在我努力使我的文章对读者更有用的时候,如果您能告诉我是什么驱使您阅读这篇文章,以及它是否给了您所寻找的答案,我将不胜感激。如果没有,那么缺少了什么?

干杯!
扫罗Dobilas

揭秘数据科学与机器学习|https://solclover.com/membership|连接www.linkedin.com/in/saulius-dobilas| Twitter @SolClover

Baidu
map