毕设项目分享 基于RNN的大数据金融预测

0 前言

Hi,大家好,这里是丹成学长,今天向同学们介绍如何构建一个RNN网络,并展示如何用于金融预测

🧿 选题指导, 项目分享:见文末

在这里插入图片描述

1 RNN算法简介

RNN(Recurrent Neural Network)是一类用于处理序列数据的神经网络。首先学长给大家介绍什么是序列数据。时间序列数据是指在不同时间点上收集到的数据,这类数据反映了某一事物、现象等随时间的变化状态或程度。这是时间序列数据的定义,当然这里也可以不是时间,比如文字序列,但总归序列数据有一个特点——后面的数据跟前面的数据有关系。

2 RNN的结构及变体

同学们学过神经网络的话,大概都清楚常见的神经网络包括输入层、隐层、输出层, 通过激活函数控制输出,层与层之间通过权值连接。激活函数是事先确定好的,那么神经网络模型通过训练“学“到的东西就蕴含在“权值“中。基础的神经网络只在层与层之间建立了权连接,RNN最大的不同之处就是在层之间的神经元之间也建立的权连接。具体如图所示:

在这里插入图片描述
这是一个标准的RNN结构图,图中每个箭头代表做一次变换,也就是说箭头连接带有权值。左侧是折叠起来的样子,右侧是展开的样子,左侧中h旁边的箭头代表此结构中的“循环“体现在隐层。在展开结构中我们可以观察到,在标准的RNN结构中,隐层的神经元之间也是带有权值的。也就是说,随着序列的不断推进,前面的隐层将会影响后面的隐层。图中O代表输出,y代表样本给出的确定值,L代表损失函数,我们可以看到,“损失“也是随着序列的推荐而不断积累的。除上述特点之外,标准RNN的还有以下特点:

  • 1、权值共享,图中的W全是相同的,U和V也一样。
  • 2、每一个输入值都只与它本身的那条路线建立权连接,不会和别的神经元连接。

以上是RNN的标准结构,然而在实际中这一种结构并不能解决所有问题,例如我们输入为一串文字,输出为分类类别,那么输出就不需要一个序列,只需要单个输出。具体如图所示:

在这里插入图片描述
在这里插入图片描述
同样的,我们有时候还需要单输入但是输出为序列的情况。那么就可以使用如下结构:
在这里插入图片描述
还有一种结构是输入虽是序列,但不随着序列变化,就可以使用如下结构:
在这里插入图片描述
原始的N vs N RNN要求序列等长,然而我们遇到的大部分问题序列都是不等长的,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。下面我们来介绍RNN最重要的一个变种:N vs M。这种结构又叫Encoder-Decoder模型,也可以称之为Seq2Seq模型。

在这里插入图片描述

从名字就能看出,这个结构的原理是先编码后解码。左侧的RNN用来编码得到c,拿到c后再

在这里插入图片描述
在这里插入图片描述
除了以上这些结构以外RNN还有很多种结构,用于应对不同的需求和解决不同的问题。还想继续了解可以看一下下面这个博客,里面又介绍了几种不同的结构。但相同的是循环神经网络除了拥有神经网络都有的一些共性元素之外,它总要在一个地方体现出“循环“,而根据“循环“体现方式的不同和输入输出的变化就形成了多种RNN结构。

3 标准RNN的前向输出流程

上面介绍了RNN有很多变种,但其数学推导过程其实都是大同小异。这里就介绍一下标准结构的RNN的前向传播过程。

在这里插入图片描述
学长给大家介绍一下各个符号的含义:x是输入,h是隐层单元,o为输出,L为损失函数,y为训练集的标签。这些元素右上角带的t代表t时刻的状态,其中需要注意的是,因策单元h在t时刻的表现不仅由此刻的输入决定,还受t时刻之前时刻的影响。V、W、U是权值,同一类型的权连接权值相同。有了上面的解释,前向传播算法其实非常简单,对于t时刻:

在这里插入图片描述

其中delta()为激活函数,一般来说会选择tanh函数,b为偏置。即t时刻的输出就更为简单:

在这里插入图片描述

最终模型的预测输出为:

在这里插入图片描述
其中delta为激活函数,通常RNN用于分类,故这里一般用softmax函数。

4 RNN的训练方法——BPTT

BPTT(back-propagation through time)算法是常用的训练RNN的方法,其实本质还是BP算法,只不过RNN处理时间序列数据,所以要基于时间反向传播,故叫随时间反向传播。BPTT的中心思想和BP算法相同,沿着需要优化的参数的负梯度方向不断寻找更优的点直至收敛。综上所述,BPTT算法本质还是BP算法,BP算法本质还是梯度下降法,那么求各个参数的梯度便成了此算法的核心。

在这里插入图片描述

这个结构图观察,需要寻优的参数有三个,分别是U、V、W。与BP算法不同的是,其中W和U两个参数的寻优过程需要追溯之前的历史数据,参数V相对简单只需关注目前,那么我们就来先求解参数V的偏导数。

在这里插入图片描述
其实这个式子看起来简单但是求解起来很容易出错,因为其中嵌套着激活函数函数,是复合函数的求道过程。RNN的损失也是会随着时间累加的,所以不能只求t时刻的偏导。

在这里插入图片描述

6 LSTM算法

接下来给大家详细介绍LSTM的相关内容。长短期记忆网络是RNN的一种变体,RNN由于梯度消失的原因只能有短期记忆,LSTM网络通过精妙的门控制将加法运算带入网络中,一定程度上解决了梯度消失的问题。只能说一定程度上,过长的序列还是会出现“梯度消失”,因此LSTM叫长一点的“短时记忆”。

6.1 长期依赖(Long-Term Dependencies)问题

RNN 的关键点之一就是他们可以用来连接先前的信息到当前的任务上,有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测 “the clouds are in the sky” 最后的词,我们并不需要任何其他的上下文 —— 因此下一个词很显然就应该是 sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN 可以学会使用先前的信息。

在这里插入图片描述
但是同样会有一些更加复杂的场景。假设我们试着去预测“I grew up in France… I speak fluent French”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的 France 的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。但是,在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。

在这里插入图片描述
在理论上,RNN 绝对可以处理这样的 长期依赖 问题。人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN 肯定不能够成功学习到这些知识。Bengio, et al. (1994)等人对该问题进行了深入的研究,他们发现一些使训练 RNN 变得非常困难的相当根本的原因。不过,LSTM 并没有这个问题。

6.2 LSTM 网络

Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力!所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。

在这里插入图片描述
LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,整体上除了h在随时间流动,细胞状态c也在随时间流动,细胞状态c就代表着长期记忆。

在这里插入图片描述

6.3 LSTM 的核心思想

LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。

在这里插入图片描述
LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。

在这里插入图片描述
Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”!LSTM 拥有三个门,来保护和控制细胞状态。

7 RNN算法的核心代码

7.1 基于Pytorch的RNN实现

在实际代码操作之前,我们实验的环境依然是前面文章用到的环境。不过我们需要的是得安装好pytorch三方库,安装只需要:

python3 -m pip install --upgrade torch torchvision -i https://pypi.tuna.tsinghua.edu.cn/simple

import torch
import torch.nn
class RnnCore(nn.Module):
    def __init__(self,inputSize,hiddenSize,outputSize,layers=1):
        super(RnnCore,self).__init__()
        self.hidden_size = hiddenSize
        self.num_layers = layers
        self.embedding = nn.Embedding(inputSize,hiddenSize)
        self.rnn = nn.RNN(hiddenSize,hiddenSize,layers,batch_first=True)
        self.fc = nn.Linear(hiddenSize,outputSize)
        self.softmax = nn.LogSoftmax(dim=1)
    def forward(self,inputs,hidden):
        x = self.embedding(inputs)
        output,hidden = self.rnn(x,hidden)
        output = output[:,-1,:]
        output = self.fc(output)
        return output,hidden
    def initHidden(self):
        return Variable(torch
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值