Doomformer:将整数神经网络编译为 DOOM 地图

概述

Doomformer 是一个专门的编译器,可以将整数神经网络转换为功能性的 ZDoom 地图。通过将算术运算、激活函数和注意力机制等神经网络操作映射到 voodoo dolls(巫毒娃娃)、扇区亮度级别和地板高度等 DOOM 引擎原语,该项目允许神经网络在游戏环境中运行。该系统通过将每个计算值与 NumPy 整数参考值进行零容忍度比对来验证其输出,确保游戏模拟与数学模型之间完全一致。

工作原理

Doomformer 的核心依赖于 DOOM 引擎(特别是 ZDoom)的确定性行为。编译器将网络组件映射到特定的游戏元素:

  • 算术运算: 由与地板触发器和线特殊效果交互的 voodoo dolls(玩家的副本)执行。
  • 数值: 存储为扇区亮度级别或平面高度。
  • 激活函数: 表示为楼梯或门控机制。
  • 注意力机制: 建模为天花板门廊。

Python 作为宿主,负责将输入写入地图并读取最终状态。由于该系统旨在实现精确性,游戏计算与 NumPy 参考值之间的任何偏差都会导致 MismatchError。这使得开发人员可以将 DOOM 地图视为一种可验证的(尽管速度缓慢)神经网络逻辑执行引擎。

性能与优化

在游戏引擎中运行神经网络的计算成本很高。Doomformer 中标准 MLP 的执行速度比等效的 NumPy 实现慢约 23,000 倍。该项目引入了“优化级别” (--opt) 来管理这种开销:

  • 默认调度: 专为最大兼容性和视觉演示而设计,单次推理通常需要超过 160 秒。
  • --opt 3: 一种更激进的调度方式,使用 ACS (Action Code Script) 在门之间复制层数值,显著减少了所需的游戏时钟周期。例如,使用此优化可以将手写数字推理时间从 163 秒缩短至 8 秒。

研究与实际应用

除了简单的演示外,Doomformer 还支持复杂的架构和研究任务:

  • Transformer: 该工具包可以编译 Transformer,包括在 DOOM 关卡名称或特定事实数据集上训练的模型。
  • 学习: 该系统支持可以直接在地图内学习的感知机,权重由 voodoo dolls 根据 Python 提供的输入标签进行更新。
  • 干预: 用户可以在游戏中进行激活修补和损伤研究,观察关闭特定的“神经元”门如何影响海军陆战队员的行为或网络的输出。
  • 机器模拟: 该项目包含一台 SUBLEQ 机器和一台计数器机器,证明了地图的几何结构可以作为存储程序计算机运行。

社区见解

Hacker News 的用户对该项目独特的神经网络可视化方法表现出了浓厚的兴趣。评论者指出,虽然该项目“绝对令人难以置信”,但需要对 DOOM 引擎有深刻的理解才能真正掌握其实现细节。其他人则强调了这种方法与在非常规环境中运行神经网络的其他尝试(例如在 Transformer 模型内部运行 DOOM)之间的对比。

"我觉得这有助于可视化神经网络,但你必须非常了解 DOOM 才能真正理解它。" — slowin

"自荐一下,我有一篇博客文章标题非常相似,但方法完全不同。老实说,我比自己的想法更喜欢你的想法。" — stmonty

技术限制

Doomformer 受限于引擎的物理极限。编译器必须考虑特定的行为,例如平面移动限制、对象列表上限(ViZDoom 中为 4,096 个对象)以及不同 ZDoom 系列端口中的坐标环绕问题。该系统主要在 ViZDoom 1.3.2 中进行验证,虽然许多地图可以在 GZDoom 或 Zandronum 等其他端口中运行,但算术行为在不同引擎版本之间可能会略有差异。

Sources