回声状态网络(echo state network,ESN)概述

article/2025/10/8 10:37:14

一、提出

循环神经网络(Recurrent Neural Networks,RNNs)的训练是通过反向对权值直接优化来实现的,这种方式容易产生两个问题:收敛速度慢和易陷入局部最优。回声状态网络( echo state networkESN) 由 Jaeger2001年提出,在模型构建与学习算法方面较传统的循环神经网络有较大差别,凭借不同于循环神经网络反向传播的形式进行学习,其相应的学习算法为递归神经网络的研究开启了新纪元

回声状态网络又称储备池计算(RC,reservoir computing),采用由随机生成稀疏连接固定不变的内部权重矩阵得到神经元组成的储备池作为隐层,用以将输入进行投射到高维、非线性的表示。ESN将神经网络的隐层权值预先生成而非训练生成,与隐层至输出层的权值训练分开进行,其基本思想的前提是生成的储备池具有某种良好的属性,往往能够保证仅采用线性方法训练储备池至输出层的权值即可获得优良的性能。

二、基本原理

2.1 网络结构

ESN拓扑结构图

 基本方程:

 

 预先生成Win(输入单元与储备池内部连接权值矩阵)、W(储备池内部连接权值矩阵)、Wback(储备池与输出单元连接权值矩阵),只训练Wout(储备池与输出单元连接权值矩阵)

\small f:储备池单元的激活函数

\small f^{out}:输出单元的激活函数

2.2 主要参数

 2.2.1 储备池规模N

 储备池其中神经元的个数N,常规来讲N值越大,预测的精度越高,但同时也会导致效率低下,容易过拟合。

2.2.2 储备池谱半径SR

SR是W最大特征值的绝对值,是影响储备池记忆能力的主要因素。一般需要保证SR<1,ESN才有回声状态性质,但后续研究逐步超越该界限,SR<1的要求不再严格。

2.2.3 储备池稀疏程度SD

SD是内部神经元的连接情况,表示储备池中相互连接的神经元占所有神经元总数的比例,通常为1%~5%。

2.2.4 输入单元尺度IS

IS是输入连接至储备池之前需要相乘的一个尺度因子。相乘使得输入信号变换至神经元激活函数相应的范围内。

2.3 构造方法

 ESN的建立流程

(1)首先确定储备池的规模,即神经元的个数。节点数越多,拟合能力越强。由于ESN仅仅通过调整输出权值来线性拟合输出结果,所以一般ESN需要远大于常规神经网络的节点规模。
(2)随机生成连接矩阵W,这个矩阵表示了哪些神经元之间是有连接的,以及连接的方向和权值。此处往往使新接触ESN的同学存疑,并因此对ESN的储备池不太理解。事实上,内部权重矩阵是某时刻神经元与下一时刻神经元的连接,而非普通的互相连接,若对此有疑问,需回看循环神经网络,在此引用https://blog.csdn.net/HiWangWenBing/article/details/121387285,图片可供参考。

 

(3)其次是输入连接的权值大小以及内部连接矩阵的谱半径,这些关键参数会影响到网络短期记忆时间的长短,输入权值越小而内部矩阵的谱半径越接近1,网络短期记忆时间越长。但是增强记忆能力的同时,这种操作也造成了网络对“快速变化”系统建模能力下降。在实际应用中,要通过分析被建模系统的实际变化特征来选取相应的数值。

2.4 训练过程

2.4.1 采集状态

采样阶段即将输入数据经过输入连接权重、储备池、初始输出权重得到各个时刻的输出 y ( n),在此阶段需要把储备池的内部状态不断收集,为后续的训练做准备。
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]
从代码中容易理解,随着时间t的增长,输入数据不断传入,同时储备池状态持续更新,更新的过程中记录下储备池状态。空转100次的目的是缓冲随机生成状态造成的影响。

2.4.2 权值计算

为了实现权值的计算, 需要根据在采样阶段收集到系统状态矩阵X和目标输出y, 计算输出连接权 W out 因为状态变量 x ( n) 和系统输出 y ( n) 之间是线性关系 ,而 需要实现的目标是利用网络实际输出 y ( n) 逼近期望输 y ( n),

也就是希望计算权值 Wout ,数学上讲这是一个线性回归问题,可使用常用的线性回归算法快速求解。
# 使用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进行输出预测值。

三、Python代码实现

from numpy import *
from matplotlib.pyplot import *
import scipy.linalg
import matplotlib.pyplot as plt# 加载数据
# 前2000个数据用来训练,2001-4000的数据用来测试。训练数据中,前100项用来初始化储备池,以让储备池中形成良好的回声之后再开始训练。
trainLen = 2000
testLen = 2000
initLen = 100  # 前100项用来初始化储备池data = loadtxt('MackeyGlass_t17.txt')# 绘制前1000条数据
figure(0).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 *= 0.9 / 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(np.arange(1 + inSize + resSize), Wout.T, 8)
plot(np.arange(1 + inSize + resSize), Wout.T)title('Output weights $\mathbf{W}^{out}$')
show()

MackeyGlass_t17.txt - 蓝奏云 ,点击此连接获取数据集

 五、参考资料

 [1]张琪. 基于演化回声状态网络的时间序列预测研究[D].南京信息工程大学, 2022. DOI:10.27248/d.cnki.gnjqc.2022.001174.

[2]李伟杰. 基于回声状态网络的混沌时间序列的动态预测[D].吉林大学, 2022. DOI:10.27162/d.cnki.gjlin.2022.002074.

[3]牟晓惠. 回声状态网络学习机制的研究及其应用[D].北京邮电大学, 2021. DOI:10.26969/d.cnki.gbydu.2021.003053.

[4]那晓栋,王嘉宁,刘墨燃,任伟杰,韩敏.基于层次化可塑性回声状态网络的混沌时间序列预测[J/OL].控制与决策:1-9[2022-09-10].DOI:10.13195/j.kzyjc.2021.0773.

[5]胡焕玲. 基于改进回声状态网络的能源预测问题研究[D].华中科技大学, 2021. DOI:10.27157/d.cnki.ghzku.2021.000301.


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

相关文章

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

最近在看回声状态网络(Echo State Network)的内容&#xff0c;因为很少搜到关于Echo State Network的快速入门讲解&#xff0c;所以打算写一下ESN的基本原理。 1、概念 回声状态网络作为一种新型的递归神经网络(如上图)&#xff0c;也由输入层、隐藏层(即储备池)、输出层组成…

安装 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…