Courses
Bạn đã bao giờ cố gắng trích xuất các mẫu hữu ích từ một tập dữ liệu với hàng nghìn đặc trưng chưa?
Bạn biết rằng trong một tập dữ liệu khổng lồ ắt hẳn có cấu trúc hữu ích bị chôn vùi. Vấn đề là, dữ liệu thô mang theo rất nhiều nhiễu, dư thừa, giá trị thiếu và nhiều chiều hơn mức bạn thực sự cần. Hầu hết các thuật toán học máy sẽ không thể hiểu loại dữ liệu này, hoặc tốt nhất là làm chậm thời gian huấn luyện.
Phân rã Giá trị Kỳ dị (SVD) tách bất kỳ ma trận nào (trong trường hợp này là tập dữ liệu) thành ba ma trận đơn giản hơn cho thấy cấu trúc cốt lõi của nó. Đây là toán học đứng sau hệ thống gợi ý, nén ảnh và các kỹ thuật giảm chiều như PCA - và khi bạn hiểu nó, bạn sẽ thấy nó ở khắp nơi trong công việc hằng ngày.
Trong bài viết này, tôi sẽ hướng dẫn bạn SVD là gì, cách nó hoạt động, nơi nó được dùng trong khoa học dữ liệu, và khi nào bạn nên chọn một giải pháp thay thế.
Bạn thấy các khái niệm như vector và định thức rối rắm? Hãy đọc bài Hóa giải các khái niệm Toán học cho Học sâu trước khi tiếp tục với bài này.
Phân rã Giá trị Kỳ dị (SVD) là gì?
SVD là một phương pháp tách bất kỳ ma trận nào thành ba ma trận đơn giản hơn.
Hãy hình dung thế này. Bạn có một ma trận A - có thể là một tập dữ liệu hoặc một bức ảnh. SVD tách A thành ba phần:

Công thức SVD
-
Ulà một ma trận trực giaom x m. Các cột của nó được gọi là vector kỳ dị trái, và chúng mô tả mối quan hệ giữa các hàng củaA -
\Sigmalà một ma trận chéom x n. Các giá trị trên đường chéo là giá trị kỳ dị - luôn không âm và được sắp xếp từ lớn đến nhỏ -
V*là chuyển vị liên hợp của một ma trận trực giaon x n. Các hàng của nó được gọi là vector kỳ dị phải, và chúng mô tả mối quan hệ giữa các cột của A
Mỗi phần thể hiện một khía cạnh khác nhau về dữ liệu gốc. U giữ các mẫu ở mức hàng (các hàng liên hệ với nhau thế nào), \Sigma giữ các trọng số mức độ quan trọng (mỗi mẫu quan trọng ra sao), và V* giữ các mẫu ở mức cột (các cột liên hệ với nhau thế nào).
Một phép so sánh như sau. Hãy tưởng tượng bạn đang mô tả một công thức nấu ăn cho ai đó. Bạn có thể chia nó thành ba phần: nguyên liệu (thành phần), định lượng (bao nhiêu mỗi thứ), và các bước (kết hợp thế nào). Không phần nào riêng lẻ có thể tái tạo món ăn, nhưng cùng nhau, chúng cho bạn mọi thứ cần biết. SVD làm điều tương tự với ma trận - nó tách "cái gì", "bao nhiêu" và "cách làm" thành các thành phần riêng biệt mà bạn có thể thao tác độc lập.
Điểm khiến SVD nổi bật trong đại số tuyến tính là nó hoạt động với bất kỳ ma trận nào. Không cần là ma trận vuông, cũng không cần thuộc tính đặc biệt. Bất kỳ ma trận m x n nào cũng có thể được phân rã theo cách này, đó là lý do nó xuất hiện khắp nơi trong khoa học dữ liệu.
SVD vận hành như thế nào trong thực tế
Hãy xem chi tiết cách SVD hoạt động, bắt đầu từ căn bản.
Giải thích phân rã ma trận
Giả sử bạn có ma trận 3×2 A:

Phân rã ma trận
SVD phân rã ma trận này thành U (3×3), \Sigma (3×2), và V* (2×2). Các cột của U đến từ các vector riêng của A x A^T, và các cột của V đến từ các vector riêng của A^T x A. Các giá trị kỳ dị trong \Sigma là căn bậc hai của các trị riêng từ một trong hai tích đó.
Tin tốt là bạn không cần tự tính tay. Trong Python, bạn chỉ cần một dòng lệnh:
import numpy as np
A = np.array([[1, 2], [3, 4], [5, 6]])
U, sigma, Vt = np.linalg.svd(A, full_matrices=True)

Kết quả Numpy
Ba ma trận tương tác với nhau thông qua phép nhân. U xoay dữ liệu trong không gian hàng, \Sigma co giãn theo từng trục, và V* xoay trong không gian cột. Kết quả là ma trận gốc A.
Vai trò của các giá trị kỳ dị
Các giá trị trên đường chéo trong \Sigma cho bạn biết mức đóng góp của từng thành phần vào toàn bộ ma trận.
Giá trị kỳ dị đầu tiên luôn lớn nhất - nó nắm bắt mẫu chi phối nhất trong dữ liệu. Mỗi giá trị tiếp theo nắm bắt ít hơn. Nếu vài giá trị kỳ dị đầu lớn và phần còn lại gần bằng không, điều đó có nghĩa phần lớn thông tin trong ma trận tập trung chỉ trong vài thành phần.
Đó là điều khiến việc nén dữ liệu trở nên khả thi.
Bạn có thể loại các giá trị kỳ dị nhỏ (và các cột tương ứng trong U và các hàng trong V*) mà không mất nhiều thông tin. Kết quả là một xấp xỉ hạng thấp hơn của ma trận gốc, nhỏ hơn và nhanh hơn để xử lý.
Số lượng giá trị kỳ dị khác không cũng cho bạn biết hạng của ma trận - số hàng hoặc cột độc lập tuyến tính. Nếu một ma trận 100×50 chỉ có 10 giá trị kỳ dị khác không, điều đó có nghĩa dữ liệu chỉ có 10 chiều độc lập. 40 chiều còn lại là dư thừa.
Tái tạo ma trận
Bạn có thể xây dựng lại ma trận gốc bằng cách nhân ba thành phần với nhau:

Tái tạo ma trận
Nhưng điều bạn thực sự muốn là tái tạo một phần. Vì vậy, thay vì dùng tất cả các giá trị kỳ dị, bạn chỉ giữ lại k giá trị lớn nhất và các vector tương ứng. Điều này cho bạn một xấp xỉ hạng-k của A:

Xấp xỉ ma trận hạng-k
Định lý Eckart-Young đảm bảo rằng xấp xỉ hạng-k này là ma trận gần nhất có hạng k so với A gốc (đo bằng chuẩn Frobenius). Nói cách khác, nếu bạn sẽ nén một ma trận xuống k chiều, SVD cho bạn kết quả tốt nhất có thể.
Ứng dụng của SVD trong Khoa học Dữ liệu
Khi để ý, bạn sẽ thấy SVD xuất hiện ở nhiều nơi hơn bạn nghĩ.
Ý tưởng luôn là lấy một ma trận lớn, giữ lại những phần quan trọng và loại bỏ phần còn lại. Điều thay đổi là "quan trọng" nghĩa là gì tùy theo bài toán.
Giảm chiều
Các tập dữ liệu nhiều chiều khó làm việc và khó diễn giải. Nhiều đặc trưng hơn đồng nghĩa thời gian huấn luyện dài hơn và rủi ro quá khớp cao hơn. SVD ngăn điều này bằng cách giảm số chiều.
Khái quát là như sau. Bạn phân rã ma trận dữ liệu, xem các giá trị kỳ dị và chỉ giữ lại k thành phần lớn nhất. Các giá trị kỳ dị nhỏ biểu thị nhiễu và biến thiên nhỏ, nên loại bỏ chúng hầu như không ảnh hưởng đến chất lượng dữ liệu. Phần còn lại là biểu diễn gọn nhẹ nhưng vẫn giữ phần lớn cấu trúc gốc.
Đây chính là cách Phân tích Thành phần Chính (PCA) hoạt động. PCA chuẩn hóa tâm dữ liệu rồi chạy SVD trên kết quả. Các thành phần chính là các vector kỳ dị phải, và các giá trị kỳ dị cho biết mỗi thành phần giải thích bao nhiêu phương sai.
Hệ thống gợi ý
Các công ty như Netflix và Amazon có các ma trận người dùng - sản phẩm khổng lồ, nơi phần lớn ô bị trống. Một người dùng chỉ đánh giá vài bộ phim trong hàng nghìn bộ, nên ma trận thưa. SVD giúp lấp đầy khoảng trống.
Ý tưởng là phân rã ma trận đánh giá thành sở thích người dùng và đặc tính sản phẩm. Ma trận U biểu diễn điều mỗi người dùng quan tâm (thể loại, nhịp điệu, tông giọng), và V* biểu diễn những gì mỗi sản phẩm cung cấp. Các giá trị kỳ dị trong \Sigma tỷ lệ hóa các yếu tố này theo mức độ quan trọng. Khi nhân lại, bạn nhận được điểm dự đoán cho các phim người dùng chưa xem.
Trong thực tế, SVD tiêu chuẩn không hoạt động trực tiếp trên ma trận thưa vì nó xem giá trị thiếu là 0. Đó là lý do các hệ thống dùng các biến thể như SVD cắt ngắn (truncated SVD) hoặc các phương pháp phân rã ma trận chỉ vận hành trên các ô quan sát được.
Nén ảnh
Một ảnh thang xám chỉ là một ma trận giá trị điểm ảnh. SVD có thể nén ảnh bằng cách chỉ giữ các giá trị kỳ dị quan trọng nhất.
Giả sử bạn có ảnh 1000×1000. SVD đầy đủ cho bạn 1000 giá trị kỳ dị. Nhưng nếu bạn chỉ giữ 50 giá trị lớn nhất, bạn tái tạo ảnh chỉ với 50 thành phần thay vì 1000. Ảnh sẽ hơi mờ nhưng vẫn nhận ra được - và dung lượng lưu trữ giảm từ 1.000.000 giá trị xuống khoảng 100.500 (50 cột của U + 50 giá trị kỳ dị + 50 hàng của V*).
Nhiều giá trị kỳ dị hơn nghĩa là chất lượng ảnh tốt hơn nhưng nén kém hơn. Ít giá trị hơn nghĩa là tệp nhỏ hơn nhưng mất mát nhiều hơn. Bạn có thể chọn điểm cân bằng tùy trường hợp sử dụng.
Cân nhắc về hiệu năng và hạn chế
Ma trận càng lớn, chi phí tính toán bạn phải đối mặt càng cao.
Chi phí tính toán
SVD đầy đủ trên một ma trận m x n có độ phức tạp thời gian O(mn²) (giả sử m >= n). Với ma trận nhỏ thì ổn. Với ma trận có hàng triệu hàng và hàng nghìn cột, nó trở nên tốn kém.
Bộ nhớ là nút thắt cổ chai khác. SVD đầy đủ tạo ra ba ma trận dày (dense), và lưu trữ đồng thời cả ba có thể vượt quá RAM khả dụng của bạn.
Cách khắc phục là tránh tính SVD đầy đủ khi bạn không cần. Truncated SVD chỉ tính k giá trị kỳ dị lớn nhất và các vector của chúng, nhanh hơn nhiều. Trong Python, scipy.sparse.linalg.svds và sklearn.decomposition.TruncatedSVD đều thực hiện điều này. Randomized SVD còn tiến xa hơn bằng cách dùng lấy mẫu ngẫu nhiên để xấp xỉ phân rã, và hoạt động tốt khi bạn chỉ cần các thành phần chi phối.
Ổn định và độ chính xác
SVD nhìn chung ổn định về số, nhưng có thể gặp khó với một số dạng dữ liệu.
Dữ liệu quá nhiễu là một ví dụ. Nếu tỷ lệ tín hiệu - nhiễu thấp, các giá trị kỳ dị lớn sẽ không tách bạch khỏi nhiễu. Bạn sẽ giữ lại nhiễu trong xấp xỉ hoặc làm giảm tín hiệu khi cắt ngắn.
Ma trận điều kiện kém cũng là vấn đề. Khi tỷ số giữa giá trị kỳ dị lớn nhất và nhỏ nhất quá lớn (số điều kiện cao), các sai số số học nhỏ trong quá trình tính toán sẽ bị khuếch đại. Điều này có thể tạo ra kết quả không đáng tin, đặc biệt với giới hạn độ chính xác dấu phẩy động.
Cách khắc phục là kiểm tra các giá trị kỳ dị trước khi cắt ngắn. Vẽ đồ thị và tìm điểm rơi rõ ràng giữa tín hiệu và nhiễu. Nếu độ suy giảm diễn ra từ từ, không có "khuỷu tay" rõ rệt, SVD có thể không phải công cụ tốt nhất cho tập dữ liệu đó.
Các lựa chọn thay thế SVD
SVD không phải là phương pháp phân rã ma trận duy nhất, và nó không phải lúc nào cũng là lựa chọn tốt nhất cho mọi công việc.
Mỗi phương án bên dưới giải quyết một loại vấn đề cụ thể. Chúng không thay thế SVD vì hoạt động dưới các giả định và ràng buộc khác nhau. Lựa chọn đúng, như thường lệ, phụ thuộc vào nhiệm vụ bạn đang thực hiện.
Phân rã trị riêng (Eigendecomposition)
Phân rã trị riêng có liên hệ gần gũi nhất với SVD. Nó tách một ma trận vuông thành các trị riêng và vector riêng:

Công thức phân rã trị riêng
Trong đó Q chứa các vector riêng và \Lambda là ma trận chéo các trị riêng.
Điểm hạn chế là nó chỉ hoạt động trên ma trận vuông. Nếu ma trận dữ liệu của bạn là m x n với m != n, phân rã trị riêng không thể làm việc trực tiếp. SVD hoạt động với mọi hình dạng ma trận, đó là lý do nó là công cụ tổng quát hơn.
Với các ma trận vuông, đối xứng (như ma trận hiệp phương sai), phân rã trị riêng và SVD cho kết quả liên quan chặt chẽ. Các giá trị kỳ dị của một ma trận đối xứng nửa xác định dương chính là các trị riêng của nó. Vì vậy nếu bạn làm việc với ma trận hiệp phương sai trong PCA, cả hai phương pháp đều cho kết quả như nhau. SVD chỉ là phiên bản tổng quát hóa cho trường hợp không vuông.
Phân rã QR
Phân rã QR tách một ma trận thành ma trận trực giao Q và ma trận tam giác trên R:

Công thức phân rã QR
Nó nhanh hơn SVD cho một số tác vụ, đặc biệt khi giải hệ phương trình tuyến tính và các bài toán bình phương tối thiểu.
Đánh đổi là thông tin. QR không cung cấp các giá trị kỳ dị, vì vậy không thể cho bạn biết về hạng của ma trận hay thành phần nào mang nhiều trọng lượng nhất. Nếu bạn cần giải Ax = b và không quan tâm đến cấu trúc nền, QR là lựa chọn tốt. Nhưng nếu bạn cần hiểu hoặc nén dữ liệu, SVD là lựa chọn tốt hơn.
Phân rã Ma trận Không âm (NMF)
NMF phân rã một ma trận thành hai ma trận mà mọi giá trị đều không âm:

Công thức NMF
Ràng buộc này khiến NMF phù hợp với dữ liệu vốn dĩ không âm (hãy nghĩ đến cường độ điểm ảnh hoặc số lần xuất hiện từ). Ngược lại, SVD không ép buộc điều này. Các ma trận sau phân rã của nó có thể có giá trị âm, đôi khi tạo ra các thành phần khó diễn giải.
NMF đặc biệt phổ biến trong khai phá văn bản và mô hình chủ đề. Mỗi cột của W có thể biểu diễn một chủ đề, và mỗi hàng của H cho thấy chủ đề đó xuất hiện bao nhiêu trong mỗi tài liệu. Ràng buộc không âm có nghĩa các chủ đề được xây dựng từ các tổ hợp cộng của từ, giúp chúng dễ đọc hơn so với các thành phần dấu lẫn lộn của SVD.
Điểm trừ là NMF không đảm bảo nghiệm duy nhất, và kết quả phụ thuộc vào khởi tạo. SVD luôn cho cùng một đầu ra với cùng một đầu vào.
Randomized SVD
Nếu ma trận của bạn quá lớn cho SVD đầy đủ nhưng bạn vẫn muốn các giá trị kỳ dị, randomized SVD đáng để xem. Nó dùng phép chiếu ngẫu nhiên để xấp xỉ k giá trị kỳ dị và vector hàng đầu mà không tính toàn bộ phân rã. Các thư viện như scikit-learn (TruncatedSVD) và fbpca của Facebook triển khai cách tiếp cận này, và nó mở rộng tốt tới các ma trận có hàng triệu hàng.
Bảng dưới tóm tắt khi nào nên chọn mỗi phương pháp.

Các lựa chọn thay thế SVD
Những lưu ý khác với SVD
Một vài điều phổ biến dễ gây nhầm lẫn cho các nhà khoa học dữ liệu mới vào nghề.
Thứ nhất là đọc sai ý nghĩa các giá trị kỳ dị. Một giá trị kỳ dị lớn nghĩa là thành phần đó giải thích nhiều phương sai trong dữ liệu - không có nghĩa thành phần đó "quan trọng" theo ý nghĩa miền ứng dụng. Ví dụ, giá trị kỳ dị chi phối trong ma trận đánh giá người dùng có thể phản ánh việc đa số mọi người đánh giá các phim phổ biến, chứ không phải một mẫu sở thích có ý nghĩa. Luôn diễn giải giá trị kỳ dị trong ngữ cảnh dữ liệu của bạn, không chỉ dựa vào độ lớn của chúng.
Thứ hai là lạm dụng SVD khi không cần. Với các tập dữ liệu nhỏ (vài trăm hàng và vài đặc trưng), SVD chỉ làm tăng độ phức tạp không cần thiết. Các phương pháp đơn giản như phân tích tương quan hoặc chọn lọc đặc trưng cơ bản thường hoàn thành công việc nhanh hơn và với ít mã hơn. SVD rất hữu ích khi bạn có dữ liệu nhiều chiều với cấu trúc dư thừa - nếu tập dữ liệu của bạn không như vậy, hãy dùng phương pháp đơn giản hơn.
Kết luận
SVD tách bất kỳ ma trận nào thành ba thành phần cho thấy cấu trúc của nó. Các giá trị kỳ dị cho bạn biết phần nào của dữ liệu là quan trọng nhất, và các vector kỳ dị trái/phải cho bạn thấy các mẫu theo hàng và theo cột đứng sau chúng.
Sự phân rã đó là nền tảng của nhiều công cụ thực tiễn bạn dùng hằng ngày. Hệ thống gợi ý dùng nó để dự đoán các đánh giá còn thiếu. Nén ảnh dùng nó để giảm kích thước tệp trong khi vẫn giữ chất lượng hiển thị. Toán học đằng sau chúng gần như giống hệt nhau, dù lĩnh vực hoàn toàn khác biệt.
Nhưng SVD không phải lúc nào cũng là công cụ đúng đắn. Nó tốn kém trên các ma trận lớn và có thể trộn lẫn tín hiệu với nhiễu khi các giá trị kỳ dị không tách bạch tốt. Ngoài ra, nó là quá mức cần thiết cho các tập dữ liệu nhỏ. Các lựa chọn như phân rã QR, phân rã trị riêng và NMF mỗi phương pháp xử lý tốt hơn các trường hợp cụ thể.
Điều mấu chốt là biết khi nào bạn nên dùng SVD và khi nào giải pháp đơn giản hơn sẽ hiệu quả hơn. Và để có được kiến thức đó, hãy đăng ký lộ trình Machine Learning Scientist với Python và sẵn sàng cho công việc vào năm 2026.
Câu hỏi thường gặp về SVD
Phân rã Giá trị Kỳ dị (SVD) là gì?
SVD là một phương pháp phân rã ma trận, tách bất kỳ ma trận nào thành ba thành phần: các vector kỳ dị trái (U), các giá trị kỳ dị (Σ) và các vector kỳ dị phải (V*). Nó hoạt động với bất kỳ ma trận nào, bất kể hình dạng hay kích thước. SVD cho thấy cấu trúc nền của dữ liệu bằng cách tách nó thành các mẫu và tầm quan trọng tương đối của chúng.
Vì sao SVD được dùng trong khoa học dữ liệu và học máy?
SVD giúp giảm số chiều trong các tập dữ liệu nhiều chiều trong khi vẫn giữ các mẫu quan trọng nhất. Nó là toán học đằng sau PCA và các hệ thống gợi ý. Những ứng dụng này đều dựa trên cùng một ý tưởng: giữ lại các thành phần chi phối và loại bỏ phần còn lại.
Sự khác nhau giữa SVD và phân rã trị riêng là gì?
Phân rã trị riêng chỉ hoạt động trên ma trận vuông, trong khi SVD hoạt động với mọi hình dạng ma trận. Với các ma trận vuông, đối xứng như ma trận hiệp phương sai, cả hai phương pháp cho kết quả liên quan chặt chẽ - các giá trị kỳ dị của một ma trận nửa xác định dương chính là các trị riêng của nó. SVD là công cụ tổng quát hơn, đó là lý do nó mặc định trong hầu hết quy trình khoa học dữ liệu.
Các giá trị kỳ dị liên quan tới nén dữ liệu như thế nào?
Các giá trị kỳ dị được sắp xếp từ lớn đến nhỏ, và mỗi giá trị biểu thị mức độ một thành phần giải thích phương sai. Loại bỏ các giá trị kỳ dị nhỏ (và các vector tương ứng của chúng) sẽ loại bỏ các mẫu nhỏ và nhiễu trong khi giữ cấu trúc chi phối. Bạn đánh đổi một chút độ chính xác để đổi lấy mức giảm kích thước lớn.
Khi nào tôi nên tránh dùng SVD?
SVD tốn kém trên các ma trận lớn, với độ phức tạp thời gian O(mn^2) cho phân rã đầy đủ. Với các tập dữ liệu nhỏ chỉ có vài đặc trưng, các phương pháp đơn giản như phân tích tương quan hoặc chọn lọc đặc trưng cơ bản sẽ hoàn thành công việc nhanh hơn. Nếu ma trận của bạn rất lớn và bạn chỉ cần các thành phần hàng đầu, SVD cắt ngắn hoặc SVD ngẫu nhiên phù hợp hơn SVD đầy đủ.
