K-Means in Music Recommendations
k-means trong gợi ý nhạc
Công ty nào đang ứng dụng Phân cụm k-means?
Sáng thứ Hai nào đó bạn mở Spotify (dịch vụ phát nhạc lớn nhất thế giới) và thấy Discover Weekly — 30 bài hát mới — đã sẵn sàng. Bài đầu tiên lạ hoắc nhưng hợp gu đến kỳ lạ. Làm sao Spotify biết bạn thích bài này, khi bạn còn chưa từng nghe?
Đằng sau sự “tiên tri” đó là một cách nhìn thú vị: Spotify biến bạn và mỗi bài hát thành một điểm trong không gian nhiều chiều. Gu âm nhạc của bạn là một toạ độ. Nhiệm vụ duy nhất: tìm các bài hát có toạ độ gần bạn — dùng đúng kỹ thuật phân cụm bạn đã học ở bài lý thuyết.
Vấn đề công ty cần giải quyết
Spotify có hơn 100 triệu bài hát và hơn 600 triệu người dùng. Dịch vụ này phân loại tới 6.291 thể loại vi mô (micro-genre) — từ “trance guru” đến “cult-progressive-rock”.
Kho nhạc khổng lồ
100 triệu bài. Đọc thủ công mỗi bài mất 10 năm làm việc không nghỉ.
Gu rất đa dạng
600 triệu người nghe. Không có hai người có gu giống nhau 100%.
Phải cá nhân hoá
Gợi ý chung kiểu “Top 50 toàn cầu” không ai xem. Cần riêng cho từng người.
Vấn đề cốt lõi: từ ma trận tương tác (ai đã nghe bài gì) giữa hàng trăm triệu người và bài hát, làm sao tìm ra những nhóm người nghe có gu giống nhau? Rồi gợi ý bài hát mà “đồng minh thẩm mỹ” của bạn yêu thích mà bạn chưa từng nghe.
Cách Phân cụm k-means giải quyết vấn đề
Thu thập phản hồi ẩn (implicit feedback). Spotify không hỏi bạn thích bài gì — quá rườm rà. Thay vào đó, họ ghi lại lượt nghe đủ lâu (>30 giây), lưu vào playlist, bỏ qua giữa chừng — khoảng 1 TB mỗi ngày trên toàn hệ thống.
Biến người và bài hát thành “điểm”. Ma trận khổng lồ {người × bài} được phân rã thành hai ma trận nhỏ: người dùng trở thành vector 40 chiều, bài hát cũng trở thành vector 40 chiều. Hai điểm gần nhau trong không gian 40 chiều = gu âm nhạc tương đồng.
Tìm láng giềng gần nhất. Với vector của bạn, Spotify dùng thư viện Voyager (nhanh hơn Annoy 10 lần) để tìm bài hát có vector gần nhất — đúng logic của k-means, nhưng với k rất lớn và không gian nhiều chiều. Việc này tương đương: tìm cụm bài hát phù hợp nhất với mỗi người nghe.
Bổ sung tín hiệu âm thanh.Bài hát mới chưa có lịch sử nghe (cold-start)? CNN (mạng nơ-ron tích chập) phân tích phổ âm thanh thô của bài đó để dự đoán vector — không cần chờ nghìn lượt nghe để “hiểu” bài này.
Vòng phản hồi mỗi thứ Hai. Bạn nghe một bài trong Discover Weekly, bỏ qua bài khác. Mỗi hành động cập nhật vector của bạn một chút — tâm gu (user centroid) dịch chuyển nhẹ về bài bạn vừa thích. Tuần sau, 30 bài mới đã phản ánh dịch chuyển đó.
Không gian đặc trưng 2D: energy × danceability
Thực tế Spotify dùng 40 chiều, nhưng chỉ 2 chiều cũng đủ thấy các cụm tự nhiên. Mỗi chấm là một bài hát tiếng Việt. Trục X là energy (năng lượng), trục Y là danceability (khiêu vũ). Bấm vào một bài để xem nó thuộc cụm nào.
Bấm tim ít nhất 2 bài hát trên để xem gợi ý. Gu của bạn sẽ hiện thành chấm vàng trong không gian bên trên.
Quan sát: mỗi lần bạn bấm tim thêm một bài, chấm vàng (gu của bạn) dời nhẹ. Các bài được gợi ý là những bài có khoảng cách d nhỏ nhất đến chấm vàng. Spotify thực tế làm điều này trên 40 chiều và hàng triệu bài hát, nhưng nguyên lý giống hệt.
Con số thật
Gu của bạn cập nhật thế nào khi thích bài mới?
Mỗi khi bạn bấm tim, Spotify không viết lại toàn bộ hồ sơ. Nó chỉ dịch chuyển nhẹvector của bạn về phía vector của bài hát vừa thích. Bấm “Tiếp tục” để đi qua từng bước.
Bạn mới tạo tài khoản — Spotify chưa biết gì về gu của bạn. Vector khởi đầu là một giá trị mặc định (thường là trung bình toàn hệ thống, kiểu “người nghe phổ thông”).
Gu của bạn (chấm vàng) nằm giữa — chưa có hướng rõ ràng.
Thử tự tay
Ba câu hỏi nhanh để kiểm tra bạn đã nắm vững nguyên lý Spotify dùng để gợi ý nhạc.
Bạn vừa tạo tài khoản Spotify mới và chưa nghe bài nào. Hệ thống sẽ gợi ý thế nào?
Bạn nghe 9 bài bolero và 1 bài EDM liên tục. Tuần sau Discover Weekly chủ yếu có gì?
Spotify ra bài mới chưa có ai nghe. Làm sao đưa vào gợi ý mà không chờ hàng ngàn lượt nghe đầu tiên?
Tại sao Spotify dùng 40 chiều mà không phải 2 chiều (energy + dance) như đồ thị trên?
Nếu không có Phân cụm k-means, app sẽ ra sao?
Không có phân cụm và biểu diễn vector, Spotify sẽ phải so sánh trực tiếp mỗi người dùng với hàng trăm triệu người khác — bất khả thi về mặt tính toán. Một truy vấn gợi ý đơn giản sẽ mất hàng giờ thay vì mili-giây.
Kỹ thuật phân rã ma trận và phân cụm biến mỗi người, mỗi bài hát thành vector ngắn gọn — biến bài toán so sánh thành phép nhân vector đơn giản. Thư viện tìm kiếm láng giềng gần đúng (Voyager) tiếp tục tăng tốc bằng cách không duyệt toàn bộ không gian. Kết quả: Discover Weekly có thể tạo ra cho 600 triệu người mỗi thứ Hai, xong trong vài giờ tính toán ngắn ngủi — một con số không thể tưởng tượng được nếu so từng cặp.
Nguyên lý này không chỉ dành cho nhạc — Netflix dùng cho phim, TikTok cho video, Shopee cho sản phẩm. Tất cả đều quy về bài toán: biến người và sản phẩm thành điểm, rồi tìm láng giềng gần nhất.