엔지니어링

DanceGAI가 Planner + Noter로 beatmap을 생성하는 이유

ManiaGAI는 오디오를 곧바로 노트로 바꾸지 않고, 확산 모델로 구간별 게임플레이를 먼저 계획한 뒤 MaskGIT 방식 트랜스포머로 노트를 놓습니다. 그 이유와 트레이드오프, 이 설계로 가능해지는 것.

AI beatmap 생성기를 가장 자연스럽게 설명하는 방식은 “오디오를 넣으면 신경망을 거쳐 노트가 나온다”일 것입니다. ManiaGAI는 그렇게 작동하지 않습니다. 일을 둘로 나눕니다. Planner는 곡의 각 부분이 플레이할 때 어떤 느낌이어야 하는지를 정하고, Noter는 노트가 정확히 어디에 놓일지를 정합니다. 이 글에서는 그 이유, 각 모델이 하는 일, 그리고 이렇게 나누는 데 드는 비용을 설명합니다.

beatmap은 받아쓰기가 아니라 편곡입니다

오디오를 충실히 따라가는 채보가 반드시 좋은 채보는 아닙니다. 좋은 osu! mania 맵은 편곡에 더 가깝습니다. mapper는 어떤 소리에 노트를 줄지, 한 구간이 얼마나 빽빽하게 느껴져야 할지, jack이나 롱노트가 어디에 어울리는지, 패턴이 양손 사이를 어떻게 흐를지를 정합니다 — 그리고 같은 곡의 Easy와 Expert 사이에서 이 모든 것이 어떻게 달라지는지도요.

오디오를 곧바로 노트로 바꾸는 단일 모델은 이 모든 결정을 매 순간 한꺼번에 내려야 합니다. 구조, 난이도, 스타일, 그리고 정확한 라인 배치까지요. 이런 모델은 국소적인 디테일은 잘 맞히면서도 곡 전체의 형태를 잃기 쉽습니다. 벌스보다 강하게 터지지 않는 후렴, 숨 돌릴 틈이 없는 브레이크다운처럼요.

두 가지 질문, 두 개의 모델

  1. 음악
  2. 이해
  3. Planner
  4. Noter
  5. 검증
  6. beatmap

두 모델은 곡에 대한 같은 음악적 그림을 읽습니다. 타이밍 그리드, 그리고 그 그리드에 비트 단위로 정렬된 오디오 표현(오픈소스 MERT 모델 기반)입니다. 거기서부터:

  • Planner는 무엇이 일어나야 하는가에 답합니다. 노트가 하나도 없는 상태에서 곡 전체의 게임플레이 구조를 구간별로 짭니다. 각 부분이 얼마나 어려워야 하는지, 롱노트, jack, 기타 패턴 유형이 어떻게 섞일지를요.
  • Noter는 노트가 어떻게 놓이는가에 답합니다. 계획과 오디오를 모두 따르면서 계획을 실제 배치로 바꿉니다. 어느 라인에 놓을지, 어떤 노트가 단노트이고 어떤 노트가 롱노트인지, 패턴이 어떻게 이어지는지를요.

각 모델은 더 좁은 일을 맡고, 계획은 노트 생성에 노트 단위 모델에는 없는 것을 줍니다. 이미 결정된 곡 전체에 대한 시야입니다.

Planner: 곡 전체에 대한 가우시안 확산

Planner는 약 6M 파라미터의 가우시안 확산 모델입니다. 음악, 키 수, 요청한 난이도와 스타일을 조건으로, 곡의 모든 구간에 대한 계획을 한꺼번에 생성합니다.

확산 모델이 이 일에 맞는 이유는 두 가지입니다. 계획은 곡에 대한 매끄럽고 연속적인 묘사입니다. 국소 난이도와 패턴 구성이 시간에 따라 오르내리는 것이죠. 이런 신호는 확산 모델이 잘 다룹니다. 그리고 구간을 하나씩 차례로 만드는 대신 전체를 한 번에 생성하기 때문에, Planner는 곡 전체의 균형을 한꺼번에 잡을 수 있습니다. 후렴을 정점으로 만들고 브리지에서 쉬어 가게 할 수 있는 것은 둘 다 보고 있기 때문입니다.

Noter: MaskGIT 방식의 반복 정제

Noter는 약 51M 파라미터의 MaskGIT 방식 비자기회귀 트랜스포머입니다. 채보는 이산적인 패턴 토큰으로 표현됩니다. 곡의 처음부터 끝까지 토큰을 하나씩 쓰는 대신, Noter는 채보 전체를 채운 뒤 여러 번에 걸쳐 다듬습니다. 확신하는 노트는 확정하고 나머지는 다시 살펴봅니다. 이 단계들을 곡 전체에 어떻게 배분하는지는 저희 고유의 방법이며, 비공개로 유지하는 부분 중 하나입니다.

언어 모델이 글을 쓰듯 채보를 왼쪽에서 오른쪽으로 생성하지 않는 이유는 무엇일까요?

  • 엄격하게 왼쪽에서 오른쪽으로 쓰면 앞쪽의 결정이 뒤쪽의 음악을 고려할 수 없고, 긴 곡에서는 실수가 누적됩니다.
  • 반복 정제 모델에서는 모든 단계가 각 구간의 양쪽 맥락을 보기 때문에, 곡 전체에서 패턴이 일관되게 유지됩니다.
  • 토큰을 하나씩 만드는 대신 정해진 횟수의 단계로 채보 전체가 만들어집니다. 이는 속도에도 중요합니다.
  • 뒤따르는 부분을 모두 다시 생성하지 않고도 한 구간을 수정할 수 있습니다(아래에서 더 설명합니다).

난이도와 스타일은 나중에 덧붙이는 것이 아니라 입력입니다

이렇게 나눈 덕분에 생성을 제어할 수도 있습니다. ManiaGAI는 명시적인 제어값을 받고, 모델은 이를 따르도록 학습되었습니다.

  • 키 수 — 4K부터 9K까지.
  • 난이도 — ★1부터 ★10까지의 ★ 레이팅을 원하는 대로 선택. 한 번 실행으로 mapset 전체가 만들어집니다.
  • 스타일 — 다섯 가지 축: 롱노트 비율, 인버스 롱노트, jack, 짧은 롱노트, 딜레이. 난이도마다 고유한 스타일을 줄 수 있으며, 해당 키 수와 ★ 레이팅의 실제 채보를 바탕으로 보정됩니다.

이 제어값은 그것이 중요한 곳, 즉 계획에 작용합니다. “더 어렵게”, “롱노트 더 많이”, “jack 더 많이”는 노트 하나가 아니라 구간의 형태에 관한 결정입니다. 밀도는 별도의 손잡이가 아니라 목표 난이도와 계획에서 따라 나옵니다. 그리고 모든 난이도가 곡에 대한 같은 이해에서 생성되기 때문에, mapset은 서로 무관한 채보들이 아니라 하나의 채보 가족처럼 읽힙니다.

국소 재생성은 설계에서 자연스럽게 나옵니다

생성된 채보가 모든 곳에서 틀리는 경우는 드뭅니다. 대개는 한 구간이 어긋나 있습니다. 어울리지 않는 패턴이나 너무 빽빽한 부분 같은 것이죠. 그걸 고치려고 채보 전체를 다시 생성하면 이미 좋았던 부분까지 모두 버리게 됩니다.

  1. 선택
  2. 마스킹
  3. 재생성
  4. 정제

Noter는 채보를 왼쪽에서 오른쪽으로 쓰는 대신 채보 전체를 다듬기 때문에, 주변을 모두 고정한 채 선택한 영역만 다시 생성할 수 있습니다. 주변 노트를 맥락으로 사용하므로, 새 구간은 채보와 부딪히지 않고 자연스럽게 이어집니다. 이것이 구간 단위 편집의 기반입니다. 마음에 들지 않는 부분을 선택해 그 구간만 다시 생성하거나, 노트를 직접 편집하고 결과를 테스트 플레이할 수 있는 맵 에디터를 내부 테스트 중입니다. 아직 사이트에서는 이용할 수 없습니다.

따로 학습하기

두 모델은 각자 다루는 표현으로 따로 학습됩니다. Planner는 각 구간의 게임플레이 묘사에 대한 확산 모델로, Noter는 패턴 토큰에 대한 마스크 토큰 예측으로 학습합니다. 키 수와 난이도 단계별로 샘플의 균형을 맞춰, ★10의 8K 같은 드문 조합이 흔한 조합에 묻히지 않도록 합니다. 두 모델의 데이터는 AI osu! mania 매퍼를 만든 데이터셋 들여다보기에서 설명합니다.

나누는 데 드는 비용

계층 구조에는 대가가 따릅니다. 저희가 감수하고 있는 트레이드오프는 다음과 같습니다.

  • 학습하고 동기화해야 할 모델이 두 개입니다. 계획은 두 모델 사이의 인터페이스이므로, 그 정의가 바뀌면 양쪽이 모두 따라가야 합니다.
  • Noter는 주어진 계획만큼만 좋을 수 있습니다. 한 구간을 잘못 판단한 계획은 Noter에게 잘못된 지시를 줍니다.
  • 계획은 저희가 묘사하기로 한 것만 묘사합니다. 구간 단위의 난이도와 패턴 구성은 채보의 느낌을 만드는 많은 부분을 담아내지만, mapper가 의도하는 모든 것을 담지는 못합니다.

저희가 주장하지 않는 것

이 설계를 같은 데이터로 학습한 단일 엔드투엔드 모델과 비교해 벤치마크하지는 않았으므로, 그보다 낫다고 주장하지 않습니다. 저희가 말할 수 있는 것은, 이 설계가 장거리 구조와 국소 노트 배치를 따로 모델링하는 더 깔끔한 방법, 난이도와 스타일 제어를 넣을 자연스러운 자리, 그리고 나머지를 건드리지 않고 채보의 한 구간을 수정할 수 있는 모델을 준다는 것입니다. 매핑 스타일은 여전히 몇 가지 축으로 제어됩니다. 슬라이더 대신 예시로 스타일을 설명하는 것이 저희가 나아가고 있는 방향입니다.

기술 페이지에서 두 모델이 전체 파이프라인 안에서 어디에 있는지 볼 수 있고, 생성을 빠르게 만든 방법에서 두 모델을 돌리는 데 무엇이 필요한지 다룹니다.