ニューラルネットワークのアイデア

以前のエントリで書いたみたいに、セルオートマトンを使ってニューラルネットワークを構築しようと考えている。んで普通に実装するなら

class Neuron
{
public:
  // hogehoge
private:
  std::vector<std::pair<*Neuron, int> > _links;
};

みたいに自分の軸索終末が結合してる次のニューロンと結合の重み保持することになるけどこれではコストが大きくなる。それに結合の重みを持つならセルオートマトンにする意味がない。

そこで軸索終末の勢力範囲を限定して(例えば3つ離れたセルまで結合できるとか)フラグで表す事を考えてみたけど

class Neuron
{
public:
  // hogehoge
private:
  std::bitset<N> _dendrites;  // 樹状突起
  std::bitset<M> _axonends;   // 軸索終末
};

とするとどのニューロンとどのニューロンが結合しているかを検索するのが非常に難しくなる。

そこで思い付いたのが

どのニューロンとどのニューロンが結合してるか分からなくてもいいかも

ということ。
根拠として挙げられるのは

  • 個々のニューロンは他のニューロンから受け取る情報伝達物質に基づいて自己を更新するのであり、「どのニューロンから」情報を受け取るかは問題ではない(と思う)
  • 同様に「どのニューロンに」情報を伝達しているかは問題ではない(と思う)
  • モデルがすっきりし、実装も楽になる。計算量も大幅に減る。

欠点として考えられるのは

  • 実際のシナプス結合はれっきとした「結合」である。
  • 樹状突起や軸索をちょっと動かすだけで、周囲のニューロンに大きな影響がでる。
  • バックプロパゲーションとか絶対無理(最初から考えてないから問題なし)
  • 神経回路網の状態を調べるのが大変。活動電位の伝播の様子などを調べるのが困難(?)

具体的には、ニューロンA,Bがあった場合

  1. Aが軸索終末を伸ばしているセルに神経伝達物質を放出する
  2. Bが樹状突起を伸ばしているセルから神経伝達物質を受け取る

という風になる。*1つまりセル空間に神経伝達物質を一端置く場所を用意するわけだ。
もしAとBが同じセルに枝を伸ばしていた場合には(擬似的に)A,Bが結合している状態になる。
つまりニューロン以外にそれらの存在するフィールドを考えるわけだけど、これが結構いろいろと都合よかったりする。
例えばニューロンの中にはメラトニンを分泌したりするものがあるけど、メラトニンシナプス結合じゃなくて直接拡散して周囲のニューロンに取り込まれる。こういった動作は結合を直接操作するモデルでは難しいけどフィールドを考えるやり方だと統一的な方法で扱える。*2

長くなってしまったけど御託を並べるばかりじゃなく実際に作ってみないと(汗)*3

*1:ここでのニューロンの実装はフラグを利用するものを使う

*2:メラトニンは体内時計にとって非常に重要な物質。食欲・睡眠欲とか体内時計が大きく関わってくるから軽視はできない。

*3:具体的な成果物をここに載せられるのはいつになるだろうか...orz