目录
3、反向传播——反向传播通过时间(Backpropagation Through Time,BPTT)
4、N——M结构(Encoder-Decoder,也称Seq2Seq)
1、选择道路曲率、车速和历史方向盘转角(这里取了五个时刻的历史方向盘转角)这三个(7个)作为特征,采用RNN训练
往期文章:
时间序列预测(一)——线性回归(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 的特殊之处在于隐藏层具有循环连接,使得每个时刻的隐藏层状态都能从前一时刻的状态(隐状态)中获得信息。具体来说,RNN 会在每个时间步更新隐藏状态 ht:
-
输出层:
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函数进行处理。
应用场景:这种结构经常被应用在文本分类问题上,如输入一段文字判别它所属的类别,或输入一个句子判断其情感倾向等。