当前位置: 首页 > news >正文

回声状态网络(ESN)基础教程

http://jlearning.cn/2017/05/29/ESN-basic-tutorial/

最近在看回声状态网络(Echo State Network)的内容,注意到中文搜索引擎搜不到关于有关Echo State Network通俗的讲解,打算写一下关于ESN的一个基本教程。本文先用一小段简单介绍ESN是什么,然后用公式来表示这种网络,并说明他的优缺点,最后用一个可执行的简单例子来演示一下ESN的效果。

由于本人能力有限,如在阅读过程中有任何疑问或者发现错误请在评论中指出。

ESN是RNN的一种,也是由输入层,隐藏层,输出层组成,并且在隐藏层到隐藏层之间有一个连接,用来保留前面时刻留下的信息。不同于RNN,ESN的输入层到隐藏层、隐藏层到隐藏层的连接权值是随机初始化,并且固定不变。在训练的过程中,我们只需要去训练隐藏层到输出层的连接权值。这就变成了一个线性回归问题,所以ESN训练起来非常快。

微信截图_20170529161715

ESN的神经网络如图所示,储备池就是常规神经网络中的隐藏层。输入层到储备池的连接为Win,储备池到下一个时刻储备池状态的连接为W,储备池到输出层的连接为Wout。另外还有一个前一时刻的输出层到下一个时刻的储备池的连接Wback,这个连接不是必须的(图中用虚线表示),由于这是一个入门级的基础教程,所以在后面的公式和例子代码中都不会涉及这一个连接。

图中所示,tt时刻的输入为u(t)u(t),一共K个节点,储备池状态为x(t)x(t),N个节点,输出为y(t)y(t),L个节点。

每一个时刻输入u(t)u(t),储备池都会更新状态,储备池的状态更新方式为:

 

x(t+1)=f(Winu(t+1)+Wx(t))x(t+1)=f(Winu(t+1)+Wx(t))

 

这个式子里,WinWin和WW都是在最初建立网络的时候随机初始化的,并且固定不变。u(t+1)u(t+1)是这个时刻的输入,x(t)x(t)是上一个时刻的储备池状态,在t=0时刻可以用0初始化。ff是一个激活函数,通常使用tanhtanh。

在建模的时候,和一般的神经网络一样,会在连接矩阵上加上一个偏置量,所以输入的uu是一个长度为1+K的向量,WinWin是一个[1+k,N]的矩阵,xx是一个长度为N的向量,WW是一个[N,N]的矩阵。

回声状态网络的输出方式为:

 

y(t)=Wout[1;u(t);x(t)]y(t)=Wout[1;u(t);x(t)]

 

有了储备池状态,再确定了ESN的输出方式之后,就可以根据目标输出ytargetytarget来确定WoutWout来让y(t)y(t)和ytarget(t)ytarget(t)的差距尽可能的小。这是一个简单的线性回归问题,计算的方法有很多种,不再赘述。

微信截图_20170529170125

到这里,我们就完成了ESN的训练工作。整个网络只需要训练WoutWout,所以它的训练过程非常快,这是ESN的优点之一。另外,对于一维时序数列的处理和预测,ESN有很好的优势。但对于高维的时序数列,比如说视频帧处理,ESN就不太能胜任了。

为了让这个网络能够正常的运转,还有一些地方是需要注意的:

  1. 之所以叫回声状态网络,是因为前面时刻输入的信息会通过WW回回荡在储备池中,就像回声一样。为了避免储备池状态爆炸,WW的特征值必须要小于等于1。这也就引入了ESN中谱半径的概念:WW的最大特征值。
  2. 由于网络中只有WoutWout是可变的,为了尽可能多的表示不同的数据规律,WW必须要设置的非常大,才能从中找出各种不同的特征进行输出。另一方面,WW的稀疏性也很重要,Hinton在多伦多大学的公开课里解释是:

建立一个松散的连接,这样某一信息可以在网络中的一小部分回荡,而不会迅速的传播到其他部分。

我不是特别的理解。希望有人解释一下。

最后引用一个例子来彻底理解最基本的ESN。

在页面中下载python源码和数据集,在python2.7环境中运行。

数据就是一维的,代码中每次输入长度为1,预测数据中后一位的值,当然长度也是1。

相关文章:

  • C# 序列化
  • VisualSVN 手动记录访问日志
  • JDBC(连接池) -- 02(I)
  • windows   8   OneNoteMX
  • 第二次作业-Steam软件分析
  • [面试] 组合(非递归)
  • Which garbage collection strategy is using
  • OutputCache造成页面响应内容类型为text/vnd.wap.wml的问题
  • windws 8 应用小技巧(11-15)
  • Mac禁用ipv6
  • C语言程序设计第一次作业
  • 学习PrintWriter类
  • 物联网设备漏洞不断增加 五大安全层面随时检视
  • 从ORACLE转战虚拟化 与VMware展开肉搏战来看
  • js 返回时间 字符串
  • .pyc 想到的一些问题
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 0x05 Python数据分析,Anaconda八斩刀
  • 5、React组件事件详解
  • exif信息对照
  • jquery ajax学习笔记
  • MaxCompute访问TableStore(OTS) 数据
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • nodejs调试方法
  • Vultr 教程目录
  • XForms - 更强大的Form
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 给初学者:JavaScript 中数组操作注意点
  • 关于 Cirru Editor 存储格式
  • 前端面试之闭包
  • 线上 python http server profile 实践
  • 想写好前端,先练好内功
  • 消息队列系列二(IOT中消息队列的应用)
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​Python 3 新特性:类型注解
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #define 用法
  • #前后端分离# 头条发布系统
  • $refs 、$nextTic、动态组件、name的使用
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (day 12)JavaScript学习笔记(数组3)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Matlab)使用竞争神经网络实现数据聚类
  • (二)丶RabbitMQ的六大核心
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (算法)求1到1亿间的质数或素数
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布