オープンメモ置き場

音楽、ゲーム、メモリスター、スパイキングニューラルネットワーク、人工知能系に関してアイデアや知識をまとめます。

これからスパイキングニューラルネットワークを始める人へ1 : ニューロンのモデルについて

スパイキングニューラルネットワークについて日本語の資料が少ないと思ったので、あんまり詳しくない人に向けて関連情報をまとめてみようかと思います。(説明の記事はいっぱいあるけど、実践的な内容が少ない)
多分、ソースコードとか調べても見つけにくいと思うので、サンプルとして最後にC++のコードもつけようと思います。
なるべく簡単にまとめようと思いますが難しかったらコメントくだせぇ。

※注意:この記事は公開しながら編集していますので、ところどころ変かもしれないですが、よろしくです。

目次

テレビでみるAI

今巷で大人気のあの人工知能さんは、大体のものがいわゆるディープラーニングという技術を応用した何かです。ディープラーニングっていうのはニューラルネットワークっていうものを、ネットワークが深くなってもうまくいくようにした感じのやつなのですが、まぁこいつが脳的システムにおいて何か本質的なことを教えてくれるかというと正直よくわかりません。
あいつはニューロンをめっちゃ簡略化してるし、時間的なダイナミクスも持たないし、生命とか意識とかの問題を本気で考えたりする自分のような人間にはちょっと疑わしいものなのです。

もっと凄そうなことがしてみたいぜ!

そう思ったあなたには、スパイキングニューラルネットワークをおすすめします。僕と一緒に深遠なる脳の世界を探検しましょう!

スパイキングニューラルネットワークとは

「スパイキングニューラルネットワークってなんだよ(怒)」って人はこの記事にたどり着かないかもしれませんけど一応説明。
スパイキングニューラルネットワーク(Spiking Neural Network: SNN)は、「脳ってニューロンシナプスでできてるんだから、ニューロンを数式にして、シナプスを数式にして、プログラムにしてくっつけたら脳になるんじゃね(適当)」って感じの分野です。
説明は適当ですけど出発点は大体こんな感じです。この状態から脱却していくために、とにかく頑張って勉強しましょうねってことで、この記事ではニューロンを数式にすることからコツコツ始めましょう。

Wikipediaにもちょっとだけ書いてあります
ニューラルネットワーク - Wikipedia

てかニューロンって何?

ニューロン(Neuron、神経細胞)は細胞の一種です。
生物って細胞がいっぱい集まってできてます。細胞たちは生物がうまく生きていくためにいろんな機能を分担してやりくりしてます。

f:id:Nonatonic:20171210031015p:plain:w400
ニューロンは生物の中でも脳や神経をうまく機能させるために頑張っているのです。
f:id:Nonatonic:20171210031027p:plain:w300
そんなニューロンさんは脳とか神経とかを運営するのに電気を使っています。それが活動電位って呼ばれるものです。ニューロンさんの活動電位は一瞬バンって電圧が上がってすぐ下がるのでスパイク(Spike)とも呼ばれています。
波形はこんな感じです。↓
f:id:Nonatonic:20180129162810p:plain:w200
ニューロンさんのスパイクをちゃんと再現してネットワークにしてあげるので、スパイキングニューラルネットワークって呼ばれてます。

↓これはちゃんとWikipediaに乗ってる!
神経細胞 - Wikipedia
活動電位 - Wikipedia
http://www.brain.riken.jp/jp/aware/neurons.html


※注意:ニューロンのことを調べているあなたは、もしかしたらどこかで「ニューロンは情報を伝達している」みたいな文を見たかもしれません。僕はこれは半分本当だけど半分嘘だと思ってます。研究分野における「物理」と「情報」の間は、あなたが思うより若くて、確定的でなく、わかりにくい分野です。ニューロンが活動電位を持つことは証明されていますが、ニューロンが情報を扱っていることを、みんなが納得する方法で立証できた人はいないように思います。まぁ話半分でいいですけど、みんなが言うから正しいみたいな思い込みには注意で。

ニューロンの活動電位を数式で再現すること、それがニューロンのモデルの使命です。

ということでニューロンは活動電位が特徴で、その電位でなんかの機能を果たしているようです。
ニューロンの特徴をシミュレーションするために、この活動電位を数式にするのです!

とその前にモデルの分類から

活動電位を数式にすることが目的なのはわかってもらえたと思うのですが、個々のモデルの説明の前にとりあえず代表的なモデルたちの名前を紹介しちゃいまっくす。

  • ホジキン-ハクスレーモデル(Hodgkin-Huxley Model)
  • フィッツフュー-南雲モデル(FitHugh-Nagumo Model)
  • インテグレートアンドファイアモデル(Integrate and Fire Model: IF Model)
  • イジケヴィッチモデル(Izhikevich Model)
  • ハインドマーシュ-ローズモデル(Hindmarsh-Rose Model)
  • ウィルソンモデル(Wilson Model)

↓こんなただの羅列でも日本語だと情報がないのです。また今度詳しくまとめますよ。たぶん。
Biological neuron model - Wikipedia
Which Model to Use for Cortical Spiking Neurons?

※参考:英語でもいい人は最初はIzhikevichの論文を読むのが一番だと思う。Izhikevichはロシアのタフガイで、プログラムとかいろんなじゃあ実際どうなのよを教えてくれる。ただ上の論文はIzhikevichが自分のモデルの良さをアピールするためのやつなので参考程度で。

とりあえずホジキン-ハクスレーモデル

一番古くて全部入りなのが、ホジキンさんとハクスレーさんがイカニューロンを測定して作ったこのモデル。イカニューロンは巨大で測定しやすい上、非常時には食料にもなるため、イカちゃんは研究対象として優秀!
モデルとしては、生理学的に妥当で、ニューロンの様々な特徴を再現でき、計算コストが多分一番高い。
式はこんな感じ

\displaystyle{
\begin{align}
C_{m}\frac{dV}{dt}&=-\overline{g}_{Na}m^{3}h(V-V_{Na})-\overline{g}_{K}n^{4}(V-V_{K})-\overline{g}_{l}(V-V_{l})+I \\
\frac{dm}{dt}&=\alpha_{m}(V)(1-m)-\beta_{m}(V)m \\
\frac{dh}{dt}&=\alpha_{h}(V)(1-h)-\beta_{h}(V)h \\
\frac{dn}{dt}&=\alpha_{n}(V)(1-n)-\beta_{n}(V)n
\end{align}
}
Hodgkin–Huxley model - Wikipedia

結構難しく見えますが、そんなことはないです。
モデルの基本はまず内部状態を表している変数がなんなのかを知ることです。
ニューロンの場合、一番大事な状態を表している変数は膜電位\displaystyle Vです。
膜電位は細胞を包んでいる細胞膜の中と外の電位差で、この膜電位がスパイクを起こします。そして、この膜電位は様々な要因により変動します。
まず、細胞膜はコンデンサーになっています。このコンデンサーのキャパシタンスが膜容量\displaystyle C_{m}です。

\displaystyle{
I=C_{m} \frac{dV}{dt} \\
}
f:id:Nonatonic:20180506233447p:plain:w400
ニューロンには内側の電流\displaystyle I_{i}と外側の電流\displaystyle Iがありまして、式はこうなります。
\displaystyle{
I=C_{m} \frac{dV}{dt}+I_{i} \\
}

そして、ホジキン-ハクスレーモデルにおいては電流が4種類あります。(種類数はモデル次第)
イオン電流3種類(合計\displaystyle I_{i})

  • ナトリウムイオン電流\displaystyle I_{Na}
  • カリウムイオン電流\displaystyle I_{K}
  • その他のイオン電流\displaystyle I_{l}

それと

よってさっきの式はこうなる

\displaystyle{
I=C_{m} \frac{dV}{dt}+I_{Na}+I_{K}+I_{l}
}
[画像(仮):plain:w400]

イオン電流は細胞膜にあるイオンチャネルというものを通じて細胞内外を出入りしてるおり、基本的にはこういう感じの式に従ってる。

\displaystyle{
I_{i}=g_{i}(V-V_{i})
}
f:id:Nonatonic:20180506233035p:plain:w400

イオンチャネルのイオンの透過性が\displaystyle g_{i}であり、膜電位\displaystyle Vと各イオンの平衡電位\displaystyle V_{i}との差に従ってイオン電流が流れている。まぁ普通にオームの法則な感じ。

詳細は各イオンによって違っていてホジキン-ハクスレーモデルの奴らはこう

\displaystyle{
\begin{align}
I_{Na}&=\overline{g}_{Na}m^{3}h(V-V_{Na})\\
I_{K}&=\overline{g}_{K}n^{4}(V-V_{K})\\
I_{l}&=\overline{g}_{l}(V-V_{l})
\end{align}
}
[画像(仮):plain:w400]

ここで\displaystyle m、h、nイオンチャネルの開き具合を表していて、0から1の間をとる無次元量。毛穴の開き具合みたいな。こいつらが残りの状態変数。さっきの式に代入して

\displaystyle{
I=C_{m} \frac{dV}{dt}+\overline{g}_{Na}m^{3}h(V-V_{Na})+\overline{g}_{K}n^{4}(V-V_{K})+\overline{g}_{l}(V-V_{l})
}
[画像(仮):plain:w400]

あとは\displaystyle m、h、nの時間変化が存在して、全部こんな感じの式

\displaystyle{
\frac{dx}{dt}=\alpha_{x}(V)(1-x)-\beta_{x}(V)x
}

こいつの両辺を\displaystyle{\alpha_{x}(V)+\beta_{x}(V)}で割ってやると

\displaystyle{
\frac{1}{\alpha_{x}(V)+\beta_{x}(V)}\frac{dx}{dt}=\frac{\alpha_{x}(V)}{\alpha_{x}(V)+\beta_{x}(V)}-x
}

なんだこの式はってことで

\displaystyle{
\tau_{x}(V)=\frac{1}{\alpha_{x}(V)+\beta_{x}(V)}\\
x_{\infty}(V)=\frac{\alpha_{x}(V)}{\alpha_{x}(V)+\beta_{x}(V)}
}

こいつらで置き換えると

\displaystyle{
\tau_{x}(V)\frac{dx}{dt}=x_{\infty}(V)-x
}

簡単のために\displaystyle Vを固定で考えてみると、この式では\displaystyle xの時間変化量は\displaystyle x_{\infty}\displaystyle xの差に依存していていることがわかる。これって\displaystyle xは時間を進めていくと\displaystyle x_{\infty}に近づいていくことを表している。そして\displaystyle \tau_{x}はその変化量がどのぐらいの強さで効いてくるかを決めている。いわゆる時定数ってやつ。
\displaystyle Vは時間で変化するので、\displaystyle m、h、nは、\displaystyle Vを使って計算した目標値\displaystyle x_{\infty}に向かって、\displaystyle Vを使って計算した時定数\displaystyle \tau_{x}の分だけ遅れて追従するって感じ。めっちゃ振り回されてる。都合のいい女みたいな。
で、\displaystyle m、h、nの振り回され方を決めている\displaystyle \alpha_{x}(V)\displaystyle \beta_{x}(V)が実際はどうなっているかというとこんな感じ

\displaystyle{
\begin{align}
\alpha_{m}(V)&=\frac{0.1(25-V)}{\exp\left(\frac{25-V}{10}\right)-1}
&\beta_{m}(V)&=4\exp\left(\frac{-V}{20}\right)\\
\alpha_{h}(V)&=0.07\exp\left(\frac{-V}{80}\right)
&\beta_{h}(V)&=\frac{1}{\exp\left(\frac{30-V}{10}\right)-1}\\
\alpha_{n}(V)&=\frac{0.01(10-V)}{\exp\left(\frac{10-V}{10}\right)-1}
&\beta_{n}(V)&=0.125\exp\left(\frac{-V}{80}\right)
\end{align}
}

というわけで最初の式に戻って来る。

\displaystyle{
\begin{align}
C_{m}\frac{dV}{dt}&=-\overline{g}_{Na}m^{3}h(V-V_{Na})-\overline{g}_{K}n^{4}(V-V_{K})-\overline{g}_{l}(V-V_{l})+I \\
\frac{dm}{dt}&=\alpha_{m}(V)(1-m)-\beta_{m}(V)m \\
\frac{dh}{dt}&=\alpha_{h}(V)(1-h)-\beta_{h}(V)h \\
\frac{dn}{dt}&=\alpha_{n}(V)(1-n)-\beta_{n}(V)n
\end{align}
}
[画像(仮):plain:w400]

これで一応説明終わり。とりあえず役者は揃った。状態変数は\displaystyle V、m、h、nの4つ!
そんなに難しくないって言ったけど、微分がわからない人にはハードルが高くなってしまった。すまぬ。
多分ホジキン-ハクスレーモデルがニューロンのモデルの中で一番式が多いので、これ以上めんどいのはないと思う。たぶん。

常微分方程式

解説だけで結構大変だったけど、これから上の式たちをプログラムで解いていかなきゃならない。こういう形で表された式には名前があって、それが常微分方程式(Ordinary Differential Equation: ODE)っていうのだけれど、コンピューターの中でこいつらを解くためには数値解析を用いないといけないのである。まぁそれは次回やるんだけど、自分で調べたい人のために名前だけ紹介。次回はオイラー法(Euler method)とルンゲ=クッタ法(Runge-Kutta method: RK4)から始めます。

常微分方程式 - Wikipedia
数値解析 - Wikipedia
オイラー法 - Wikipedia
ルンゲ=クッタ法 - Wikipedia

次回に続く!

次回は実際にプログラムを書いてとにかく1ニューロンのシミュレーションができるようになるとこまで行きたいですな。
これからスパイキングニューラルネットワークを始める人へ2 : ニューロンモデルの実装 - オープンメモ置き場