「AIを騙せ!」は、審判AIに「読める」と言わせながら、相手AIには間違えさせる手書き数字バトルゲームです。お題の数字を、審判AI(大型・正解率99.0%)が読めて、なおかつ相手AI(小型)が誤答する形で描けたら騙し成功になります。雑に崩せば審判に弾かれるので、読めるのに騙す、という細い線をねらうのが腕の見せどころです。スコアは相手の誤答確信度にコンボ倍率を掛けて算出し、0から9までをそろえると図鑑バッジがつきます。判定も学習もすべてブラウザの中で完結し、依存ライブラリもサーバーも必要ありません。index.html を開くだけで動き、file:// の直開きにも対応しています。スマホでは指で描けます。
「たいせん」はLv1とLv2の2段階で、基本の騙し合いです。「リベンジ(しんかAI)」はv3の目玉で、Lv2をベースにした学習する敵と戦います。騙すと特訓画面(ライブの損失曲線と確信度メーター)が入り、同じ絵をもう一度判定させると今度は看破されます。特訓の回数に応じて得点倍率が上がり、最大で×3になります。学習済みの重みはlocalStorageに永続するので、あなたの騙し技だけを喰って育った、世界に一体だけの敵ができあがります。図鑑から初期化することもできます。「60秒ラッシュ」は時間内に何回騙せるかを競うモード、「けんきゅうしつ」は特徴マップと判断根拠のヒートマップを観察するモードです。図鑑内の「研究データ書き出し」では、プレイログ(手描き画像と判定)を自分の端末へJSONでダウンロードできます。送信は一切ありません。
特訓では、畳み込み層を凍結したうえで、全結合ヘッド(hidden64+fc10・約5.2万パラメータ)だけを純粋なJavaScriptでSGD学習させています(損失はクロスエントロピー)。あなたの技だけを覚えて他を忘れてしまわないように、忘却防止の仕掛けを入れてあります。クリーンなMNIST特徴300本のリプレイバッファを同梱して復習ステップを回し、元の重みへのL2アンカーで長期的な漂流を有界化し、さらに過去の騙し技12件を混ぜて再学習します。確信95%に到達したら打ち切る早期終了を入れているので、1回の特訓は実測53msで終わります(演出のためにわざと2秒に伸ばしています)。仕様上の見どころとして、特訓するとクリーン精度が98.5%から96%台に下がることがあります。これは実在する機械学習の現象「頑健性と精度のトレードオフ」で、ゲーム内では「AI学力テスト」として可視化しました。おかげで、あえて学習させて隙を作る——データポイズニング——までが戦略になります。
中身はすべて自動テストで確かめています。test_parity.js と test_parity_v2.js では、JavaScriptによる推論がPyTorchと誤差およそ5e-7で一致することを確認しました。test_learn_parity.js では、JS側の学習1周が、同一バッチ・同一学習率・アンカー込み40ステップの条件でPyTorchのfloat64 autogradと誤差1e-9台で一致します。test_learning.js では学習効果を検証していて、自然に成立した騙し15件が特訓後にはすべて看破され(15/15)、10回連続で特訓したあともクリーン精度96.5%・技の記憶15/15を保ち、速度は53ms/回でした。test_winnable.py ではゲームとしての成立性を確認していて、審判の可読率は98.9%、Lv2の「8」は裏ボス級の難しさという結果です。