概要
PySAMACTを見つけたのでやってみた。
xorを分類してみた。
AIに、手伝って貰った。
参考にしたページ
環境
windows10
サンプルコード
import numpy as np
from samact import *
# ==========================================
# 1. データ構造(32件)
# ==========================================
num_samples = 32
X_np = np.random.randn(num_samples, 13).astype(np.float32)
y_np = np.random.randn(num_samples, 1).astype(np.float32)
# 最初の4行にXORパターンを上書き
X_np[0, :2] = [0.0, 0.0]
X_np[1, :2] = [0.0, 1.0]
X_np[2, :2] = [1.0, 0.0]
X_np[3, :2] = [1.0, 1.0]
y_np[0, 0] = 0.0
y_np[1, 0] = 1.0
y_np[2, 0] = 1.0
y_np[3, 0] = 0.0
# 【超重要修正】SAMACTの内部バグを回避するため、
# NumPy配列から「Python標準のネストされたリスト」へ完全に変換します
X = X_np.tolist()
y = y_np.tolist()
# ==========================================
# 2. モデルの構築
# ==========================================
inputLayer = NeuronFocusEncodeLayer(13, 16)
hiddenLayer = SAMLayer(128, LayerProperty(a=3, p=0.75), Step(), Step())
outputLayer = SAMLayer(16, LayerProperty(a=3, p=0.75), Step(), Step())
decoder = NeuronFocusDecodeLayer()
layers_list = [hiddenLayer, outputLayer]
model = Sequential(inputLayer, decoder, layers_list)
# コンパイル
print("モデルをコンパイルしています...")
model.Compile(32)
print("--- モデルのコンパイルに成功しました! ---")
# ==========================================
# 3. 学習の実行
# ==========================================
epochs = 5
learning_prop = LearningProperty(1)
print("--- 学習を開始します ---")
# リスト形式で投入することで、zip関数での0-d arrayエラーを完全に阻止します
model.Fit(X, y, epochs, learning_prop)
print("--- 学習が完了しました ---")
# ==========================================
# 4. XORパターンの検証
# ==========================================
print("\n[XORパターンの学習結果の検証]")
for i in range(4):
# 推論時も1次元のプレーンなリストとして渡します
pred_val = model.Predict(X[i])
print(f"入力: {X[i][:2]} -> 予測値: {pred_val} (目標値: {y[i][0]})")
実行結果
>python sm19.py
モデルをコンパイルしています...
--- モデルのコンパイルに成功しました! ---
--- 学習を開始します ---
--- 学習が完了しました ---
[XORパターンの学習結果の検証]
入力: [0.0, 0.0] -> 予測値: [0.06445312] (目標値: 0.0)
入力: [0.0, 1.0] -> 予測値: [0.76367188] (目標値: 1.0)
入力: [1.0, 0.0] -> 予測値: [0.67382812] (目標値: 1.0)
入力: [1.0, 1.0] -> 予測値: [0.] (目標値: 0.0)
AIに聞く
はい、SAMACTは「分類(パターン認識)」が圧倒的に得意です。
回帰のような「なめらかな連続値の出力」は苦手ですが、複雑な境界線を持つデータの「分類(0か1か、クラスAかBか)」や、特定のパターンを見つけ出すタスクでは、その真価(超省電力・高速なオンチップ学習)を発揮します。
SAMACTが分類を得意とする理由と、その強みを活かすためのポイントを整理しました。
SAMACTが分類を得意とする3つの理由
- 出力が「0か1(スパイク)」という仕様に直結している
ニューロンが「発火する(1)」か「発火しない(0)」かという仕組みそのものが、「クラスに属するか(Yes)」「属さないか(No)」という分類の判断にそのまま1対1で対応するため、無駄な計算がありません。 - 非線形な境界線(XORなど)を簡単に分離できる
提示いただいたコードにある通り、通常の線形回帰では絶対に解けない「XORパターン」も、SAMLayer(隠れ層)に一度通してニューロンを高次元に発火させることで、きれいに分類できるようになります。 - パターンの「特徴の組み合わせ」を捉えるのが上手い
SAMACTのローカル学習ルールは、「この入力とこの入力が同時に来たら発火する」というような、データの同時発生パターン(相関)を学習するのが非常に得意です。そのため、画像の文字認識、音声のコマンド認識、センサーの異常検知(正常か異常か)などで高い性能を発揮します。
分類タスクでSAMACTの性能を100%引き出すポイント
もし $\sin$ 波のようなデータや時系列データをSAMACTで扱う場合も、分類問題に変換することで非常にうまく処理できるようになります。
- 例1:波形の「状態・フェーズ」の分類
$\sin$ 波の数値を予測するのではなく、「今、波形は上昇中か?下降中か?ピーク(頂点)付近か?」という 3〜4個の状態の分類 に変える。 - 例2:異常波形の検知
流れてくるセンサーデータ(振動など)が、「きれいな $\sin$ 波(正常)」か「ノイズの混ざった乱れた波(異常)」かを 2値分類(0 or 1) する。 - 例3:周波数の識別
「10Hzの波」「50Hzの波」「100Hzの波」のどれが入力されているかを 多クラス分類 する。
SAMACTの「分類が得意」という強みを活かして、次はどのようなデータやパターンの分類に挑戦してみたいですか?
例えば、「時系列のセンサーデータを使った異常検知の分類」や、「先ほどのコードをベースにした多クラス分類への拡張」など、具体的な実装の方向性についてご希望があれば教えてください。
以上。