0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ED法 - SNN(スパイキングニューラルネットワーク)の新しい学習法

Last updated at Posted at 2025-11-02

yoiwa0714です。
ED法によるSNN(スパイキングニューラルネットワーク)の学習に成功したため、情報を展開いたします。
なお、詳細に関してはGitHubのREADME.mdファイルを参照ください。

ed_multi_lif_snn.pyによる学習結果例

ed_multi_lif_snn.pyによる、MNISTデータとFashion-MNISTデータの学習結果例を以下に示します。

MNISTデータでの学習例

realtime_viz_result_20251102_113203.png

・最高正答率: 87.60%

・学習実行コマンド

python ed_multi_lif_snn.py --fashion --train 1000 --test 500 --spike_max_rate 150 --spike_sim_time 50 --spike_dt 1.0 --viz --heatmap --save_fig viz_results/lif_fashion_256_lr0.15_e20 --epochs 20 --hidden 256 --lr 0.15

Fashion-MNISTデータでの学習例

realtime_viz_result_20251102_113256.png

・最高正答率: 78.20%

・学習実行コマンド

python ed_multi_lif_snn.py --fashion --train 1000 --test 500 --spike_max_rate 150 --spike_sim_time 50 --spike_dt 1.0 --viz --heatmap --save_fig viz_results/lif_fashion_256_lr0.15_e20 --epochs 20 --hidden 256 --lr 0.15

ed_multi_frelu_snn.pyによる学習結果例

ed_multi_frelu_snn.pyはed_multi_lif_snn.pyの活性化関数を、試験的にFReLUに置き換えたコードです。
ed_multi_frelu_snn.pyによる、Fashion-MNISTデータの学習結果例を以下に示します。

Fashion-MNISTデータでの学習例

realtime_viz_result_20251102_062334.png

・最高正答率: 76.71%

・学習実行コマンド

python ed_multi_frelu_snn.py --viz --heatmap --fashion --seed 42 --train 2048 --test 2048 --batch 128 --save_fig viz_results/frelu_snn_fashion_hid2048_128_dif1.5_epo20 --hidden 2048,128 --epochs 20 --dif 1.5

お断り: バイブコーディングの利用について

今回公開するコードは、ほぼバイブコーディングによって作成したものとなります。
本来であれば、バイブコーディングによって作成されたコードは人間がしっかりとレビューしなければならないということは理解しているのですが、以下の理由により公開することにしました。

  • 今回公開するコードは長期的な運用や保守を必要とするものではなく短期的に使用されるコードという位置付けであること
  • 実装の有効性が確認できたのであれば、共有して更なる発展を期待したいこと

以上の状況をご理解いただければ幸いです。

GitHub情報

GitHub ed_multi_snn

それでは、今回の実装内容の詳細を以下に記載します。

  • より詳しい内容についてはGitHubのREADME.mdファイルをご覧ください

ED法とは

  • ED法(Error Diffusion Learning Algorithm、誤差拡散学習法)は、金子勇氏が1999年に提案した生物学的にインスパイアされた学習アルゴリズムです。従来の微分の連鎖律を用いた誤差逆伝播法とは異なり、アミン拡散メカニズムを模倣した独自の学習手法を採用しています
  • 金子勇氏のEDLAサイトの内容を私(AI)の解釈で取りまとめたファイル docs/ED法_解説資料.md を作成していますので、必要に応じて参照ください

ED法の技術的メリット

並列計算による高速化

誤差逆伝播法では後ろの層から順次計算が必要ですが、ED法では各層が独立してモノアミン濃度に基づいて重み更新を行うため、層間の並列計算が可能です。これにより、特に深いネットワークでの学習速度向上が期待できます。

  • 各層が独立してアミン濃度に基づく重み更新
  • 誤差逆伝播の順次計算制約を回避
  • 深いネットワークでの学習速度向上

勾配消失問題の回避

微分の連鎖律を使用しないため、深い層でも勾配消失問題が発生しません。アミン拡散による局所学習により、各層が直接的に学習信号を受け取ることができます。

  • 微分の連鎖律を使用しない局所学習
  • 層の深さに関わらず安定した学習信号
  • 生物学的妥当性と実用性の両立

本プロジェクトの概要

  1. 金子勇氏のEDLAサイトに残されていたC言語のソースを参考にし、通常のニューラルネットワークにED法を実装
  2. 前項1に対し、全てのニューロンをLIFニューロンに置き換えてSNNへ変更
  3. ED法での学習方法を、SNNに最適化実装

ed_multi_lif_snn.pyの実装内容の特徴

  • 純粋ED法: 「微分の連鎖律を用いた誤差逆伝播法」を用いない生物学的学習
  • スパイキングニューラルネットワーク: LIFニューロンによるスパイキングニューラルネットワーク
  • スパイク符号化: ポアソン符号化による入力層のスパイク生成
  • E/Iペア構造: 興奮性(E)・抑制性(I)ニューロンペアによる生物学的妥当性
  • Dale's Principle: ニューロンの重み符号保持(興奮性≥0、抑制性≤0)
  • 多層対応: 任意の隠れ層構造(単層・多層)をサポート
  • 高速化: NumPy行列演算による効率的な実装
  • GPU対応: CuPy使用時の自動GPU計算
  • 可視化対応: 正答率/エラー(誤答)率や各層のニューロンの発火状況をリアルタイム表示
    • 正答率/エラー(誤答)率表示
      ・本記事冒頭のグラフです

    • ニューロン発火状況のリアルタイム表示
      ・注: 完全なリアルタイム表示ではなく、実行に影響を与えないように抜き取り表示にしています

MNISTデータの場合の発火状況表示例

ヒートマップリアルタイム表示-MNIST.png

Fashion-MNISTデータの場合の発火状況表示例

ヒートマップリアルタイム表示-FashionMNIST.png

実装上のポイント

1. 純粋ED法の保持

  • 重要: 「微分の連鎖律を用いた誤差逆伝播法」を一切使用しない
  • アミン拡散メカニズムによる生物学的学習
  • 出力層中心のエラー拡散型重み更新

2. E/Iペア構造

  • E: 興奮性ニューロン、I: 抑制性ニューロン
  • 各入力ピクセル → 興奮性(+1) + 抑制性(-1) ニューロンペア
  • MNIST: 784ピクセル → 1568ニューロン(784ペア)
  • 生物学的妥当性の保証

3. Dale's Principle(デールの原理)

  • 同種間結合: 正の重み制約
  • 異種間結合: 負の重み制約
  • 重み符号制約: w *= ow[source] * ow[target]

4. 独立出力ニューロンアーキテクチャ

  • 各クラスが完全に独立した重み空間を保持
  • 3次元重み配列: w_ot_ot[出力ニューロン][送信先][送信元]

5. 全層LIF化

  • 入力層・隠れ層・出力層のすべてがLIFニューロン
  • スパイク駆動型の完全なSNN実装
  • 生物学的リアリズムの追求

6. 多層ニューラルネットワーク対応

  • オリジナル仕様: 単一隠れ層
  • 拡張機能: 複数隠れ層を自由に組み合わせ可能
  • アミン拡散係数u1を多層間に適用

7. 高速化・GPU対応

  • NumPy行列演算による並列計算
  • CuPy統合によるGPU処理
  • CPU/GPU自動切り替え

技術的詳細

LIFニューロンモデル

膜電位の時間発展:

dV/dt = (V_rest - V + I_syn) / τ_m
  • V: 膜電位
  • V_rest: 静止膜電位
  • I_syn: シナプス電流
  • τ_m: 膜時定数

発火条件: V ≥ V_threshold → スパイク発火 → V = V_reset

ED法学習則

重み更新:

Δw = α × amine × input × output_error
  • α: 学習率
  • amine: アミン濃度(誤差信号強度)
  • input: 入力ニューロン活性
  • output_error: 出力誤差

アミン拡散:

amine_hidden = u1 × amine_output
  • u1: 拡散係数(0-1の範囲)

インストール方法

# 基本パッケージ
pip install numpy tensorflow matplotlib tqdm psutil

# GPU使用時(オプション)
pip install cupy-cuda11x  # CUDA 11.x用
# または
pip install cupy-cuda12x  # CUDA 12.x用

ed_multi_lif_snn_simple.py について

  • 本プロジェクトの実装を学びやすくするために、基本的な機能に絞った実装としています
  • README_simple.mdで詳細な解説を行っています

ed_multi_frelu_snn.py について

  • ed_multi_lif_snn.pyで用いられている活性化関数を、試験的にFReLUに変更してみたものです

参考情報

  • 金子勇 (1999): Error-Diffusion法のEDLAサイト
  • LIF neuron model: Leaky Integrate-and-Fire ニューロンモデル
  • Dale's Principle: 神経伝達物質の単一性原理

著作権とライセンス

・著作権
-- 本プロジェクトで達成した「ED法でSNNの学習を行い、高い正答率を得る実装」というアイデアに関して著作権を主張します
-- ED法の著作権は金子勇氏に帰属します

・ライセンス
-- 以下の「注意」項に記載した内容以外に対しては、GPLライセンスで公開します
-- 以下の「注意」項に記載されている内容に該当しなければ、すべての方が無償で、本プロジェクトのアイデアを用いた研究、開発、展開等を行うことができます

・注意
-- 個人や団体、企業等の形態にかかわらず、本プロジェクトの実装に基づいた(あるいは類する)有形/無形の商品やサービスを「有償」で提供する場合には、事前の私への連絡を要求します

関連ドキュメント

関連記事

  • ANN(通常のニューラルネットワーク)に対するED法実装例の記事も投稿しています

https://qiita.com/yoiwa0714/items/07e81c9f0103097472a6

終わりに

  • もし本記事の内容に関する不明点などがありましたらお問合せください。基本的には週末にしか時間がとれないため、回答が遅くなる可能性のあることをご了承ください
  • 本アイデアがSNN界の発展に寄与できることを願っています
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?