プログラミング

Spiking Neural Networksライブラリ ー BindsNETを触ってみる【Python】

binsnet

BindsNET

Spiking Neural Networks (SNN) のPythonライブラリでPytorchがベースとなっている.

ドキュメント,ソース,元論文は以下を参照.

"""
[ドキュメント] Welcome to BindsNET’s documentation! — bindsnet 0.2.5 documentation
[Github] Hananel-Hazan/bindsnet: Simulation of spiking neural networks (SNNs) using PyTorch.
[論文] BindsNET: A Machine Learning-Oriented Spiking Neural Networks Library in Python
"""

SNNのライブラリは今までBRIANが有名だった(らしい)が,2018年ごろにBindsNETが公開されて以来,結構主流になってきているっぽい.

Githubも投稿時点では約470スターついている.

今回はそれを使ってみた感想や,中身の解説を少し書こうと思う.

もし間違った解釈があったら申し訳ない...

(というか需要があるのか?)

インストール

Githubから直接クローンしてきても良いが,pipでインストール可能.

もし,コードサンプルが欲しいなら,Githubから持ってくると良い.

用意されているニューロンモデル

BindsNETにはいくつかのニューロンモデルが用意されている.

ニューロンモデルといっても層単位でしか指定できず,1層の中に複数のニューロンモデルを共存させることはできない

ここではメジャーなものを紹介する.

LIF: leaky integrate-and-fire モデル

言わずもがなメジャーなニューロンモデル.

とりあえずこれ使っとけってモデル.

このあと紹介するIFモデルに膜電位減衰(漏れ)が加わったもの

IF: integrate-and-fire モデル

これも有名で,先のLIFの「漏れ」がなくなったもの.

最近,これが使われているネットワークは見ない.

ニューロン数(n)とトレース(trace)をTrueに最低限していれば,良いと思う.

Input

ニューロンモデルというより,入力層用のニューロン.

必須のノード.

Diehl And Cook モデル

2015年に発表された教師なしSTDP学習で有名になったDiehlのモデル.

基本はLIFモデルで,発火閾値に動的変化を設けた仕様

その他

他にも,McCulloch & Pittsモデルや,スパイクではなく実数値入力用のRealInputなどがある.

AdaptiveLIFというモデルもあるがこれはDiehlモデルとほとんど同じっぽい.

BindsNETでのスパイクの取り扱い

BindsNETでは,基本データは torch.tensor 型である.

例えばMNISTを100msのスパイク列に変換し,バッチサイズを10にした時の生成されるテンソルは,

である.

つまり基本的には [batch, time, channel, (input shape)] という形になる.

しかし,ネットワークへの入力時には,[time, batch, channel, (input shape)]に変換しているが,おそらく「時間」を一番外側のループにしているからだと思う.

トレースという考え方

BindsNETに限らずスパイクトレースと発火トレースというものが存在する.

トレースという名の通り,対象物をコピーしたものだが,BindsNETではこれらはSTDP学習などに利用されている.

トレースもテンソル[batch, input_size]という形を取る.

先のMNISTの例で言えば, [10, 784] である.

すなわち,単位時間あたりのスパイクの有無や発火の様子をトレースしたものである.

スパイクトレースは発火の有無,つまり{0, 1}を記録.

発火トレースはスパイクの発生に時間的変化を持たせたものの記録である.

これについては見た方が早い.

実際に描画してみた.

左がスパイクトレース,右は発火トレースである.

traces

 

これを各ニューロンが保持しており,これらを使ってSTDP学習が行われる.

実際はこの2つに内積をとり,時間差と重みの更新量を決定している

ちなみにソースだと変数名が分かりにくいが,

connection.source.x → 前ニューロンの発火トレース
connection.source.s → 前ニューロンのスパイクトレース
connection.target.x → 後ニューロンの発火トレース
connection.target.s → 後ニューロンのスパイクトレース

である.

GPU

PytorchベースなのでGPUも簡単に使える.

ネットワークを構築したら,

とすれば良い.

ちなみにネットワークを構築する前に,これをやるとダメ

必ず,レイヤーを確定させてからにすること.(当たり前だけど,最初これをやらかした)

そして,入力スパイクをネットワークに投げるとき(run()する前)に,各入力もGPUに投げる必要がある.

例えばこんな感じに.

これを忘れると,エラーを吐かれる.

おわりに

実際にBindsNETを使ってみるとよくできている.

現在も頻繁にアップデートがされており,これからより使いやすく多機能になっていくだろう.

さすがに普通のニューラルネットワークに比べたら遅いが,十分速いと思う.

GPUにも対応しているし.

ちなみに日本語の文献は無いに等しいので,みんな使ってみて僕に正しい使い方を教えてください.笑

完全に私用で作っている,BindsNETを取り扱いやすくしたコードをGithubにあげています.

ずっと未完成だけど,よかったら使ってみてね.

HiroshiARAKI/snnlibpy: The tiny Spiking neural network library implemented by BindsNet.


スポンサードリンク