本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com
Elman神经网络是 J. L. Elman于1990年提出的一种用于时序的神经网络,也称为RNN神经网络
本文讲解Elman神经网络的结构、原理以及模型表达式,并展示一个具体的Elman神经网络实现例子
通过本文可以快速了解什么是Elman神经网络,以及如何使用Elman神经网络来解决时间序列预测问题
本节讲解Elman神经网络的结构以及原理,快速了解Elman神经网络是什么
Elman神经网络是什么
Elman神经网络是Elman于1990年提出的一种用于时序预测的神经网络模型
Elman神经网络最初属于BP神经网络的一种拓展,后来自成一派,也就是后来所称的RNN循环神经网络
Elman神经网络的结构如下:
如图所示,Elman神经网络的结构与BP神经网络类似
但不同的是,它的隐层不仅接受前层的输入,且接受上一时刻(即上一个样本)该隐层的输出
如何理解Elman神经网络
直接理解Elman是较奇怪的,但如果理解了Jordan神经网络,就很容易理解它了
Jordan神经网络
在序列预测中,当前时刻的y不仅受当前X的影响,还受上一时刻的输出y的影响
因此Jordan在解决序列预测问题时,把BP上一时刻的y也作为当前时刻的输入,如下:
如此,就得到了Jordan神经网络,专用于序列预测,简单来说就是把上一时刻的y也当作输入
Elman神经网络
进一步地,Elman把Jordan中的延时输入改为了上一时刻的隐层
因为上一时刻的y就是由上一时刻的h得到的,所以为何要用y作为延迟输入呢?
直接把隐层传到下一时刻,所包含的信息岂不更原始、更有效?如此一来,就有了Elman神经网络了
所以,Elman神经网络纯粹就是把上一时刻的输出的信息,也当作本时刻的输入的一种"BP神经网络的特殊应用"而已
,
本节讲解Elman的输入是什么,以及是如何计算输出的
Elman神经网络的模型与计算
Elman的输入输出数据样本
Elman面向的是序列样本,每个样本是一个X、Y序列,而不是单个X、Y
即一个序列样本并非一维向量,而是二维矩阵,示例如下:
如表所示,一个序列样本包括了样本的各个变量以及各个时刻的值
Elman的计算
虽然Elman神经网络面向的是序列样本,但Elman每次运算只接收单时刻的数据
然后通过循环迭代,逐时刻计算,得到每一个时刻的输出
Elman的计算过程如下:
先将X的第1时刻数据与初始延迟输入,投到模型中计算第1时刻的输出
再将X的第2时刻数据与第1时刻的隐节点,投到模型计算第2时刻的输出
如此类推,直到计算到最后一个时刻为止
Elman单时刻计算公式如下:
Elman每一时刻的计算与BP类似,只是加入了上一时刻的隐节点作为延迟输入
Elman神经网络每个隐层的计算公式如下:
其中,
:隐层的输入
:隐层的权重
:延迟输入,即上一时刻该隐层的输出
:延迟输入到隐层的权重
:隐层的阈值
:隐层到输出层的权重
:输出层的阈值
:激活函数,一般隐层为tansig,输出层为purelin
备注:由于第一个样本没有,一般将第一个样本的设为0
这里介绍的是单隐层的Elman神经网络,对于多隐层则按照BP来理解就可以
唯一需要注意的是,每个隐层所接收的延迟输入,是来自上一时刻该隐层的值
本节展示如何使用matlab训练一个Elman神经网络用于时序预测
Elman神经网络-代码实现
在matlab中训练Elman神经网络,只需使用newelm函数即可
Elman(RNN)神经网络的具体实现代码如下:
% 本代码展示如何用matlab训练一个Elman神经网络(matlab2018a)
% 代码主旨用于教学,供大家学习理解如何用matlab训练一个Elman神经网络
% 转载请说明来自 《老饼讲解神经网络》 www.bbbdata.com
% 生成输入输出数据
X = -5:0.3:5; % 用于训练网络的输入数据
y = sin(X); % 用于训练网络的输出数据
rand('seed',408); % 指定随机种子,这样每次训练出来的网络都一样。
net = newelm(X,y,6,{'tansig','purelin'}); % 新建一个elman网络
net.trainparam.goal = 0.00001; % 设置训练目标
net.trainparam.epochs = 2000; % 设置最大训练次数.
% ----------网络训练---------------
% 在训练时一定要将数据转为序列数据,
% 如果是矩阵格式,工具箱会认为每个数据是独立的
Xseq = con2seq(X); % 将输入转成序列格式
Yseq = con2seq(y); % 将输出转成序列格式
[net,tr] = train(net,Xseq,Yseq); % 将输入输出数据进行训练
% ----------网络预测---------------
% 注意,在预测时也必须传入序列数据,
% 如果传入矩阵格式,工具箱会认为只是一个时刻的数据,而不是多个时刻的数据,
% 也就是说,网络会对每个数据进行独立预测,它不会把上个数据的隐节点作为延迟输入传给下个数据
py = sim(net,Xseq); % 用训练好的网络进行预测,
py = cell2mat(py) % 将预测结果转为矩阵格式
plot(X,y,X,py,'*')
legend('原始数据','预测结果')
代码运行结果如下:
可以看到,Elman神经网络已经很好地预测了sin曲线
老饼的提示
Elman神经网络的训练基本与BP一致,包括参数的设置等等,
但由于Elman神经网络用于预测序列数据,所有有些方面需要注意,下面列举一二
1.训练与预测时需要传入序列数据
如代码中的注释所说,训练、预测时需要将数据通过con2seq函数转为序列数据
如果不转为序列数据,而采用矩阵格式,也不会报错
但工具箱会认为只是一个时刻的数据,而不是多个时刻的数据
也就是说,此时Elman神经网络对每个数据都是独立预测的
它不会把上个数据的隐节点作为延迟输入传给下个数据
这样就相当于忽略了Elman最重要和最具特色的“延迟输入”了
2.预测结果是相对于序列而言,而非独立样本
需要注意Elman是应用于序列数据,
即,它是对整个序列进行预测,而不是对某个数据进行独立预测
预测序列和预测序列
虽然,但模型给出的结果将是不一样的,因为受初始值的影响
好了,以上就是Elman神经网络的入门介绍了~
End