วิศวกรรม

ทำไม DanceGAI ใช้ Planner + Noter ในการสร้าง beatmap

แทนที่จะแปลงเสียงเป็นโน้ตโดยตรง ManiaGAI วางแผนเกมเพลย์ของแต่ละช่วงด้วยโมเดล diffusion ก่อน แล้วจึงวางโน้ตด้วยทรานส์ฟอร์เมอร์สไตล์ MaskGIT เหตุผล ข้อแลกเปลี่ยน และสิ่งที่มันทำให้เป็นไปได้

วิธีอธิบาย AI สร้าง beatmap ที่เป็นธรรมชาติที่สุดคือ “ใส่เสียงเข้าไป ผ่านโครงข่ายประสาทเทียม ได้โน้ตออกมา” แต่ ManiaGAI ไม่ได้ทำงานแบบนั้น มันแบ่งงานออกเป็นสองส่วน: Planner ตัดสินว่าแต่ละช่วงของเพลงควรให้ความรู้สึกตอนเล่นอย่างไร และ Noter ตัดสินว่าโน้ตจะไปอยู่ตรงไหนกันแน่ บทความนี้อธิบายว่าทำไม แต่ละโมเดลทำอะไร และการแบ่งแบบนี้มีต้นทุนอะไร

beatmap คือการเรียบเรียง ไม่ใช่การถอดโน้ต

ชาร์ตที่ตามเสียงอย่างใกล้ชิดไม่จำเป็นต้องเป็นชาร์ตที่ดี แมพ osu! mania ที่ดีใกล้เคียงกับการเรียบเรียงดนตรีมากกว่า: mapper ตัดสินว่าเสียงไหนควรได้โน้ต ช่วงไหนควรรู้สึกหนาแน่นแค่ไหน jack หรือ long note ควรอยู่ตรงไหน แพทเทิร์นไหลระหว่างมืออย่างไร — และทั้งหมดนั้นเปลี่ยนไปอย่างไรระหว่างระดับ Easy กับ Expert ของเพลงเดียวกัน

โมเดลเดียวที่แปลงเสียงเป็นโน้ตโดยตรงต้องตัดสินใจทุกเรื่องพร้อมกันในทุกขณะ: โครงสร้าง ความยาก สไตล์ และตำแหน่งคอลัมน์ที่แน่นอน โมเดลแบบนั้นมักทำรายละเอียดเฉพาะจุดได้ถูก แต่เสียรูปทรงของเพลงไป — ท่อนฮุกที่ไม่ได้หนักกว่าท่อนเวิร์ส ช่วง breakdown ที่ไม่ได้ให้พักหายใจ

สองคำถาม สองโมเดล

  1. เพลง
  2. ทำความเข้าใจ
  3. Planner
  4. Noter
  5. ตรวจสอบ
  6. beatmap

ทั้งสองโมเดลอ่านภาพทางดนตรีของเพลงชุดเดียวกัน: กริดไทมมิ่ง และตัวแทนของเสียงที่จัดแนวตรงกับกริดทีละบีต (จากโมเดลโอเพนซอร์ส MERT) จากนั้น:

  • Planner ตอบว่าอะไรควรเกิดขึ้น ก่อนที่จะมีโน้ตแม้แต่ตัวเดียว มันวางโครงสร้างเกมเพลย์ของทั้งเพลงทีละช่วง: แต่ละช่วงควรยากแค่ไหน และสัดส่วนของ long note, jack และแพทเทิร์นประเภทอื่น ๆ
  • Noter ตอบว่าโน้ตจะวางอย่างไร มันเปลี่ยนแผนให้เป็นการวางจริง — คอลัมน์ไหน โน้ตไหนเป็น tap และโน้ตไหนเป็น long note แพทเทิร์นเชื่อมต่อกันอย่างไร — โดยทำตามทั้งแผนและเสียง

แต่ละโมเดลได้งานที่แคบลง และแผนก็ให้สิ่งที่โมเดลแบบวางทีละโน้ตไม่มีแก่การสร้างโน้ต: มุมมองของทั้งเพลงที่ถูกตัดสินไว้แล้ว

Planner: Gaussian diffusion บนทั้งเพลง

Planner เป็นโมเดล Gaussian diffusion ขนาดราว 6 ล้านพารามิเตอร์ มันสร้างแผนของทุกช่วงในเพลงไปพร้อมกัน โดยมีเงื่อนไขจากดนตรี จำนวนคีย์ และความยากกับสไตล์ที่ขอ

Diffusion เหมาะกับงานนี้ด้วยสองเหตุผล แผนคือคำอธิบายเพลงที่ราบรื่นและต่อเนื่อง — ความยากเฉพาะจุดและสัดส่วนแพทเทิร์นที่ขึ้นลงตามเวลา — ซึ่งเป็นสัญญาณแบบที่โมเดล diffusion จัดการได้ดี และการสร้างทั้งหมดในคราวเดียวแทนที่จะทำทีละช่วง ทำให้ Planner ถ่วงสมดุลทั้งเพลงได้พร้อมกัน: มันทำให้ท่อนฮุกเป็นจุดพีกและท่อน bridge เป็นช่วงพักได้ เพราะมันเห็นทั้งสองท่อน

Noter: การขัดเกลาแบบ MaskGIT

Noter เป็นทรานส์ฟอร์เมอร์แบบ non-autoregressive สไตล์ MaskGIT ขนาดราว 51 ล้านพารามิเตอร์ ชาร์ตถูกแทนด้วยโทเคนแพทเทิร์นแบบไม่ต่อเนื่อง (discrete) แทนที่จะเขียนทีละตัวจากต้นเพลงไปท้ายเพลง Noter เติมทั้งชาร์ตแล้วขัดเกลาหลายรอบ — ยืนยันโน้ตที่มั่นใจ แล้วกลับมาแก้ส่วนที่เหลือ การจัดตารางรอบเหล่านั้นตลอดทั้งเพลงเป็นวิธีของเราเอง และเป็นหนึ่งในสิ่งที่เราเก็บเป็นความลับ

ทำไมไม่สร้างชาร์ตจากซ้ายไปขวา แบบที่โมเดลภาษาเขียนข้อความ?

  • การเขียนจากซ้ายไปขวาอย่างเคร่งครัดหมายความว่าการตัดสินใจช่วงต้นไม่สามารถคำนึงถึงดนตรีช่วงหลังได้ และความผิดพลาดจะสะสมไปตลอดเพลงยาว
  • ในโมเดลแบบขัดเกลา ทุกรอบจะเห็นบริบททั้งสองฝั่งของทุกช่วง ซึ่งทำให้แพทเทิร์นสอดคล้องกันตลอดทั้งเพลง
  • ทั้งชาร์ตถูกสร้างในจำนวนรอบที่ตายตัวแทนที่จะทีละโทเคน — ซึ่งสำคัญต่อความเร็วด้วย
  • แก้ไขช่วงหนึ่งได้โดยไม่ต้องสร้างทุกอย่างหลังจากนั้นใหม่ (อ่านต่อด้านล่าง)

ความยากและสไตล์คืออินพุต ไม่ใช่สิ่งที่มาเติมทีหลัง

การแบ่งงานนี้ยังเป็นสิ่งที่ทำให้ควบคุมการสร้างได้ ManiaGAI รับค่าควบคุมที่ระบุชัดเจน และโมเดลถูกฝึกให้ทำตาม:

  • จำนวนคีย์ — 4K ถึง 9K
  • ความยาก — เลือกค่าดาวชุดใดก็ได้ตั้งแต่ ★1 ถึง ★10 การรันครั้งเดียวได้ mapset ทั้งชุด
  • สไตล์ — ห้ามิติ: สัดส่วน long note, inverse long note, jack, long note สั้น และ delay แต่ละระดับความยากมีสไตล์ของตัวเองได้ ซึ่งปรับเทียบจากชาร์ตจริงที่มีจำนวนคีย์และค่าดาวนั้น

ค่าควบคุมเหล่านี้ทำงานบนแผน ซึ่งเป็นจุดที่มันมีผล: “ยากขึ้น” “long note มากขึ้น” หรือ “jack มากขึ้น” คือการตัดสินใจเรื่องรูปทรงของช่วง ไม่ใช่เรื่องของโน้ตตัวเดียว ความหนาแน่นไม่ได้เป็นปุ่มปรับแยก — มันเป็นผลจากความยากเป้าหมายและแผน และเพราะทุกระดับความยากสร้างจากความเข้าใจเพลงชุดเดียวกัน mapset หนึ่งจึงอ่านได้เหมือนชาร์ตครอบครัวเดียวกัน ไม่ใช่ชาร์ตที่ไม่เกี่ยวข้องกัน

การสร้างใหม่เฉพาะจุดได้มาจากการออกแบบนี้เอง

ชาร์ตที่สร้างขึ้นแทบไม่เคยผิดไปทั้งหมด ส่วนใหญ่มักมีช่วงเดียวที่ไม่เข้าที่ — แพทเทิร์นที่ไม่เข้ากัน หรือช่วงที่หนาแน่นเกินไป การสร้างทั้งชาร์ตใหม่เพื่อแก้จุดนั้นคือการทิ้งทุกอย่างที่ดีอยู่แล้วไป

  1. เลือก
  2. มาสก์
  3. สร้างใหม่
  4. ขัดเกลา

เพราะ Noter ขัดเกลาทั้งชาร์ตแทนที่จะเขียนจากซ้ายไปขวา มันจึงสร้างพื้นที่ที่เลือกใหม่ได้โดยตรึงทุกอย่างรอบ ๆ ไว้ และใช้โน้ตรอบข้างเป็นบริบท — ช่วงใหม่จึงเชื่อมเข้ากับชาร์ตแทนที่จะขัดกัน นี่คือรากฐานของการแก้ไขระดับช่วง: editor แมพที่ให้คุณเลือกส่วนที่ไม่ชอบแล้วสร้างใหม่เฉพาะช่วงนั้น หรือแก้โน้ตเองแล้วทดลองเล่นผลลัพธ์ กำลังอยู่ในการทดสอบภายใน ยังไม่เปิดให้ใช้บนเว็บไซต์

ฝึกแยกกัน

ทั้งสองโมเดลฝึกแยกกัน แต่ละตัวฝึกบนตัวแทนข้อมูลที่มันใช้งาน: Planner ฝึกเป็นโมเดล diffusion บนคำอธิบายเกมเพลย์ของแต่ละช่วง ส่วน Noter ฝึกด้วยการทำนายโทเคนที่ถูกมาสก์บนโทเคนแพทเทิร์น ตัวอย่างถูกปรับสมดุลตามจำนวนคีย์และระดับความยาก เพื่อไม่ให้ชุดผสมที่หายาก อย่าง 8K ที่ ★10 ถูกกลบด้วยชุดผสมที่พบบ่อย ข้อมูลเบื้องหลังทั้งสองโมเดลอธิบายไว้ในเจาะลึกชุดข้อมูลเบื้องหลัง AI ทำแมพ osu! mania

การแบ่งงานนี้มีต้นทุนอะไร

ลำดับชั้นไม่ได้มาฟรี ข้อแลกเปลี่ยนที่เรายอมรับ:

  • ต้องฝึกสองโมเดลและทำให้สอดคล้องกันเสมอ แผนคือส่วนเชื่อมต่อระหว่างทั้งสอง เมื่อคำนิยามของแผนเปลี่ยน ทั้งสองฝั่งต้องตามให้ทัน
  • Noter ดีได้เท่ากับแผนที่มันได้รับเท่านั้น แผนที่ประเมินช่วงหนึ่งผิดก็เท่ากับให้โจทย์ที่ผิดแก่ Noter
  • แผนอธิบายได้เฉพาะสิ่งที่เราเลือกจะอธิบาย ความยากระดับช่วงและสัดส่วนแพทเทิร์นจับได้มากว่าอะไรทำให้ชาร์ตให้ความรู้สึกแบบนั้น แต่ไม่ใช่ทุกอย่างที่ mapper ตั้งใจ

สิ่งที่เราไม่ได้อ้าง

เรายังไม่ได้ทำเบนช์มาร์กเทียบการออกแบบนี้กับโมเดลเดี่ยวแบบ end-to-end ที่ฝึกบนข้อมูลชุดเดียวกัน เราจึงไม่ได้อ้างว่ามันดีกว่า สิ่งที่เราพูดได้คือ มันให้วิธีที่สะอาดกว่าในการจำลองโครงสร้างระยะยาวกับการวางโน้ตเฉพาะจุดแยกกัน ให้ตำแหน่งที่เป็นธรรมชาติสำหรับค่าควบคุมความยากและสไตล์ และให้โมเดลที่แก้ไขช่วงหนึ่งของชาร์ตได้โดยไม่แตะส่วนที่เหลือ สไตล์การทำแมพยังถูกควบคุมผ่านมิติเพียงไม่กี่มิติ การอธิบายสไตล์ด้วยตัวอย่างแทนแถบเลื่อนคือทิศทางที่เรากำลังมุ่งไป

หน้าเทคโนโลยี แสดงว่าทั้งสองโมเดลอยู่ตรงไหนในไปป์ไลน์ทั้งหมด และเราทำให้การสร้างเร็วได้อย่างไร เล่าว่าการรันโมเดลเหล่านี้ต้องใช้อะไรบ้าง