たけのこブログ

凡人が頑張って背伸びするブログ

ニューロンとシナプスを組み合わせたランダムネットワークをJuliaで実装してみた

はじめに

今回の一言:かなり久しぶりの投稿になってしまった気がする笑

概要

最近は、こんな書籍などを勉強していたりします。

booth.pm

こちらpythonで書かれていたのですが、著者の方はjuliaでも実装を進めているみたいです。私も最近はpythonに飽きてきた新しい言語を触ってみたいなと思い、matlab cloneを移植しやすいjuliaを使っているのでjuliaでの実装をする予定でした。

しかし、著者のgithubのコードにはニューロンシナプスのモデルはあってもそれらを組み合わせたネットワークに関するサンプルコードがまだ公開されてなかったので、今回はpython本に書かれていたランダムネットワークソースコードをjuliaに焼き直して実装してみました。

実装手順

ランダムネットワークは。文字通り重みがランダムなネットワークです。 シナプスの出力をシナプス後電流とした場合、基本的に神経ネットワークは以下の手順で構築できます。

1. スパイクが入力としてシナプスに入り、シナプス後電流が放出される(ここに遅延結合が入ってくるケースがありますが、今回は純粋に全結合されたスパイク情報をシナプスに入力として加えています)
2. シナプス後電流が入力としてニューロンに入り、電圧&スパイクが出力される
3. 上記の繰り返しで膜電位やシナプス後電流が変化する

また、教科書に書かれていた説明通り、以下の手順で実装しています。

・一層目には10個のポワソンスパイクニューロン、二層目には1個のLIFニューロンのランダムネットワークが構築されている想定で実装
・ポワソンスパイクがシナプスへ伝達される際に全結合が行われていますが、教科書通り`dot(W,spikes[t,:])`で簡潔に記述しました(実際にjuliaでstructなどを用いて全結合などを定義する記事は別で紹介したいと思います)

ニューロンシナプスの詳細については最初に紹介した教科書を作成した著者が無料で資料を公開しているので、そちらをチェックして頂ければと思います(githubにjulia&pythonのサンプルコードもあって分かりやすいです)。

compneuro-julia.github.io

ソースコード

実際にjuliaで実装したソースコードがこちらになります。JuliaはIJuliaでjupyter上に実装できるようになってるので便利ですね。

下記のソースコードをそのまま実装すれば問題なく動くと思います(必要なパッケージは別途追加して下さい汗)

github.com

結果

二層目のLIFニューロンの膜電位と入力電流、および一層目のニューロンのラスタープロットは以下のように教科書通りに実装することができました。上から順番に二層目のシナプス後電流、膜電位、一層目のポワソンスパイクニューロンのラスタープロットになります。

f:id:YuKR:20210614185441p:plain
ランダムネットワークの出力結果

まとめ

今回はスパイキング・ニューラルネットワークに不可欠なニューロンシナプスモデルを組み合わせてランダムネットワークをjuliaで実装・可視化をしてみました。

近いうちに全結合や遅延結合を組み合わせたネットワークについても説明していきたいと思います。