Singular Value Decomposition - SVD là một trong những phép phân tích quan trọng nhất trong đại số tuyến tính vì nó được áp dụng cực kỳ phổ biến trong các lĩnh vực về Machine Learning để giảm chiều dữ liệu hay nén ảnh... Bài viết này mình muốn giới thiệu đến bạn về phương pháp này và một interactive demo để các bạn có thể “vọc“ tận tay với nó :)
SVD cho phép ta phân rã một ma trận bất kỳ kích thước thành ba ma trận khác:
là ma trận trực giao kích thước với các cột là là eigenvectors của
là ma trận chéo kích thước chứa các singular values (luôn không âm)
là ma trận trực giao kích thước với các cột là eigenvectors của
Cho ma trận vuông , một vector được gọi là eigenvector nếu:
trong đó là eigen value. Điều này có nghĩa là khi nhân ma trận với chỉ làm cho thay đổi độ dài chứ không thay đổi hướng.
Nếu ma trận có thể viết dưới dạng
với là ma trận chéo chứa các eigenvalues, thì ta nói có thể chéo hóa. Một tính chất cực kỳ quan trọng là ma trận đối xứng luôn có thể chéo hóa được.
Khi một ma trận bất kỳ nhân với một không gian vector, nó thực hiện các phép biến đổi tuyến tính phức tạp như quay (rotation), lật (reflection), và kéo giãn (stretching). Những phép biến đổi này thường làm thay đổi hình dạng và định hướng của các vector trong không gian.
Cụ thể, nếu chúng ta xét một hệ cơ sở trực chuẩn thông thường, ví dụ như các vector đơn vị chuẩn , khi chúng ta áp dụng phép biến đổi lên chúng (tức là tính ), các vector kết quả thường sẽ bị "bóp méo". Điều này có nghĩa là chúng không còn giữ được tính trực giao (vuông góc) và độ dài đơn vị như ban đầu nữa. Việc phân tích một phép biến đổi như vậy trở nên khó khăn vì các hướng cơ bản đã bị lẫn lộn.
SVD ra đời để giải quyết vấn đề này. Ý tưởng chính của SVD là tìm ra một tập hợp các vector cơ sở trực chuẩn đặc biệt trong không gian đầu vào (được định nghĩa bởi các cột của ma trận ) sao cho khi biến đổi các vector này, chúng chỉ tạo thành một tập hợp các vector trực chuẩn khác trong không gian đầu ra (được định nghĩa bởi các cột của ma trận ) với một tập hợp các hệ số kéo giãn tương ứng (được định nghĩa bởi ma trận đường chéo ), từ đó ta có quan hệ như sau:
Để ý là vì cũng là một hệ trực chuẩn cho nên ta có . Từ đó ta có công thức:
Tính vuông góc được bảo toàn trong cả hai không gian này, làm cho việc hiểu và phân tích phép biến đổi của ma trận trở nên minh bạch hơn rất nhiều.
Ta xét ma trận tích , đây là một ma trận vuông, đối xứng, do đó nó luôn có thể chéo hóa được theo như đã đề cập ở trên. Lúc này ta có:
Lại tiếp tục áp dụng khai triển SVD, ta có (để ý rằng cả đều trực chuẩn):
Như vậy và vì là hệ trực chuẩn nên . Lúc này ta có thể nhận ra sự tương quan giữa 2 vế:
bên vế trái chính là của vế phải
bên vế trái chính là của vế phải, mà có dạng ma trận đường chéo với các phần tử tương ứng là Vậy có thể kết luận rằng mỗi phần tử chính là bằng với là trị riêng thứ của ma trận .
Giả sử ma trận có phân rã: , nếu sắp xếp các singular values với là rank của , ta có thể viết lại
Trong đó:
là cột thứ của
là cột thứ của (chú ý là công thức là , nên trở thành hàng)
Nếu chỉ giữ lại thành phần lớn nhất, ta sẽ có:
Lúc đó sẽ là xấp xỉ lớn nhất của trong chuẩn Frobenius và chuẩn 2 (Eckart–Young–Mirsky theorem)
Như vậy:
Trong xử lý ảnh: chỉ cần vài chục singular values lớn để khôi phục ảnh gần như đầy đủ, thay vì lưu toàn bộ ma trận pixel.
Trong machine learning: thay vì lưu một ma trận lớn (ví dụ 1 triệu user × 100 nghìn sản phẩm), ta có thể xấp xỉ bằng hạng thấp → tiết kiệm bộ nhớ và tính toán.
Ví dụ: Nếu ta lưu một ảnh kích thước 1,920 × 1,080 thì số pixel phải lưu là 2,073,600. Nếu áp dụng SVD với k=100 ta cần:
: 100 cột đầu tiên của ma trận là 100×1,920 = 192,000
: 100 phần tử trên đường chéo
: 100 cột đầu tiên của của ma trận là 100×1,080 = 108,000
Tổng cộng là 300,100 phần tử so với 2,073,600 phần tử của ma trận gốc.
No comments yet. Be the first to comment!