目录
一、理论基础
RNN通常用来建模视频序列以及它们之间的依赖关系。其优点是可以用RNN将一段视频编码为固定长度的表示,进而可以采用另外的RNN解码器作用于不同的任务。例如,建模视频表示的无监督RNN学习和视频序列预测的递归CNN网络等。另外,利用序列帧的时间信息,RNN可以应用于视频序列中显著点检测以及行为识别等问题。Gregor等通过模拟人类视觉关注机制修订了自编码机框架来重复迭代生成图像。Mnih等提出自适应地选取显著区域的动态视觉控制系统,它可以在不需要任何训练信息情况下实现跟踪比较简单的目标。Yang等采用循环自编码机的策略学习大规模网上视频数据中的重要视频事件。为了捕获视频序列中的运动行为信息,微分(differential)递归神经网络在LSTM中引入了两个状态的差信息来描述前后帧之间的信息变化量。针对人体行为任务,Du等建立了基于人体骨架(skeleton)的分层RNN网络模型,Fragkiadaki等提出了ERD(encoder-recurrent-decoder)网络模型。RNN也被尝试应用于视频目标跟踪任务,以建立序列帧的动态依赖性。此外,Huang等提出了基于双向RNN网络的视频超分辨率(super-resolution, SR)方法。
RNN也用来建模图像空间域的依赖性。这仅需要采用一些规则遍历二维平面以形成能使用RNN描述的序列,其代表性模型是多维RNN模型[Graves09a]。目前主要的应用领域包括场景标注(scene labeling)和图像分割(segmentation)。Pinheiro等重复利用CNN网络模型的场景标注方法,Shuai等和Byeon等利用四个方向的RNN子网络来完成图像标注任务,Liang等提出带有层内反馈连接的卷积神经网络并应用于场景标注和物体识别。Visin等[Visin15a]提出了不断堆积多层RNN模型的Reseg网络以用于图像分割任务。此外,通过利用RNN建模大范围(long-range)依赖性的能力,Theis等[Theis15]提出了基于空间LSTM的纹理合成方法。
为了提高递归神经网络(RNN)的算法性能,最近人们考虑了递归神经网络中顶点和关联边的特征关系,提出用图论来研究RNN系统的复杂的时变性能[[i]],特别关注由外部输入信号驱动执行计算的系统。例如在上世纪80年代,基于物理学和神经科学的联系开发出来的人工递归神经网络,这是一种计算机动力学系统。如今,递归神经网络(RNN)由于其具有生物学上的合理性,以及计算机科学和工程方面的建模能力,而引起了神经科学的新兴趣。递归神经网络能够生成复杂的动力学,并根据当前输入和内部状态进行推理,保持对过去输入的记忆。
递归神经网络因其具有丰富的动力学特性而在各个方面得到广泛的应用,但是同时也存在着各种各样的问题。例如计算量大、训练时效率不高、网络状态难以稳定等等问题。这成为了阻碍递归神经网络发展的一大难题。
为了研究递归神经网络的动力学特性以及解决当前存在的各种问题,本次设计主要以MATLAB软件为工具,编写程序,以动态监控的方式监控RNN算法程序的运行效率,比较实际与预测的差异,并且我们设计了有原则无监督的方法,采用了一种基于图的框架来解释和表征递归神经网络内部的动力学特性的方法,以更直观的方式演示出各个节点所体现的信息。这对完善神经网络理论,拓展神经网络在人工智能方向的应用具有非常重要的意义。甚至有可能在网络动力学的基于图的表示形式中识别出新兴的结构模式。
递归神经网络(recursive neural network)和循环神经网络(Recurrent Neural Network)统称为递归神经网络(RNN)。简单来说它就是深度学习算法其中一种,具有树状阶层的结构,且按其连接顺序对网络节点的输入信息进行递归。
如果要从本质上说的话,递归神经网络就是对循环神经网络的一个扩展,他们的计算图是不一样的。循环神经网络与递归神经网络不同之处在于它是属于时间递归的神经网络,这种网络的神经元之间互相连接构成了矩阵,而递归神经网络是属于结构递归神经网络,这种神经网络主要利用几个类似的神经网络结构,通过递归构造成为一个更复杂的深度网络。RNN存在的一个严重问题是无法解决随着递归,权重会指数级爆炸或者消失的问题,导致很难捕捉长期时间关联。
RNN模型最早在20世纪初90年代年被提出,它被看作是循环神经网络的推广。当RNN的父子节点都是一对一连接时,其结构相当于一个全连接的循环神经网络。递归神经网络的优势在于它具有相当灵活的拓扑结构而且它们的权重是共享的,所以它们适用于一些机器学习的任务,例如包了含结构关系的,同时RNN在自然语言处理(Natural Language Processing, NLP)方面也有着重要应用。
二、核心程序
...............................................................
S = loadseq('laser.trs');
SI = S(:,1:8000-1);
ST = S(:,2:8000);
SI2 = S(:,8000-1:end-1);
ST2 = S(:,8000:end);
net = rnn_new_elman(4,6,4);
%补充两条曲线,一条是经过神经网络训练以后的重新仿真的曲线,
%一条是一开始还没进入循环前的曲线(真实的曲线,没有噪声的曲线),目的是为了比较训练完以后的效果是不是很好。
% net = rnn_start_bp(net, 0.1, 0.0);
% net = rnn_start_bptt(net, 0.1, 0.0, 1);
% net = rnn_start_rtrl(net, 0.5, 0.0);
net = rnn_start_ekf_bptt(net, 10, 1000, 0, 100, 0.00001, 1);
% net = rnn_start_ekf_rtrl(net, 1000, 0, 100, 0.00001, 1);
% calculate NNL for untrained network (epoch 0)
[AO, AR] = rnn_sim(net, SI);
NNL = eval_nnl(AO, ST);
fprintf('Epoch: %d, NNL: %f\n', 0, NNL(1));
%训练前的结果
[AO,AR] = rnn_sim(net, SI2);
AO_0=AO;
ST_0=ST;
% perform training and error calculation
for ep=1:40
[net, AO, AR] = rnn_train_ekf_bptt(net, SI, ST, 0);
[AO, AR] = rnn_sim(net, SI2);
NNL(ep+1) = eval_nnl(AO, ST2);
fprintf('Epoch: %d, NNL: %f\n', ep, NNL(ep+1));
end;
%训练后的结果
[AO,AR] = rnn_sim(net, SI2);
AO_1=AO;
ST_1=ST;
figure;
plot(NNL,'b-o');
xlabel('迭代次数');
ylabel('LOSS损失函数');
for i=1:length(AO_0)
[v0,i0]=max(AO_0(:,i));
[v1,i1]=max(AO_1(:,i));
[v2,i2]=max(SI2(:,i));
X0(i)=i0;
X1(i)=i1;
X2(i)=i2;
end
figure;
plot(X0+5,'b-o')
hold on
plot(X1,'r-*')
hold on
plot(X2-5,'k-^')
hold on
legend('训练前的分类结果','训练后的分类结果','真实的分类结果');
figure;
semilogy(NNL(2:end),'b-o');
xlabel('迭代次数');
ylabel('LOSS损失函数');
grid on
A05-88
三、仿真结论