Kỹ thuật

Vì sao DanceGAI dùng Planner + Noter để tạo beatmap

Thay vì ánh xạ thẳng âm thanh thành nốt, ManiaGAI lên kế hoạch gameplay bằng diffusion rồi đặt nốt bằng transformer kiểu MaskGIT. Lý do, đánh đổi và những gì nó mở ra.

Cách mô tả tự nhiên nhất cho một công cụ AI tạo beatmap là “âm thanh vào, mạng nơ-ron, nốt ra”. ManiaGAI không hoạt động như vậy. Nó chia công việc làm hai: một Planner quyết định mỗi phần của bài hát nên mang lại cảm giác chơi như thế nào, và một Noter quyết định chính xác nốt nằm ở đâu. Bài viết này giải thích vì sao, mỗi mô hình làm gì, và cái giá của việc chia tách đó.

Beatmap là một bản phối, không phải bản chép lại

Một chart bám sát âm thanh chưa chắc đã là chart hay. Một map osu! mania tốt gần với một bản phối hơn: mapper quyết định âm thanh nào xứng đáng có nốt, một đoạn nên dày đến mức nào, jack hay long note nên nằm ở đâu, pattern luân chuyển giữa hai tay ra sao — và tất cả những điều đó thay đổi thế nào giữa độ khó Easy và Expert của cùng một bài.

Một mô hình duy nhất ánh xạ thẳng âm thanh thành nốt phải đưa ra mọi quyết định đó cùng một lúc, ở mọi thời điểm: cấu trúc, độ khó, phong cách và vị trí cột chính xác. Loại mô hình đó thường làm đúng các chi tiết cục bộ nhưng đánh mất hình dáng của bài hát — một đoạn điệp khúc không mạnh hơn đoạn verse, một đoạn breakdown không có chỗ để thở.

Hai câu hỏi, hai mô hình

  1. Âm nhạc
  2. Hiểu
  3. Planner
  4. Noter
  5. Kiểm định
  6. Beatmap

Cả hai mô hình đều đọc cùng một bức tranh âm nhạc của bài hát: một lưới timing, và một biểu diễn của âm thanh được căn theo lưới đó từng nhịp một (từ mô hình mã nguồn mở MERT). Từ đó:

  • Planner trả lời câu hỏi điều gì nên xảy ra. Trước khi có bất kỳ nốt nào, nó vạch ra cấu trúc gameplay của cả bài, từng đoạn một: mỗi phần nên khó đến đâu, và tỉ lệ giữa long note, jack và các loại pattern khác.
  • Noter trả lời câu hỏi các nốt được đặt thế nào. Nó biến kế hoạch thành vị trí cụ thể — cột nào, nốt nào là nốt nhấn và nốt nào là long note, các pattern nối với nhau ra sao — bám theo cả kế hoạch lẫn âm thanh.

Mỗi mô hình nhận một nhiệm vụ hẹp hơn, và kế hoạch cho phần tạo nốt một thứ mà mô hình tạo từng nốt một không có: một cái nhìn về toàn bộ bài hát đã được quyết định sẵn.

Planner: Gaussian diffusion trên cả bài hát

Planner là một mô hình Gaussian diffusion với khoảng 6 triệu tham số. Nó tạo kế hoạch cho mọi đoạn của bài hát cùng một lúc, dựa trên âm nhạc, số phím, cùng độ khó và phong cách được yêu cầu.

Diffusion hợp với việc này vì hai lý do. Một kế hoạch là bản mô tả mượt, liên tục của một bài hát — độ khó cục bộ và tỉ lệ pattern lên xuống theo thời gian — đúng loại tín hiệu mà mô hình diffusion xử lý tốt. Và việc tạo nó một lần cho cả bài, thay vì từng đoạn nối tiếp nhau, giúp Planner cân bằng toàn bộ bài hát cùng lúc: nó có thể đẩy điệp khúc lên đỉnh và cho đoạn bridge nghỉ, vì nó thấy được cả hai.

Noter: tinh chỉnh kiểu MaskGIT

Noter là một transformer phi tự hồi quy (non-autoregressive) kiểu MaskGIT với khoảng 51 triệu tham số. Chart được biểu diễn bằng các token pattern rời rạc. Thay vì viết từng token một từ đầu đến cuối bài, Noter điền toàn bộ chart rồi tinh chỉnh qua nhiều lượt — chốt những nốt nó tự tin và xem lại phần còn lại. Cách các lượt đó được lên lịch trên một bài hát là phương pháp riêng của chúng tôi, và là một trong những điều chúng tôi giữ kín.

Vì sao không tạo chart từ trái sang phải, như cách một mô hình ngôn ngữ viết văn bản?

  • Viết chặt chẽ từ trái sang phải nghĩa là các quyết định ban đầu không thể tính đến phần nhạc phía sau, và lỗi sẽ cộng dồn qua một bài dài.
  • Trong mô hình tinh chỉnh, mỗi lượt đều thấy ngữ cảnh ở cả hai phía của mọi đoạn, giúp pattern nhất quán xuyên suốt bài.
  • Toàn bộ chart được tạo trong một số lượt cố định thay vì từng token một — điều này cũng quan trọng cho tốc độ.
  • Một đoạn có thể được sửa lại mà không phải tạo lại mọi thứ phía sau nó (sẽ nói thêm bên dưới).

Độ khó và phong cách là đầu vào, không phải chuyện tính sau

Sự chia tách cũng là điều khiến việc tạo map có thể điều khiển được. ManiaGAI nhận các tham số điều khiển rõ ràng, và các mô hình được huấn luyện để tuân theo chúng:

  • Số phím — 4K đến 9K.
  • Độ khó — chọn bất kỳ star rating nào từ ★1 đến ★10; một lần chạy tạo ra cả một mapset.
  • Phong cách — năm chiều: tỉ lệ long note, inverse long note, jack, long note ngắn và delay. Mỗi độ khó có thể có phong cách riêng, được hiệu chỉnh từ các chart thật ở số phím và star rating đó.

Các tham số điều khiển này tác động lên kế hoạch, nơi chúng thực sự có ý nghĩa: “khó hơn”, “nhiều long note hơn” hay “nhiều jack hơn” là những quyết định về hình dáng của một đoạn, không phải về một nốt. Mật độ không phải một núm điều chỉnh riêng — nó bắt nguồn từ độ khó mục tiêu và kế hoạch. Và vì mọi độ khó đều được tạo từ cùng một sự hiểu biết về bài hát, một mapset đọc lên như một gia đình chart thay vì những chart không liên quan đến nhau.

Tạo lại cục bộ là hệ quả tự nhiên của thiết kế

Chart được tạo hiếm khi sai ở mọi chỗ. Thường thì chỉ một đoạn bị lệch — một pattern không hợp, một khúc quá dày. Tạo lại cả chart để sửa nó sẽ vứt bỏ mọi thứ vốn đã tốt.

  1. Chọn
  2. Che
  3. Tạo lại
  4. Tinh chỉnh

Vì Noter tinh chỉnh cả chart thay vì viết từ trái sang phải, nó có thể tạo lại một vùng được chọn trong khi giữ nguyên mọi thứ xung quanh, dùng các nốt lân cận làm ngữ cảnh — để đoạn mới hòa vào chart thay vì vênh với nó. Đó là nền tảng cho việc chỉnh sửa theo từng đoạn: một map editor nơi bạn chọn phần mình không thích và chỉ tạo lại đoạn đó, hoặc tự sửa nốt rồi chơi thử kết quả, đang được thử nghiệm nội bộ. Tính năng này chưa có trên trang web.

Huấn luyện riêng từng mô hình

Hai mô hình được huấn luyện riêng, mỗi mô hình trên biểu diễn mà nó làm việc: Planner là mô hình diffusion trên bản mô tả gameplay của từng đoạn, Noter được huấn luyện bằng dự đoán token bị che (masked-token prediction) trên các token pattern. Các mẫu được cân bằng theo số phím và mức độ khó để những tổ hợp hiếm, như 8K ở ★10, không bị lấn át bởi những tổ hợp phổ biến. Dữ liệu đằng sau cả hai được mô tả trong Bên trong tập dữ liệu của một AI mapper osu! mania.

Cái giá của việc chia tách

Một hệ thống phân cấp không miễn phí. Những đánh đổi chúng tôi chấp nhận:

  • Hai mô hình phải huấn luyện và giữ đồng bộ. Kế hoạch là giao diện giữa chúng; khi định nghĩa của nó thay đổi, cả hai phía đều phải theo.
  • Noter chỉ có thể tốt bằng kế hoạch mà nó được giao. Một kế hoạch đánh giá sai một đoạn sẽ giao cho Noter một yêu cầu sai.
  • Kế hoạch chỉ mô tả những gì chúng tôi chọn mô tả. Độ khó và tỉ lệ pattern theo từng đoạn nắm bắt được phần lớn điều tạo nên cảm giác của một chart, nhưng không phải mọi ý đồ của mapper.

Những điều chúng tôi không khẳng định

Chúng tôi chưa benchmark thiết kế này với một mô hình end-to-end duy nhất được huấn luyện trên cùng dữ liệu, nên chúng tôi không khẳng định nó tốt hơn. Điều chúng tôi có thể nói là nó cho chúng tôi một cách gọn gàng hơn để mô hình hóa riêng cấu trúc tầm xa và vị trí nốt cục bộ, một chỗ tự nhiên để đặt các tham số điều khiển độ khó và phong cách, và một mô hình có thể sửa một đoạn của chart mà không đụng đến phần còn lại. Phong cách map vẫn được điều khiển qua một vài chiều; mô tả phong cách bằng ví dụ thay vì bằng thanh trượt là hướng chúng tôi đang theo đuổi.

Trang Công nghệ cho thấy cả hai mô hình nằm ở đâu trong toàn bộ pipeline, và cách chúng tôi làm cho việc tạo map nhanh trình bày những gì cần để chạy chúng.