Исследования
Как создавался OsuGAI: beatmap для osu! standard, созданные ИИ
Как OsuGAI v1 делает из песни карту osu! standard: нажатия и позиции курсора, 118 000 карт с реплеями Auto из osu!lazer, 4 раунда обучения, итоги и честные пределы беты.
OsuGAI — первая модель DanceGAI для osu! standard, исходного режима osu!: круги, слайдеры и спиннеры, разбросанные по игровому полю. Сегодня она вышла в бете рядом с ManiaGAI для osu! mania. В этом отчёте рассказано, как она представляет карту, на чём училась, как обучалась, что мы измерили — и так же прямо о том, что она пока делает неправильно.
Почему osu! standard сложнее, чем osu! mania
Чарт osu! mania — это ноты в колонках: генератор решает, когда появится нота и в какую из 4–9 колонок она попадёт. В osu! standard у каждого объекта есть ещё и место на игровом поле 512 × 384, и игроку нужно до него довести курсор. Это добавляет три проблемы, которых в mania нет:
- Движение в двух измерениях. Дистанция, углы прыжков и flow между объектами — это бо́льшая часть того, из-за чего карта standard ощущается хорошей или плохой, — и они непрерывны, а не сводятся к выбору из нескольких колонок.
- Геометрия слайдеров. Слайдер — это кривая с длиной, скоростью, а иногда и повторами; она должна подходить к музыке и к объектам вокруг.
- Читаемость. Объекты появляются до того, как по ним нужно попасть, перекрываются и складываются в стаки. Карта может быть идеально затаймленной и всё равно нечитаемой.
Представление: сначала геймплей, потом объекты редактора
Очевидный способ научить модель osu! standard — дать ей объекты редактора: «круг в (x, y)», «слайдер с такими контрольными точками». Это семейство подходов мы попробовали первым. OsuGAI v1 вместо этого описывает карту так, как в неё играют, и уже потом превращает это обратно в объекты. Каждый бит — это пять токенов:
- Один токен взаимодействия: состояние кнопки на протяжении бита, с дискретизацией 48 ячеек на бит — нажата или отпущена, и ничего больше. Тап — короткое нажатие; слайдер или спиннер — длинное. Токен — один из 4 096 самых частых 48-ячеечных паттернов в обучающих чартах; они покрывают 99,87 % обучающих битов и 99,69 % отложенных битов.
- Четыре пространственных токена: где находится курсор максимум в четыре момента бита — при каждом нажатии, каждом отпускании, а затем при самых длинных удержаниях, разделённых поровну. Позиции лежат на сетке с шагом 4 пикселя (128 × 96 ячеек), поэтому наибольшая ошибка округления — 2,83 пикселя; неиспользованный слот остаётся пустым.
Это пять слотов на бит и единый словарь из 16 385 токенов (4 096 паттернов кнопки плюс 12 289 позиций). Моменты, которые описывают пространственные токены, выводятся только из паттерна кнопки, поэтому модели никогда не нужно учить типы объектов.
Зачем отделять задуманный геймплей от представления редактора? По двум причинам, и обе мы измерили на реплеях людей ещё до того, как что-либо обучать. Во-первых, решения редактора в игре в основном не видны: по одному лишь курсору короткий слайдер удавалось отличить от круга только в 43–45 % случаев — так что детали на уровне объектов — это решения, которые может принять декодер, а не то, что модель обязана угадать. Во-вторых, описание геймплея почти ничего важного не теряет: карты, восстановленные из идеализированного состояния кнопки и траектории курсора человека, реплеи других игроков проходили так же часто, как карты, восстановленные из описания с учётом объектов (97,9 % против 98,0 %). Если же взять реальные состояния кнопки игроков, показатель падал до 78,5 % — настоящие нажатия слишком шумные, чтобы на них учиться, поэтому токен кнопки идеализирован.
Обучающие данные
| Значение | |
|---|---|
| Обработано чартов | 117 918 |
| Песен | 25 928 |
| Обучающих окон | 11.85 million |
| Чарты: обучение / валидация / holdout | 117 474 / 362 / 82 |
| Звёздный рейтинг, 10-й / 50-й / 90-й процентиль | 1,98 / 3,69 / 5,86 |
Корпус — это ranked-, approved- и loved-карты osu! standard: успешно сконвертированы 117 918 из 117 920 чартов. Валидационная и holdout-выборки не пересекаются по песням: ни одна песня из них не встречается в обучении. Как и для ManiaGAI, тайминг каждого чарта сначала перенесли на сетку нашего собственного детектора тайминга, так что модель обучается на такой же сетке, какую получает при генерации. Ни один чарт не был отброшен из-за сложности.
Откуда берутся позиции курсора: реплей Auto из osu!lazer
Файл карты говорит, где находятся объекты, но не как между ними движется курсор. Пространственные токены мы получаем из реплея Auto в osu!lazer — встроенного идеального игрока. Мы портировали его логику курсора на Python и сверили её с настоящей игрой на 20 картах: 264 716 кадров, то же количество кадров, ноль расхождений по кнопкам и стакам, средняя разница — 0,014 пикселя. Карты, декодированные обратно из траекторий курсора Auto, реплеи людей проходили в 99,7 % случаев на бенчмарке из 91 карты.
Одна честная оговорка: Auto — не человек. Он точно следует траектории каждого слайдера, поэтому его курсор близок к «исходной геометрии слайдера, записанной в виде позиций»: 72 % исходных траекторий слайдеров можно восстановить из Auto с точностью до 4 пикселей — против 1 % из одного реплея человека. Поэтому OsuGAI v1 учится тому, где маппер расставляет объекты, а не тому, как на самом деле двигаются люди.
Архитектура
- Музыка
- Сетка тайминга
- Planner
- Noter
- Декодер
- .osu / .osz
OsuGAI работает на том же движке, что и ManiaGAI (он описан в статье Planner и Noter), но с заменёнными частями, специфичными для режима:
- Planner (переиспользован). Небольшая диффузионная модель, не изменившаяся со времён нашей более ранней работы над osu! standard, планирует каждую часть песни ещё до появления каких-либо объектов: её уровень звёзд и описание стиля — долю слайдеров, характер углов, неравномерность дистанции, расстояние в стримах и ритм.
- Noter (новый). Трансформер в стиле MaskGIT примерно на 64,1 млн параметров заполняет пять токенов каждого бита, следуя плану, аудио и настройкам сложности (circle size, approach rate, overall difficulty и slider velocity). Помимо точности попадания в точную позицию, при обучении он получает частичный зачёт за позицию, которая оказалась в пределах 16 пикселей от цели.
- Декодер (на правилах, с учётом повторов). Превращает геймплей обратно в объекты: нажатие становится кругом; длинное нажатие становится спиннером, если курсор кружит вокруг центра не меньше 1,5 бита, а иначе — слайдером: самой простой линией, дугой или кривой, при которой шар слайдера остаётся близко к предсказанной траектории. Чёткие, равномерно распределённые по времени развороты становятся слайдером с повторами. Новые комбо ставятся по фиксированному правилу.
Обучение: четыре раунда
Noter был инициализирован нашей предыдущей моделью для osu! standard и обучался четыре раунда по четыре эпохи с ограничением по времени (около 46 минут каждая) — в сумме примерно 14 часов на одной RTX 4070 Ti SUPER (16 ГБ), с пиковым потреблением около 6 ГБ видеопамяти. После каждого раунда мы генерировали оценочный набор: 8 отложенных песен × 22 настройки = 176 карт.
| Раунд | Валидационный loss | Корректные карты | Измеренные ★ для целей 2 / 4 / 6 |
|---|---|---|---|
| 1 | 3,1389 | 176/176 | 2,39 / 4,76 / 7,38 |
| 2 | 3,0175 | 176/176 | 2,24 / 4,64 / 7,28 |
| 3 | 2,9842 | 176/176 | 2,32 / 4,64 / 7,04 |
| 4 (выпущен) | 2,9570 | 176/176 | 2,40 / 4,62 / 7,22 |
- Валидационный loss за четыре раунда снизился с 3,1389 до 2,9570.
- Структурная корректность: все 176 оценочных карт в каждом раунде были корректными картами osu! standard — допустимые объекты, никаких нарушений слотов.
- Сложность и стиль откликаются: измеренный звёздный рейтинг рос вместе с целью на 8 из 8 песен, и каждая из четырёх осей стиля сдвигала карту в нужную сторону на 8 из 8 песен — хотя следование плану секция за секцией пока слабое.
- Детерминированность: одна и та же песня с тем же seed даёт побайтово идентичные файлы .osu.
Скорость. На этом GPU для разработки восемь сложностей Flower Dance (4:22) прошли этапы с замером времени примерно за 16–18 секунд — подготовка аудио, тайминг, аудиопризнаки, планирование и около 11–12 секунд генерации нот; декодирование и запись файлов добавляют в среднем около 0,6 секунды на карту, на CPU. Это локальный бенчмарк: в продакшене работает другой, облачный 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.