Nghiên cứu

Xây dựng OsuGAI: beatmap osu! standard do AI tạo

OsuGAI v1 tạo map osu! standard thế nào: biểu diễn gameplay bằng nút bấm và vị trí con trỏ, 118.000 map với replay Auto của osu!lazer, bốn vòng huấn luyện, kết quả và giới hạn thật của bản beta.

OsuGAI là mô hình đầu tiên của DanceGAI cho osu! standard, mode nguyên bản của osu!: hit circle, slider và spinner trải khắp playfield. Hôm nay nó ra mắt dưới dạng beta, bên cạnh ManiaGAI cho osu! mania. Báo cáo này giải thích cách nó biểu diễn một map, nó học từ đâu, được huấn luyện thế nào, chúng tôi đã đo được gì — và, cũng thẳng thắn như vậy, những gì nó vẫn còn làm sai.

Vì sao osu! standard khó hơn osu! mania

Một chart osu! mania là các nốt nằm trong cột: công cụ tạo map quyết định khi nào một nốt xuất hiện và nó rơi vào cột nào trong 4 đến 9 cột. Trong osu! standard, mỗi object còn có một vị trí trên playfield 512 × 384, và người chơi phải di chuyển tới đó. Điều này thêm vào ba vấn đề mà mania không có:

  • Chuyển động hai chiều. Khoảng cách, góc jump và flow giữa các object là phần lớn những gì khiến một map standard có cảm giác hay hay dở — và chúng là giá trị liên tục, không phải lựa chọn giữa vài cột.
  • Hình học slider. Slider là một đường cong có độ dài, tốc độ và đôi khi có repeat; nó phải khớp với nhạc và với các object xung quanh.
  • Khả năng đọc map. Object xuất hiện trước khi bạn bấm vào, chồng lên nhau và stack. Một map có thể timing hoàn hảo mà vẫn không thể đọc nổi.

Cách biểu diễn: gameplay trước, object của editor sau

Cách hiển nhiên để dạy một mô hình osu! standard là đưa cho nó các object của editor — “circle tại (x, y)”, “slider với các điểm điều khiển này”. Chúng tôi đã thử nhóm cách đó trước. Thay vào đó, OsuGAI v1 mô tả một map theo cách nó được chơi, rồi sau đó mới chuyển ngược lại thành object. Mỗi phách gồm năm token:

  • Một token tương tác: trạng thái nút bấm trong suốt phách, lấy mẫu ở 48 ô mỗi phách — nhấn hoặc nhả, không gì khác. Một cú tap là một lần nhấn ngắn; slider hay spinner là một lần nhấn dài. Token này là một trong 4.096 pattern 48 ô phổ biến nhất trong các chart huấn luyện, bao phủ 99,87% số phách huấn luyện và 99,69% số phách trong tập giữ lại.
  • Bốn token không gian: con trỏ ở đâu tại tối đa bốn thời điểm trong phách — mỗi lần nhấn, mỗi lần nhả, rồi đến những đoạn giữ dài nhất được chia đều. Vị trí nằm trên lưới 4 pixel (128 × 96 ô), nên sai số làm tròn lớn nhất là 2,83 pixel; ô không dùng đến thì để trống.

Như vậy là năm ô mỗi phách và một bộ từ vựng duy nhất gồm 16.385 token (4.096 pattern nút bấm cộng 12.289 vị trí). Các thời điểm mà token không gian mô tả được suy ra chỉ từ pattern nút bấm, nên mô hình không bao giờ phải học loại object.

Vì sao tách gameplay dự định ra khỏi cách biểu diễn của editor? Có hai lý do, cả hai đều được đo trên replay của người chơi trước khi chúng tôi huấn luyện bất cứ thứ gì. Thứ nhất, các lựa chọn của editor phần lớn không thấy được khi chơi: chỉ nhìn con trỏ, một slider ngắn chỉ phân biệt được với một circle trong 43–45% trường hợp — nên chi tiết ở cấp object là quyết định mà decoder có thể đưa ra, không phải thứ mô hình buộc phải đoán. Thứ hai, cách mô tả gameplay gần như không mất gì quan trọng: các map dựng lại từ trạng thái nút bấm lý tưởng hóa cộng đường đi con trỏ của người chơi được replay của những người chơi khác bấm trúng thường xuyên ngang với các map dựng lại từ cách mô tả có biết về object (97,9% so với 98,0%). Nếu dùng trạng thái nút bấm thực tế của người chơi, con số đó giảm xuống còn 78,5% — các lần nhấn thật quá nhiễu để học, đó là lý do token nút bấm được lý tưởng hóa.

Dữ liệu huấn luyện

Dữ liệu huấn luyện OsuGAI v1
Giá trị
Chart đã xử lý117.918
Bài hát25.928
Cửa sổ huấn luyện11.85 triệu
Chart huấn luyện / kiểm định / giữ lại117.474 / 362 / 82
Star rating, bách phân vị 10 / 50 / 901,98 / 3,69 / 5,86

Kho dữ liệu là các map osu! standard ranked, approved và loved — 117.918 trên 117.920 chart được chuyển đổi thành công. Tập kiểm định và tập giữ lại tách biệt theo bài hát: không bài nào trong đó xuất hiện trong tập huấn luyện. Giống như với ManiaGAI, timing của mọi chart trước tiên được chuyển lên lưới của bộ nhận diện timing của chính chúng tôi, nên mô hình huấn luyện trên cùng loại lưới mà nó nhận được khi tạo map. Không chart nào bị loại vì quá khó.

Vị trí con trỏ lấy từ đâu: replay Auto của osu!lazer

File map cho biết object nằm ở đâu, chứ không cho biết con trỏ di chuyển giữa chúng thế nào. Chúng tôi suy ra các token không gian từ replay Auto của osu!lazer — người chơi hoàn hảo có sẵn trong game. Chúng tôi đã port logic con trỏ của nó sang Python và đối chiếu với game thật trên 20 map: 264.716 frame, cùng số frame, không sai lệch nào về nút bấm hay stacking, chênh lệch trung bình 0,014 pixel. Các map giải mã ngược từ đường đi con trỏ của Auto được replay người thật của những người chơi khác bấm trúng 99,7% trên một bộ benchmark 91 map.

Một lưu ý thẳng thắn: Auto không phải con người. Nó đi theo đúng đường của từng slider, nên con trỏ của nó gần với “hình học slider gốc được viết thành các vị trí” — 72% đường slider gốc có thể đọc lại từ Auto với sai số trong vòng 4 pixel, so với 1% từ một replay đơn lẻ của người chơi. Vì vậy OsuGAI v1 học được mapper đặt mọi thứ ở đâu, chứ không phải con người thực sự di chuyển thế nào.

Kiến trúc

  1. Âm nhạc
  2. Lưới timing
  3. Planner
  4. Noter
  5. Decoder
  6. .osu / .osz

OsuGAI chạy trên cùng engine với ManiaGAI (được mô tả trong Planner và Noter), với các phần riêng cho từng mode được thay thế:

  • Planner (dùng lại). Một mô hình diffusion nhỏ, giữ nguyên từ công việc osu! standard trước đây của chúng tôi, lên kế hoạch cho từng đoạn của bài hát trước khi có bất kỳ object nào: mức sao của đoạn đó, và một mô tả phong cách — tỉ lệ slider, đặc tính góc, độ thất thường của khoảng cách, khoảng cách stream và nhịp điệu.
  • Noter (mới). Một transformer kiểu MaskGIT với khoảng 64,1 triệu tham số điền năm token của mỗi phách, theo kế hoạch, âm thanh và các thông số độ khó (circle size, approach rate, overall difficulty và slider velocity). Ngoài độ chính xác vị trí tuyệt đối, quá trình huấn luyện của nó còn cho điểm một phần với vị trí rơi trong vòng 16 pixel quanh mục tiêu.
  • Decoder (dựa trên quy tắc, nhận biết repeat). Chuyển gameplay ngược lại thành object: một lần nhấn trở thành hit circle; một lần nhấn dài trở thành spinner khi con trỏ xoay quanh tâm ít nhất 1,5 phách, nếu không thì thành slider — đường thẳng, cung tròn hoặc đường cong đơn giản nhất giữ cho bóng slider sát với đường đi được dự đoán. Các lần đảo chiều rõ ràng, đều nhịp trở thành repeat slider. New combo theo một quy tắc cố định.

Huấn luyện: bốn vòng

Noter được khởi động từ mô hình osu! standard trước đây của chúng tôi và huấn luyện trong bốn vòng, mỗi vòng bốn epoch có giới hạn thời gian (khoảng 46 phút mỗi epoch) — tổng cộng khoảng 14 giờ trên một chiếc RTX 4070 Ti SUPER (16 GB), dùng tối đa khoảng 6 GB bộ nhớ GPU. Sau mỗi vòng, chúng tôi tạo một bộ đánh giá: 8 bài hát giữ lại × 22 thiết lập = 176 map.

Các vòng huấn luyện OsuGAI v1
VòngLoss kiểm địnhMap hợp lệ★ đo được cho mục tiêu 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 (bản phát hành)2,9570176/1762,40 / 4,62 / 7,22
  • Loss kiểm định giảm từ 3,1389 xuống 2,9570 qua bốn vòng.
  • Tính hợp lệ về cấu trúc: cả 176 map đánh giá đều là map osu! standard hợp lệ ở mọi vòng — object hợp lệ, không vi phạm ô nào.
  • Độ khó và phong cách có phản hồi: star rating đo được tăng theo mục tiêu trên 8/8 bài hát, và mỗi trục trong bốn trục phong cách đều đẩy map theo đúng hướng trên 8/8 bài hát — dù việc bám theo kế hoạch từng đoạn một vẫn còn yếu.
  • Tất định: cùng bài hát với cùng seed cho ra các file .osu giống nhau đến từng byte.

Tốc độ. Trên GPU phát triển đó, tám độ khó của Flower Dance (4:22) mất khoảng 16–18 giây qua các giai đoạn được đo giờ — chuẩn bị âm thanh, timing, đặc trưng âm thanh, lên kế hoạch và khoảng 11–12 giây tạo nốt; giải mã và ghi file tốn thêm trung bình khoảng 0,6 giây mỗi map, trên CPU. Đây là benchmark cục bộ: môi trường production chạy trên một GPU đám mây khác, và chúng tôi chưa đo độ trễ production của OsuGAI.

Hạn chế

Một map hợp lệ không đồng nghĩa với một map vui để chơi, và không con số nào ở trên nói rằng map của OsuGAI đủ tốt để chơi competitive. Những gì chúng tôi biết là còn sai:

  • Độ khó vượt mục tiêu. Map ra khó hơn mục tiêu, và khó hơn nhiều ở các mức cao: với Flower Dance, các mục tiêu 7,43; 8,71 và 10 đo được 9,28; 13,49 và 13,99 sao. Vì vậy trang web chỉ cho chọn mục tiêu ★1–★6 và luôn hiển thị star rating đo được.
  • Slider tự cắt chính nó. 3,3% slider được tạo ở vòng cuối tự giao cắt (2,4% sau vòng đầu tiên), so với 0,1% trong các map gốc.
  • Lỗi hình học slider. Một số slider chạm ngưỡng giới hạn tốc độ (2,8% ở vòng cuối), và repeat slider hiếm hơn so với map do người làm (6,1% số slider so với 21%).
  • Giám sát bằng Auto. Đường đi con trỏ là của Auto, không phải của con người: mô hình học cách đặt object, không phải chuyển động của con người.
  • Tràn ô và fallback từ vựng. 0,58% số phách huấn luyện cần nhiều hơn bốn vị trí; chỉ bốn vị trí đầu được giữ lại. 0,13% số phách nằm ngoài 4.096 pattern nút bấm và dùng pattern gần nhất. Các map rất dày bị ảnh hưởng nhiều nhất.
  • Chưa được người chơi playtest rộng rãi. Mọi bước kiểm tra cho đến nay đều tự động hoặc dựa trên replay đã ghi. Bản beta là nơi việc đó bắt đầu.

Tiếp theo là gì

  • Hiệu chỉnh độ khó tốt hơn — mục tiêu bạn có thể tin được, và trả lại toàn bộ dải star rating.
  • Hình học slider gọn gàng hơn — ít tự cắt và bị giới hạn tốc độ hơn, repeat tự nhiên hơn.
  • Dữ liệu gameplay của người thật — học cách con người di chuyển, không chỉ object nằm ở đâu.
  • Kiểm soát phong cách mạnh hơn — các thanh mà map bám theo từng đoạn một, không chỉ ở mức trung bình.
  • Thêm mode osu! — osu! taiko và osu! catch là các bước tiếp theo trong lộ trình.

Mới biết mode này? osu! standard là gì? giải thích bản thân trò chơi; trang công nghệ trình bày về engine mà OsuGAI dùng chung với ManiaGAI.