神经网络-一篇入门

【模型】一篇入门之-Elman神经网络(RNN)

作者 : 老饼 发表日期 : 2023-03-01 02:12:28 更新日期 : 2024-11-10 05:38:28
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com



Elman神经网络是 J. L. Elman于1990年提出的一种用于时序的神经网络,也称为RNN神经网络

本文讲解Elman神经网络的结构、原理以及模型表达式,并展示一个具体的Elman神经网络实现例子

通过本文可以快速了解什么是Elman神经网络,以及如何使用Elman神经网络来解决时间序列预测问题





    01. Elman神经网络是什么     




本节讲解Elman神经网络的结构以及原理,快速了解Elman神经网络是什么





     Elman神经网络是什么      


Elman神经网络是Elman于1990年提出的一种用于时序预测的神经网络模型
Elman神经网络最初属于BP神经网络的一种拓展,后来自成一派,也就是后来所称的RNN循环神经网络
 Elman神经网络的结构如下:
 Elman神经网络的拓扑结构 
如图所示,Elman神经网络的结构与BP神经网络类似
但不同的是,它的隐层不仅接受前层的输入,且接受上一时刻(即上一个样本)该隐层的输出





      如何理解Elman神经网络      


直接理解Elman是较奇怪的,但如果理解了Jordan神经网络,就很容易理解它了
 Jordan神经网络
在序列预测中,当前时刻的y不仅受当前X的影响,还受上一时刻的输出y的影响
因此Jordan在解决序列预测问题时,把BP上一时刻的y也作为当前时刻的输入,如下:
  Jordan神经网络的结构
 如此,就得到了Jordan神经网络,专用于序列预测,简单来说就是把上一时刻的y也当作输入
Elman神经网络 
进一步地,Elman把Jordan中的延时输入改为了上一时刻的隐层
 如何理解Elman神经网络
因为上一时刻的y就是由上一时刻的h得到的,所以为何要用y作为延迟输入呢?
直接把隐层传到下一时刻,所包含的信息岂不更原始、更有效?如此一来,就有了Elman神经网络了
所以,Elman神经网络纯粹就是把上一时刻的输出的信息,也当作本时刻的输入的一种"BP神经网络的特殊应用"而已







    02. Elman神经网络的计算流程     



,

本节讲解Elman的输入是什么,以及是如何计算输出的





    Elman神经网络的模型与计算    


Elman的输入输出数据样本
Elman面向的是序列样本,每个样本是一个X、Y序列,而不是单个X、Y
即一个序列样本并非一维向量,而是二维矩阵,示例如下:
 
Elman的输入输出数据样本 
如表所示,一个序列样本包括了样本的各个变量以及各个时刻的值
Elman的计算
虽然Elman神经网络面向的是序列样本,但Elman每次运算只接收单时刻的数据
然后通过循环迭代,逐时刻计算,得到每一个时刻的输出
 Elman的计算过程 
 Elman的计算过程如下:
先将X的第1时刻数据与初始延迟输入,投到模型中计算第1时刻的输出  
再将X的第2时刻数据与第1时刻的隐节点,投到模型计算第2时刻的输出 
如此类推,直到计算到最后一个时刻为止
 Elman单时刻计算公式如下:
 
Elman每一时刻的计算与BP类似,只是加入了上一时刻的隐节点作为延迟输入
Elman神经网络每个隐层的计算公式如下:
 
 
                   
 其中, 
 
     :隐层的输入            
 
   :隐层的权重            
           
:延迟输入,即上一时刻该隐层的输出
 
    :延迟输入到隐层的权重  
 
    :隐层的阈值            
 
   :隐层到输出层的权重    
 
    :输出层的阈值          
                     
    :激活函数,一般隐层为tansig,输出层为purelin 
备注:由于第一个样本没有
,一般将第一个样本的设为0
这里介绍的是单隐层的Elman神经网络,对于多隐层则按照BP来理解就可以
 唯一需要注意的是,每个隐层所接收的延迟输入,是来自上一时刻该隐层的值







     03. Elman神经网络-代码实现      




本节展示如何使用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神经网络代码运行结果 
可以看到,Elman神经网络已经很好地预测了sin曲线





    老饼的提示   


Elman神经网络的训练基本与BP一致,包括参数的设置等等,
但由于Elman神经网络用于预测序列数据,所有有些方面需要注意,下面列举一二
 1.训练与预测时需要传入序列数据
如代码中的注释所说,训练、预测时需要将数据通过con2seq函数转为序列数据
 如果不转为序列数据,而采用矩阵格式,也不会报错
但工具箱会认为只是一个时刻的数据,而不是多个时刻的数据
也就是说,此时Elman神经网络对每个数据都是独立预测的
它不会把上个数据的隐节点作为延迟输入传给下个数据
这样就相当于忽略了Elman最重要和最具特色的“延迟输入”了

 
2.预测结果是相对于序列而言,而非独立样本
 
需要注意Elman是应用于序列数据,
即,它是对整个序列进行预测,而不是对某个数据进行独立预测
预测序列和预测序列
虽然,但模型给出的结果将是不一样的,因为受初始值的影响






好了,以上就是Elman神经网络的入门介绍了~








 End 






联系老饼