リザバーコンピューティング概観

# リザバーコンピューティングとは
みなさんは「リザバーコンピューティング」という技術を耳にしたことがあるでしょうか。
リザバーコンピューティングとは時系列パターン認識に適した機械学習手法の一つであり、以下のような構成をもつニューラルネットワークです。

![reservoir.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940763/98cf4a9a-a151-e73d-b519-7899437b3426.png)

通常のニューラルネットワークと同様、多次元のベクトルを入力とし、出力されるベクトルが目標のベクトルに近づくように学習を行います。逐次的に入力される時系列データの情報を再帰的な結合を持つリザバー部が記憶し、その内部状態を出力層で読み取る（リードアウト）ことで時系列性を活かした回帰・分類が可能となります。特筆すべきは、リカーレントニューラルネットワーク(RNN)等と異なり、リザバー部の結合の重みについては学習を一切行わず、固定されたランダムな値を使うという点です。つまり学習を行うのはリザバーと出力層を結ぶ部分の重みのみであり、この特性によってリザバーコンピューティングは他の深層学習モデルと比べて格段に高速な学習を行うことができます。

要約すると、<b>時系列入力の情報をリザバー部に蓄え、読み取る部分で簡易的な学習識別器を用いる</b>というのがリザバーコンピューティングの基本的なコンセプトであり、<b>学習コストが低い一方で高い性能を期待できる</b>という点に最大の長所があります。

本記事では、このリザバーコンピューティングという計算の枠組みについて、初学者が読むことを想定し、網羅的に概観します。

# リザバーコンピューティングの代表的なモデル
### Echo State Network (ESN)
ESNとは2001年にJaegerによって提案された、重みを固定した疎な結合を持つRNNをリザバーとし、線形学習器によりリードアウトを行うモデルです。他のRNN同様、動的システムやフィルタの近似に適しており、時系列予測・生成に利用されます。
内部状態を更新する規則はLeaky Integrator(LI)モデルが主流です。また、結合構造にもバリエーションがあり、入力層から結合層への結合があるモデル、出力層からリザバー部へのフィードバック結合があるモデルなどが考えられます。

##### 参考になる記事
https://qiita.com/donaldchi/items/c65b978de384821f2942

### Liquid State Machine (LSM)
LSMとは2002年にWolfgang,Maassらによって提案された、Spiking Neural Network(SNN)をリザバーとし、個々のタスクに応じたリードアウト写像を学習するモデルです。SNNはより脳の仕組みに近い作りをした人工ニューラルネットワークであり、各ニューロンに紐づけられた膜電位が入力される電流によって変化し、ある閾値を超えると発火して電流を生じさせる機構を再現したものです。
発火する際に生まれるスパイク列が時系列入力を反映したパターンとなります。SNNのモデルとして代表的なものにLeaky Integrate-and-Fire(LIF)モデルがあります。
##### 参考になる記事
https://qiita.com/arakiii/items/b076a5c9e57c08c49a9a

# 研究の展開
### モデルの構造の改良
##### DeepESN
深層学習において中間層を増やすことが性能の向上につながったように、ESNでもリザバー部の層を多段に拡張する試みがあります。DeepESNは時系列入力に対する複数の時間スケール表現を獲得し、音声やテキスト処理といった複雑なタスクへの性能を向上させることが示唆されています。
![deepesn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940763/6e93c7a3-79f0-74b0-2d1e-55f50ce7eedf.png)

##### Multi-Step Learning ESN
下図のようにリザバーを複数用意し、一つ目のESNから順番に学習を行い出力されたベクトルを次のESNの入力に組み込むことによって段階的に精度を上げていくという方式です。
![multisteplearningesn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940763/f8954eb2-e190-b150-76d6-a4aeb1bc50c2.png)


### plasticityルール
リザバー部のパラメータはランダムに初期化したものを使うのがリザバーコンピューティングの特徴ですが、神経科学を背景にした可塑性ルールを適用しリザバー部の初期値を調整することで、モデルの精度や安定性が向上することが報告されています。
##### Synaptic plasticity
リザバー内のニューロンの結合の重みを、結び付けられた二つのニューロンの状態に応じて変化させる機構をSynaptic plasticityと呼びます。入力に対して相関の強い反応を示すニューロン間の結合を強める・弱めることで効率よく入力の特徴量が抽出できるようになることを期待します。この教師なしの事前学習によってリザバー部の重みを決めてからリードアウト部の訓練を行います。
重み調整のための代表的な規則に、ESNでは(anti-) Hebbian ruleや(anti-) Oja’s rule、SNNではSpike-timing-dependent plasticity (STDP)があります。
##### Intrinsic plasticity
神経細胞内部の興奮性を調整するのがIntrinsic plasticityです。具体的には、各ニューロンの活性化関数のパラメータ（ゲインとバイアス）を更新することで、ニューロンの出力値の分布が予め設定したガウス分布に近づくようにします。これは、ニューロンのエネルギー消費を最小限に抑えながら情報伝達を最大化するという情報理論的な意図に基づいています。

### 物理リザバーコンピューティング
リザバーコンピューティングにおいては中間層のチューニングを全く行いません。そのため、状態を制御できないような(ハードウェア実装に適した)物理系によってリザバー部を実現することが可能です。つまり、時系列入力信号に対して非線形・高次元・短期記憶を持つような出力をするような多種多様な物理現象にリザバー部の計算を委ねるというわけです。実装例としては量子多体系、光、スピントロニクス、アナログ・デジタル回路など多岐に及んでいます。また変わったところでは、タコの足を水槽内で振ったときの応答をリザバーの出力とする研究([該当記事](https://www.nikkei.com/article/DGXMZO32049350R20C18A6000000/))もあります。

# 実践
スクラッチでの実装は他記事に譲るとして、ここではPythonのパッケージを利用し、ESNによる時系列予測を実践します。

### easyesnによる実装
使用するのは[easyesn](https://github.com/kalekiu/easyesn)というパッケージで、東京の平均気温の時系列データを予測の対象とします。過去の平均気温の推移がわかっているときに2日後の平均気温を予測するモデルを訓練します。

##### 必要なパッケージのインストール
```
pip install easyesn
```

##### データセットのダウンロードと可視化
```data.py
import matplotlib.pyplot as plt
import pandas as pd
y = pd.read_csv('https://www.salesanalytics.co.jp/5kf2',index_col=0)
fig = plt.figure(figsize=(12, 6), dpi=50)
ax = plt.axes()
ax.plot(y.values)
ax.set_xlabel("day")
ax.set_ylabel("average temperature")
```
![Unknown-69.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940763/7c27c36a-1340-8158-7c86-bf52423084ac.png)


##### 訓練データとテストデータの作成
```dataset.py
#前半7割を訓練用、後半3割をテスト用に使う
train = y[:int(len(y)*0.7)]
train = y[int(len(y)*0.7):]
#二日後の平均気温を目標値とする
x_train = train[:-2]
y_train = train[2:]
x_test = test[:-2]
y_test = test[2:]
```

##### ESNモデルの訓練
```train.py
from easyesn import PredictionESN
esn = PredictionESN(n_input=1,n_reservoir=100,n_output=1)
esn.fit(x_train, y_train, transientTime=100, verbose=1)
```

##### 予測結果
```prediction.py
y_test_pred = esn.predict(x_test,  verbose=1)
fig = plt.figure(figsize=(15, 8), dpi=50)
ax = plt.axes()
ax.plot(y_test.values[30:],label= "ground truth")
ax.plot(y_test_pred[30:],label= "prediction")
ax.legend()
```
![Unknown-70.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940763/b292a474-d319-17f4-fc16-7b8afc1e2f6e.png)

テスト期間のうち、30日目以降の予測結果を図示しました(最初の方は予測のための材料が不十分であるため)。後半になるほど予測が正確になっている様子が見てとれます。これは、リザバー部の中に過去の時系列情報（周期、トレンドなど）が蓄えられて予測に寄与していることの証左だと言えるでしょう。

### 他のパッケージ
リザバーコンピューティングのモデルを利用できるパッケージは他に[EchoTorch](https://github.com/nschaetti/EchoTorch)、[pyESN](https://github.com/cknd/pyESN)、[RcTorch](https://github.com/blindedjoy/RcTorch)などがあり、いずれもpipによるインストールが可能です。


# おわりに
筆者は本分野の初学者であり、正しく理解できていない点、不足している事項などが多くあるかもしれません。今後も学びを深めるとともに、本記事の内容を適宜更新していく予定です。


# 参考文献・サイト
[リザバーコンピューティング:時系列パターン認識のための高速機械学習の理論とハードウェア](https://www.amazon.co.jp/リザバーコンピューティング-時系列パターン認識のための高速機械学習の理論とハードウェア-田中-剛平/dp/4627855311?ref_=nav_custrec_signin)

[Deep Echo State Network (DeepESN): A Brief Survey](https://arxiv.org/pdf/1712.04323.pdf)

[Unsupervised Learning in Reservoir Computing for EEG-based Emotion Recognition](https://arxiv.org/pdf/1811.07516.pdf)

[Unveiling the role of plasticity rules in reservoir computing](https://arxiv.org/pdf/2101.05848.pdf)

[Computational Efficiency of Multi-Step Learning Echo State Networks for Nonlinear Time Series Prediction](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9732994)