yoiwa0714と申します。趣味で週末に細々とコードを書いている、個人コーダーです。
今回がQiitaへの初めての投稿になります。よろしくお願いします。
早速ですが、まずはED法でMNISTの10クラス分類の実験を行った結果グラフを以下に示し、その後詳細を説明していきます。
MNISTデータセットでの実験結果
補足1
: 以下のグラフは1000データ/エポック、30エポックで学習/テストを試行した結果になります。
補足2
: 私の環境(第10世代Core-i5、16GB、RTX3060)において、以下のコマンドパラメータで実行した場合の学習時間は、平均188秒/エポック程度です。
補足3
: 以下のコマンドで指定したパラメータ以外のパラメータは、デフォルトのままで変更していません。
補足4
: ファッションMNISTを用いた学習機能を実装しています。いくつかのパラメータで試してみましたが、まだ良い結果は得られていません。ハイパーパラメータのチューニングによって良い結果を出せる可能性があります。
python ed_v021_simple.py --train 1000 --test 1000 --batch 32 --seed 42 --epochs 30 --learning_rate 0.5 --hidden 256 --viz --save_fig
精度と誤差のグラフ
混同行列のグラフ
バイブコーディングの利用について
今回公開するコードは、ほぼバイブコーディングによって作成したものとなります。
本来であれば、バイブコーディングによって作成されたコードは人間がしっかりとレビューしなければならないということは理解しているのですが、バイブコーディングで作成されたコード全体を読み解くだけの実力が私に無いことから、現状は簡易なレビューしか行えていません。
ただし、ED法の理論を実装の仕様書として作成し、この仕様書を使ってこまめな実装内容の確認を行っています。
このような状況ではありますが、以下の理由により公開することにしました。
- 今回公開するコードは長期的な運用や保守を必要とするものではなく、テストコードという、あくまでも短期的に使用されるコードという位置付けであること
- 実装の有効性が確認できたのであれば、共有して更なる発展を期待したいこと
以上の状況をご理解いただければ幸いです。
GitHub情報
GitHub multi-class-clasification-ed
それでは、今回の実装内容の詳細を以下に記載します。
(より詳しい内容については、GitHubのREADME.mdファイルをご覧ください。)
ED法とは
ED法(Error Diffusion Learning Algorithm、誤差拡散学習法)は、金子勇氏が1999年に提案した生物学的にインスパイアされた学習アルゴリズムです。従来の微分の連鎖律を用いた誤差逆伝播法とは異なり、アミン拡散メカニズムを模倣した独自の学習手法を採用しています。
本プロジェクトの概要
金子勇氏のEDLAサイトに残されていたC言語のソースを参考にしてPythonで実装し、実験を行うための各種機能を追加したものが今回公開するコードになります。
- コメント量が多いというバイブコーディングの特性もあり、コード量はかなり多くなっています
- コメントを削除しても良かったのですが、コードの内容を分かり易くすることを優先してコメントを残してあります
- 少しでもコード内容を見易くするため各種機能をモジュール化して本体から切り離し、modulesディレクトリの下にまとめてあります
特徴
- 独立出力ネットワーク構造: 各出力ニューロンが独自の重み空間を維持
- 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_v021.py --epochs 10 --hidden 128 --batch 32
# 可視化付き実行
python multi_ed_v021.py --epochs 10 --viz --save_fig results
# Fashion-MNISTでの実行
python multi_ed_v021.py --fashion --epochs 10 --viz
高度な使用例
# 詳細分析モード
python multi_ed_v021.py --viz --verbose
# CPU強制実行
python multi_ed_v021.py --cpu
コマンドラインオプション
multi_ed_v021.py
では以下のコマンドラインオプションが利用可能です:
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
: ランダムシード(デフォルト: ランダム)
コードに関する補足
- 現在の実装では、隠れ層は1層のみしか作成できません
対応環境
- Python: 3.8以上
- GPU: CUDA対応GPU(オプション)
- OS: Linux, Windows, macOS
ファイル構成
プロジェクトのルートディレクトリ
multi_ed_v021.py # メインプログラム(524行)
requirements.txt # 依存関係管理(58行)
ed_genuine.prompt.md # 理論的背景(377行)
README.md # プロジェクト概要(本ファイル)
modules/ # コアモジュール群(総計3,190行)
└─ [各種実装モジュール]
images/ # 実験結果可視化
├─ realtime-sample.png # 精度と誤差グラフ
└─ confusion-realtime.png # 混同行列グラフ
original-c-source-code/ # 金子勇氏オリジナルCソースコード
├─ main.c, neuro.c等 # 核心アルゴリズム実装
└─ makefile # コンパイル設定
modulesディレクトリ
modules/
├─ ed_core.py # 核となるED法実装(1,517行)
├─ network_mnist.py # MNIST専用ネットワーク構造(423行)
├─ performance.py # 性能評価・分析(684行)
├─ visualization.py # 可視化・グラフ生成(454行)
└─ data_loader.py # データローディング(64行)
引用
- 本実装を研究で使用される場合は、できるだけ以下を引用するようにしてください
金子勇 (1999). Error Diffusion学習アルゴリズム - マルチクラス分類のためのOne-Hot符号化実装
[ED-Genuine Algorithm v0.2.0 Python実装]
ライセンス
- 本プロジェクトは、金子氏のオリジナル研究のオープン精神を尊重し、MITライセンスの下で公開されています
終わりに
- Error Diffusion学習アルゴリズムの先駆的研究と、pat[5]マルチクラス実装により提供されたインスピレーションに対し、金子勇氏に敬意を表します
- 本プロジェクトは、金子氏の 生物学的にインスパイアされた機械学習への革新的アプローチを保存し、発展させることを目的と しています
- 本実装の有効性が証明され、ED法が発展していくことを心から願っています