Vectors & Matrices in Photo Search
Google Photos biến ảnh thành vector để tìm
Công ty nào đang ứng dụng Vector và ma trận?
Bạn mở Google Photos, gõ “hoàng hôn bãi biển” rồi chờ. Hàng trăm tấm ảnh của bạn suốt 5 năm qua hiện ra trong một giây. Không phải bạn đã dán nhãn cho từng tấm. Máy tự nhận ra. Làm sao được?
Câu trả lời ngắn: mỗi ảnh được biến thành một mũi tên (vector) trong không gian nhiều chiều. Hai ảnh giống nhau cho ra hai mũi tên chỉ cùng hướng. Việc “so sánh hai bức ảnh” phức tạp thu gọn lại thành so sánh hai mũi tên có cùng hướng không. Mà việc đó bạn đã biết làm rồi. Nó chính là tích vô hướng và cosine similarity ở bài trước.
Mỗi thẻ ảnh dưới đây có 3 thanh màu. Mỗi thanh là một con số giữa 0 và 1, mô tả một đặc điểm của ảnh: ấm/lạnh, rộng/hẹp, nhiều chi tiết/ít chi tiết. Trong thực tế, Google dùng 128 đến 2048 con số cho mỗi ảnh, nhưng nguyên tắc vẫn giống hệt.
Hai ảnh gần như giống hệt theo cả ba tín hiệu
Quan sát: hai ảnh ngoài trời (hoàng hôn và bãi biển) có cosine cao. Ảnh bếp và ảnh núi thì cosine thấp. Cả một bài toán “hai ảnh có giống nhau không?” thu gọn lại thành một con số duy nhất.
Vấn đề công ty cần giải quyết
Google Photos lưu trữ hơn 9 nghìn tỷ tấm ảnh, phục vụ 1,5 tỷ người dùng mỗi tháng, với 28 tỷ ảnh mới tải lên mỗi tuần. Riêng bạn có thể có 20.000 tấm trong thư viện cá nhân, chụp từ nhiều năm, nhiều góc, nhiều đèn, nhiều mùa khác nhau.
Bài toán cốt lõi: khi bạn gõ từ khoá hoặc bấm vào khuôn mặt bà ngoại, máy phải trả về đúng những ảnh liên quan trong mili-giây, và phải đúng dù bà đang đội nón lá, đeo kính, hay cười to. Không có thời gian cho máy “xem từng tấm rồi nghĩ”.
Mỗi ảnh 1 triệu pixel. So sánh 2 ảnh là 1 triệu phép trừ. Hai ảnh cùng chủ thể chụp khác góc cho ra pixel khác hoàn toàn, kết quả sai. Hai ảnh khác nhau mà cùng màu lại cho pixel giống, kết quả vẫn sai. Vô dụng.
Mỗi ảnh trở thành một mũi tên 128 chiều (vector embedding). Hai ảnh cùng chủ thể cho ra hai mũi tên chỉ cùng hướng, bất kể góc chụp hay ánh sáng. So sánh là tính cosine. Mili-giây trên hàng tỷ ảnh. Hoạt động.
Bạn có 20.000 ảnh trong thư viện. Nếu so sánh pixel-từng-pixel cho mỗi truy vấn, việc tìm kiếm sẽ tốn bao lâu trên điện thoại?
Cách Vector và ma trận giải quyết vấn đề
Phát hiện đối tượng trong ảnh (face detection, object detection). Một mô hình nhỏ quét qua ảnh, khoanh hình chữ nhật quanh khuôn mặt, xe, cây, món ăn. Mục tiêu chỉ là tách phần đáng quan tâm ra khỏi nền.
Mỗi khuôn mặt được đóng khung riêng trước khi đi tiếp.Biến ảnh thành vector (embedding). Mạng FaceNet của Google nhận vùng ảnh khuôn mặt và trả ra một vector 128 chiều. Sau khi được huấn luyện trên 100-200 triệu ảnh, mạng học được một quy tắc bền vững: cùng một người cho ra hai vector gần nhau, khác người cho ra hai vector xa nhau, bất kể ánh sáng hay góc chụp.
Minh hoạ (bản rút gọn 3 chiều thay vì 128):
🌅Hoàng hôn biểnẤm/lạnh0.92Mở/đóng0.95Chi tiết0.30🏖️Bãi biển trưaẤm/lạnh0.65Mở/đóng0.90Chi tiết0.45🏔️Núi sương mùẤm/lạnh0.20Mở/đóng0.95Chi tiết0.25Hai ảnh đầu (hoàng hôn và bãi biển) có ba thanh gần giống nhau, vector của chúng gần nhau. Ảnh núi có thanh “ấm” rất thấp nên vector lệch ra xa.
Đo khoảng cách giữa các vector. Với hai vector đã tính, Google dùng cosine similarity hoặc khoảng cách Euclid. Cosine gần 1 nghĩa là cùng người, cùng cảnh. Gần 0 nghĩa là hai bức ảnh không liên quan.
Gom các ảnh gần nhau thành cụm(clustering). Tất cả ảnh của cùng một người được xếp chung một nhóm, và Google đặt tên nhóm đó là album “Bà Ngoại”. Với hàng tỷ ảnh, Google dùng kỹ thuật tìm láng giềng gần đúng (ANN) để trả kết quả trong mili-giây, thay vì phải so sánh hết 20.000 vector cá nhân của bạn.
Minh hoạ: ở đây 6 ảnh được tự gom thành 3 cụm theo độ tương đồng (mỗi cụm có 2 ảnh gần nhau nhất theo cosine).
Cụm 'ngoài trời ấm'🌅🏖️Cụm 'trong nhà ấm'🍲☕Cụm 'ngoài trời mát'🌃🏔️Bạn đang có 20.000 ảnh trong thư viện. Google cần tìm tất cả ảnh của bà ngoại. Thuật toán nào giúp việc này chạy trong mili-giây?
Con số thật
- Độ chính xác 99,63% trên bộ chuẩn LFW (nhận diện khuôn mặt), cao hơn mức 97,53% của con người [1]
- Mỗi khuôn mặt được biểu diễn bằng vector 128 chiều, thay cho việc so sánh hàng triệu pixel [1]
- Lưu trữ hơn 9 nghìn tỷ tấm ảnh, phục vụ 1,5 tỷ người dùng mỗi tháng [3]
- Tìm kiếm trả kết quả trên hàng tỷ vector chỉ trong mili-giây nhờ thuật toán láng giềng gần đúng (ANN) [4]
Nếu không có Vector và ma trận, app sẽ ra sao?
Không có vector embedding, Google Photos sẽ phải so sánh trực tiếp từng điểm ảnh của mỗi khuôn mặt với hàng tỷ khuôn mặt khác. Chỉ cần bạn đội mũ, đeo kính, hoặc chụp ở ánh sáng khác, kết quả lập tức sai hoàn toàn.
Khi biến mỗi khuôn mặt thành vector 128 chiều, Google đã chuyển một bài toán nhận diện ảnh rất phức tạp thành phép đo khoảng cách giữa hai mảng số. Đây là cốt lõi giúp mọi tính năng tìm kiếm thông minh của Photos chạy được. Spotify gợi ý nhạc, TikTok gợi ý video, và phần lớn AI hiện đại đều dùng đúng kỹ thuật này.
- Mỗi ảnh được biến thành một vector 128 chiều. Hai ảnh giống nhau cho ra hai vector gần nhau.
- So sánh hai ảnh trở thành so sánh hai vector, tức tính cosine similarity. Bài toán phức tạp thu gọn về một con số.
- Hàng tỷ ảnh trên hàng tỷ người dùng vẫn chạy được trong mili-giây nhờ thuật toán tìm láng giềng gần đúng.
Kiểm tra hiểu biết
Google Photos biến mỗi khuôn mặt thành một vector 128 chiều. Vector 128 chiều là gì?