回声状态网络(ESN)教程

article/2025/10/8 10:34:46

回声状态网络(ESN)教程

基础概念

回声状态网络(Echo State Network)提出于2001年,曾经是研究的热点,但近年来随着RNN,LSTM与其它一些变种的网络的出现,现在研究比较少了,但是其在时间序列预测上还有着很不错的应用。传统的MLP网络的隐层是一层层的全连接的神经元,而ESN引入了一个储备池计算模式来替代原始的隐层,这个储备池是什么呢?先来看下下图:
回声状态网络

网络结构依次是输入层,储备池和输出层,所谓的储备池就是中间的部分。这个储备池的特点是: (1)储备池中神经元的连接状态是随机的,即神经元之间是否建立连接并不是我们人工确定的;(2)储备池中的连接权重是固定的,不像传统的MLP网络使用梯度下降进行权重的更新。这样做的好处是:(1)大大降低了训练的计算量;(2)一定程度上避免了梯度下降的优化算法中出现的局部极小情况;(3)此外,在很多问题上确实有着不错的建模能力。ESN的基本思想就是由储备池生成一个随输入不断变化的复杂动态空间,当这个状态空间足够复杂时,就可以利用这些内部状态, 线性地组合处所需要的对应输出~(实际上就是传统的MLP拟合的能力)。那么,到底是如何训练这个网络的呢?不要着急,我们先来对ESN 做一些数学符号的定义。

数学定义

假设这个回声状态网络有 N N 个中间节点,即储备池中的神经元个数为N,输入层和输出层神经元个数都为 D D 。用u(t)RD,x(t)RN,f(t)RD分别表示t时刻的输入,网络状态(储备池的状态)和输出; VRN×D,RRN×N,WRD×N V ∈ R N × D , R ∈ R N × N , W ∈ R D × N 分别表示输入权重、中间权值及输出权重矩阵, tanh() t a n h ( ⋅ ) 为激活函数。注意,有些文献会把 V V 定义为Win W W
定义为Wout R R 定义为W
则储备池的状态更新方式以及网络的输出为:

x(t)=tanh(Rx(t1)+Vu(t))(1) (1) x ( t ) = t a n h ( R x ( t − 1 ) + V u ( t ) )

f(t)=Wx(t)(2) (2) f ( t ) = W x ( t )

构造过程

首先我们来看下ESN的构造过程:初始化,训练以及使用(测试),如下图所示。

回声状态网络的构造过程。

首先进行初始化操作,在这步里,我们先确定储备池的大小,即神经元的个数。与传统的MLP相同,节点数越多,拟合能力越强。由于ESN仅仅通过调整输出权值(即图1中的 W W ,我们最终就是利用储备池的状态信息来确定这个W)来线性拟合输出结果,所以一般ESN需要远大于一般神经网络的节点规模。
接下来是随机生成连接矩阵,这个矩阵表示了哪些神经元之间是有连接的,以及连接的方向和权值,实际上就是有向图的矩阵表示~(即图1中的 R R )。接下来的缩放矩阵实际上就是归一化的操作,有些时候我们会直接使用一个缩放因子,使用该缩放因子乘以原始的随机生成的矩阵,相比于使用特征值来缩放更加快速,但是很大程度上也丧失了精度。为什么要进行这个操作呢?原因和我们在初始化一些神经网络的权值时是类似的,对于这些神经网络,我们通常会将权重初始化为0-1之间(或着-1至1),有两个原因:~(1)受激活函数的影响,比如图3所示的sigmoid tanh t a n h 激活函数,在0与1之间区分度比较大,但是大于1之后,激活值变化不大;~(2)我们对激活函数求导,可以看出在大于1时,图像比较平坦,其导数接近于0,由此在计算梯度时会导致梯度过小,无法顺利实现权重的更新。对于ESN我们不使用梯度来更新权值,主要是第一点的问题。最后随机生成输入权值 V V 和输出权值W
这些参数会影响到网络短期记忆时间的长短。输入权值越小而内部矩阵的谱半径越接近1,网络短期记忆时间越长。但是,增强记忆能力的同时,这种操作也造成了网络对“快速变化”系统的建模能力下降。

sigmoid(左)和tanh(右)

第二步进行训练。值得注意的是这个“空转”过程,实际上就是初始化储备池的状态。为什么要进行这个操作呢?因为储备池的内部连接是随机的,最开始的输入序列得到储备池状态的噪声会比较大,所以会先使用一些数据来初始化储备池的状态,从而降低噪声的影响。对于使用线性回归确定输出权值,在下一部分我们来一起进行推导。

数学推导

我们来对前面所说的输出权值进行求解。问题如下:这里假定对输出权重 W W 做了2范数正则,正则化系数为λ。记网络状态矩阵为 X X ,输出序列矩阵
Y,请写出输出权重 W W 的计算公式。

首先我们要优化的目标是:

(3)minWXY22+λW22

求解非常简单,只需要对其求导,令其导数为0,解出 W W 即可,实际上就是最小二乘法求解,可得:

(4)W=YXT(XXT+λI)1

进一步说,就是岭回归(带2范数惩罚项的最小二乘回归)。

考虑一个等价的问题:考虑概率情况, y(t)=f(t)+ε y ( t ) = f ( t ) + ε ,其中 εN(0,β1I) ε ∼ N ( 0 , β − 1 I )
且对于 Wi W i 的分布有 WiN(0,α1I) W i ∼ N ( 0 , α − 1 I ) 。证明最大化后验 p(Wi|X,Yi) p ( W i | X , Y i ) 得到的输出权重与第1问中最小二乘法得到的输出权重等价。

最大化后验,即:

maxP(W|X,Y)=maxP(W,X,Y)P(X,Y)=maxP(X|W,Y)P(W)P(X,Y)(5) (5) m a x P ( W | X , Y ) = m a x P ( W , X , Y ) P ( X , Y ) = m a x P ( X | W , Y ) P ( W ) P ( X , Y )

由于分母与 W W 无关,所以可以省略,由此上式等价于:

(6)maxP(X|W,Y)P(W)

假设训练样本数为 L L ,则上式等价于:

(7)maxi=1LP(Xi|Wi,Y)P(Wi)

加上对数处理后,上式可变为:

maxi=1L(logP(Xi|Wi,Yi)+logP(Wi))(8) (8) m a x ∑ i = 1 L ( l o g P ( X i | W i , Y i ) + l o g P ( W i ) )

由题目中的条件可知: YiWiXiN(0,β1I) Y i − W i X i ∼ N ( 0 , β − 1 I ) ,所以上式
可写作:

maxi=1L(log12πβ1Iexp((YiWiXi)22β1I)+log12πα1Iexp(W2i2α1I))(9) (9) m a x ∑ i = 1 L ( l o g 1 2 π β − 1 I e x p ( − ( Y i − W i X i ) 2 2 β − 1 I ) + l o g 1 2 π α − 1 I e x p ( − W i 2 2 α − 1 I ) )

展开上式,即等价于:

maxi=1L((YiWiXi)22β1IW2i2α1I)(10) (10) m a x ∑ i = 1 L ( − ( Y i − W i X i ) 2 2 β − 1 I − W i 2 2 α − 1 I )

将负号去掉,则上式变为:

min(i=1L(YiWiXi)22β1I+i=1LW2i2α1I)(11) (11) m i n ( ∑ i = 1 L ( Y i − W i X i ) 2 2 β − 1 I + ∑ i = 1 L W i 2 2 α − 1 I )

使用矩阵的形式来表示,可得:

minWXY222β1I+W222α1I(12) (12) m i n ‖ W X − Y ‖ 2 2 2 β − 1 I + ‖ W ‖ 2 2 2 α − 1 I

进一步地等价于:

minWXY22+αβW22(13) (13) m i n ‖ W X − Y ‖ 2 2 + α β ‖ W ‖ 2 2

我们令 λ=αβ λ = α β ,即可得到最终的式子:

minWXY22+λW22(14) (14) m i n ‖ W X − Y ‖ 2 2 + λ ‖ W ‖ 2 2

哈,可以看到与公式1是相同的,由此得证。

Matlab代码实现

这里给出Matlab代码的实现,代码来源于http://minds.jacobs-university.de/mantas:

% A minimalistic Echo State Networks demo with Mackey-Glass (delay 17) data 
% in "plain" Matlab.
% by Mantas Lukosevicius 2012
% http://minds.jacobs-university.de/mantas% load the data
trainLen = 3000;
testLen = 1000;
initLen = 100;data = load('MackeyGlass-t17.txt');% plot some of it
% figure(10);
% plot(data(1:1000));
% title('A sample of data');% generate the ESN reservoir
inSize = 1; outSize = 1;
resSize = 1000;
a = 0.3; % leaking rate%rand( 'seed', 42 );
Win = (rand(resSize,1+inSize)-0.5) .* 1;
W = rand(resSize,resSize)-0.5;
% Option 1 - direct scaling (quick&dirty, reservoir-specific):
% W = W .* 0.13;
% Option 2 - normalizing and setting spectral radius (correct, slower):
disp 'Computing spectral radius...';
opt.disp = 0;
rhoW = abs(eigs(W,1,'LM',opt));
disp 'done.'
W = W .* ( 1.25 /rhoW);% allocated memory for the design (collected states) matrix
X = zeros(1+inSize+resSize,trainLen-initLen);
% set the corresponding target matrix directly
Yt = data(initLen+2:trainLen+1)';% run the reservoir with the data and collect X
x = zeros(resSize,1);
for t = 1:trainLenu = data(t);x = (1-a)*x + a*tanh( Win*[1;u] + W*x );if t > initLenX(:,t-initLen) = [1;u;x];end
end% train the output
reg = 1e-8;  % regularization coefficient
X_T = X';
% Wout = Yt*X_T * inv(X*X_T + reg*eye(1+inSize+resSize));
Wout = Yt*X_T / (X*X_T + reg*eye(1+inSize+resSize));
% Wout = Yt*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+1);
for t = 1:testLen x = (1-a)*x + a*tanh( Win*[1;u] + W*x );y = Wout*[1;u;x];Y(:,t) = y;% generative mode:u = y;% this would be a predictive mode:%u = data(trainLen+t+1);
enderrorLen = 1000;
mse = sum((data(trainLen+2:trainLen+errorLen+1)'-Y(1,1:errorLen)).^2)./errorLen;
disp( ['MSE = ', num2str( mse )] );% plot some signals
figure(1);
plot( data(trainLen+2:trainLen+testLen+1), 'color', [0,0.75,0] );
hold on;
plot( Y', 'b' );
hold off;
axis tight;
title('Target and generated signals y(n) starting at n=0');
legend('Target signal', 'Free-running predicted signal');figure(2);
plot( X(1:20,1:200)' );
title('Some reservoir activations x(n)');figure(3);
bar( Wout' )
title('Output weights W^{out}');

后记

确定性跳跃循环状态网络(CRJ)是ESN的一个变种,如图所示:

确定性跳跃循环状态网络

在下一节我们会基于前面的ESN的代码一起来实现一个CRJ。


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

相关文章

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…

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;查…