Mogura AI

プレイヤーがモグラを叩くまでの時間を予測し、反応が遅くなりそうな穴を選ぶ、26–8–1構成の小型MLPです。重み・バイアスは225個、Cの初期値配列は468バイトです。FPGA内のMIPS CPUで整数演算による推論と、出力層9パラメータのオンライン学習を行います。

このリポジトリには、事前学習済みの整数パラメータ、Python推論コード、ゲームのCコード、FPGA回路、学習スクリプトを保存しています。実機のRAMに蓄積したオンライン学習後の重みは含みません。Transformers形式のモデルではありません。

構成

Pythonで推論する

このリポジトリをダウンロードしたディレクトリで実行します。inputs_q8は各入力を256倍した整数です。

from inference import predict_ticks

# 左上の通常モグラ、表示時間2秒、ほかの穴は空、直前の入力なし。
x = [0] * 26
x[0] = 256
x[9] = 200 * 256 // 240
x[20] = 200 * 256 // 240
seconds = predict_ticks(x) / 100
print(seconds)

入力26個の内訳、正規化、オンライン学習の計算はAI仕様とsoft/ai.hを参照してください。model.jsonのw1は8×26、w2は8要素です。重みはQ10、バイアスはQ18、入力・中間値はQ8です。Pythonの推論例は事前学習済みモデル専用で、オンライン更新はC側に実装しています。

学習と評価

1人の25ゲームから収集した1,900件のうち、利用可能な1,859件を使用しました。15ゲーム・1,120件を重み更新、5ゲーム・365件をモデル選択、残る5ゲーム・374件を最終評価に分けています。ゲーム間の分割を維持し、同じゲームの行を別の分割へ混ぜていません。

事前学習はNumPyによるAdam、Huber損失、学習率0.003です。命中には実測反応時間を使い、逃走は表示時間を下限とする打ち切りデータとして扱います。最終評価の命中370件で、整数NNの平均絶対誤差は約112 msでした。常に学習データの中央値を出す方法では約138 msです。詳細はreport.jsonに記録しています。

データセットのraw/内の25セッションを、このリポジトリのdata/へコピーすると再学習できます。

python3 -m pip install -r tools/requirements-ai.txt
python3 tools/train_ai.py
python3 tests/ai_test.py

FPGAで遊ぶ

授業のZYBO Z7とMIPS環境を前提としています。Pmod KYPDはJB、LCDはJA、ブザーはJCです。一般的なPC向けゲームではありません。

cd soft
make
cd ../hard
make
make program

MIPSツールチェーンとVivadoが必要です。ツールチェーンのパスは授業環境向けなので、別環境ではMakefileを調整してください。SW2・SW0をON、SW1をOFFにし、SW3をOFF→ONでAIモードを開始します。ゲーム中に最後の層をSGDで更新し、ゲーム間で保持します。リセット・電源OFFで初期値に戻ります。

予測精度の評価は、実機で逃走率が改善することを証明するものではありません。1人分のデータで、利用可能な逃走は27件しかありません。画像や音声から判断するモデルではなく、出現時の数値情報だけを使います。

元のゲームと更新履歴:GitHub。データ:ruiname/mogura_AI。

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Dataset used to train ruiname/mogura_AI