연구

OsuGAI 개발기: AI로 생성하는 osu! standard beatmap

OsuGAI v1이 곡을 osu! standard 채보로 바꾸는 방법: 버튼 입력과 커서 위치로 이루어진 게임플레이 표현, osu!lazer Auto 리플레이를 곁들인 학습 채보 118,000개, 네 번의 학습 라운드, 결과 — 그리고 베타의 솔직한 한계.

OsuGAI는 osu!의 원조 모드인 osu! standard를 위한 DanceGAI의 첫 모델입니다. 히트 서클, 슬라이더, 스피너가 플레이필드 곳곳에 펼쳐지는 모드죠. 오늘 osu! mania용 ManiaGAI와 나란히 베타로 공개되었습니다. 이 보고서에서는 OsuGAI가 채보를 어떻게 표현하는지, 무엇으로 학습했는지, 어떻게 훈련했는지, 무엇을 측정했는지 — 그리고 똑같이 솔직하게, 아직 무엇을 잘못하는지 설명합니다.

osu! standard가 osu! mania보다 어려운 이유

osu! mania 채보는 라인 위의 노트입니다. 생성기는 노트가 언제 나오고 4~9개 라인 중 어느 라인에 떨어질지를 정합니다. osu! standard에서는 모든 오브젝트가 512 × 384 플레이필드 위의 위치도 가지며, 플레이어는 그곳으로 움직여야 합니다. 그래서 mania에는 없는 세 가지 문제가 생깁니다.

  • 2차원 움직임. 오브젝트 사이의 간격, 점프 각도, 흐름이 standard 채보의 느낌을 좋게도 나쁘게도 만드는 대부분의 요소입니다 — 그리고 이것들은 몇 개의 라인 중 하나를 고르는 선택이 아니라 연속적인 값입니다.
  • 슬라이더 기하. 슬라이더는 길이와 속도, 때로는 반복을 가진 곡선입니다. 음악과 주변 오브젝트에 맞아야 합니다.
  • 가독성. 오브젝트는 치기 전에 나타나고, 겹치고, 스택됩니다. 타이밍이 완벽해도 읽을 수 없는 채보가 될 수 있습니다.

표현 방식: 게임플레이가 먼저, 에디터 오브젝트는 그다음

모델에게 osu! standard를 가르치는 가장 뻔한 방법은 에디터의 오브젝트를 그대로 주는 것입니다 — “(x, y)에 서클”, “이런 컨트롤 포인트를 가진 슬라이더”. 저희도 처음에는 그 계열을 시도했습니다. OsuGAI v1은 대신 채보를 플레이되는 방식으로 기술하고, 나중에 그것을 다시 오브젝트로 바꿉니다. 모든 비트는 토큰 다섯 개입니다.

  • 인터랙션 토큰 하나: 비트 동안의 버튼 상태를 비트당 48칸으로 샘플링한 것입니다 — 눌림 또는 뗌, 그 밖에는 아무것도 없습니다. 탭은 짧은 누름이고, 슬라이더나 스피너는 긴 누름입니다. 이 토큰은 학습 채보에서 가장 자주 나오는 48칸 패턴 4,096개 중 하나로, 학습 비트의 99.87%, 홀드아웃 비트의 99.69%를 커버합니다.
  • 공간 토큰 네 개: 비트 안에서 최대 네 시점의 커서 위치입니다 — 모든 누름, 모든 뗌, 그리고 가장 긴 홀드를 균등하게 나눈 시점. 위치는 4픽셀 그리드(128 × 96칸) 위에 있어서 최대 반올림 오차는 2.83픽셀이고, 쓰지 않는 슬롯은 비워 둡니다.

즉 비트당 슬롯 다섯 개와 16,385개 토큰으로 이루어진 단일 어휘(버튼 패턴 4,096개 + 위치 12,289개)입니다. 공간 토큰이 기술하는 시점은 버튼 패턴만으로 정해지므로, 모델은 오브젝트 유형을 배울 필요가 없습니다.

왜 의도된 게임플레이를 에디터의 표현과 분리할까요? 이유는 두 가지이고, 둘 다 아무것도 학습시키기 전에 사람의 리플레이로 측정했습니다. 첫째, 에디터에서의 선택은 플레이에서 대부분 드러나지 않습니다. 커서만 보고 짧은 슬라이더를 서클과 구별할 수 있었던 경우는 43–45%에 불과했습니다 — 그러니 오브젝트 수준의 세부 사항은 모델이 추측해야 하는 것이 아니라 디코더가 정할 수 있는 결정입니다. 둘째, 게임플레이 기술 방식은 중요한 정보를 거의 잃지 않습니다. 이상화된 버튼 상태와 사람의 커서 경로로 재구성한 채보는, 오브젝트 정보를 포함한 기술 방식으로 재구성한 채보와 비슷한 비율로 다른 플레이어들의 리플레이에 맞았습니다(97.9% 대 98.0%). 대신 플레이어의 실제 버튼 상태를 쓰면 그 비율이 78.5%로 떨어졌습니다 — 실제 누름은 학습하기에 너무 노이즈가 많고, 그래서 버튼 토큰은 이상화되어 있습니다.

학습 데이터

OsuGAI v1 학습 데이터
값
처리한 채보117,918
곡25,928
학습 윈도1,185만
학습 / 검증 / 홀드아웃 채보117,474 / 362 / 82
★ 레이팅, 10번째 / 50번째 / 90번째 백분위1.98 / 3.69 / 5.86

코퍼스는 ranked, approved, loved osu! standard 채보입니다 — 117,920개 중 117,918개가 변환에 성공했습니다. 검증 세트와 홀드아웃 세트는 곡 단위로 분리되어 있어, 그 안의 어떤 곡도 학습에 나오지 않습니다. ManiaGAI와 마찬가지로 모든 채보의 타이밍은 먼저 저희 타이밍 감지기의 그리드로 옮겼기 때문에, 모델은 생성할 때 받는 것과 같은 종류의 그리드로 학습합니다. 어렵다는 이유로 제외한 채보는 하나도 없습니다.

커서 위치의 출처: osu!lazer의 Auto 리플레이

채보 파일은 오브젝트가 어디에 있는지는 알려 주지만, 그 사이를 커서가 어떻게 움직이는지는 알려 주지 않습니다. 저희는 공간 토큰을 osu!lazer에 내장된 완벽한 플레이어인 Auto의 리플레이에서 얻습니다. Auto의 커서 로직을 Python으로 옮기고 실제 게임과 20개 채보에서 비교했습니다. 264,716프레임, 같은 프레임 수, 버튼·스택 불일치 전무, 평균 차이 0.014픽셀이었습니다. Auto 커서 경로로부터 다시 디코딩한 채보는 91개 채보 벤치마크에서 다른 플레이어들의 사람 리플레이에 99.7% 맞았습니다.

솔직하게 밝혀 둘 점이 하나 있습니다. Auto는 사람이 아닙니다. Auto는 각 슬라이더의 경로를 정확히 따라가므로, 그 커서는 “원래 슬라이더 기하를 위치로 적은 것”에 가깝습니다 — 원래 슬라이더 경로의 72%를 Auto로부터 4픽셀 이내로 다시 읽어 낼 수 있지만, 사람 리플레이 하나로부터는 1%에 불과합니다. 따라서 OsuGAI v1이 배우는 것은 사람이 실제로 어떻게 움직이는지가 아니라 mapper가 오브젝트를 어디에 두는지입니다.

아키텍처

  1. 음악
  2. 타이밍 그리드
  3. Planner
  4. Noter
  5. 디코더
  6. .osu / .osz

OsuGAI는 ManiaGAI와 같은 엔진(Planner와 Noter에서 설명)으로 작동하며, 모드별 부분만 바뀌었습니다.

  • Planner (재사용). 이전 osu! standard 작업에서 그대로 가져온 작은 디퓨전 모델로, 오브젝트가 하나도 없는 상태에서 곡의 각 부분을 설계합니다. ★ 수준, 그리고 스타일 기술 — 슬라이더 비중, 각도 성격, 간격 불규칙성, 스트림 간격, 리듬.
  • Noter (신규). 약 6,410만 파라미터의 MaskGIT 방식 트랜스포머가 플랜, 오디오, 난이도 설정(서클 크기, 어프로치 레이트, 오버롤 난이도, 슬라이더 속도)을 따라 모든 비트의 토큰 다섯 개를 채웁니다. 학습에서는 정확한 위치를 맞히는 것 외에도, 목표에서 16픽셀 이내에 떨어진 위치에 부분 점수를 줍니다.
  • 디코더 (규칙 기반, 반복 인식). 게임플레이를 다시 오브젝트로 바꿉니다. 누름은 히트 서클이 되고, 긴 누름은 커서가 최소 1.5비트 동안 중앙을 돌면 스피너, 그렇지 않으면 슬라이더가 됩니다 — 슬라이더 볼이 예측 경로에 가깝게 유지되는 가장 단순한 직선, 호, 곡선으로요. 뚜렷하고 일정한 간격의 방향 전환은 리버스 슬라이더가 됩니다. 뉴 콤보는 고정된 규칙을 따릅니다.

학습: 네 라운드

Noter는 이전 osu! standard 모델에서 웜 스타트해, 시간 제한이 있는 에포크 4개(각 약 46분)씩 네 라운드에 걸쳐 학습했습니다 — RTX 4070 Ti SUPER(16 GB) 한 장으로 총 약 14시간, GPU 메모리는 최대 약 6 GB였습니다. 라운드가 끝날 때마다 평가 세트를 생성했습니다: 홀드아웃 곡 8개 × 설정 22개 = 채보 176개.

OsuGAI v1 학습 라운드
라운드검증 손실유효한 채보목표 2 / 4 / 6에 대한 측정 ★
13.1389176/1762.39 / 4.76 / 7.38
23.0175176/1762.24 / 4.64 / 7.28
32.9842176/1762.32 / 4.64 / 7.04
4 (출시)2.9570176/1762.40 / 4.62 / 7.22
  • 검증 손실은 네 라운드에 걸쳐 3.1389에서 2.9570으로 떨어졌습니다.
  • 구조적 유효성: 모든 라운드에서 평가 채보 176개 전부가 유효한 osu! standard 채보였습니다 — 올바른 오브젝트, 슬롯 위반 없음.
  • 난이도와 스타일이 반응합니다: 측정된 ★ 레이팅은 8곡 중 8곡에서 목표와 함께 올라갔고, 스타일 축 네 개 각각이 8곡 중 8곡에서 채보를 올바른 방향으로 움직였습니다 — 다만 구간별로 플랜을 따르는 능력은 아직 약합니다.
  • 결정적: 같은 곡에 같은 시드를 주면 바이트 단위로 동일한 .osu 파일이 나옵니다.

속도. 그 개발용 GPU에서 Flower Dance(4:22)의 난이도 8개는 시간을 잰 단계들 — 오디오 준비, 타이밍, 오디오 특징, 플래닝, 그리고 약 11–12초의 노트 생성 — 을 거치는 데 약 16–18초가 걸렸습니다. 디코딩과 파일 쓰기는 CPU에서 채보당 평균 약 0.6초가 추가됩니다. 이것은 로컬 벤치마크입니다. 운영 환경은 다른 클라우드 GPU에서 돌아가며, OsuGAI의 운영 환경 지연 시간은 아직 측정하지 않았습니다.

한계

유효한 채보가 재미있는 채보와 같은 것은 아니며, 위의 어떤 숫자도 OsuGAI의 채보가 경쟁적으로 플레이하기에 좋다는 뜻이 아닙니다. 저희가 알고 있는 문제점은 다음과 같습니다.

  • 난이도 초과. 채보가 목표보다 어렵게 나오고, 높은 난이도에서는 훨씬 어렵게 나옵니다. Flower Dance에서 목표 7.43, 8.71, 10은 각각 9.28, 13.49, 13.99 ★로 측정되었습니다. 그래서 웹사이트에서는 목표를 ★1–★6까지만 제공하고 항상 측정된 레이팅을 보여 줍니다.
  • 스스로 교차하는 슬라이더. 마지막 라운드에서 생성된 슬라이더의 3.3%가 자기 교차합니다(첫 라운드 후에는 2.4%). 원본 채보에서는 0.1%입니다.
  • 슬라이더 기하 아티팩트. 일부 슬라이더는 속도 제한에 걸리고(마지막 라운드에서 2.8%), 리버스 슬라이더는 사람의 채보보다 드뭅니다(슬라이더 중 6.1% 대 21%).
  • Auto 지도 학습. 커서 경로는 사람이 아니라 Auto의 것입니다. 모델은 사람의 움직임이 아니라 오브젝트 배치를 배웁니다.
  • 오버플로와 어휘 대체. 학습 비트의 0.58%는 위치가 네 개보다 많이 필요하며, 처음 네 개만 남깁니다. 비트의 0.13%는 버튼 패턴 4,096개 밖에 있어 가장 가까운 패턴을 사용합니다. 아주 빽빽한 채보가 가장 큰 영향을 받습니다.
  • 아직 폭넓은 사람 플레이테스트가 없습니다. 지금까지의 모든 검사는 자동이거나 녹화된 리플레이를 기반으로 합니다. 그 시작이 바로 이번 베타입니다.

다음 단계

  • 더 나은 난이도 보정 — 믿을 수 있는 목표, 그리고 전체 ★ 범위의 복귀.
  • 더 깔끔한 슬라이더 기하 — 자기 교차와 속도 제한은 줄이고, 리버스는 더 자연스럽게.
  • 사람의 게임플레이 데이터 — 오브젝트가 어디에 있는지뿐 아니라 사람이 어떻게 움직이는지 배우기.
  • 더 강한 스타일 조절 — 평균적으로만이 아니라 구간별로 채보가 따르는 막대.
  • 더 많은 osu! 모드 — osu! taiko와 osu! catch가 로드맵의 다음 차례입니다.

이 모드가 처음이신가요? osu! standard란?에서 게임 자체를 설명하고, 기술 페이지에서는 OsuGAI가 ManiaGAI와 공유하는 엔진을 다룹니다.