循环核
我们可以利用卷积神经网络实现离散数据的分类,然而有些数据是与时间序列相关的,是可以根据上文预测出下文的。比如我们的大脑就可以利用脑记忆体提取出历史数据进行分析来预测接下来有可能出现的数据,比如“鱼离不开___”,我们下意识地会预测出接下来出现的可能是“水”。
那么在神经网络中也有这样一个记忆体,叫做“循环核”。循环核具有记忆力,通过不同时刻的参数共享,实现了对时间序列的信息提取。
循环核中记忆体的个数可以被设定,改变记忆容量。当记忆体个数、输入x以及输出y维度被指定,循环核周围这些带训练参数的维度也就被限定了。循环核内存储着每个时刻的状态信息ht,当前时刻存储的状态信息ht为:
当前时刻的输出为:
其实,这就是一层全连接,前向传播时,循环核内存储的状态信息ht,在每个时刻都被刷新,三个参数矩阵wxh、whh、why自始至终都是固定不变的;反向传播时,三个参数矩阵被梯度下降法更新
循环核按时间步展开
即按时间轴方向展开
我们训练优化的就是这些参数矩阵,训练完成后使用效果最好的参数矩阵执行前向传播预测结果。
循环神经网络,就是借助循环核提取时间特征后,送入全连接网络,实现连续数据的预测
循环计算层
每个循环核构成一个循环计算层
每个循环核中记忆体的个数可以自定义
tensorflow描述循环计算层:
tf.keras.layers.SimpleRNN(记忆体个数, activation='激活函数', return_sequences=是否每个时刻输出ht到下一层)
## activation默认是tanh
## return_sequences=True表示各时间步输出ht
## return_sequences=False表示仅最后时间步输出ht(默认)
## 一般来说,最后一层的循环核用False,中间层用True
注意,送入RNN的训练数据是有要求的,要求是三维数据:
循环计算层计算过程
输入一个字母预测下一个字母(时间步为1):
如果是连续输入四个字母预测下一个字母(时间步为4):
可以看出,这次前向传播分为四个时间步,ht每个时刻都在更新,其余参数已经被训练好,固定不变,最后时刻的ht输出,进行预测,结果为a
Embedding——一种编码方法
在刚刚的例子中,使用了独热码对字母进行编码,独热码的位宽要与词汇量一致,词汇量增大时非常浪费资源,因此自然语言处理中有一个专门的方向在研究单词的编码。
Embedding是一种单词编码方式,用低维的向量实现了单词的编码
来看一下代码实现:
股票预测
这里先用tushare模块下载贵州茅台的日k线数据
用LSTM实现股票预测
传统的RNN可以通过记忆体实现短期的记忆来进行连续数据的预测,但是当连续数据的序列变长时,会使展开时间步过长。在反向传播更新参数时,梯度要按照时间步连续相乘,会导致梯度消失。所以在1997年Horchreiter等人提出了长短记忆网络LSTM
引入了三个门限,都使用sigmoid激活函数使得门限的范围在[0, 1]之间。
细胞态等于上个时刻的长期记忆乘以遗忘门加上当前时刻归纳出的新知识乘以输入门。
当有多层循环网络的时候,下一层的输入xt,就是上一层的输出ht。
Tensorflow描述LSTM:
GRU实现股票预测
2014年,Chou等人优化了LSTM结构,实现了GRU网络。
Tensorflow描述GRU: