リザーバコンピューティングの世界 ~Qoreとともに~

# はじめに

これは[深層学習以外の機械学習と応用技術 by QuantumCore Advent Calendar 2019](https://qiita.com/advent-calendar/2019/quantumcore_reservoir)の第1日目の記事です。　　
こんにちは。[QuantumCore](https://www.qcore.co.jp)のリサーチャーの@ryoppippiです。　　
今年、弊社ではアドベントカレンダーを企画しています。
その名も
***『深層学習以外の機械学習と応用技術』***  
近年話題になることが多い深層学習 **ではない** 機械学習技術にフォーカスを当てた、ユニークなものとなっております。  

古典的アルゴリズムの応用でも良いですし、もちろん弊社のQoreを使ってもらっても構いません。

皆さんの投稿を是非とも楽しみにしています！

# それで、この記事は？

- アドベントカレンダーの概要欄にあるQoreとはなんぞや

- どう使えばいいのだ

  

  といったことを中心に書いていきます。

# Qoreについて

QoreとはQuantumCoreが開発した機械学習の仕組みです。

リザーバコンピューティングを応用し、いくつか手を加えたものとなっています。

リザーバコンピューティングについての詳しい解説は、一旦先駆者たちの記事にお任せしますが、特徴を一言で言えば、

* 学習が速い(収束が速い)
* 軽量
* 多変量時系列解析に向いている

です。

この三拍子がそろっているのにもかかわらずなぜ今まで普及しなかったか。それは従来のリザーバコンピューティングの精度がイマイチだったからです。

リザーバも他のニューラルネットワークのようにサイズを決める必要があるのですが、リザーバのサイズが小さいと精度は低下し、逆に低い精度を補おうとしてリザーバのサイズを大きくすると「軽量」という特徴も犠牲になってしまうのです。

そこで、QuantumCoreは独自に改良を重ね、リザーバ内部はもちろん、前処理と後処理にも独自の仕組みを開発することで、小さなリザーバサイズでも高精度なモデルを実現しました。

<img width="963" alt="スクリーンショット 2019-12-01 19.59.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96492/a5fdfe73-8e93-426f-73c9-412e5d6e4fd4.png">
*Van der Sande, Guy & Brunner, Daniel & Soriano, Miguel. (2017). Advances in photonic reservoir computing. Nanophotonics. 6. 561-576. 10.1515/nanoph-2016-0132.*


*参考*

[ゼロから作るReservoir Computing](https://qiita.com/pokotsun/items/dd8eb48fadeee052110b)

[ちょっと変わったニューラルネットワーク Reservoir Computing](https://qiita.com/kazoo04/items/71b659ced9dc0342a2b0)

# Qoreを試してみる

では実際にQoreを試してみようと思います！

Colaboratoryに実行環境も作ってありますので、そちらを参照しながら読み進めていただければと思います。

[Sample Codes on Colaboratory](https://colab.research.google.com/github/qcore-info/advent-calendar-2019/blob/master/Qoreサンプル1_with_UCI.ipynb)

## 1. アカウントを発行する

現在のところ、Qoreを利用するにはアカウント発行が必要です。

現在期間限定で無料で使用できるので、登録してQoreSDKをダウンロードしてください。  
Python3.5以上で動作します。

[Advent Calender公式Github](https://github.com/qcore-info/advent-calendar-2019)

QoreSDKにはサーバーと通信する`WebQoreClient`、そしてデータの前処理を行う`Featurizer`、`Utils`が含まれています。

今回はClientのみ使います。

## 2. データを用意する

Colaboratoryにある通り、今回は UCI Machine Learning Repositoryにある話者の発音データを用います。

*UCI Machine Learning Repository: Japanese Vowels Dataset. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels*

ここでは詳細は省きますが、このデータをまずダウンロードし、numpy形式に変換します。

```python
with open("jpvow_train_x.json", "r") as f:
    X_train = json.load(f)
with open("jpvow_train_y.json", "r") as f:
    y_train = json.load(f)
with open("jpvow_test_x.json", "r") as f:
    X_test = json.load(f)
with open("jpvow_test_y.json", "r") as f:
    y_test = json.load(f)
data = np.concatenate((X_train, X_test), axis=0)
target = np.concatenate((y_train, y_test), axis=0)
X_train, X_test, y_train, y_test = model_selection.train_test_split(
    data, target, test_size=0.2, random_state=1
)
```

## 3.Clientの設定

次は、Clientを設定します。この時、発行されたユーザーアカウント情報が必要になります。

```python
from  qore_sdk.client import WebQoreClient
client = WebQoreClient(username="", #ユーザー名
                       password="", #パスワード
                       endpoint="") #接続先エンドポイント
```

実行後、ログインが成功すると、次は学習です！

## 4.学習と推論をさせてみる

```python
res = client.classifier_train(X=X_train, Y=y_train)
print(res)
## {'res': 'ok', 'train_time': 1.2235112190246582}
```

`classifier_train`関数を用いてデータを送信すると、学習を行ってくれます。

特筆すべきはその速さです。

というのも、このモデルはAWSで動かしているのですが、通常の機械学習モデルを動かすにはスペック不足です（メモリは1GB）。ですが、1秒ちょっとの速さで学習が終わります。

さて、学習が終わったら次は推論ですね。

```Python
res = client.classifier_predict(X=X_test)
print("acc=", accuracy_score(y_test.tolist(), res["Y"]))
print("f1=", f1_score(y_test.tolist(), res["Y"], average="weighted"))

## acc= 0.9921875
## f1= 0.9921496212121212
```

驚異の99%越え！

物凄い速さで終わるので、是非ご自分の環境で動かしていただければと思います。

### ※追記
それぞれのメソッドの説明はhelp関数で呼び出せるのでご確認ください。

```python
from  qore_sdk.client import WebQoreClient
help(WebQoreClient)
```



# 改めてQoreについて

今回は単純な音声のトイデータを用いた話者特定のタスクでしたが、いかがだったでしょうか。

弊社はソリューションとして話者特定技術も提供しています。従来の深層学習だと明らかに足りないデータ量でも、リザーバなら数秒の音声で十分ですし、学習も速い。エッジデバイスでも動くので活用の幅は大きく広がります。

[Speaker Recognition Demo with Qore Engine](https://www.youtube.com/watch?v=VLez2I0jUQ4)

そもそも多変量の時系列データは取り扱いは一般的に難しいこともあり、今後Qoreによってどんな問題が解かれていくのか楽しみです。



# 次回予告

明日は弊社エンジニアの@sk1010kです！

QoreSDKに含まれるデータの前処理技術についての解説をしてもらいます。

# QuantumCoreについて

機械学習の一種であるリザーバコンピューティング技術を用いて、これまでの深層学習では困難だった「少量データ」で「リアルタイム学習」を「高精度」に実現する独自技術を様々なビジネスの現場にて展開しています。

私たちはテクノロジーの力で、世の中の波動のバランスにより生じる社会課題を解決していきたいと考えており、新しい仲間を求めています！
もし少しでも興味を持たれたら、お気軽にご連絡ください！
[株式会社QuantumCore](https://www.qcore.co.jp/)