Doomformer: 整数ニューラルネットワークをDOOMマップにコンパイルする
概要
Doomformerは、整数ニューラルネットワークを機能的なZDoomマップに変換する特殊なコンパイラです。算術演算、活性化関数、アテンション機構といったニューラルネットワークの操作を、ブードゥードール(voodoo dolls)、セクターの明るさ、床の高さといったDOOMエンジンのプリミティブにマッピングすることで、ゲーム環境内でのニューラルネットワークの実行を可能にします。このシステムは、計算されたすべての値をNumPyの整数リファレンスと照合し、許容誤差ゼロで検証を行うことで、ゲームのシミュレーションと数学的モデルの完全な一致を保証します。
仕組み
Doomformerの核となるのは、DOOMエンジン、特にZDoomの決定論的な挙動です。コンパイラはネットワークのコンポーネントを特定のゲーム要素にマッピングします。
- 算術演算: 床のトリガーやラインスペシャルと相互作用するブードゥードール(プレイヤーのコピー)によって実行されます。
- 値: セクターの明るさや平面の高さとして保存されます。
- 活性化関数: 階段やゲートのメカニズムとして表現されます。
- アテンション: 天井ゲートの廊下としてモデル化されます。
Pythonがホストとして機能し、マップへの入力の書き込みと最終状態の読み取りを行います。このシステムは正確性を重視して設計されているため、ゲーム側の計算結果がNumPyのリファレンスと少しでも異なると MismatchError が発生します。これにより、開発者はDOOMマップを、低速ではあるものの検証可能なニューラルロジックの実行エンジンとして扱うことができます。
パフォーマンスと最適化
ゲームエンジン内でニューラルネットワークを実行するのは計算コストが高い処理です。Doomformerにおける標準的なMLPの実行は、同等のNumPy実装と比較して約23,000倍低速です。このオーバーヘッドを管理するために、プロジェクトでは「最適化レベル」 (--opt) を導入しています。
- デフォルトスケジュール: 最大限の互換性と視覚的なデモンストレーションを目的としており、1回の推論に160秒以上かかることが一般的です。
- --opt 3: ACS (Action Code Script) を使用してゲート間でレイヤーの値をコピーする、より積極的なスケジュールです。これにより、ゲームのティック数を大幅に削減できます。例えば、手書き数字の推論では、この最適化を使用することで163秒から8秒に短縮可能です。
研究および実用的な応用
単なるデモンストレーションを超えて、Doomformerは複雑なアーキテクチャや研究タスクをサポートしています。
- Transformer: このツールキットは、DOOMのレベル名や特定の事実データセットで学習されたモデルを含む、Transformerをコンパイルできます。
- 学習: このシステムはマップ内で直接学習可能なパーセプトロンをサポートしており、Pythonから提供される入力ラベルに基づいてブードゥードールが重みを更新します。
- 介入: ユーザーはゲーム内で活性化パッチや損傷研究を行うことができ、特定の「ニューロン」ドアを閉じることで、マリーンの挙動やネットワークの出力にどのような影響が出るかを観察できます。
- 機械シミュレーション: このプロジェクトにはSUBLEQマシンとカウンタマシンが含まれており、マップのジオメトリがストアードプログラム方式コンピュータとして機能することを示しています。
コミュニティの洞察
Hacker Newsのユーザーは、ニューラルネットワークの可視化に対するこのユニークなアプローチに大きな関心を寄せています。コメントでは、このプロジェクトは「完全に信じられないほど素晴らしい」ものである一方、実装の詳細を完全に理解するにはDOOMエンジンに対する深い知識が必要であると指摘されています。また、Transformerモデルの中でDOOMを動かすといった、他の型破りな環境でニューラルネットワークを実行する試みと、このアプローチとの対比についても議論されています。
"ニューラルネットワークを可視化する助けにはなると思うが、それを真に理解するにはDOOMについてかなり詳しくなければならない。" — slowin
"宣伝になってしまうが、私は非常によく似たブログ記事のタイトルを持っているが、アプローチは全く異なる。正直なところ、自分のアイデアよりもあなたのアイデアの方が好きだ。" — stmonty
技術的な制限
Doomformerはエンジンの物理的な制限に縛られています。コンパイラは、平面移動の制限、オブジェクトリストの上限(ViZDoomでは4,096オブジェクト)、ZDoomファミリーの各ポートにおける座標のラップアラウンドなど、特定の挙動を考慮しなければなりません。このシステムは主にViZDoom 1.3.2で検証されており、多くのマップはGZDoomやZandronumなどの他のポートでも動作しますが、算術演算の挙動はエンジンバージョン間でわずかに異なる場合があります。