- Các nhà khoa học dữ liệu biến mọi thứ thành vector. Đó là ngôn ngữ của AI
- Tuy nhiên, nếu áp dụng độ tương đồng cosine một cách mù quáng, nó có thể dẫn bạn đi sai hướng
- Bài viết này giải thích cách sử dụng độ tương đồng có chủ đích hơn để đạt được kết quả tốt hơn.
Embedding
- Embedding là biểu diễn dữ liệu dưới dạng vector, rất hữu ích để thể hiện mối quan hệ giữa các thực thể hoặc tìm các mục tương tự
- Ví dụ, "brother" và "sister" không có quan hệ gì nếu chỉ là ID thô, nhưng khi được vector hóa thì có thể biểu diễn quan hệ ngữ nghĩa
- Vector được dùng làm cấu trúc đầu vào cho mô hình machine learning hoặc tự thân được dùng để truy tìm độ tương đồng
- Embedding câu dựa trên mô hình ngôn ngữ lớn (LLM) hiện là một trong những trường hợp sử dụng embedding phổ biến nhất
- Sức mạnh đó cũng đòi hỏi trách nhiệm về bảo mật dữ liệu và việc sử dụng có chủ đích
Ví dụ: so sánh câu bằng độ tương đồng cosine
- So sánh ba câu
- A: "Python can make you rich."
- B: "Python can make you itch."
- C: "Mastering Python can fill your pockets."
- So sánh dựa trên ký tự
- Nếu so sánh chuỗi thô, A và B khác 2 ký tự, còn A và C khác 21 ký tự
- Nhưng về mặt ngữ nghĩa, A và C lại giống nhau hơn (đều nói về tiền bạc)
- So sánh dựa trên vector
- Dùng OpenAI text-embedding-3-large để tạo các vector embedding như sau:
- A:
[-0.003738, -0.033263, -0.017596, 0.029024, -0.015251, ...]
- B:
[-0.066795, -0.052274, -0.015973, 0.077706, 0.044226, ...]
- C:
[-0.011167, 0.017812, -0.018655, 0.006625, 0.018506, ...]
- Số chiều vector: 3072 (dài nhưng có thể giảm chiều mà không làm giảm chất lượng)
- Tính độ tương đồng cosine
- A và C: 0.750 (gần nhau về ngữ nghĩa)
- A và B: 0.576 (gần nhau về mặt chữ)
- Kết quả: ý nghĩa là yếu tố tương đồng quan trọng hơn cách đánh vần
Độ tương đồng cosine là gì?
- Độ tương đồng cosine (cosine similarity) đo mức độ giống nhau bằng cách tính cosine của góc giữa hai vector
- Vì vector tồn tại trong không gian nhiều chiều nên trực giác hình học thường không còn hiệu quả
- Về mặt toán học, đó là tích vô hướng (dot product) của các vector đã được chuẩn hóa
- Các đặc tính chính:
- Hai vector giống hệt nhau cho giá trị 1
- Các vector ngẫu nhiên thường gần 0 (do hiệu ứng trung bình hóa trong không gian nhiều chiều)
- Giá trị kết quả nằm trong khoảng từ -1 đến 1
- Sự đơn giản này có thể gây hiểu lầm
- Việc giá trị nằm trong khoảng 0~1 không có nghĩa đó là xác suất hay một thước đo có ý nghĩa tuyệt đối
- Ví dụ: giá trị 0.6 có thể không hề biểu thị độ tương đồng mạnh
- Giá trị âm hiếm khi biểu thị sự đối lập về ngữ nghĩa
- Phần lớn chỉ là kết quả vô nghĩa hoặc gần như nhiễu
- Nếu dùng Glove(
glove.6B.300d) để tìm các từ tương tự với "dog":
- Các từ gần thường đúng như kỳ vọng
- Các từ xa nhất lại thường cho ra kết quả vô nghĩa
- Độ tương đồng cosine giống như "băng keo" vì nó đơn giản và nhanh, cho phép so sánh đủ loại vector
- Có thể dùng để so sánh hình ảnh, văn bản, âm thanh, mã nguồn, v.v.
- Nhưng nó chỉ là giải pháp tạm, có thể che giấu những vấn đề sâu hơn
- Ví dụ: giống như sửa ống nước bằng băng keo, khó mà tin cậy và không bền vững
- Có lúc độ tương đồng cosine trông có vẻ hiệu quả, nhưng khi thất bại thì rất khó xác định nguyên nhân
- Ta thường phải vá víu bằng các giải pháp ứng biến, và điều đó có thể tạo ra vấn đề mới
Mối quan hệ giữa độ tương đồng cosine và hệ số tương quan
- Hệ số tương quan Pearson được tính qua ba bước:
- Trừ đi giá trị trung bình để đưa dữ liệu về trung tâm
- Chuẩn hóa vector thành vector đơn vị
- Tính tích vô hướng (dot product) của hai vector
- Khi vector đã được đưa về trung tâm và chuẩn hóa:
- Hệ số tương quan Pearson = độ tương đồng cosine = tích vô hướng
- Cách dùng trong thực tế
- Người ta không đưa vector về trung tâm hoặc chuẩn hóa ở mỗi lần so sánh từng cặp
- Thay vào đó, xử lý trước rồi chỉ tính tích vô hướng
- Nếu có thể dùng độ tương đồng cosine thì cũng có thể dùng hệ số tương quan Pearson theo cách tương tự
- Hai thước đo này trên thực tế có thể được dùng trong cùng một ngữ cảnh
Vấn đề khi dùng độ tương đồng cosine làm thước đo tương đồng
- Dùng độ tương đồng cosine làm mục tiêu huấn luyện cho mô hình machine learning là điều hợp lệ về mặt toán học
- Vấn đề xuất hiện ở những chỗ vượt ra ngoài việc cosine similarity có phù hợp hay không:
- Khi hàm mất mát dùng để huấn luyện mô hình không phải là cosine similarity
- Khi mục tiêu huấn luyện khác với yêu cầu của ứng dụng thực tế
- Nhìn chung, mô hình thường được huấn luyện bằng vector chưa chuẩn hóa:
- Ví dụ: dự đoán xác suất dựa trên tích vô hướng (dot product) và dùng hàm mất mát logistic
- Một số mô hình học bằng cách tối thiểu hóa khoảng cách Euclid để kéo các mục cùng lớp lại gần nhau
- Chuẩn hóa mang lại vài tính chất toán học (giới hạn kết quả trong khoảng -1 đến 1), nhưng đó chỉ là một "giải pháp tạm"
- Chỉ những mô hình được huấn luyện bằng độ tương đồng cosine hoặc hàm trực tiếp của nó mới có thể được dùng một cách an toàn
- Ngay cả khi mô hình được huấn luyện rõ ràng bằng độ tương đồng cosine, định nghĩa về "tương đồng" vẫn không hề rõ ràng:
- Nhà phê bình văn học: chia sẻ cùng chủ đề
- Thủ thư: cùng thể loại
- Độc giả: cùng phản ứng cảm xúc
- Người dàn trang: số trang và định dạng giống nhau
- Độ tương đồng cosine đơn giản hóa nhiều định nghĩa khác nhau thành một con số duy nhất, nên rất dễ gây hiểu lầm
- Ví dụ: "espresso" và "cappuccino"
- word2vec xem hai từ này gần như giống hệt nhau (theo bối cảnh Mỹ)
- Nhưng ở Italy thì chúng không được xem là như nhau
Khi độ tương đồng cosine thất bại
- Ví dụ đơn giản: câu hỏi tìm chìa khóa
- Câu hỏi: "What did I do with my keys?"
- Các câu được đem ra so sánh:
- "I left them in my pocket"
- "They are on the table"
- "What did I put my wallet?"
- "What I did to my life?"
- Vấn đề
- Kết quả khi dùng độ tương đồng cosine:
- Câu gần nhất lại là một câu hỏi khác thay vì một câu trả lời phù hợp ("What I did to my life?")
- Nó dựa vào sự giống nhau của cấu trúc câu chứ không phải liên quan ngữ nghĩa thực sự
- Các câu liên quan đến Python có độ tương đồng gần bằng 0, nên phần nào phản ánh đúng là không liên quan
- Giới hạn trong thế giới thực
- Trong ứng dụng thực tế, bạn sẽ phải xử lý hàng nghìn tài liệu
- Với các tập dữ liệu lớn vượt quá context window, hệ thống còn nhạy với nhiễu hơn
- Khi kích thước tập dữ liệu tăng lên, điểm tương đồng sẽ vận hành như một trò roulette trong không gian nhiều chiều
Có thể dùng gì thay cho độ tương đồng cosine?
Cách tiếp cận mạnh nhất
- Tận dụng truy vấn LLM:
- Dùng một mô hình ngôn ngữ mạnh để so sánh hai mục
- Ví dụ: "Is {sentence_a} a plausible answer to {sentence_b}?"
- Khi dùng LLM, có thể thực hiện các so sánh có ý nghĩa:
- Phân biệt đơn giản giữa câu hỏi và câu trả lời
- Có thể trả kết quả dưới dạng có cấu trúc như JSON
- Tuy nhiên, nếu tập dữ liệu lớn thì cách này kém hiệu quả và tốn chi phí
Tối ưu embedding
- Tạo embedding theo từng tác vụ:
- Fine-tuning để điều chỉnh trọng số của mô hình hiện có
- Transfer Learning để tận dụng tri thức của mô hình và tạo embedding mới, tập trung hơn
- Tương đồng đối xứng:
- Biểu diễn câu hỏi "A và B có giống nhau không?" trong không gian vector
- Giảm các chiều không cần thiết và chỉ giữ lại các đặc tính liên quan
- Tương đồng bất đối xứng:
- Ví dụ: biểu diễn xác suất của câu hỏi "Tài liệu B có phải là câu trả lời đúng cho câu hỏi A không?"
- Chuyển đổi thành các không gian chuyên biệt riêng cho query và key
Prompt engineering
- Thêm prompt để thiết lập ngữ cảnh:
- Ví dụ: "Nationality of {person}" để nhấn mạnh ngữ cảnh liên quan đến quốc tịch
- Thay vì prompt đơn giản, dùng câu cụ thể hơn:
- "This is a country that has produced many influential historical figures, including {person}"
- Chất lượng kết quả được cải thiện đáng kể, dù vẫn chưa hoàn hảo
Viết lại văn bản và trích xuất ngữ cảnh
- Tiền xử lý văn bản trước khi embedding:
- Dùng prompt đơn giản như "Hãy tóm tắt văn bản sau bằng tiếng Anh chuẩn trong tối đa 200 từ" để loại bỏ sự tương đồng bề mặt
- Bỏ qua các yếu tố hình thức không cần thiết (lỗi chính tả, định dạng, v.v.) và tập trung vào nội dung
- Tạo ngữ cảnh có cấu trúc:
- Tóm tắt cuộc trò chuyện với khách hàng để rút ra các yêu cầu và vấn đề rõ ràng:
- "Hãy tóm tắt cuộc trò chuyện thành tối đa 10 gạch đầu dòng Markdown"
- Các trang tài liệu cũng có thể được chuyển sang cùng định dạng để ghép nối chính xác hơn
Kết luận
- Nhiều phương pháp thay thế có thể bù đắp những điểm yếu của độ tương đồng cosine và mang lại kết quả đáng tin cậy hơn
- Hãy chọn và áp dụng cách tiếp cận phù hợp tùy theo bối cảnh của dự án
Tóm tắt
- Giới hạn của độ tương đồng cosine:
- Độ tương đồng cosine cho giá trị từ -1 đến 1, nhưng không nên coi đó là xác suất
- Phần lớn mô hình không được huấn luyện với mục tiêu là độ tương đồng cosine, nên kết quả chỉ là tương quan không có gì bảo đảm
- Ngay cả khi mô hình đã học độ tương đồng cosine, ta vẫn phải hiểu liệu định nghĩa về tương đồng đó có khớp với nhu cầu của mình hay không
- Cách dùng hiệu quả độ tương đồng vector:
- Huấn luyện embedding chuyên biệt cho dữ liệu
- Thiết kế prompt tập trung vào các khía cạnh liên quan
- Làm sạch và chuẩn hóa văn bản trước khi embedding
2 bình luận
Tài liệu này được tổng hợp quá tuyệt.
Ý kiến trên Hacker News
Với các ứng dụng RAG sử dụng độ tương đồng cosine, nên sắp xếp lại kết quả bằng "semantic re-ranker" hoặc "L2 re-ranking model"
Vector từ giải quyết vấn đề hai từ có thể liên quan chặt chẽ dù không xuất hiện trong cùng một ngữ cảnh
Ở Mỹ, word2vec có thể đánh giá espresso và cappuccino gần như giống hệt nhau, nhưng ở Ý thì không như vậy
Độ tương đồng cosine được dùng trong hầu hết các hệ thống semantic search dựa trên deep learning
Dùng trực tiếp truy vấn LLM để so sánh hai mục là cách tiếp cận mạnh nhất
HyDE là phương pháp tạo ra một câu trả lời giả định cho câu hỏi rồi so sánh độ tương đồng
Độ tương đồng cosine và top-k RAG tạo cảm giác đã lỗi thời
Sau khi thử cách tiếp cận RAG, có cảm giác thất vọng và cho rằng cần cấu trúc để mô hình có thể thực hiện RAG ngay trong quá trình huấn luyện
Trong đồ họa 3D và vật lý, tầm quan trọng và độ chính xác là rất rõ ràng, nhưng trong machine learning, không gian vector biểu diễn quá nhiều thứ nên việc dùng tích vô hướng tạo cảm giác khá mơ hồ