Doomformer: 정수 신경망을 DOOM 맵으로 컴파일하기

개요

Doomformer는 정수 신경망을 기능적인 ZDoom 맵으로 변환하는 특수 컴파일러입니다. 산술 연산, 활성화 함수, 어텐션 메커니즘과 같은 신경망 연산을 voodoo doll, 섹터 밝기 레벨, 바닥 높이와 같은 DOOM 엔진의 기본 요소로 매핑함으로써, 이 프로젝트는 신경망이 게임 환경 내에서 실행될 수 있도록 합니다. 이 시스템은 모든 계산 값을 NumPy 정수 참조값과 오차 없이 비교하여 검증하며, 게임의 시뮬레이션과 수학적 모델 간의 정확한 일치를 보장합니다.

작동 원리

Doomformer의 핵심은 DOOM 엔진, 특히 ZDoom의 결정론적 동작에 의존합니다. 컴파일러는 네트워크 구성 요소를 특정 게임 요소에 매핑합니다:

  • 산술 연산: 바닥 트리거 및 라인 스페셜과 상호 작용하는 voodoo doll(플레이어의 복제본)에 의해 수행됩니다.
  • 값: 섹터 밝기 레벨이나 평면 높이로 저장됩니다.
  • 활성화 함수: 계단이나 게이트 메커니즘으로 표현됩니다.
  • 어텐션: 천장 게이트의 복도로 모델링됩니다.

Python이 호스트 역할을 하여 맵에 입력을 쓰고 최종 상태를 다시 읽어옵니다. 이 시스템은 정확성을 위해 설계되었으므로, 게임의 계산 결과가 NumPy 참조값과 조금이라도 다르면 MismatchError가 발생합니다. 이를 통해 개발자는 DOOM 맵을 신경망 논리를 위한 검증 가능하지만 느린 실행 엔진으로 취급할 수 있습니다.

성능 및 최적화

게임 엔진 내에서 신경망을 실행하는 것은 계산 비용이 많이 듭니다. Doomformer에서 표준 MLP를 실행하는 것은 동일한 NumPy 구현보다 약 23,000배 느립니다. 이 프로젝트는 이러한 오버헤드를 관리하기 위해 "최적화 레벨"(--opt)을 도입했습니다:

  • 기본 스케줄: 최대 호환성과 시각적 데모를 위해 설계되었으며, 단일 추론에 160초 이상 걸리는 경우가 많습니다.
  • --opt 3: ACS(Action Code Script)를 사용하여 게이트 간에 레이어 값을 복사함으로써 필요한 게임 틱 수를 크게 줄이는 더 공격적인 스케줄입니다. 예를 들어, 손글씨 숫자 추론의 경우 이 최적화를 사용하면 163초에서 8초로 단축될 수 있습니다.

연구 및 실용적 응용

단순한 데모를 넘어, Doomformer는 복잡한 아키텍처와 연구 과제를 지원합니다:

  • 트랜스포머: 이 툴킷은 DOOM 레벨 이름이나 특정 사실 데이터셋으로 학습된 모델을 포함하여 트랜스포머를 컴파일할 수 있습니다.
  • 학습: 이 시스템은 맵 내에서 직접 학습할 수 있는 퍼셉트론을 지원하며, Python이 제공하는 입력 레이블을 기반으로 voodoo doll이 가중치를 업데이트합니다.
  • 개입: 사용자는 게임 내에서 활성화 패칭 및 병변 연구를 수행하여 특정 "뉴런" 문을 닫는 것이 마린의 행동이나 네트워크 출력에 어떤 영향을 미치는지 관찰할 수 있습니다.
  • 기계 시뮬레이션: 이 프로젝트에는 SUBLEQ 머신과 카운터 머신이 포함되어 있어, 맵의 기하학적 구조가 저장 프로그램 컴퓨터로 기능할 수 있음을 보여줍니다.

커뮤니티 통찰

Hacker News 사용자들은 신경망 시각화에 대한 이 프로젝트의 독특한 접근 방식에 상당한 관심을 보였습니다. 댓글 작성자들은 이 프로젝트가 "정말 놀랍지만" 구현 세부 사항을 완전히 이해하려면 DOOM 엔진에 대한 깊은 이해가 필요하다고 언급했습니다. 다른 이들은 이러한 접근 방식과 트랜스포머 모델 내부에서 DOOM을 실행하는 것과 같은 비전통적인 환경에서 신경망을 실행하려는 다른 시도들 사이의 대조를 강조했습니다.

"신경망을 시각화하는 데 도움이 될 것 같지만, 이를 제대로 이해하려면 DOOM에 대해 많이 알아야 합니다." — slowin

"셀프 홍보하자면, 저는 매우 비슷한 블로그 포스트 제목을 가지고 있지만 접근 방식은 완전히 다릅니다. 솔직히 제 아이디어보다 당신의 아이디어가 더 마음에 듭니다." — stmonty

기술적 한계

Doomformer는 엔진의 물리적 한계에 제약을 받습니다. 컴파일러는 평면 이동기 제한, 객체 목록 제한(ViZDoom에서 4,096개 객체), 다양한 ZDoom 계열 포트에서의 좌표 래핑과 같은 특정 동작을 고려해야 합니다. 이 시스템은 주로 ViZDoom 1.3.2에서 검증되었으며, 많은 맵이 GZDoom이나 Zandronum과 같은 다른 포트에서도 실행되지만, 산술 연산 동작은 엔진 버전에 따라 약간 다를 수 있습니다.

Sources