1.算法描述 神经网络可以当做是能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到希望的y,结构图如下:
RNN是一种特殊的神经网络结构, 它是根据"人的认知是基于过往的经验和记忆"这一观点提出的. 它与DNN,CNN不同的是: 它不仅考虑前一时刻的输入,而且赋予了网络对前面的内容的一种’记忆’功能.RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。
RNN(Recurrent Neural Network)是一类用于处理序列数据的神经网络。首先我们要明确什么是序列数据,摘取百度百科词条:时间序列数据是指在不同时间点上收集到的数据,这类数据反映了某一事物、现象等随时间的变化状态或程度。这是时间序列数据的定义,当然这里也可以不是时间,比如文字序列,但总归序列数据有一个特点——后面的数据跟前面的数据有关系。
RNN的目的使用来处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNN能够对任何长度的序列数据进行处理。但是在实践中,为了降低复杂性往往假设当前的状态只与前面的几个状态相关,模型结构如下:
RNN网络是一种基础的多层反馈神经网络,该神经网络的节点定向连接成环。相比于前馈神经网络,该网络内部具有很强的记忆性,它可以利用内部的记忆来处理任意时序的输入序列。 循环网络是一种对序列数据有较强的处理能力的网络。在网络模型中不同部分进行权值共享使得模型可以扩展到不同样式的样本,比如CNN网络中一个确定好的卷积核模板,几乎可以处理任何大小的图片。将图片中分成多个区域,使用同样的卷积核对每一个区域进行处理,最后可以获得非常好的处理结果。同样的,循环网络使用类似的模块(形式上相似)对整个序列进行处理,可以将很长的序列进行泛化,得到需要的结果。
对每一个参数求其偏导数,使用随机梯度下降方法更新参数
初始时刻,没有上一个隐层的输出,因此初始化为[0,0]。 将上一个隐层的输出与当前时刻输入进行拼接,得到第一个隐藏计算的输入为[0,0,1]。 隐层内计算,将拼接后的输入值与初始权重W进行相乘,同时加上偏置b,得到一个基础值,值得注意的是这个W和b是一个更新的过程,需要不断迭代计算。 第一次激活,这次激活是对s(t)进行激活,采用的激活函数为tanh函数,将上一步得到的基础值代入到tanh函数中,得到的输出即为s(t),这个s(t)将作为下一层的s(t-1)参与下一个隐层的计算。 当前层输出基础值计算,将s(t)和新的权重V相乘加上偏置b,得到当前层输出基础值。 当前层最终输出,加上激活函数以后就是当前层的输出啦,此时采用的激活函数一般为softmax()。
2.仿真效果预览 matlab2022a仿真结果如下:
测试样本:
923 32.54999924 880 73.12791173 5.00
923 32.54999924 880 80.13526276 5.00
923 32.54999924 880 99.99999937 5.00
923 32.54999924 880 74.7898174 5.00
923 32.54999924 880 82.97630188 5.00
923 32.54999924 880 82.1910392 5.00
923 32.54999924 880 76.40087537 5.00
923 32.54999924 880 76.47206613 5.00
923 32.54999924 880 76.47206613 5.00
923 32.54999924 880 76.29192801 5.00
923 32.54999924 880 82.797826 5.00
923 32.54999924 880 75.36246728 5.00
923 32.54999924 880 71.64880462 5.00
923 32.54999924 880 71.87758833 5.00
923 32.54999924 880 71.87758833 5.00
923 32.54999924 880 72.2944235 5.00
923 32.54999924 880 81.76186206 5.00
923 32.54999924 880 75.07288529 5.00
923 32.54999924 880 92.74331369 5.00
923 32.54999924 880 89.57816762 5.00
923 32.54999924 880 76.78911908 5.00
923 32.54999924 880 73.55658823 5.00
923 32.54999924 880 72.27779603 5.00
923 32.54999924 880 72.27779603 5.00
3.MATLAB核心程序
u = data(:,1:3);
x = data(:,4:5);
%数据归一化
x1= x(:,1);xmin1 = min(x1);xmax1 = max(x1);
x2= x(:,2);xmin2 = min(x2);xmax2 = max(x2);
x1=(x1)/(xmax1);
x2=(x2)/(xmax2);
x = [x1,x2];
u1= u(:,1);umin1 = min(u1);umax1 = max(u1);
u2= u(:,2);umin2 = min(u2);umax2 = max(u2);
u3= u(:,3);umin3 = min(u3);umax3 = max(u3);
u1=(u1)/(umax1);
u2=(u2)/(umax2);
u3=(u3)/(umax3);
u = [u1,u2,u3];
%RNN;
[xpre,A,B,C,D] = func_RNN(u,x);
function [xpre,Aw,Bw,Cw,Dw] = func_RNN(u,x);
dtrain = u';
dtest = x';
%网络参数初始化
Nin = 3;
Nhi = 32;
Not = 2;
%权重初始化
Aw = rand(Nhi,Nhi);
Bw = rand(Not,Nhi);
Cw = rand(Nhi,Nin);
Dw = rand(Nhi,1);
xpre= zeros(Not,length(u));
%RNN网络训练
Lr = 0.002;
for ij=1:80
ij
for t=1:length(dtrain)
%从输入到隐层
if t==1
States = Cw*dtrain(:,t) + Dw;
else
States = Cw*dtrain(:,t) + Aw*fx(:,t-1) + Dw;
end
%从隐层到输出
for n=1:Nhi
fx(n,t) = 1/(1+exp(-States(n,:)));%通过sigmoid函数
end
xpre(:,t) = Bw*fx(:,t);
%误差计算
Error = xpre(:,t)-dtest(:,t);
%权值更新
[Aw,Bw,Cw,Dw]=func_wdata(t,Lr,Error,dtrain,fx,Aw,Bw,Cw,Dw);
end
end