时间序列预测(六)——循环神经网络(RNN)

目录

一、RNN的基本原理

1、正向传播(Forward Pass):

2、计算损失(Loss Calculation)

3、反向传播——反向传播通过时间(Backpropagation Through Time,BPTT)

4、梯度更新:

二、RNN的常用结构

 1、N——N结构

2、N——1结构

3、1——N结构

4、N——M结构(Encoder-Decoder,也称Seq2Seq)

三、RNN的优缺点

四、在Python中的代码解释

1、模型定义

(1)类定义:RNNModel

(2)实例化模型

2、参数形状转化(注意)

五、梯度消失与梯度爆炸

六、RNN的改进模型

七、具体代码实现

1、选择道路曲率、车速和历史方向盘转角(这里取了五个时刻的历史方向盘转角)这三个(7个)作为特征,采用RNN训练

2、使用更长的序列来捕捉历史信息,而不需要手动构造历史特征

1、绘制平均值

​2、绘制第一个未来时间步的对比


往期文章:

时间序列预测(一)——线性回归(linear regression)-CSDN博客

时间序列预测(二)——前馈神经网络(Feedforward Neural Network, FNN)-CSDN博客

前面有提到前馈神经网络,下图是两者的区别对比

特性 前馈神经网络(FNN) 循环神经网络(RNN)
结构 无循环连接,数据单向流动 有循环连接,数据可流过多个时间步
适用任务 静态任务,无时间依赖 动态任务,包含时间依赖
记忆能力 无法记忆前一时刻信息 通过隐藏状态记忆前一时刻信息
梯度计算 反向传播(BP) 反向传播通过时间(BPTT)
常见问题 无梯度消失或爆炸问题 易出现梯度消失或爆炸问题
适用场景 图像分类、静态预测 时间序列预测、文本生成、语音识别

循环神经网络(Recurrent Neural Network,RNN)是一种专门用于处理序列数据的神经网络结构,它能够处理时间序列数据,并预测未来的数据变化趋势。RNN能够处理序列中的时间依赖性,因而非常适合时间序列预测。以下是对RNN在时间序列预测中的详细分析:

一、RNN的基本原理

RNN的基本原理是在神经网络中引入时间的概念,使得网络可以处理序列数据。RNN的基本结构是一个循环单元,它包含一个输入层、一个隐藏层和一个输出层。在每一个时间步上,网络接收一个输入向量和一个隐藏状态向量,通过一个非线性函数对它们进行组合,然后产生一个输出向量和一个新的隐藏状态向量,作为下一个时间步的输入和隐藏状态。这种反馈机制可以使得网络记忆之前的信息,并在处理序列数据时考虑到历史信息。​

1、正向传播(Forward Pass)
  • 输入层

    • RNN的输入是一个序列,表示为 X=[x1,x2,…,xT],其中 T 是序列长度,xt 表示在时间 t 的输入值。
  • 隐藏层(是一个循环单元):

    • RNN 的特殊之处在于隐藏层具有循环连接,使得每个时刻的隐藏层状态都能从前一时刻的状态(隐状态)中获得信息。具体来说,RNN 会在每个时间步更新隐藏状态 ht:
    • 注意:在计算时,每一步使用的参数Wh、Wx、b都是一样的,也就是说每个步骤的参数都是共享的,这是RNN的重要特点,而LSTM中的权值则不共享
  • 输出层

RNN 的输出 yt依赖于当前隐藏状态 ht:

2、计算损失(Loss Calculation)

选择合适的损失函数,计算每个时间步 ttt 的损失值 Lt,将所有时间步上的损失求和,得到整个序列的总损失 L:

3、反向传播——反向传播通过时间(Backpropagation Through Time,BPTT)

在计算总损失后,通过BPTT算法沿时间维度反向传播误差,计算每个时间步上的梯度。

因为隐藏状态在每个时间步都传递到下一个时间步,所以需要在时间上展开 RNN,形成一个“展开的计算图”,并在这个图上逐步反向传播。对于每个时间步的参数(如 Wh和 Wx),需要计算梯度:

(注意:由于隐藏状态 hth_tht​ 依赖于所有之前的状态,所以当前时间步的梯度受多个时间步的误差影响。)

4、梯度更新

计算出参数的梯度后,通常使用优化器(如 SGD、Adam 等)来更新模型参数。随着每个时间步梯度的反向传播,BPTT算法会依次更新所有权重,以最小化损失。

为了减小计算量,提出了截断 BPTT,它 是一种优化的 BPTT 方法,通过限制反向传播的时间步数来减少计算量。它按固定长度(如 10 或 20 步)的窗口,将长序列分成若干个较短的子序列,每个子序列独立进行正向和反向传播。在每个子序列结束时,重置梯度,但隐藏状态在各子序列间保持连续,以保留长程依赖信息。

最后,需要注意在PyTorch中,RNN的输入数据通常是一个形状为(batch_size, sequence_length, input_size)的张量,输出数据通常是一个二维张量,其形状为(batch_size, output_size)或是三维张量(batch_size, sequence_length, output_size)(对于序列输出)。

其中,

  • batch_size:表示批次中样本的数量。
  • sequence_length:表示序列的长度。
  • input_size和output_size:表示每个时间步骤的输入和输出的特征数量

所以要将数据进行转化。这里是与FNN是不一样的,多了一个序列长度,所以RNN 可以一次性输入和输出多个时间步的特征和目标,RNN 才是真正可以处理序列数据的,而 FNN 处理的是单个独立样本。

因此,当 sequence_length=1 时,RNN 变得和 FNN 类似,但仍保持了 RNN 的结构。在这种情况下,使用 RNN 可能会显得有些多余,因为 FNN 可以实现相同的功能,而不需要引入 RNN 的复杂性。

二、RNN的常用结构

 1、N——N结构

输入与输出:输入是x1,x2,.....xn,输出为y1,y2,...yn。输入和输出序列是等长的。

应用场景:由于这种结构的输入输出长度一致,因此它适用于生成等长度的序列,如合辙的诗句等。此外,它还可用于计算视频中每一帧的分类标签,因为要对每一帧进行计算,所以输入和输出序列等长。

  

2、N——1结构

输入与输出:输入是一个序列,而输出是一个单独的值,不是序列。

处理方式:这种结构通常在最后一个隐层输出h上进行线性变换,以得到所需的输出值。为了更明确地表示结果,还可以使用sigmoid或softmax函数进行处理。

应用场景:这种结构经常被应用在文本分类问题上,如输入一段文字判别它所属的类别,或输入一个句子判断其情感倾向等。  

R语言在预测时间序列中使用RNN是一个常见的方法。RNN特别适用于处理按顺序排列的输入序列,如时间序列数据。RNN按顺序处理输入序列的时间步长,并可以提取序列中的模式。对于序列问题,例如温度预测RNN通常表现良好。另外,双向RNN是一种使用两个常规RNN(例如layer_gru和layer_lstm)沿不同方向处理输入序列的方法,并结合它们的表示形式。通过双向处理序列,双向RNN可以捕获单向RNN忽略的模式。 在使用R语言进行时间序列预测时,您可以参考北京大学内部的金融时间序列讲义。这是一个经典的金融时间序列资料,以R语言为基础,涵盖了完整的体系。这个讲义可以为您在使用LSTM、RNN神经网络模型进行时间序列预测时提供参考。 在处理文本数据集时,逆序处理与按时间顺序处理一样有效。这表明,尽管单词顺序在理解语言中确实很重要,但使用不同的顺序进行训练的RNN可以学习到不同的表示形式。在机器学习中,不同的表示总是值得开发的,因为它们提供了一个新的视角来查看数据,并捕获其他方法可能忽略的数据方面,从而提高任务的性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [北京大学金融时间序列分析讲义.pdf](https://download.csdn.net/download/liangcaivip/12318983)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [R语言基于递归神经网络RNN的温度时间序列预测](https://blog.csdn.net/tecdat/article/details/128750847)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值