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。
