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法によるMNISTの10クラス分類

Last updated at Posted at 2025-09-07

yoiwa0714と申します。趣味で週末に細々とコードを書いている、個人コーダーです。
今回がQiitaへの初めての投稿になります。よろしくお願いします。

早速ですが、ED法でMNISTの10クラス分類の実験を行った結果グラフを以下に示し、その後詳細を説明していきます。

MNISTデータセットでの実験結果

補足1: 以下のグラフは訓練/テストとも512データ/エポック、100エポックで訓練/テストを試行した結果になります。
補足2: 私の環境(第10世代Core-i5、16GB、RTX3060)において、以下のコマンドパラメータで実行した場合の学習時間は、平均約53秒/エポック程度です。
補足3: 以下のコマンドで指定したパラメータ以外のパラメータは、デフォルトのままで変更していません。
補足4: ファッションMNISTを用いた学習機能を実装しています。いくつかのパラメータで試してみましたが、まだ良い結果は得られていません。ハイパーパラメータのチューニングによって良い結果を出せる可能性があります。

python multi_ed_v031.py --train 512 --test 512 --batch 128 --seed 42 --viz --save_fig --heatmap --epochs 100 --ami 0.3 --sig 1.0 --lr 0.1

精度と誤差のグラフ

realtime-20250928_100207.png

混同行列のグラフ

confusion-final-20250928_100208.png

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

今回公開するコードは、ほぼバイブコーディングによって作成したものとなります。
本来であれば、バイブコーディングによって作成されたコードは人間がしっかりとレビューしなければならないということは理解しているのですが、バイブコーディングで作成されたコード全体を読み解くだけの実力が私に無いことから、現状は簡易なレビューしか行えていません。
ただし、ED法の理論を実装の仕様書として作成し、この仕様書を使ってこまめな実装内容の確認を行っています。
このような状況ではありますが、以下の理由により公開することにしました。

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

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

GitHub情報

GitHub multi-class-clasification-ed


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

  • より詳しい内容についてはGitHubのREADME.mdファイルをご覧ください
  • 本記事中やREADME.mdファイル等に記載されているファイル名(multi_ed_v031.py)はバージョンアップにより予告なく変更されることがありますので、GitHub上の最新のファイル名に読み替えてください

ED法とは

ED法(Error Diffusion Learning Algorithm、誤差拡散学習法)は、金子勇氏が1999年に提案した生物学的にインスパイアされた学習アルゴリズムです。従来の微分の連鎖律を用いた誤差逆伝播法とは異なり、アミン拡散メカニズムを模倣した独自の学習手法を採用しています。

本プロジェクトの概要

金子勇氏のEDLAサイトに残されていたC言語のソースを参考にしてPythonで実装し、実験を行うための各種機能を追加したものが今回公開するコードになります。

  • コメント量が多いというバイブコーディングの特性もあり、コード量はかなり多くなっています
  • コメントを削除しても良かったのですが、コードの内容を分かり易くすることを優先してコメントを残してあります
  • 少しでもコード内容を見易くするため各種機能をモジュール化して本体から切り離し、modulesディレクトリの下にまとめてあります
  • マルチクラス分類ED法の実装を試していただく時に参考となる情報をREADME_simple.mdファイルにまとめてあります
  • マルチクラス分類ED法の基本的な機能だけを実装して実装内容を理解しやすくしたmulti_ed_simple.pyも掲載しています

multi_ed_v031.pyの実装内容の特徴

  • 独立出力ネットワーク構造: 各出力ニューロンが独自の重み空間を維持
  • One-Hot符号化統合: ED学習アルゴリズムとOne-Hot符号化をシームレスに統合
  • マルチクラス学習のためのアミン拡散: 金子勇氏のアミン拡散メカニズム理論を複数クラス対応に拡張
  • 興奮性-抑制性ペア構造: 金子勇氏オリジナルのペアニューロン概念を維持
  • MNIST/FashionMNIST対応: MNIST(10クラス分類の手書き数字認識)とFashionMNIST(10クラス分類のファッションアイテム認識)に対応
  • リアルタイム可視化: 学習進捗をリアルタイムでグラフ表示
  • 金子勇氏の原理論: 金子勇氏のEDLAサイトに掲載されていたED法の原理論をed_genuiene.prompt.mdファイルに取りまとめ、これをバイブコーディングにおけるED法の仕様として活用

実装上の重要なポイント

1. 3次元重み配列の実装

w_ot_ot = np.zeros((ot_max, unit_max, unit_max))
del_ot = np.zeros((ot_max, unit_max, 2))
ot_in = np.zeros((ot_max, unit_max))
ot_ot = np.zeros((ot_max, unit_max))

2. アミン拡散の計算

# 出力層アミン設定
if error > 0:
    del_ot[l][output_pos][0] = error
    del_ot[l][output_pos][1] = 0
else:
    del_ot[l][output_pos][0] = 0
    del_ot[l][output_pos][1] = -error

# 隠れ層への拡散
for k in range(hidden_start, all_units+1):
    del_ot[l][k][0] = del_ot[l][output_pos][0] * u1
    del_ot[l][k][1] = del_ot[l][output_pos][1] * u1

3. 重み更新の実装

# 各出力ニューロン独立更新
for n in range(output_neurons):
    for k in range(hidden_start, all_units+1):
        for m in range(all_units+1):
            if w_ot_ot[n][k][m] != 0:
                delta = alpha * ot_in[n][m]
                delta *= abs(ot_ot[n][k])
                delta *= (1 - abs(ot_ot[n][k]))
                
                if ow[m] > 0:  # 興奮性
                    w_ot_ot[n][k][m] += delta * del_ot[n][k][0] * ow[m] * ow[k]
                else:          # 抑制性
                    w_ot_ot[n][k][m] += delta * del_ot[n][k][1] * ow[m] * ow[k]

インストール手順

[インストールにあたってのご注意]

  • クローン後すぐに利用できるよう、MNISTデータも含んだ構成としています
  • MNISTデータが不要な場合にはクローン後に削除をお願いします
# リポジトリをクローン
git clone https://github.com/yoiwa0714/multi-class-clasification-ed
cd multi-class-clasification-ed

# 仮想環境の作成(推奨)
python -m venv .venv
source .venv/bin/activate  # Linux/Mac
または
.venv\Scripts\activate  # Windows

# 依存関係のインストール

# 基本環境(CPU)
pip install -r requirements.txt

# GPU高速化環境(必要に応じて)
pip install cupy-cuda11x  # CUDA 11.x環境の場合。環境に合わせてください。

使用方法

基本的な使用例

# 推奨設定での実行
python multi_ed_v031.py --epochs 10 --hidden 128 --batch 32

# 可視化付き実行
python multi_ed_v031.py --epochs 10 --viz --save_fig results

# Fashion-MNISTでの実行
python multi_ed_v031.py --fashion --epochs 10 --viz

高度な使用例

# 詳細分析モード
python multi_ed_v031.py --viz --verbose

# CPU強制実行
python multi_ed_v031.py --cpu

コマンドラインオプション

multi_ed_v031.pyでは以下のコマンドラインオプションが利用可能です:
(注)コマンドラインオプションはバージョンアップにより追加/削除される場合がありますので、最新のコマンドラインオプションは--helpオプションで確認するようにしてください。

ED法アルゴリズムパラメータ

  • --learning_rate, --lr: 学習率 alpha(デフォルト: 0.8)
  • --amine, --ami: 初期アミン濃度 beta(デフォルト: 0.3)
  • --diffusion, --dif: アミン拡散係数 u1(デフォルト: 1.0)
  • --sigmoid, --sig: シグモイド閾値 u0(デフォルト: 0.4)
  • --weight1, --w1: 重み初期値1(デフォルト: 1.0)
  • --weight2, --w2: 重み初期値2(デフォルト: 1.0)

実行設定パラメータ

  • --epochs, --epo: エポック数(デフォルト: 3)
  • --hidden, --hid: 隠れ層ニューロン数(デフォルト: 128)
  • --batch_size, --batch: ミニバッチサイズ(デフォルト: 32)
  • --train_samples, --train: 訓練データ数(デフォルト: 100)
  • --test_samples, --test: テストデータ数(デフォルト: 100)

動作モード

  • --viz: リアルタイム可視化を有効化
  • --verbose, --v: 詳細表示を有効化
  • --profile, --p: 訓練時間詳細プロファイリング
  • --cpu: CPU強制実行モード(GPU無効化)
  • --fashion: Fashion-MNISTデータセット使用
  • --save_fig [DIR]: 図表保存(引数なし: ./images、引数あり: 指定ディレクトリ)
  • --seed: ランダムシード(デフォルト: ランダム)

コードに関する補足

  • --hiddenオプションで複数の隠れ層を実装することができますが、6層以上の隠れ層を指定した場合の動作は確認できていません
  • 「精度と誤差のリアルタイム表示グラフと混同行列のリアルタイム表示グラフ」、および「ニューロン活動ヒートマップリアルタイム表示」の可視化機能を備えています
  • バージョン番号(multi_ed_v031.pyの'v031'部分)は予告なく変更されることがありますので、最新のバージョンはGitHubで確認してください

対応環境

  • Python: 3.8以上
  • GPU: CUDA対応GPU(オプション)
  • OS: Linux, Windows, macOS

ファイル構成

プロジェクトのルートディレクトリ

multi_ed_v031.py # 多機能プログラム
multi_ed_simple.py # 基本機能限定プログラム

README.md # プロジェクト概要(本ファイル)
README_simple.md # ED法の基本機能実装支援用説明

requirements.txt # 依存関係管理

modules/ # コアモジュール群
└─ [各種実装モジュール]

images/ # 実験結果可視化
├─ realtime-sample.png # 精度と誤差グラフ
└─ confusion-realtime.png # 混同行列グラフ

original-c-source-code/ # 金子勇氏オリジナルCソースコード
├─ main.c, neuro.c等 # 核心アルゴリズム実装
└─ makefile # コンパイル設定

modulesディレクトリ

modules/
├─ ed_core.py # 核となるED法実装
├─ network_mnist.py # MNIST専用ネットワーク構造
├─ performance.py # 性能評価・分析
├─ visualization.py # 可視化・グラフ生成
└─ data_loader.py # データローディング

ライセンス

  • 本プロジェクトは、金子氏のオリジナル研究のオープン精神を尊重し、MITライセンスの下で公開されています

終わりに

  • Error Diffusion学習アルゴリズムの先駆的研究と、pat[5]マルチクラス実装により提供されたインスピレーションに対し、金子勇氏に敬意を表します
  • 本プロジェクトは、金子氏の 生物学的にインスパイアされた機械学習への革新的アプローチを保存し、発展させることを目的と しています
  • 本実装の有効性が証明され、ED法が発展していくことを心から願っています
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?