回声状态网络(ESN)的公式推导及代码实现

article/2025/10/8 10:33:39

1. ESN的任务

给定一段信号: u ( 0 ) , u ( 1 ) , ⋅ ⋅ ⋅ , u ( N t − 1 ) u(0),u(1),···,u(N_t-1) u(0)u(1)u(Nt1)
和目标值: v ( 1 ) , v ( 2 ) , ⋅ ⋅ ⋅ , v ( N t ) v(1),v(2),···,v(N_t) v(1)v(2)v(Nt)
学习一个黑箱模型M使得我们可以预测 v ( N t + 1 ) , v ( N t + 2 ) , ⋅ ⋅ ⋅ v(N_t+1),v(N_t+2),··· v(Nt+1)v(Nt+2)

优势:与传统的递归神经网络相比,ESN最大的优势是简化了网络的训练过程,解决了传统递归神经网络结构难以确定、训练算法过于复杂的问题,同时也可以克服递归网络存在的记忆消减等问题(ESN的训练方法与传统的递归神经网络有本质不同)。

ESN解决问题的思想:使用大规模随机稀疏网络(储备池)作为信息处理媒介,将输入信号从低维的输入空间映射到高维的状态空间,在高维的状态空间采用线性回归方法对网络的部分连接权进行训练,而其他连接权随机产生,并在网络训练过程中保持不变。这种思想在Steil关于传统递归神经网络的经典算法(Atiya-Parlos)的研究中也得到了验证:递归神经网络输出连接权改变迅速,而内部连接权则以高度耦合的方式缓慢改变。也就是说,如果递归神经网络内部连接权选择合适,在对网络进行训练时可以忽略内部连接权的改变。

2. ESN的结构和训练步骤

在这里插入图片描述ESN的结构如上图所示,其中:
中间的大圆圈叫做“储备池”,它有以下特点:
(1)包含数目较多的神经元(与经典神经网络相比);
(2)神经元之间的连接关系随机产生;
(3)神经元之间的连接具有稀疏性。

u ∈ R M ∗ 1 u\in R^{M*1} uRM1 W I R ∈ R N ∗ M W_{IR}\in R^{N*M} WIRRNM W r e s ∈ R N ∗ N W_{res}\in R^{N*N} WresRNN r ∈ R N ∗ 1 r\in R^{N*1} rRN1 W R O ∈ R L ∗ N W_{RO}\in R^{L*N} WRORLN v ∈ R L ∗ 1 v\in R^{L*1} vRL1

上面的两个参数矩阵 W I R ∈ R N ∗ M W_{IR}\in R^{N*M} WIRRNM W r e s ∈ R N ∗ N W_{res}\in R^{N*N} WresRNN都是事先给定的数值,在训练的过程中只需要计算 W R O ∈ R L ∗ N W_{RO}\in R^{L*N} WRORLN即可。

整个计算过程如下所示:

(1)从输入到储备池(reservoir)的运算: W I R ∗ u ( t ) W_{IR}*u(t) WIRu(t)

(2)储备池中 r ( t ) r(t) r(t)的更新: r ( t + Δ t ) = f [ W r e s ∗ r ( t ) + W I R ∗ u ( t ) ] r(t+\Delta t)=f[W_{res}*r(t)+W_{IR}*u(t)] r(t+Δt)=f[Wresr(t)+WIRu(t)]

(3)从储备池到输出: W R O ∗ r ( t ) W_{RO}*r(t) WROr(t)

(4)损失函数: L = ∑ t = d + 1 N t ∣ v ( t ) − W R O ∗ r ( t ) ∣ 2 L=\sum_{t=d+1}^{N_t}|v(t)-W_{RO}*r(t)|^2 L=t=d+1Ntv(t)WROr(t)2

(6)使损失函数最小化的推导过程:

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

3. ESN的预测步骤

W R O W_{RO} WRO确定之后,库的输出为:

u ( t ) = W R O ∗ r ( t ) u(t)=W_{RO}*r(t) u(t)=WROr(t)

r ( t + Δ t ) = f [ W r e s ∗ r ( t ) + W I R ∗ u ( t ) ] r(t+\Delta t)=f[W_{res}*r(t)+W_{IR}*u(t)] r(t+Δt)=f[Wresr(t)+WIRu(t)]

u ( t + Δ t ) = W R O ∗ r ( t + Δ t ) u(t+\Delta t)=W_{RO}*r(t+\Delta t) u(t+Δt)=WROr(t+Δt)

···

热启动方式:使用训练步中最后一个阶段的库状态作为预测中的 r ( t ) r(t) r(t)

冷启动方式:使用一个新的数据作为库的初始值

在这里插入图片描述

预测的时候不会再给单独的输入了,而是会将输出作为输入进行递推计算。

一般 W I R W_{IR} WIR各元素会初始化为 [ − α , α ] [-\alpha,\alpha] [α,α]之间的均匀分布。

每个输入 u ( t ) u(t) u(t)都会和 N / M N/M N/M个库中的节点相连,因为输入个数时M,库中有N个节点,
即: u ∈ R M ∗ 1 u\in R^{M*1} uRM1 r ∈ R N ∗ 1 r\in R^{N*1} rRN1

W r e s W_{res} Wres通常是一个大型,稀疏,有向或无向的随机网络,平均度为k,谱半径 ρ ( W r e s ) \rho (W_{res}) ρ(Wres) W r e s W_{res} Wres最大的特征值。

W r e s W_{res} Wres会初始化为一个稀疏矩阵。

4. ESN的代码

import pickle
import numpy as np
import matplotlib.pyplot as pltclass ESN():def __init__(self, data, N=1000, rho=1, sparsity=3, T_train=2000, T_predict=1000, T_discard=200, eta=1e-4, seed=2050):self.data = dataself.N = N  # reservoir size 库的大小self.rho = rho  # spectral radius 谱半径self.sparsity = sparsity  # average degree 平均度       sparsity:稀疏性self.T_train = T_train  # training stepsself.T_predict = T_predict  # prediction stepsself.T_discard = T_discard  # discard first T_discard steps  discard:丢弃self.eta = eta  # regularization constant 正则化常数self.seed = seed  # random seeddef initialize(self):"""对连接权矩阵W_IR和W_res进行初始化其中W_IR(N*1)是从输入到库的连接权矩阵,W_res(N*N)是从库到输出的连接权矩阵"""if self.seed > 0:np.random.seed(self.seed)# 生成形状为N * 1的,元素为[-1, 1]之间的随机值的矩阵self.W_IR = np.random.rand(self.N, 1) * 2 - 1  # [-1, 1] uniform# 生成形状为N * N的,元素为[0, 1]之间的随机值的矩阵W_res = np.random.rand(self.N, self.N)# 将W_res中大于self.sparsity / self.N的元素置0W_res[W_res > self.sparsity / self.N] = 0\# np.linalg.eigvals(W_res)求出W_res的特征值,W_res矩阵除以自身模最大的特征值的模W_res /= np.max(np.abs(np.linalg.eigvals(W_res)))# 在乘以谱半径W_res *= self.rho  # set spectral radius = rhoself.W_res = W_resdef train(self):u = self.data[:, :self.T_train]  # traning data T_train = 2000assert u.shape == (1, self.T_train)r = np.zeros((self.N, self.T_train + 1))  # initialize reservoir state r(N*(T_train + 1))for t in range(self.T_train):# @是Python3.5之后加入的矩阵乘法运算符r[:, t+1] = np.tanh(self.W_res @ r[:, t] + self.W_IR @ u[:, t])# disgard first T_discard steps  r丢弃前T_discard步变成r_pself.r_p = r[:, self.T_discard+1:]  # length=T_train-T_discardv = self.data[:, self.T_discard+1:self.T_train+1]  # targetself.W_RO = v @ self.r_p.T @ np.linalg.pinv(self.r_p @ self.r_p.T + self.eta * np.identity(self.N))train_error = np.sum((self.W_RO @ self.r_p - v) ** 2)print('Training error: %.4g' % train_error)def predict(self):u_pred = np.zeros((1, self.T_predict))  # u_pred是形状为(1, self.T_predict)的全零矩阵r_pred = np.zeros((self.N, self.T_predict))  # r_pred是形状为(N, self.T_predict)的全零矩阵r_pred[:, 0] = self.r_p[:, -1]  # warm start 热启动for step in range(self.T_predict - 1):u_pred[:, step] = self.W_RO @ r_pred[:, step]r_pred[:, step + 1] = np.tanh(self.W_res @r_pred[:, step] + self.W_IR @ u_pred[:, step])u_pred[:, -1] = self.W_RO @ r_pred[:, -1]self.pred = u_preddef plot_predict(self):ground_truth = self.data[:,self.T_train: self.T_train + self.T_predict]plt.figure(figsize=(12, 4))plt.plot(self.pred.T, 'r', label='predict', alpha=0.6)plt.plot(ground_truth.T, 'b', label='True', alpha=0.6)plt.show()def calc_error(self):ground_truth = self.data[:,self.T_train: self.T_train + self.T_predict]rmse_list = []for step in range(1, self.T_predict+1):error = np.sqrt(np.mean((self.pred[:, :step] - ground_truth[:, :step]) ** 2))rmse_list.append(error)return rmse_listif __name__ == "__main__":# http://minds.jacobs-university.de/mantas/codedata = np.load('mackey_glass_t17.npy')  # data.shape = (10000,)data = np.reshape(data, (1, data.shape[0]))  # data.shape = (1, 10000)print(data.shape)esn = ESN(data)esn.initialize()esn.train()esn.predict()esn.plot_predict()

上面所用到的mackey_glass_t17.npy数据集可在下面的链接中找到:
链接:https://pan.baidu.com/s/1UX3ZAMjF1pQFMe6Ru8dqsQ
提取码:uf8y
复制这段内容后打开百度网盘手机App,操作更方便哦

参考


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

相关文章

matlab 回声状态网络ESN的时间序列预测

1、内容简介 略 537-可以交流、咨询、答疑 2、内容说明 ESN是Jaeger于2001年提出一种新型递归神经网络,ESN一经提出便成为学术界的热点,并被大量地应用到各种不同的领域中,包括动态模式分类、机器人控制、对象跟踪核运动目标检测、事件监测…

手机esn不可用怎么解决_什么是ESN,为什么我不担心它是否干净?

手机esn不可用怎么解决 If you’re in the market for a cellphone, especially a used one, you’ll hear a lot of talk about ESNs with an emphasis on whether or not the phone is “clean”. What exactly does acronym stand for and what does it mean if the phone i…

回声状态网络(ESN)教程

回声状态网络(ESN)教程 基础概念 回声状态网络(Echo State Network)提出于2001年,曾经是研究的热点,但近年来随着RNN,LSTM与其它一些变种的网络的出现,现在研究比较少了,但是其在时间序列预测上还有着很不错的应用。…

Deep Learning之带你详细了解回声状态网络(ESN)

Abstract 首先呢写本篇博客的灵感来源于我在学习RNN(循环神经网络)时对于如何解决其循环结构,参数共享带来的长期依赖问题,我将在(一)中简要叙述RNN引出本文主角ESN(回声状态网络)。…

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

一、提出 循环神经网络(Recurrent Neural Networks,RNNs)的训练是通过反向对权值直接优化来实现的,这种方式容易产生两个问题:收敛速度慢和易陷入局部最优。回声状态网络( echo state network,ESN) 由 Jaeger于2001年…

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

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

安装 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 组件

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

Chrome DevTools 使用详解

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

Vue的devtools工具打包

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

DevTools 页面

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

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

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

浏览器 DevTools使用

原文地址 Start 本文将会介绍浏览器devtool的一些常用工具方法,这些工具能够以可视化的方式展现当前网页情况,我们也能快速定位代码问题,如果我们能很好的利用起来,那就能写出高质量代码。 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…