Hacker News Nổi bật (buzzing.cc bản dịch tiếng Trung)
85

Sản phẩm

Show HN: Tôi đã huấn luyện Transformer 125 triệu tham số để tự động hoàn thiện piano trên thiết bị

(giờ Việt Nam)

Tóm tắt AI

Một nhà phát triển đã tạo ra mô hình Transformer 125M tham số, cho phép iPhone 15 tự động gợi ý nốt nhạc piano theo thời gian thực. Dự án tối ưu hóa dữ liệu MIDI và áp dụng kỹ thuật DPO để đạt hiệu suất ấn tượng, hiện đã ra mắt ứng dụng RollTab miễn phí.

Bản dịch AI

Training a 125M-parameter Model to Autocomplete Piano

TL;DR: Tôi đã huấn luyện một mô hình transformer 125 triệu tham số để tự động hoàn thiện các bản nhạc piano trong thời gian thực (~108 nốt/giây trên iPhone 15). Những cải tiến lớn nhất đến từ việc tìm ra cách biểu diễn MIDI phù hợp, làm sạch dữ liệu huấn luyện một cách triệt để và bổ sung quá trình hậu huấn luyện DPO.

Gần một năm trước, tôi bắt đầu mày mò với một ý tưởng: kết nối đàn piano MIDI của mình với điện thoại, chơi một đoạn nhạc và để AI tự động hoàn thiện bài hát đó. Hãy hình dung nó giống như GitHub Copilot, nhưng dành cho piano.

Hóa ra đây là một "hang thỏ" sâu hơn tôi tưởng. Sau 14 thử nghiệm, cuối cùng nó cũng đạt đến trạng thái khiến tôi đủ hài lòng để viết về nó.

Ứng dụng này, RollTab, hiện đã có sẵn miễn phí tại đây nếu bạn có bàn phím MIDI và iPhone/iPad. 1

Một vài đoạn âm thanh mẫu

Mỗi đoạn âm thanh bắt đầu bằng một đoạn gợi ý ngắn, theo sau là phần tiếp nối của mô hình.

Pokémon, Pallet Town (gợi ý 8 nốt)

Trình duyệt của bạn không hỗ trợ thẻ âm thanh.

Final Fantasy VI, Terra's Theme (gợi ý 16 nốt)

Trình duyệt của bạn không hỗ trợ thẻ âm thanh.

Für Elise (gợi ý 16 nốt)

Trình duyệt của bạn không hỗ trợ thẻ âm thanh.

File MIDI chứa những gì?

Một file MIDI rất khác so với MP3 hay các định dạng âm thanh khác. Thay vì lưu trữ âm thanh đã ghi lại, nó lưu trữ âm nhạc dưới dạng một chuỗi các sự kiện: một phím được nhấn ở cao độ và vận tốc (velocity) nhất định, một phím được thả ra, bàn đạp ngân (sustain pedal) thay đổi trạng thái, v.v. Các sự kiện khác bao gồm chuyển đổi nhạc cụ hoặc thay đổi âm lượng.

Các sự kiện này thường được tổ chức thành nhiều track. Một file MIDI nhạc pop hoặc game có thể có giai điệu, hợp âm, bass, trống, đàn dây và một vài phần synth. Dự án này tập trung vào việc tiếp nối nhạc piano, vì vậy tôi chủ yếu giữ lại các thành phần giống piano và loại bỏ hoặc giảm bớt các phần còn lại.

Bạn Tokenize âm nhạc như thế nào?

Để huấn luyện một transformer trên các bản nhạc này, trước tiên tôi cần chuyển các sự kiện MIDI thành một chuỗi rời rạc mà mô hình có thể đọc và dự đoán. Cách ánh xạ rõ ràng nhất là tạo một token cho mỗi sự kiện MIDI:

Nếu bạn đưa trực tiếp cao độ và vận tốc vào một token NOTE_ON, từ vựng sẽ tăng lên rất nhanh. Có 128 cao độ MIDI và 128 giá trị vận tốc, vì vậy từ vựng kết hợp note-on đơn giản có tới:

token chỉ dành cho note-on và note-off. Trong thực tế, bạn có thể sẽ nhóm các giá trị vận tốc (bucket), nhưng vấn đề cơ bản vẫn còn đó: nhiều tổ hợp rất hiếm gặp và mô hình phải học rất nhiều cấu trúc từ các token thưa thớt.

Một cải tiến phổ biến là phân tách cách biểu diễn bằng một ngữ pháp:

Bây giờ không gian đầu ra đã nhỏ hơn:

Bạn có thể áp đặt ngữ pháp trong quá trình tạo bằng cách chặn (mask) các token tiếp theo không hợp lệ. Sau NOTE_ON, chỉ các token cao độ là hợp lệ. Sau cao độ, chỉ các token vận tốc là hợp lệ. Điều này đảm bảo đầu ra đúng cú pháp.

Tôi đã thử các cách biểu diễn kiểu note-on/note-off, nhưng các mô hình của tôi có xu hướng bị lệch (drift). Chúng thường quên phát lệnh note-off, để lại các nốt bị treo hoặc mất dấu trạng thái hoạt động. Điều đó đặc biệt tệ đối với mục tiêu của tôi: một mô hình nhỏ chạy gần thời gian thực trên laptop hoặc điện thoại.

Một cách biểu diễn khác mà tôi đã thử gần giống với:

Cách này tránh được hiện tượng lệch note-off vì thời lượng nốt được thể hiện rõ ràng. Token dịch chuyển thời gian (time shift) sẽ đẩy con trỏ phát nhạc đi khi không có nốt nào được chơi.

Cách này hiệu quả hơn về mặt âm nhạc, nhưng lại chậm. Một nốt nhạc mất khoảng bốn bước transformer tự hồi quy (autoregressive). Nó cũng làm cạn kiệt cửa sổ ngữ cảnh (context window) rất nhanh.

Cách biểu diễn cuối cùng

Cách biểu diễn mà cuối cùng tôi chọn là:

Không có sự kiện TIME_SHIFT riêng biệt trong phiên bản cuối cùng. Sự im lặng được thể hiện bằng delta_onset trên nốt tiếp theo: khoảng thời gian kể từ khi nốt trước đó bắt đầu.

Ví dụ:

có nghĩa là: chơi C4, đợi 24 bước thời gian trước khi nốt tiếp theo bắt đầu, sau đó chơi D4.

Các hợp âm được biểu diễn dưới dạng nhiều nốt với delta_onset = 0, được sắp xếp theo cao độ2:

Nó cũng không phải là một luồng token phẳng như:

Thay vì tốn bốn lượt chạy transformer để tạo các thuộc tính của một nốt, transformer đẩy bản nhạc tiến lên một nốt hoàn chỉnh mỗi lần. Trong thực tế, điều này giúp mô hình lớn đạt khoảng 108 nốt/giây trên iPhone, cao hơn nhiều so với bất kỳ tốc độ nào con người cần để chơi trực tiếp.

Về mặt nội bộ, mỗi nốt có năm trường phân loại, mỗi trường có từ vựng riêng3, với thời gian được định lượng thành các bước cố định.4

Mỗi trường có một embedding riêng. Token nốt là tổng của tất cả các embedding:

Sau đó, mô hình có các đầu ra (output heads) riêng biệt: cao độ, delta, thời lượng, v.v.

Có một bộ giải mã lồng nhau nhỏ giữa các trường, vì vậy các trường sau có thể phụ thuộc vào các trường đã được dự đoán trước đó. Nhưng phần lõi transformer đắt đỏ chỉ chạy một lần cho mỗi nốt, chứ không phải một lần cho mỗi trường.

Bàn đạp ngân (Sustain Pedal)

AITransformerPianoOn-device AIMIDI
Đọc bài gốc

Bài viết được AI dịch và tổng hợp tự động từ Hacker News Nổi bật (buzzing.cc bản dịch tiếng Trung). Liên kết bài gốc ở phía trên. Dữ liệu đồng bộ qua API công khai được ghi nguồn tại AI HOT (canonical) ↗. AIHOT.vn luôn dẫn nguồn đầy đủ — nếu bạn thấy điểm cần chỉnh sửa, hãy gửi ý kiến tại trang phản hồi.