回声状态网络(ESN)原理详解(附源码实现)

article/2025/10/8 10:36:22

最近在看回声状态网络(Echo State Network)的内容,因为很少搜到关于Echo State  Network的快速入门讲解,所以打算写一下ESN的基本原理。

1、概念

回声状态网络作为一种新型的递归神经网络(如上图),也由输入层、隐藏层(即储备池)、输出层组成。其将隐藏层设计成一个具有很多神经元组成的稀疏网络,通过调整网络内部权值的特性达到记忆数据的功能,其内部的动态储备池(DR)包含了大量稀疏连接的神经元,蕴含系统的运行状态,并具有短期训记忆功能。ESN训练的过程,就是训练隐藏层到输出层的连接权值(Wout)的过程。总结如下三个特点:

(1)核心结构是一个随机生成且保持不变的储备池(Reservoir)

(2)其输出权值是唯一需要调整的部分

(3)简单的线性回归就可完成网络的训练

 

2、ESN的各个参数与公式。

2.1 节点与状态

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

        t 时刻的状态为:

  

2.2 连接矩阵与状态方程

图中的储备池就是常规神经网络的隐藏层,输入层到储备池的连接为Win(N*K阶),储备池到下一个时刻储备池状态的连接为W(N*N阶),储备池到输出层的连接为Wout(L*(K+N+L)阶)。另外还有一个前一时刻的输出层到下一时刻的储备池的连接Wback(N*L阶),这个连接不是必须的(图中虚线表示)。

每一时刻输入u(t),储备池都要更新状态,它的状态更新方程为:

式中,Win和Wback都是在最初建立网络的时候随机初始化的,并且固定不变。u(t+1)是这个时刻的输入,x(t+1)是这个时刻的储备池状态,x(t)是

上一个时刻的储备池状态,在t=0时刻可以用0初始化。f是DR内部神经元激活函数,通常使用双曲正切函数(tanh)。

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

x是一个长度为N的向量。

ESN的输出状态方程为:

式中,fout是输出层神经元激活函数。

到这里有了储备池状态,有了ESN输出方式,就可以根据目标输出y(target)来确定Wout,以使得y(t+1)和y(target)的差距尽可能小。这是一个简单

的线性回归问题,计算方法有多种,不再赘述。

2.3 储备池四个参数

储备池是该网络的核心结构,所谓的储备池就是随机生成的、大规模的、稀疏连接(SD通常保持1%-5%连接)的递归结构。

ESN的最终性能是由储备池的各个参数决定的,包括:储备池内部连接权谱半径SR、储备池规模N、储备池输入单元尺度IS、储备池稀疏程度SD。

(1)储备池内部连接权谱半径SR。其为连接权矩阵W的绝对值最大的特征值,记为λmax,λmax<1是保证网络稳定的必要条件;

(2)储备池规模N。其为储备池中神经元的个数,储备池的规模选择与样本个数有关,对网络性能影响很大,储备池规模越大,ESN对给定动态系统的描述越准确,但是会带来过拟合问题。

(3)储备池输入单元尺度IS。其为储备池的输入信号连接到储备池内部神经元之前需要相乘的一个尺度因子,即对输入信号进行一定的缩放。一般需要处理的对象非线性越强,IS越大。

(4)储备池稀疏程度SD。其表示储备池中神经元之间的连接情况,储备池中并不是所有神经元之间都存在连接。SD表示储备池中相互连接的神经元总数占总的神经元N的百分比,其值越大,非线性逼近能力越强。

 

3. ESN网络的训练

ESN的训练过程就是根据给定的训练样本确定系数输出连接权矩阵Wout的过程。其训练分为两个阶段:采样阶段权值计算阶段

为了简单起见,这里假定Wback为0,同时输入到输出以及输出到输出连接权也假定为0。

3.1 采样阶段

采样阶段首先任意选定网络的初始状态,但是通常情况下选取网络的初始状态为0,即x(0)=0。

(1)训练样本(u(t), t=1,2,...,P)经过输入连接权矩阵Win被加入到储备池。

(2)按照前述两个状态方程,依次完成系统状态和输出y(t)的计算与收集。

为了计算输出连接权矩阵,需要从某一时刻m开始收集(采样)内部状态变量,并以向量为行构成矩阵B(P-m+1, N),同时相应的样本数据y(t)也被收集,并构成一个列向量T(P-m+1, 1)。

3.2 权值计算阶段

权值计算就是根据在采样阶段收集到系统状态矩阵和样本数据,计算输出连接权Wout。因为状态变量x(t)和预测输出之间是线性关系,所以需要实现的目标就是利用预测输出,逼近期望输出y(t):

至此,ESN网络训练已经完成,训练好的网络可以用于时间序列建模具体问题。

4. ESN实例

最后通过一个例子彻底理解最基本的ESN。数据集。python源码。(修改:链接已更新。如果以后在失效,可以在github上搜到类似代码和数据集,地址:https://github.com/alexander-rakhlin/ESN,现在我又在githhub搜了下ESN,能看到很多更好的代码,大家可以试试看

在页面中下载python源码和数据集,在python2.7环境中运行。下面我改成了python3,并带有自己的注解。

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

效果什么的,自己跑跑看。。。。

 

# -*- coding: utf-8 -*-
"""
A minimalistic Echo State Networks demo with Mackey-Glass (delay 17) data 
in "plain" scientific Python.
by Mantas Lukoševi�?ius 2012
http://minds.jacobs-university.de/mantas
"""
from numpy import *
from matplotlib.pyplot import *
import scipy.linalg# 加载数据
#前2000个数据用来训练,2001-4000的数据用来测试。训练数据中,前100项用来初始化储备池,以让储备池中形成良好的回声之后再开始训练。
trainLen = 2000
testLen = 2000
initLen = 100data = loadtxt('MackeyGlass_t17.txt')# 绘制前1000条数据
figure(10).clear()
plot(data[0:1000])
title('A sample of data')# 生成ESN储层
inSize = outSize = 1   # inSize 输入维数 K
resSize = 1000     # 储备池规模 N
a = 0.3 # 可以看作储备池更新的速度,可不加,即设为1.random.seed(42)
#随机初始化 Win 和 W
Win = (random.rand(resSize, 1+inSize)-0.5) * 1   # 输入矩阵 N * (1+K)
W = random.rand(resSize, resSize)-0.5    # 储备池连接矩阵 N * N# 对W进行防缩,以满足稀疏的要求。
# 方案 1 - 直接缩放 (快且有脏数据, 特定储层): W *= 0.135 
# 方案 2 - 归一化并设置谱半径 (正确, 慢):
print ('计算谱半径...')
rhoW = max(abs(linalg.eig(W)[0]))   # linalg.eig(W)[0]:特征值   linalg.eig(W)[1]:特征向量
W *= 1.25 / rhoW# 为设计(收集状态)矩阵分配内存
X = zeros((1+inSize+resSize, trainLen-initLen))   # 储备池的状态矩阵x(t):每一列是每个时刻的储备池状态。后面会转置
# 直接设置相应的目标矩阵
Yt = data[None, initLen+1:trainLen+1]    #输出矩阵:每一行是一个时刻的输出# 输入所有的训练数据,然后得到每一时刻的输入值和储备池状态。
x = zeros((resSize, 1))
for t in range(trainLen):u = data[t]x = (1-a)*x + a*tanh( dot( Win, vstack((1, u)) ) + dot( W, x ) )   # vstack((1, u)):将偏置量1加入输入序列if t >= initLen:   # 空转100次后,开始记录储备池状态X[:, t-initLen] = vstack((1, u, x))[:, 0]# 使用Wout根据输入值和储备池状态去拟合目标值,这是一个简单的线性回归问题,这里使用的是岭回归(Ridge Regression)。
reg = 1e-8  # 正则化系数
X_T = X.T
# Wout:  1 * 1+K+N
Wout = dot( dot(Yt, X_T), linalg.inv( dot(X, X_T) + \reg*eye(1+inSize+resSize) ) )   # linalg.inv矩阵求逆;numpy.eye()生成对角矩阵,规模:1+inSize+resSize,默认对角线全1,其余全0
#Wout = dot( Yt, linalg.pinv(X) )# 使用训练数据进行前向处理得到结果
# run the trained ESN in a generative mode. no need to initialize here, 
# because x is initialized with training data and we continue from there.
Y = zeros((outSize, testLen))
u = data[trainLen]
for t in range(testLen):x = (1-a)*x + a*tanh( dot( Win, vstack((1, u)) ) + dot( W, x ) )y = dot( Wout, vstack((1, u, x)) )   # 输出矩阵(1 * 1+K+N)*此刻状态矩阵(1+K+N * 1)=此刻预测值Y[:,t] = y    # t时刻的预测值   Y: 1 * testLen# 生成模型u = y# 预测模型#u = data[trainLen+t+1] # 计算第一个errorLen时间步长的MSE
errorLen = 500
mse = sum( square( data[trainLen+1:trainLen+errorLen+1] - Y[0, 0: errorLen] ) ) / errorLen
print ('MSE = {0}'.format( str( mse ) ))# 绘制测试集的真实数据和预测数据
figure(1).clear()
plot( data[trainLen+1:trainLen+testLen+1], 'g' )
plot( Y.T, 'b' )
title('Target and generated signals $y(n)$ starting at $n=0$')
legend(['Target signal', 'Free-running predicted signal'])# 绘制储备池中前200个时刻状态(x(t))的前20个储层结点值
figure(2).clear()
plot( X[0:20,0:200].T )
title('Some reservoir activations $\mathbf{x}(n)$')# 绘制输出矩阵
figure(3).clear()
bar( range(1+inSize+resSize), Wout.T )
title('Output weights $\mathbf{W}^{out}$')show()

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/WBswF68o.shtml

相关文章

安装 Vue-devtools拓展程序

Chrome安装 Vue-devtools拓展程序 一、Vue-devtools简介二、安装1、打开终端下载仓库代码2、下载依赖node_modules3、编译打包4、修改manifest.json文件5、在Chrome浏览器中加载已解压的扩展程序 三、安装遇到的坑build 问题 四、换种方式下载1、安装命令2、修改manifest.json文…

Vue DevTools 使用指南 - 如何安装和使用 Vue DevTools 调试 Vue 组件

本文首发&#xff1a;《Vue DevTools 使用指南 - 如何安装和使用 Vue DevTools 调试 Vue 组件》 Vue Devtools 是 Vue 官方发布的调试浏览器插件&#xff0c;可以安装在 Chrome 和 Firefox 等浏览器上&#xff0c;直接内嵌在开发者工具中&#xff0c;使用体验流畅。Vue Devtoo…

Chrome DevTools 使用详解

【转自&#xff1a;https://segmentfault.com/a/1190000007877846】 基本够调试用了&#xff01;有这么详细文章&#xff0c;真实很感谢作者&#xff01; 写在前面&#xff1a;Chrome DevTools 系列文章正在紧张地整理当中&#xff0c;目前正在整理 DevTools 的第一部分&#…

Vue的devtools工具打包

Vue的devtools工具打包 最近想升级一下Vue的开发工具&#xff0c;因为升级到vue3后一直使用的是Vue.js devtools 6.0.0 beta 21。使用的是测试版&#xff0c;想到正式Vue3发布这么久了打算更新一下&#xff0c;用上最新的正式版&#xff08;保持最新——来自程序员的执念&…

DevTools 页面

DevTools基础内容 DevTools 扩展为 Chrome DevTools 添加了功能。它可以添加新的 UI 面板和侧边栏&#xff0c;与检查的页面交互&#xff0c;获取有关网络请求的信息等等。 DevTools 扩展可以访问一组额外的 DevTools 特定的扩展 API&#xff1a; devtools.inspectedWindowde…

vue devtools调试工具安装(详细)

Vue调试工具安装&#xff08;vue devtools&#xff09; 第一步&#xff1a;下载vue-devtools 创建一个空的文件夹&#xff0c;命名最好可以见名知意&#xff0c;复制目录后打开命令行 在cmd中进入此文件夹目录下&#xff0c;输入npm install vue-devtools命令开始下载&#xff…

浏览器 DevTools使用

原文地址 Start 本文将会介绍浏览器devtool的一些常用工具方法&#xff0c;这些工具能够以可视化的方式展现当前网页情况&#xff0c;我们也能快速定位代码问题&#xff0c;如果我们能很好的利用起来&#xff0c;那就能写出高质量代码。 Performance(重点) 强大的性能监控工具…

热部署Devtools

热部署Devtools 1.添加devtools到项目中 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional> </dependenc…

React-DevTools开发者工具安装

React开发者工具最简单的安装方式自然是科学上网&#xff0c;通过Google Chrome浏览器访问应用商店安装了。以下介绍另一种安装方式&#xff1a;基于 react-devtools的GitHub项目源码编译进行插件安装。 目录 React-DevTools&#xff1a;GitHub项目地址 React-DevTools&#x…

react-devtools安装教程

有时候看网上各路大神&#xff0c;写如何安装react-devtools&#xff0c;大神就是大神&#xff0c;好多步骤一笔带过&#xff0c;导致一些学习者看的一脸懵逼&#xff0c;今天我给大家讲超级简单的react-devtools安装步骤&#xff0c;相信看过的小伙伴儿不存在懵逼状态&#xf…

VUE3 VUE-DEVTOOLS 安装

VUE3 Vue-Devtools 正确安装&#xff0c;亲测有效 写在前面正确的安装方式下载源码编译安装 写在前面 最近在学习Vue3。学习Vue自然离不开debug。Vue官方发布了调试工具Vue-Devtools。 官方网址&#xff1a;Vue-Devtools。 对于Vue3&#xff0c;Vue-Devtools没有正式的发布&a…

如何在生产环境使用devtools?

经常会有在生产环境使用devtools插件的需求&#xff0c;但是看别人操作之后自己就老是忘记&#xff0c;在这儿记录一下在生产环境使用devtools的整个过程。 1、原理 其实是否使用devtools是根据Vue.config.devtools这个配置来决定的&#xff0c;这个配置在开发环境下会被设为t…

mac安装vue-devtools

一.先查看电脑是否安装了node 没有安装node则需要安装node mac 安装node.js 第一步&#xff1a;官网下载 访问nodejs官网&#xff0c;链接: https://nodejs.org/en/&#xff0c;选择红色选框内的点击安装。 LTS是稳定版。 Current是最新版本&#xff0c;最新的功能特性都在这…

devtool使用介绍(1)

devtool使用介绍1 SDK中devtool的工作流程2.4.1 使用 devtool add添加应用程序 SDK中devtool的工作流程 可扩展SDK的核心要件是一个命令行工具&#xff0c;称为devtool。该工具提供了许多功能&#xff0c;可以帮助你在可扩展的SDK中构建&#xff0c;测试和打包软件&#xff0c…

vue-devtools-简介、下载、安装、配置、使用

一、简介 vue-devtools是一款基于chrome游览器的插件&#xff0c;可以用于调试vue应用&#xff0c;也可以用来辅助我们找到各页面对应的Vue.js文件路径&#xff0c;这将极大地提高我们的开发和调试效率。 二、下载 下载路径&#xff1a;https://github.com/vuejs/vue-devtoo…

DevTools使用

Chrome DevTools是内嵌在Chrome浏览器里的一组用于网页制作和调试的工具。使用DevTools&#xff0c;可以在平时中的开发调试中极大的提高效率。 使用快捷键ctrlshifti或者f12可以直接打开开发者工具。 在DevTools开发者工具一共有九个部分。 Element 在这张图中&#xff0c;右…

下载、编译、安装、使用 vue-devtools

不少人都想下载 vue-devtools插件&#xff0c;但又不会做&#xff0c;今天我做个比较详细的笔记 查看当前的devtools的版本可以去这个网站看右侧的个v几点几的&#xff0c;就是版本号 github/vuejs/devtools 目录 第一个方法&#xff1a;使用极简插件 第一步&#xff1a;查…

Vue调试工具vue-devtools的安装与使用

目录 前言 一、vue-devtools是什么&#xff1f; 二、vue-devtools安装 1.下载vue-devtools工具 2.安装vue-devtools工具 三、vue-devtools的使用 总结 前言 主要介绍vue-devtools的安装与使用。 一、vue-devtools是什么&#xff1f; vue-devtools是一款基于chrome游览器…

devTools最新安装方法

VUE DevTools 最新安装方法 啊头疼&#xff01;最近学习vue&#xff0c;要用到devtools&#xff0c;网上搜索资料&#xff0c;发现都不行&#xff0c;然后就试了好久好久&#xff0c;终于&#xff0c;成功了&#xff0c;接下来划重点&#xff01;仔细看&#xff01;&#xff0…

Devtools的简单使用

一.Devtools作用 方便我们实时地观察自己写的数据和组件的状况等。 二.安装 极简插件_Chrome扩展插件商店_优质crx应用 <template><div class""></div> </template><script> export default {data() {return {name:芜湖, //单项数据…